diff --git a/404.html b/404.html index 165334fe7..2ef035d15 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.jouenNGy.js b/assets/app.MA2Q-arw.js similarity index 95% rename from assets/app.jouenNGy.js rename to assets/app.MA2Q-arw.js index 3dd27d7d2..7b956f185 100644 --- a/assets/app.jouenNGy.js +++ b/assets/app.MA2Q-arw.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.VAmOuqsF.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.HGQKPfzt.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.JtUCui32.js b/assets/chunks/@localSearchIndexen.JtUCui32.js new file mode 100644 index 000000000..78c04d39f --- /dev/null +++ b/assets/chunks/@localSearchIndexen.JtUCui32.js @@ -0,0 +1 @@ +const e='{"documentCount":118,"nextId":118,"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/assets.html#application-resources","14":"/en/development/assets.html#baseicon","15":"/en/development/assets.html#icons-js","16":"/en/development/ide.html#configuring-the-ide","17":"/en/development/building.html#create-and-build-an-application","18":"/en/development/libraries.html#tell-me-a-handy-library","19":"/en/development/misc.html#helpful-hints","20":"/en/development/misc.html#carousel-or-slider","21":"/en/development/misc.html#date-and-time","22":"/en/development/stores.html#state-management-in-vue-3","23":"/en/development/testing.html#testing","24":"/en/frontend/about-frameworks.html#about-frontend-frameworks","25":"/en/frontend/architecture.html#frontend-application-architecture","26":"/en/frontend/architecture.html#avoid-dependencies","27":"/en/frontend/architecture.html#use-wrappers-over-components-of-ui-libraries-and-third-party-utilities","28":"/en/frontend/architecture.html#regular-refactoring","29":"/en/frontend/architecture.html#use-css3","30":"/en/frontend/architecture.html#use-modern-standards-and-language-features","31":"/en/frontend/architecture.html#document-the-project","32":"/en/frontend/css-ui-libs.html#css-and-ui-libraries","33":"/en/frontend/learning.html#learning-vue","34":"/en/frontend/spa-pwa-ssr-ssg.html#spa-pwa-ssg-ssr-and-seo","35":"/en/misc/CHANGELOG.html#changelog","36":"/en/misc/CHANGELOG.html#v1-4-24-11-2023","37":"/en/misc/CHANGELOG.html#changed","38":"/en/misc/CHANGELOG.html#v1-3-10-10-2023","39":"/en/misc/CHANGELOG.html#changed-1","40":"/en/misc/CHANGELOG.html#v1-2-28-09-2023","41":"/en/misc/CHANGELOG.html#new","42":"/en/misc/CHANGELOG.html#changed-2","43":"/en/misc/CHANGELOG.html#v1-1-15-09-2023","44":"/en/misc/CHANGELOG.html#new-1","45":"/en/misc/CHANGELOG.html#changed-3","46":"/en/misc/CHANGELOG.html#v1-0-11-09-2023","47":"/en/misc/CHANGELOG.html#new-2","48":"/en/misc/cheat-sheets.html#cheat-sheet","49":"/en/misc/cheat-sheets.html#vue","50":"/en/misc/cheat-sheets.html#javascript","51":"/en/misc/cheat-sheets.html#html","52":"/en/misc/cheat-sheets.html#css","53":"/en/misc/cheat-sheets.html#typescript","54":"/en/misc/cheat-sheets.html#markdown","55":"/en/misc/contribute.html#contribute-to-the-development-of-this-resource","56":"/en/misc/glossary.html#glossary-and-abbreviations","57":"/en/vue-webapp/contribution.html#project-participation","58":"/en/misc/introduction.html#introduction","59":"/en/misc/introduction.html#about-the-author","60":"/en/vue-webapp/getting-started.html#getting-started","61":"/en/vue-webapp/getting-started.html#installation-via-create-vue-webapp","62":"/en/vue-webapp/getting-started.html#initializing-and-launching-a-web-application","63":"/en/vue-webapp/getting-started.html#installation-from-the-repository","64":"/en/vue-webapp/guidelines.html#guidelines","65":"/en/vue-webapp/#scaffolding-a-vue-webapp","66":"/en/vue-webapp/#summary","67":"/en/vue-webapp/#justification","68":"/en/vue-webapp/objectives.html#objectives","69":"/en/vue-webapp/options/adaptability.html#adaptability","70":"/en/vue-webapp/options/api.html#api-module","71":"/en/vue-webapp/options/api.html#api-rest","72":"/en/vue-webapp/options/api.html#json-rpc","73":"/en/vue-webapp/options/baseIcon.html#baseicon","74":"/en/vue-webapp/options/description.html#implementation-details","75":"/en/vue-webapp/options/description.html#code-injections-in-the-index-html","76":"/en/vue-webapp/options/description.html#css-tricks","77":"/en/vue-webapp/options/drawer.html#navigation-drawers","78":"/en/vue-webapp/options/drawer.html#simpledrawer","79":"/en/vue-webapp/options/drawer.html#touchslideoutdrawer","80":"/en/vue-webapp/options/footer.html#footers","81":"/en/vue-webapp/options/footer.html#simplefooter","82":"/en/vue-webapp/options/footer.html#richfooter","83":"/en/vue-webapp/options/footer.html#mantinesimplefooter","84":"/en/vue-webapp/options/footer.html#mantinerichfooter","85":"/en/vue-webapp/options/footer.html#distributedfooter","86":"/en/vue-webapp/options/ga-gp.html#github-actions-script-to-deploy-to-github-pages","87":"/en/vue-webapp/options/ga-gp.html#deployment","88":"/en/vue-webapp/options/ga-gp.html#setting-base-in-vite-config","89":"/en/vue-webapp/options/google-analytics.html#google-analytics","90":"/en/vue-webapp/options/i18n.html#i18n","91":"/en/vue-webapp/options/i18n.html#i18next","92":"/en/vue-webapp/options/i18n.html#usei18nlight","93":"/en/vue-webapp/options/i18n.html#usage","94":"/en/vue-webapp/options/i18n.html#i18next-extensions","95":"/en/vue-webapp/options/i18n.html#as-a-result","96":"/en/vue-webapp/options/header.html#headers","97":"/en/vue-webapp/options/header.html#simpleheader","98":"/en/vue-webapp/options/header.html#mantinesimpleheader","99":"/en/vue-webapp/options/header.html#mantinelayeredheader","100":"/en/vue-webapp/options/header.html#slidingheader","101":"/en/vue-webapp/options/#options-when-creating-an-application","102":"/en/vue-webapp/options/#available-options","103":"/en/vue-webapp/options/#available-by-default","104":"/en/vue-webapp/options/#in-development","105":"/en/vue-webapp/options/#planned","106":"/en/vue-webapp/options/layout-main.html#mainlayout","107":"/en/vue-webapp/options/layout-main.html#routing","108":"/en/vue-webapp/options/layout-one-column.html#onecolumnlayout","109":"/en/vue-webapp/options/navbar.html#navbar","110":"/en/vue-webapp/options/navbar.html#simplenavbar","111":"/en/vue-webapp/options/navbar.html#mantinesimplenavbar","112":"/en/vue-webapp/options/open-graph.html#google-analytics","113":"/en/vue-webapp/options/pwa.html#pwa","114":"/en/vue-webapp/options/pwa.html#manifest-json","115":"/en/vue-webapp/options/pwa.html#service-worker","116":"/en/vue-webapp/options/splash-screen.html#splash-screen","117":"/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,150],"13":[2,1,178],"14":[1,3,71],"15":[2,3,116],"16":[3,1,815],"17":[5,1,209],"18":[5,1,49],"19":[2,1,9],"20":[3,3,17],"21":[3,3,312],"22":[5,1,468],"23":[1,1,149],"24":[3,1,368],"25":[3,1,189],"26":[2,4,79],"27":[11,4,41],"28":[2,4,30],"29":[2,4,48],"30":[6,4,18],"31":[3,4,36],"32":[4,1,214],"33":[2,1,408],"34":[6,1,457],"35":[1,1,1],"36":[6,1,1],"37":[1,7,8],"38":[5,1,1],"39":[1,6,11],"40":[6,1,1],"41":[1,7,4],"42":[1,7,14],"43":[6,1,1],"44":[1,7,3],"45":[1,7,4],"46":[6,1,1],"47":[1,7,3],"48":[2,1,1],"49":[1,3,5],"50":[1,3,4],"51":[1,3,4],"52":[1,3,6],"53":[1,3,8],"54":[1,3,2],"55":[7,1,42],"56":[3,1,61],"57":[2,1,15],"58":[1,1,80],"59":[4,2,29],"60":[2,1,1],"61":[5,2,136],"62":[6,7,14],"63":[4,2,37],"64":[1,1,134],"65":[4,1,1],"66":[1,4,63],"67":[1,4,158],"68":[1,1,169],"69":[1,1,79],"70":[2,1,1],"71":[3,2,92],"72":[2,2,89],"73":[1,1,65],"74":[2,1,1],"75":[6,2,44],"76":[2,2,30],"77":[2,1,12],"78":[1,2,23],"79":[1,2,24],"80":[1,1,9],"81":[1,1,1],"82":[1,1,1],"83":[1,1,1],"84":[1,1,1],"85":[1,1,1],"86":[6,1,1],"87":[1,6,67],"88":[5,6,46],"89":[2,1,45],"90":[1,1,1],"91":[1,1,99],"92":[1,1,22],"93":[1,1,56],"94":[2,1,56],"95":[3,1,17],"96":[1,1,5],"97":[1,1,4],"98":[1,1,8],"99":[1,1,8],"100":[1,1,30],"101":[5,1,1],"102":[2,5,73],"103":[3,5,20],"104":[2,5,12],"105":[1,5,74],"106":[1,1,28],"107":[1,1,13],"108":[1,1,46],"109":[1,1,17],"110":[1,1,1],"111":[1,1,1],"112":[2,1,34],"113":[1,1,16],"114":[2,1,56],"115":[2,1,66],"116":[2,1,49],"117":[1,1,83]},"averageFieldLength":[2.423728813559321,2.11864406779661,74.55084745762709],"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":"Application Resources","titles":[]},"14":{"title":"BaseIcon","titles":["Application Resources",null,null]},"15":{"title":"icons.js","titles":["Application Resources",null,null]},"16":{"title":"Configuring the IDE","titles":[]},"17":{"title":"Create and build an application","titles":[]},"18":{"title":"Tell me a handy library","titles":[]},"19":{"title":"Helpful hints","titles":[]},"20":{"title":"Carousel or slider","titles":["Helpful hints",null]},"21":{"title":"Date and time","titles":["Helpful hints",null]},"22":{"title":"State management in Vue 3","titles":[]},"23":{"title":"Testing","titles":[]},"24":{"title":"About frontend frameworks","titles":[]},"25":{"title":"Frontend application architecture","titles":[]},"26":{"title":"Avoid dependencies","titles":["Frontend application architecture",null,null,null,null]},"27":{"title":"Use wrappers over components of UI libraries and third-party utilities","titles":["Frontend application architecture",null,null,null,null]},"28":{"title":"Regular refactoring","titles":["Frontend application architecture",null,null,null,null]},"29":{"title":"Use CSS3","titles":["Frontend application architecture",null,null,null,null]},"30":{"title":"Use modern standards and language features","titles":["Frontend application architecture",null,null,null,null]},"31":{"title":"Document the project","titles":["Frontend application architecture",null,null,null,null]},"32":{"title":"CSS and UI libraries","titles":[]},"33":{"title":"Learning Vue","titles":[]},"34":{"title":"SPA, PWA, SSG, SSR and SEO","titles":[]},"35":{"title":"Changelog","titles":[]},"36":{"title":"v1.4 (24-11-2023)","titles":["Changelog"]},"37":{"title":"Changed","titles":["Changelog","v1.4 (24-11-2023)",null]},"38":{"title":"v1.3 (10-10-2023)","titles":["Changelog"]},"39":{"title":"Changed","titles":["Changelog","v1.3 (10-10-2023)",null]},"40":{"title":"v1.2 (28-09-2023)","titles":["Changelog"]},"41":{"title":"New","titles":["Changelog","v1.2 (28-09-2023)",null]},"42":{"title":"Changed","titles":["Changelog","v1.2 (28-09-2023)",null]},"43":{"title":"v1.1 (15-09-2023)","titles":["Changelog"]},"44":{"title":"New","titles":["Changelog","v1.1 (15-09-2023)"]},"45":{"title":"Changed","titles":["Changelog","v1.1 (15-09-2023)"]},"46":{"title":"v1.0 (11-09-2023)","titles":["Changelog"]},"47":{"title":"New","titles":["Changelog","v1.0 (11-09-2023)"]},"48":{"title":"Cheat Sheet","titles":[]},"49":{"title":"Vue","titles":["Cheat Sheet",null]},"50":{"title":"JavaScript","titles":["Cheat Sheet",null]},"51":{"title":"HTML","titles":["Cheat Sheet",null]},"52":{"title":"CSS","titles":["Cheat Sheet",null]},"53":{"title":"Typescript","titles":["Cheat Sheet",null]},"54":{"title":"Markdown","titles":["Cheat Sheet",null]},"55":{"title":"Contribute to the development of this resource","titles":[]},"56":{"title":"Glossary and abbreviations","titles":[]},"57":{"title":"Project participation","titles":[]},"58":{"title":"Introduction","titles":[]},"59":{"title":"About the author:","titles":["Introduction",null]},"60":{"title":"Getting started","titles":[]},"61":{"title":"Installation via create vue-webapp","titles":["Getting started"]},"62":{"title":"Initializing and launching a web application","titles":["Getting started","Installation via create vue-webapp"]},"63":{"title":"Installation from the repository","titles":["Getting started"]},"64":{"title":"Guidelines","titles":[]},"65":{"title":"Scaffolding a Vue webapp","titles":[]},"66":{"title":"Summary","titles":["Scaffolding a Vue webapp"]},"67":{"title":"Justification","titles":["Scaffolding a Vue webapp"]},"68":{"title":"Objectives","titles":[]},"69":{"title":"Adaptability","titles":[]},"70":{"title":"API module","titles":[]},"71":{"title":"API (REST)","titles":["API module"]},"72":{"title":"JSON-RPC","titles":["API module"]},"73":{"title":"BaseIcon","titles":[]},"74":{"title":"Implementation details","titles":[]},"75":{"title":"Code injections in the index.html","titles":["Implementation details"]},"76":{"title":"CSS tricks","titles":["Implementation details"]},"77":{"title":"Navigation drawers","titles":[]},"78":{"title":"SimpleDrawer","titles":["Navigation drawers"]},"79":{"title":"TouchSlideoutDrawer","titles":["Navigation drawers"]},"80":{"title":"Footers","titles":[]},"81":{"title":"SimpleFooter","titles":["Footers"]},"82":{"title":"RichFooter","titles":["Footers"]},"83":{"title":"MantineSimpleFooter","titles":["Footers"]},"84":{"title":"MantineRichFooter","titles":["Footers"]},"85":{"title":"DistributedFooter","titles":["Footers"]},"86":{"title":"GitHub Actions script to deploy to GitHub Pages","titles":[]},"87":{"title":"Deployment","titles":["GitHub Actions script to deploy to GitHub Pages"]},"88":{"title":"Setting base in Vite config","titles":["GitHub Actions script to deploy to GitHub Pages"]},"89":{"title":"Google analytics","titles":[]},"90":{"title":"i18n","titles":[]},"91":{"title":"i18next","titles":["i18n"]},"92":{"title":"useI18nLight","titles":["i18n"]},"93":{"title":"Usage","titles":["i18n"]},"94":{"title":"i18next extensions","titles":["i18n"]},"95":{"title":"As a result","titles":["i18n"]},"96":{"title":"Headers","titles":[]},"97":{"title":"SimpleHeader","titles":["Headers"]},"98":{"title":"MantineSimpleHeader","titles":["Headers"]},"99":{"title":"MantineLayeredHeader","titles":["Headers"]},"100":{"title":"SlidingHeader","titles":["Headers"]},"101":{"title":"Options when creating an application","titles":[]},"102":{"title":"Available options","titles":["Options when creating an application"]},"103":{"title":"Available by default","titles":["Options when creating an application"]},"104":{"title":"In development","titles":["Options when creating an application"]},"105":{"title":"Planned","titles":["Options when creating an application"]},"106":{"title":"MainLayout","titles":[]},"107":{"title":"Routing","titles":["MainLayout"]},"108":{"title":"OneColumnLayout","titles":[]},"109":{"title":"Navbar","titles":[]},"110":{"title":"SimpleNavbar","titles":["Navbar"]},"111":{"title":"MantineSimpleNavbar","titles":["Navbar"]},"112":{"title":"Google analytics","titles":[]},"113":{"title":"PWA","titles":[]},"114":{"title":"Manifest.json","titles":["PWA"]},"115":{"title":"Service worker","titles":["PWA"]},"116":{"title":"Splash screen","titles":[]},"117":{"title":"Themes","titles":[]}},"dirtCount":0,"index":[["6",{"2":{"117":1}}],["67",{"2":{"117":3}}],["60",{"2":{"117":6}}],["78",{"2":{"117":1}}],["767",{"2":{"69":1}}],["70",{"2":{"33":1,"92":1}}],["√",{"2":{"61":13,"66":5}}],["q",{"2":{"55":1}}],["qbutton",{"2":{"32":1}}],["questions",{"2":{"58":3}}],["question",{"2":{"33":1,"55":1}}],["questionable",{"2":{"23":1}}],["queries",{"2":{"5":1}}],["query",{"2":{"3":1,"5":1,"30":1}}],["quasar",{"2":{"16":2,"18":1}}],["quality",{"2":{"15":1,"16":1,"32":1,"33":3,"56":2}}],["quickly",{"2":{"25":1,"67":3,"68":1}}],["quick",{"2":{"23":1}}],["quieter",{"2":{"16":1}}],["quiet",{"2":{"16":1}}],["quite",{"2":{"2":1,"16":1,"18":1,"22":1,"24":1,"33":1,"34":2,"67":3,"94":1}}],["quote",{"2":{"32":1}}],["quot",{"2":{"2":2,"3":2,"4":4,"21":6,"22":8,"24":4,"25":4,"29":2,"33":5,"34":4,"61":6,"67":4,"78":2,"87":14,"91":8,"106":2,"108":2}}],["zuckerberg",{"2":{"24":1}}],["zero",{"2":{"2":1,"16":1}}],["^20",{"2":{"17":1}}],["^",{"2":{"16":1}}],["400",{"2":{"100":1}}],["401",{"2":{"2":2}}],["480",{"2":{"69":1}}],["4",{"0":{"36":1},"1":{"37":1},"2":{"15":2,"16":1,"33":1}}],[">",{"2":{"8":1,"12":8,"13":5,"14":2,"16":1,"32":2,"55":2,"69":5,"73":3,"89":2,"93":2,"100":3,"112":15}}],[">>",{"2":{"8":5}}],["`~",{"2":{"16":1}}],["`$",{"2":{"14":4}}],["`",{"2":{"8":3,"13":1}}],["+page",{"2":{"16":6}}],["+layout",{"2":{"16":7}}],["+$backups",{"2":{"8":1}}],["+",{"2":{"8":1,"15":2}}],["||",{"2":{"89":1}}],["|",{"2":{"8":4,"16":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,"13":1,"16":96,"62":2,"63":3}}],["kb",{"2":{"95":1}}],["kits",{"2":{"67":1}}],["kill",{"2":{"33":1}}],["kids",{"2":{"33":1}}],["kinds",{"2":{"33":1}}],["kind",{"2":{"22":1,"34":1}}],["karma",{"2":{"16":10}}],["keen",{"2":{"20":1}}],["keeps",{"2":{"24":1}}],["keep",{"2":{"16":1,"22":1,"33":1}}],["keys",{"2":{"22":1}}],["keyboard",{"2":{"16":2}}],["key",{"2":{"8":10,"21":1,"91":1}}],["knows",{"2":{"33":2}}],["knowledge",{"2":{"33":2}}],["known",{"2":{"20":1,"21":1}}],["know",{"2":{"3":1,"17":1,"32":1,"33":3}}],["🚀",{"2":{"8":1}}],["🛎️",{"2":{"8":1}}],["56",{"2":{"117":1}}],["50",{"2":{"95":1}}],["50kb",{"2":{"21":1}}],["58",{"2":{"16":1}}],["5",{"2":{"8":3,"22":1}}],["86",{"2":{"117":1}}],["8",{"2":{"8":2}}],["yes",{"2":{"61":8,"66":4}}],["yet",{"2":{"24":1}}],["years",{"2":{"21":2,"34":1,"58":1,"59":1,"91":1}}],["year",{"2":{"9":1,"33":1}}],["yielded",{"2":{"22":1}}],["yarnrc",{"2":{"16":2}}],["yarn",{"2":{"16":4,"17":1}}],["yamllint",{"2":{"16":2}}],["yaml",{"2":{"8":7,"16":7}}],["y",{"2":{"8":1}}],["yougithubusername",{"2":{"87":1}}],["youtube",{"2":{"33":2}}],["you",{"2":{"1":1,"2":3,"3":5,"5":2,"9":6,"10":3,"11":3,"12":3,"13":3,"15":1,"16":6,"17":6,"21":4,"22":9,"23":1,"24":3,"25":6,"26":2,"27":1,"29":1,"32":3,"33":9,"34":9,"55":1,"61":1,"67":2,"87":1,"88":3,"89":1,"94":1,"112":1,"115":1}}],["yourname",{"2":{"88":1}}],["yourself",{"2":{"9":2,"16":1,"17":1,"33":1}}],["your",{"0":{"3":1},"2":{"1":3,"2":4,"3":4,"4":1,"5":1,"8":18,"9":5,"11":1,"12":1,"13":3,"16":3,"17":1,"21":1,"22":6,"25":1,"26":3,"27":1,"28":1,"31":1,"32":3,"33":5,"34":4,"55":1,"87":2,"88":1,"89":1,"112":1,"114":1}}],["99",{"2":{"5":1,"22":3}}],["95",{"2":{"2":1,"18":1,"21":1}}],["09",{"0":{"40":1,"43":1,"46":1},"1":{"41":1,"42":1,"44":1,"45":1,"47":1}}],["04",{"2":{"16":1}}],["0",{"0":{"46":1},"1":{"47":1},"2":{"5":1,"8":5,"34":2,"72":2,"117":5}}],["38",{"2":{"117":1}}],["300",{"2":{"16":1}}],["30",{"2":{"16":1}}],["3",{"0":{"22":1,"38":1},"1":{"39":1},"2":{"4":1,"5":1,"10":2,"16":2,"17":1,"21":3,"22":9,"24":3,"33":5,"49":1,"58":2,"64":2,"66":1,"68":1,"72":1,"117":2}}],["1443",{"2":{"72":1}}],["1px",{"2":{"69":1}}],["1199",{"2":{"69":1}}],["11",{"0":{"36":1,"46":1},"1":{"37":1,"47":1}}],["1280px",{"2":{"117":1}}],["12",{"2":{"33":1}}],["15",{"0":{"43":1},"1":{"44":1,"45":1},"2":{"26":1}}],["16gb",{"2":{"16":1}}],["10",{"0":{"38":2},"1":{"39":2},"2":{"16":1,"21":1,"33":2}}],["100vw",{"2":{"76":1}}],["10000",{"2":{"69":1}}],["1000",{"2":{"22":1}}],["100",{"2":{"14":2,"34":1,"76":1}}],["1",{"0":{"43":1},"1":{"44":1,"45":1},"2":{"4":6,"15":2,"17":1,"21":2,"22":2,"33":2,"34":1,"71":1,"72":1,"76":1,"117":2}}],["nice",{"2":{"79":1}}],["nix",{"2":{"16":3}}],["npx",{"2":{"17":2}}],["npm",{"2":{"10":1,"16":4,"17":1,"21":1,"26":1,"68":1,"91":1}}],["nls",{"2":{"16":2}}],["nx",{"2":{"16":2}}],["nvmrc",{"2":{"16":2}}],["number",{"2":{"21":1,"23":1,"25":1,"105":1}}],["numbers",{"2":{"21":1,"91":1}}],["nuxt",{"2":{"16":2,"67":1}}],["null",{"2":{"16":1}}],["n",{"2":{"8":1,"16":1,"33":1}}],["naming",{"2":{"68":1}}],["namely",{"2":{"22":1}}],["named",{"2":{"15":2}}],["name=",{"2":{"13":1,"73":1,"112":4}}],["names",{"2":{"4":1,"13":1,"73":1}}],["name",{"2":{"4":1,"8":13,"12":2,"13":3,"14":4,"15":8,"55":1,"61":1,"66":1,"73":1,"87":1,"88":1,"103":1,"114":2}}],["navbar",{"0":{"109":1},"1":{"110":1,"111":1},"2":{"61":2,"102":1,"109":1}}],["navigationdrawer",{"2":{"61":1,"109":1}}],["navigation",{"0":{"77":1},"1":{"78":1,"79":1},"2":{"61":1,"68":1,"77":1,"102":2,"108":1}}],["native",{"2":{"24":1,"34":3,"114":1}}],["nativetabs",{"2":{"16":1}}],["nature",{"2":{"18":1}}],["naturally",{"2":{"8":1,"22":1}}],["nginx",{"2":{"3":1,"9":1}}],["next",{"2":{"16":2,"33":1}}],["nest",{"2":{"16":2}}],["nesting",{"2":{"16":2}}],["nested",{"2":{"12":1}}],["netlify",{"2":{"9":1,"16":2}}],["networks",{"2":{"72":1,"102":1}}],["network",{"2":{"3":1}}],["newitem",{"2":{"24":3}}],["news",{"2":{"22":2}}],["newer",{"2":{"17":1}}],["new",{"0":{"41":1,"44":1,"47":1},"2":{"8":5,"15":2,"16":1,"24":2,"26":2,"32":1,"33":1,"34":1,"55":1,"69":1,"89":1,"94":1,"105":1,"115":1,"117":1}}],["nevertheless",{"2":{"67":1}}],["never",{"2":{"5":1,"16":1,"33":1}}],["needs",{"2":{"11":1,"13":1,"22":1,"23":1,"32":1,"34":1}}],["needed",{"2":{"8":1,"13":1,"21":1,"25":1,"64":2,"68":1,"88":1,"91":1,"94":1,"116":1}}],["need",{"2":{"3":1,"5":1,"8":2,"9":1,"10":2,"11":2,"12":1,"13":1,"17":4,"21":1,"22":1,"23":1,"24":3,"25":3,"26":1,"33":3,"34":3,"67":2,"88":1,"94":1}}],["necessary",{"2":{"2":1,"8":1,"16":1,"23":1,"33":1,"34":1,"64":2,"67":1,"95":1}}],["novice",{"2":{"67":1,"68":1}}],["non",{"2":{"22":2,"33":1,"58":1}}],["nontrivial",{"2":{"16":1}}],["normal",{"2":{"13":1,"16":1,"34":2}}],["now",{"2":{"9":1,"33":1}}],["nosql",{"2":{"3":1,"22":1}}],["nodemon",{"2":{"16":4}}],["node",{"2":{"3":2,"8":2,"16":7,"17":3,"33":1,"34":1}}],["no",{"2":{"2":1,"15":1,"16":1,"21":1,"22":4,"26":1,"34":1,"61":8,"66":4}}],["nothing",{"2":{"32":1}}],["notified",{"2":{"24":1}}],["notificationinterceptor",{"2":{"1":2,"72":2}}],["notebook",{"2":{"69":3,"78":1,"106":1,"108":1}}],["notes",{"2":{"34":1}}],["note",{"2":{"17":1,"32":1,"33":1}}],["not",{"0":{"5":1},"2":{"1":1,"2":6,"3":3,"4":3,"5":1,"6":1,"15":1,"16":4,"20":1,"21":7,"22":7,"23":1,"24":4,"25":2,"26":2,"29":1,"32":1,"33":5,"34":7,"58":1,"64":3,"67":1,"88":1,"115":1}}],["x",{"2":{"21":2,"76":1}}],["xshell",{"2":{"16":1}}],["xss",{"2":{"2":1}}],["xo",{"2":{"16":4}}],["xmlhttprequest",{"2":{"34":1}}],["xml",{"2":{"16":4}}],["xaml",{"2":{"16":2}}],["xdv",{"2":{"16":1}}],["x3c",{"2":{"12":20,"13":4,"14":8,"16":1,"32":4,"69":10,"73":7,"89":5,"93":8,"100":8,"112":15}}],["x26",{"2":{"8":4,"16":1,"69":2}}],["xhr",{"2":{"1":1,"71":1}}],["235",{"2":{"117":4}}],["255",{"2":{"117":2}}],["28",{"0":{"40":1},"1":{"41":1,"42":1}}],["22+",{"2":{"16":1}}],["29",{"2":{"16":1}}],["245",{"2":{"117":3}}],["24",{"0":{"36":1},"1":{"37":1},"2":{"14":2}}],["26",{"2":{"13":1}}],["20+",{"2":{"59":1}}],["2022",{"2":{"58":1}}],["2023",{"0":{"36":1,"38":1,"40":1,"43":1,"46":1},"1":{"37":1,"39":1,"41":1,"42":1,"44":1,"45":1,"47":1},"2":{"16":1,"33":1,"58":1}}],["2016",{"2":{"33":1}}],["20~30",{"2":{"17":1}}],["200",{"2":{"16":1,"34":1,"100":1}}],["20",{"2":{"8":1,"22":1,"33":1}}],["2",{"0":{"40":1},"1":{"41":1,"42":1},"2":{"2":1,"4":1,"16":3,"21":5,"22":2,"24":1,"32":1,"33":3,"34":1,"52":2,"72":1,"117":2}}],["gave",{"2":{"34":1}}],["gatsby",{"2":{"16":5}}],["gateway",{"2":{"3":1}}],["gql",{"2":{"16":2}}],["gz",{"2":{"16":1}}],["goes",{"2":{"16":1,"27":1}}],["governance",{"2":{"16":1}}],["go",{"2":{"16":6,"33":1,"67":1,"87":1}}],["good",{"2":{"3":1,"16":1,"19":1,"20":1,"22":1,"23":1,"24":1,"25":3,"26":1,"28":1,"32":2,"33":3}}],["googletagmanager",{"2":{"89":1}}],["googleanalytics",{"2":{"61":1}}],["google",{"0":{"89":1,"112":1},"2":{"2":8,"3":4,"9":1,"21":1,"26":1,"33":1,"34":3,"61":1,"66":1,"75":1,"89":2,"102":2}}],["gutter",{"2":{"117":1}}],["guidelines",{"0":{"64":1}}],["guide",{"2":{"33":2}}],["guides",{"2":{"16":1}}],["gui",{"2":{"24":1}}],["gulp",{"2":{"16":2}}],["guest",{"2":{"2":1}}],["glass",{"2":{"33":1}}],["gls",{"2":{"16":1}}],["glossary",{"0":{"56":1}}],["glo",{"2":{"16":1}}],["glob",{"2":{"14":1,"15":2,"73":1}}],["global",{"2":{"11":1,"22":7,"25":1,"68":1,"104":1}}],["glg",{"2":{"16":1}}],["glitches",{"2":{"16":1}}],["gtag",{"2":{"89":5}}],["gt",{"2":{"8":1,"16":1,"34":2}}],["gh",{"2":{"8":2,"87":3}}],["gitpod",{"2":{"16":2}}],["gitmessage",{"2":{"16":1}}],["gitmodules",{"2":{"16":1}}],["gitattributes",{"2":{"16":1}}],["gitlens",{"2":{"16":4}}],["gitlab",{"2":{"6":1,"16":2}}],["gitignore",{"2":{"8":1,"16":1}}],["githubactionsgithubpagesworkflow",{"2":{"61":1}}],["githubpullrequests",{"2":{"16":1}}],["githubissues",{"2":{"16":1}}],["github",{"0":{"8":1,"86":2},"1":{"87":2,"88":2},"2":{"6":2,"8":23,"9":3,"16":7,"33":2,"41":1,"55":1,"61":2,"63":1,"66":1,"68":1,"87":6,"102":3,"105":1}}],["git",{"2":{"6":1,"8":3,"10":1,"16":10,"63":2}}],["gives",{"2":{"5":2,"16":1,"21":1}}],["given",{"2":{"3":1}}],["give",{"2":{"2":2,"24":1,"34":1}}],["grpc",{"2":{"71":1}}],["grid",{"2":{"30":1,"52":2}}],["growth",{"2":{"28":1}}],["grown",{"2":{"21":1,"91":1}}],["grunt",{"2":{"16":2}}],["greateŕl",{"2":{"24":1}}],["great",{"2":{"16":1,"17":1}}],["greatly",{"2":{"5":1,"10":1,"67":1,"115":1}}],["gray",{"2":{"69":1}}],["graphql",{"2":{"71":1}}],["graph",{"2":{"61":1,"66":1,"75":1,"102":1,"112":1}}],["graphgl",{"2":{"5":1}}],["grains",{"2":{"33":1}}],["grab",{"2":{"8":1}}],["grant",{"2":{"4":1}}],["granted",{"2":{"4":2}}],["granular",{"2":{"2":1}}],["g",{"2":{"3":1,"13":1,"16":1,"22":1,"34":1,"64":1,"89":1}}],["gmail",{"2":{"2":1,"59":1}}],["gemfile",{"2":{"16":2}}],["generation",{"2":{"34":2}}],["generating",{"2":{"17":1,"34":1}}],["generated",{"2":{"34":2}}],["generate",{"2":{"8":1,"9":1,"34":1}}],["generates",{"2":{"2":2,"3":1,"34":1}}],["generalize",{"2":{"68":1}}],["generally",{"2":{"58":1}}],["general",{"2":{"13":1,"16":3,"33":1,"34":1,"56":1,"68":2}}],["generalroutes",{"2":{"12":2}}],["genuinely",{"2":{"12":1}}],["getbestblockhash",{"2":{"72":1}}],["getting",{"0":{"60":1},"1":{"61":1,"62":1,"63":1}}],["getters",{"2":{"22":2}}],["gettoken",{"2":{"1":1}}],["getimageurl",{"2":{"14":2,"15":2}}],["getitem",{"2":{"8":1}}],["getsvgicon",{"2":{"14":3,"15":2}}],["gets",{"2":{"2":1,"13":2,"16":1}}],["get",{"2":{"1":1,"2":1,"3":1,"4":1,"6":1,"9":2,"15":2,"24":1,"33":1,"34":2,"71":1}}],["getuserdata",{"2":{"1":2}}],["b",{"2":{"21":2,"25":1}}],["bzl",{"2":{"16":1}}],["bbl",{"2":{"16":1}}],["blank",{"2":{"116":1}}],["blame",{"2":{"16":3}}],["blg",{"2":{"16":1}}],["bloating",{"2":{"75":1}}],["blocks",{"2":{"68":2}}],["block",{"2":{"16":1}}],["bloc",{"2":{"16":1}}],["blog",{"2":{"2":1,"66":1,"67":1,"68":1}}],["bit",{"2":{"22":1,"24":1,"26":1,"34":2}}],["bidirectional",{"2":{"5":1}}],["big",{"2":{"2":1,"24":1,"33":1}}],["bunch",{"2":{"21":1,"22":1,"91":1}}],["bundleconfig",{"2":{"16":2}}],["bundle",{"2":{"3":1,"17":4,"21":1,"26":1,"32":1,"95":1}}],["buying",{"2":{"9":1}}],["built",{"2":{"8":1,"22":1,"34":1}}],["builds",{"2":{"17":1}}],["builders",{"2":{"17":1}}],["builder",{"2":{"17":5,"64":1,"66":1,"68":1}}],["building",{"2":{"9":1,"17":1,"68":1,"102":1}}],["builddata",{"2":{"8":4}}],["build",{"0":{"17":1},"2":{"6":1,"8":12,"16":4,"17":3,"23":1,"68":1,"87":2,"95":1,"102":1}}],["bus",{"2":{"5":1}}],["business",{"2":{"3":1,"22":7,"24":1,"66":1,"67":3,"68":1,"71":1}}],["button>",{"2":{"93":1}}],["button",{"2":{"25":1,"32":1,"93":2}}],["buttons",{"2":{"25":1}}],["but",{"2":{"2":5,"3":3,"4":1,"5":1,"6":1,"8":1,"12":1,"13":1,"16":1,"21":4,"22":4,"23":1,"24":4,"25":2,"26":2,"32":1,"33":6,"34":6,"63":1,"64":2,"67":1,"72":1,"79":1,"91":1,"108":1}}],["border",{"2":{"69":1,"117":1}}],["born",{"2":{"34":1}}],["body",{"2":{"69":1,"116":1}}],["box",{"2":{"68":1,"69":4}}],["bottom",{"2":{"102":1}}],["bot",{"2":{"34":2}}],["bots",{"2":{"34":2}}],["bother",{"2":{"3":1}}],["both",{"2":{"3":2,"5":1,"8":2,"10":1,"16":1,"17":1,"22":1,"28":1,"33":4,"58":2,"94":1,"105":1}}],["book",{"2":{"33":6,"58":1}}],["booting",{"2":{"16":1}}],["boilerplates",{"2":{"68":1}}],["boilerplate",{"2":{"24":1,"67":1}}],["bound",{"2":{"22":3}}],["boundary",{"2":{"16":1}}],["bower",{"2":{"16":3}}],["bonuses",{"2":{"2":1}}],["broken",{"2":{"33":1}}],["browserslist",{"2":{"16":2}}],["browsers",{"2":{"9":1,"21":1,"34":1}}],["browser",{"2":{"2":3,"4":5,"8":1,"13":1,"16":1,"17":1,"23":1,"34":5,"62":1,"105":1,"114":1,"115":1}}],["brings",{"2":{"32":1}}],["bring",{"2":{"22":1,"25":1}}],["brand",{"2":{"116":1}}],["branch",{"2":{"8":5,"34":1,"87":6}}],["branches",{"2":{"8":2,"22":1}}],["bracketpairs",{"2":{"16":1}}],["breakpoint",{"2":{"69":1}}],["break",{"2":{"2":1,"24":1}}],["bar",{"2":{"102":1}}],["bad",{"2":{"21":2,"22":2,"32":2}}],["babel",{"2":{"16":10}}],["babelrc",{"2":{"16":10}}],["bazelproject",{"2":{"16":1}}],["bazelignore",{"2":{"16":1}}],["bazelrc",{"2":{"16":1}}],["bazel",{"2":{"16":3}}],["bandle",{"2":{"13":2}}],["banner",{"2":{"13":1}}],["bash$",{"2":{"61":1}}],["bashpnpm",{"2":{"61":1}}],["basics",{"2":{"33":1}}],["basic",{"2":{"25":1,"33":3}}],["basically",{"2":{"3":1,"22":1}}],["basis",{"2":{"22":1}}],["basetoggle",{"2":{"103":1}}],["baseurl",{"2":{"72":1}}],["baseinput",{"2":{"27":1}}],["baseicon",{"0":{"14":1,"73":1},"2":{"13":2,"17":2,"73":5,"103":1}}],["basebutton",{"2":{"27":1,"32":2}}],["basebuttonandstringhelpers",{"2":{"10":1}}],["base",{"0":{"88":1},"2":{"14":1,"88":2,"117":1}}],["base64",{"2":{"13":1}}],["based",{"2":{"2":2,"8":1,"21":2}}],["baas",{"2":{"3":6}}],["battery",{"2":{"2":1}}],["backers",{"2":{"16":1}}],["backend",{"0":{"0":1,"3":1},"1":{"1":1},"2":{"1":4,"2":6,"3":8,"4":6,"5":2,"9":1,"23":1,"24":3,"33":2,"34":1,"39":1,"67":1,"71":2,"72":2,"102":1}}],["background",{"2":{"15":1}}],["backroute",{"2":{"12":1}}],["backups",{"2":{"8":2}}],["backup",{"2":{"8":9}}],["back",{"2":{"2":3,"3":1,"5":1,"16":1,"24":1,"32":1,"33":1}}],["bedroom",{"2":{"34":1}}],["benefit",{"2":{"34":1}}],["believed",{"2":{"33":1}}],["belong",{"2":{"22":1}}],["below",{"2":{"4":1,"55":1}}],["beautiful",{"2":{"32":1,"34":1}}],["besides",{"2":{"26":1,"33":1}}],["best",{"0":{"12":1},"2":{"2":1,"12":2,"15":1,"16":2,"33":5,"56":1,"58":1,"67":3,"68":2}}],["beyond",{"2":{"24":1}}],["better",{"2":{"24":1,"29":1,"33":2,"34":1,"94":1}}],["between",{"2":{"4":1,"12":1,"22":2,"24":1,"33":2,"34":1}}],["behavior",{"2":{"24":1}}],["behind",{"2":{"24":1}}],["beforehand",{"2":{"33":2}}],["before",{"2":{"13":1,"33":1,"34":1}}],["been",{"2":{"13":1,"21":1,"24":1,"34":2,"116":1}}],["beginners",{"2":{"16":1,"58":1}}],["beginner",{"2":{"5":1,"33":1}}],["becoming",{"2":{"67":1}}],["become",{"2":{"22":1,"24":1,"26":1,"32":2,"33":1}}],["becomes",{"2":{"4":1,"22":2}}],["became",{"2":{"22":2}}],["because",{"2":{"2":1,"5":1,"8":1,"21":1,"22":1,"34":1}}],["be",{"2":{"2":2,"3":2,"8":9,"9":4,"10":2,"12":3,"13":3,"16":2,"21":3,"22":9,"23":4,"24":9,"25":1,"28":1,"29":2,"32":1,"33":6,"34":6,"58":1,"61":2,"63":2,"64":3,"67":2,"68":2,"69":2,"71":1,"78":1,"88":1,"91":1,"108":1,"114":1}}],["being",{"2":{"2":1}}],["bypass",{"2":{"34":1}}],["by",{"0":{"103":1},"2":{"2":5,"3":4,"4":5,"8":1,"12":1,"13":3,"16":1,"17":1,"21":3,"22":4,"23":1,"24":3,"32":1,"33":3,"34":8,"61":1,"78":1,"79":1,"91":2,"93":1,"102":1,"108":1,"116":1,"117":2}}],["jl65gwrnqqq",{"2":{"89":1}}],["jl65gwrnqq",{"2":{"89":1}}],["jumping",{"2":{"76":1}}],["justification",{"0":{"67":1}}],["justifications",{"2":{"25":1}}],["just",{"2":{"2":2,"12":1,"16":1,"21":1,"22":3,"32":2,"33":1,"64":1,"67":1}}],["j",{"2":{"17":1}}],["jest",{"2":{"16":10,"23":1}}],["jenkins",{"2":{"6":1,"16":2}}],["jpg",{"2":{"15":1}}],["jpeg",{"2":{"9":1}}],["jasmine",{"2":{"16":10}}],["java",{"2":{"16":1,"59":1}}],["javascript",{"0":{"50":1},"2":{"3":1,"13":1,"16":2,"17":2,"18":1,"21":4,"22":2,"24":1,"25":1,"32":3,"33":4,"34":4,"50":1,"64":1,"69":1,"95":1}}],["jamesives",{"2":{"8":3,"87":1}}],["job",{"2":{"24":2}}],["jobs",{"2":{"8":2}}],["john",{"2":{"2":2,"91":1}}],["jwt",{"2":{"2":4,"56":2,"105":1}}],["jslint",{"2":{"16":2}}],["jsconfig",{"2":{"16":11}}],["jsconst",{"2":{"8":1,"15":1,"21":2}}],["jsx",{"2":{"16":3}}],["jsexport",{"2":{"12":1,"88":1}}],["jsonrpc",{"2":{"61":1,"72":6}}],["json5",{"2":{"16":1}}],["jsonc",{"2":{"16":1}}],["jsonplaceholder",{"2":{"3":1,"71":1}}],["json",{"0":{"72":1,"114":1},"2":{"1":1,"3":1,"5":7,"8":4,"13":1,"15":4,"16":50,"17":4,"33":1,"34":2,"61":5,"64":1,"71":1,"72":6,"93":1,"94":1,"102":1,"114":2}}],["jsimport",{"2":{"1":3,"13":1,"17":1,"71":1,"72":1,"93":1}}],["js",{"0":{"15":1},"2":{"1":4,"2":1,"3":3,"9":1,"11":1,"13":4,"14":1,"15":1,"16":21,"17":3,"18":2,"20":1,"21":3,"22":1,"24":4,"25":1,"33":4,"34":1,"58":1,"68":1,"69":1,"71":1,"72":1,"89":3,"115":3}}],["snippets",{"2":{"75":1,"102":1}}],["snickerbockers",{"2":{"8":2}}],["skeleton",{"2":{"67":1}}],["skill",{"2":{"32":1,"33":1}}],["sd",{"2":{"59":1}}],["sw",{"2":{"34":1,"56":1}}],["swagger",{"2":{"33":1}}],["switch",{"2":{"27":1,"71":1}}],["switching",{"2":{"5":1,"103":1,"117":2}}],["swiper",{"2":{"20":1}}],["slidingheader",{"0":{"100":1}}],["slider",{"0":{"20":1},"2":{"20":1}}],["sleeping",{"2":{"34":1}}],["slowing",{"2":{"25":1}}],["slower",{"2":{"22":2}}],["slot",{"2":{"11":1}}],["svelte",{"2":{"16":3,"24":2}}],["svgs",{"2":{"17":1}}],["svgo",{"2":{"16":10}}],["svgresources",{"2":{"15":4}}],["svg",{"2":{"14":2,"15":2,"16":2,"73":1}}],["syntax",{"2":{"64":1}}],["synthesizing",{"2":{"22":1}}],["synctex",{"2":{"16":1}}],["systems",{"2":{"24":2,"25":1}}],["system",{"2":{"2":4,"24":2,"32":1,"71":1}}],["smartphone",{"2":{"34":2}}],["smaller",{"2":{"24":1,"95":1}}],["small",{"2":{"2":2,"3":1,"13":1,"18":1,"22":1,"32":1,"34":1}}],["smoothscrolling",{"2":{"16":1}}],["sftp",{"2":{"16":1}}],["sfc",{"2":{"16":2,"24":1}}],["src=",{"2":{"13":3,"14":1,"89":1}}],["src",{"2":{"13":1,"17":2,"75":1,"93":1}}],["s3",{"2":{"9":1}}],["ssg",{"0":{"34":1},"2":{"34":3}}],["ssd",{"2":{"16":1}}],["ssrs",{"2":{"34":1}}],["ssr",{"0":{"34":1},"2":{"16":1,"22":2,"34":8}}],["ss06",{"2":{"16":1}}],["ss03",{"2":{"16":1}}],["ss02",{"2":{"16":1}}],["ss01",{"2":{"16":1}}],["ssl",{"2":{"9":2}}],["ssh",{"2":{"8":14,"16":2}}],["sso",{"2":{"2":2}}],["sql",{"2":{"5":1,"8":1,"16":1,"22":2,"33":1}}],["sh$",{"2":{"61":1,"62":1,"63":1,"66":1}}],["sheet",{"0":{"48":1},"1":{"49":1,"50":1,"51":1,"52":1,"53":1,"54":1},"2":{"49":1,"50":1,"51":1,"52":4}}],["shell",{"2":{"10":2,"16":1,"34":1}}],["shnpx",{"2":{"17":1}}],["shpnpm",{"2":{"17":1}}],["shims",{"2":{"16":1}}],["sh",{"2":{"16":2}}],["shrinkwrap",{"2":{"16":2}}],["shadow",{"2":{"25":1}}],["shallowref",{"2":{"21":2}}],["shaking",{"2":{"15":1,"26":1}}],["shared",{"2":{"11":1,"16":1,"22":1}}],["share",{"2":{"11":1,"12":1,"22":1}}],["sharing",{"2":{"4":1}}],["showcase",{"2":{"68":1,"105":1}}],["show",{"2":{"34":1}}],["showed",{"2":{"33":1,"34":1}}],["shows",{"2":{"22":1}}],["showsuggestionsassnippets",{"2":{"16":1}}],["showdocumentation",{"2":{"16":1}}],["showing",{"2":{"8":1}}],["shown",{"2":{"4":1,"12":1,"21":1,"24":1}}],["should",{"2":{"2":3,"3":1,"8":1,"13":1,"16":1,"21":2,"22":4,"23":1,"24":2,"28":1,"33":1,"61":1,"64":2,"67":1,"68":1,"89":1,"112":1}}],["shortens",{"2":{"32":1}}],["short",{"2":{"2":1,"33":1,"114":1}}],["scope",{"2":{"114":1}}],["scoped>",{"2":{"14":1}}],["scaffolder",{"2":{"66":1,"68":1}}],["scaffolded",{"2":{"64":1}}],["scaffold",{"2":{"61":1,"68":1}}],["scaffolding",{"0":{"65":1},"1":{"66":1,"67":1},"2":{"61":1,"67":1,"68":1}}],["scalable",{"2":{"24":1}}],["school",{"2":{"33":1}}],["screens",{"2":{"79":1}}],["screenwidthfactor",{"2":{"69":1}}],["screen",{"0":{"116":1},"2":{"34":1,"61":1,"66":2,"68":1,"75":1,"76":2,"78":1,"102":2,"114":1,"116":4}}],["scrollbar",{"2":{"76":1}}],["scroll",{"2":{"21":1}}],["scrolls",{"2":{"21":1,"100":1}}],["script>",{"2":{"14":1,"69":1,"73":1,"89":3,"93":1}}],["scripts",{"2":{"8":1,"23":1,"34":1,"105":1}}],["script",{"0":{"86":1},"1":{"87":1,"88":1},"2":{"3":2,"8":2,"14":1,"16":1,"21":1,"34":1,"64":1,"69":1,"73":1,"89":1,"93":1,"102":1}}],["scmitem",{"2":{"16":1}}],["scmgroupinline",{"2":{"16":1}}],["scmgroup",{"2":{"16":1}}],["scm",{"2":{"16":2}}],["scss",{"2":{"14":1,"16":1,"64":1,"69":2,"117":1}}],["scenario",{"2":{"2":1,"12":1}}],["sans",{"2":{"117":1}}],["sandbox",{"2":{"17":1}}],["sandboxes",{"2":{"16":1}}],["saw",{"2":{"34":1}}],["says",{"2":{"25":1}}],["say",{"2":{"25":1}}],["sass",{"2":{"16":1}}],["sample",{"2":{"8":2}}],["same",{"2":{"2":2,"5":2,"10":3,"16":1,"17":1,"21":1,"22":4,"23":2,"24":1,"25":1,"27":1,"67":1,"72":1,"87":1,"91":1}}],["saved",{"2":{"8":1}}],["save",{"2":{"2":1,"3":1,"16":1,"26":1,"32":1}}],["saves",{"2":{"2":1,"8":1,"17":1}}],["saving",{"2":{"2":1}}],["sun",{"2":{"59":1}}],["suffer",{"2":{"29":1}}],["sufficient",{"2":{"18":1,"21":1}}],["summary",{"0":{"66":1}}],["sum",{"2":{"16":2}}],["support",{"2":{"21":2,"22":3,"25":1,"33":1,"91":1,"103":1,"117":1}}],["supports",{"2":{"17":1}}],["supported",{"2":{"15":1,"21":1,"22":1,"26":1,"115":1}}],["supabase",{"2":{"3":2,"33":1}}],["success",{"2":{"10":1}}],["such",{"2":{"2":1,"3":1,"4":1,"10":1,"11":1,"22":1,"34":1,"64":1}}],["sudo",{"2":{"8":3}}],["subjective",{"2":{"58":1}}],["substring",{"2":{"15":2}}],["subdirectory",{"2":{"10":1,"13":1}}],["subdirectories",{"2":{"8":1}}],["subdomains",{"2":{"9":1}}],["submodules",{"2":{"8":4,"10":2}}],["suggestselection",{"2":{"16":1}}],["suggest",{"2":{"5":1,"33":1,"55":1}}],["suitable",{"2":{"3":1,"10":2,"16":1,"22":1,"24":1,"34":2}}],["suspicious",{"2":{"2":1}}],["sure",{"2":{"2":1,"33":1}}],["sort",{"2":{"22":1}}],["sophisticated",{"2":{"16":1}}],["social",{"2":{"13":1,"102":1}}],["solving",{"2":{"67":3}}],["solvery",{"2":{"33":1}}],["solve",{"2":{"8":1,"13":1,"22":1,"33":1}}],["solid",{"2":{"18":1,"69":1}}],["solutions",{"2":{"34":1,"59":1,"68":1}}],["solution",{"2":{"3":2,"4":2,"5":1,"8":1,"12":1,"16":1,"34":1,"67":1}}],["software",{"2":{"5":1,"9":1,"23":1,"24":1,"31":1}}],["source",{"2":{"4":2,"8":1,"16":4,"33":2,"57":1,"87":1}}],["sources",{"2":{"4":2,"33":1,"58":1}}],["sooner",{"2":{"26":1}}],["soon",{"2":{"2":1}}],["somehow",{"2":{"34":1}}],["somearr",{"2":{"24":4}}],["someone",{"2":{"23":1,"34":1}}],["someimage",{"2":{"13":1}}],["sometimes",{"2":{"10":2,"22":1,"32":1}}],["something",{"2":{"2":1,"22":1,"23":1,"25":1,"33":1}}],["somefunc",{"2":{"3":1}}],["somewhere",{"2":{"3":1}}],["some",{"2":{"2":1,"3":2,"9":1,"12":2,"16":1,"19":1,"21":2,"22":3,"26":1,"27":1,"32":1,"33":3,"34":3,"67":1}}],["so",{"2":{"2":3,"8":1,"9":2,"16":1,"20":1,"21":1,"22":2,"24":1,"33":1,"34":3,"64":1,"67":1,"88":1,"94":2}}],["study",{"2":{"33":1}}],["studying",{"2":{"33":1}}],["student",{"2":{"33":1}}],["stylized",{"2":{"32":1}}],["styling",{"2":{"24":1,"27":1,"68":1}}],["stylus",{"2":{"21":1}}],["styles",{"2":{"32":4}}],["stylelint",{"2":{"16":4}}],["styleci",{"2":{"16":2}}],["style>",{"2":{"14":1}}],["style",{"2":{"14":1,"16":1,"32":1,"33":2,"56":1,"68":1,"98":1,"99":1}}],["style=",{"2":{"14":2}}],["step",{"2":{"34":1}}],["steps",{"2":{"2":1,"8":2}}],["steate",{"2":{"22":1}}],["steit",{"2":{"21":1,"22":1}}],["storage",{"2":{"22":1}}],["storages",{"2":{"22":2}}],["story",{"2":{"16":1}}],["storefront",{"2":{"67":1}}],["stored",{"2":{"33":1,"117":1}}],["stores",{"2":{"22":4,"42":1,"44":1}}],["store",{"2":{"2":2,"8":1,"10":1,"11":1,"22":8,"34":2,"66":1,"67":1,"68":1}}],["stick",{"2":{"32":1}}],["sticky",{"2":{"16":1,"97":1,"98":1,"99":1}}],["stickyscroll",{"2":{"16":1}}],["still",{"2":{"12":1,"33":1,"34":1}}],["structured",{"2":{"34":1}}],["structuring",{"2":{"28":1}}],["strategy",{"2":{"115":1}}],["strategies",{"2":{"33":1}}],["straightforward",{"2":{"12":1}}],["strengthen",{"2":{"116":1}}],["streets",{"2":{"33":1}}],["stretch",{"2":{"25":1}}],["strong",{"2":{"15":1}}],["string",{"2":{"2":1,"4":1,"13":1,"14":6,"21":1}}],["stand",{"2":{"24":1}}],["standalone",{"2":{"3":1,"24":1,"114":1}}],["standards",{"0":{"30":1},"2":{"32":1}}],["standard",{"2":{"2":2,"4":1,"5":1,"18":1,"21":2,"33":1,"72":1,"106":1}}],["stack",{"2":{"22":1,"59":1}}],["stackblitz",{"2":{"16":3}}],["stage",{"2":{"25":1}}],["staged",{"2":{"16":2}}],["staging",{"2":{"8":5}}],["statistics",{"2":{"17":1}}],["static",{"2":{"9":1,"13":1,"25":1,"34":3}}],["states",{"2":{"22":2}}],["stateful",{"2":{"22":1}}],["state",{"0":{"22":1},"2":{"16":1,"22":13,"24":1,"25":1}}],["stash",{"2":{"16":3}}],["starter",{"2":{"67":1}}],["started",{"0":{"60":1},"1":{"61":1,"62":1,"63":1}}],["startup",{"2":{"23":1,"102":1,"105":1,"116":1}}],["start",{"2":{"3":1,"5":1,"33":1,"34":1,"67":1,"114":1}}],["s",{"2":{"2":4,"3":2,"5":1,"8":1,"13":1,"14":1,"16":3,"17":2,"18":1,"22":5,"24":4,"25":2,"32":1,"33":3,"34":3,"56":3,"64":1,"67":1,"71":2}}],["splashscreen",{"2":{"61":1}}],["splash",{"0":{"116":1},"2":{"61":1,"66":2,"68":1,"75":1,"102":2,"116":4}}],["split",{"2":{"22":1}}],["splide",{"2":{"20":1}}],["spite",{"2":{"33":1}}],["spinning",{"2":{"16":1}}],["spread",{"2":{"22":1}}],["sponsors",{"2":{"16":1}}],["spend",{"2":{"16":1,"29":1}}],["spec",{"2":{"16":1}}],["specifying",{"2":{"61":1}}],["specify",{"2":{"24":1,"103":1}}],["specified",{"2":{"4":1,"94":1}}],["specifications",{"2":{"34":1}}],["specification",{"2":{"33":1,"72":1}}],["specifically",{"2":{"4":1}}],["specific",{"2":{"3":1,"4":1,"5":1,"12":1,"64":3,"67":1,"68":3}}],["specialized",{"2":{"4":1}}],["special",{"2":{"4":1,"5":1}}],["speeds",{"2":{"32":1}}],["speed",{"2":{"13":1,"25":2,"32":1,"34":1}}],["speaking",{"2":{"2":1,"4":1,"24":1,"25":1}}],["space",{"2":{"17":1}}],["spaces",{"2":{"4":1}}],["spa",{"0":{"34":1},"2":{"2":1,"34":10,"68":1}}],["silent",{"2":{"61":1}}],["since",{"2":{"34":1}}],["singleton",{"2":{"22":1}}],["singlequote",{"2":{"16":1}}],["singleclick",{"2":{"16":1}}],["single",{"2":{"2":1,"10":1,"24":1,"34":1}}],["situations",{"2":{"25":1}}],["situation",{"2":{"22":1,"24":1}}],["sites",{"2":{"3":1,"34":2}}],["site",{"2":{"2":7,"3":1,"4":3,"6":1,"8":17,"9":2,"21":2,"22":1,"23":1,"24":1,"25":2,"33":3,"34":5,"56":1,"67":1,"68":1,"87":1,"88":1,"91":3}}],["simulates",{"2":{"23":1}}],["similar",{"2":{"22":1,"24":1,"33":1,"34":1,"67":1,"79":1,"108":1}}],["simply",{"2":{"25":1}}],["simplified",{"2":{"34":1}}],["simplifies",{"2":{"5":1}}],["simplistically",{"2":{"24":1}}],["simplenavbar",{"0":{"110":1}}],["simpleheader",{"0":{"97":1}}],["simplefooter",{"0":{"81":1}}],["simpledrawer",{"0":{"78":1},"2":{"61":2,"79":1}}],["simpledialog",{"2":{"16":1}}],["simpler",{"2":{"21":1}}],["simple",{"2":{"1":1,"2":1,"6":1,"16":4,"21":1,"24":1,"33":1,"34":4,"68":1,"91":2,"97":1,"98":1,"113":1}}],["size=",{"2":{"13":1}}],["size",{"2":{"13":2,"14":5,"26":1}}],["sidebar",{"2":{"87":1,"106":2,"108":2}}],["sidebarlayout",{"2":{"12":2}}],["side",{"2":{"10":1,"12":2,"34":3,"115":1}}],["significantly",{"2":{"34":1}}],["significant",{"2":{"21":1,"24":1,"34":1}}],["signing",{"2":{"2":1}}],["sign",{"2":{"2":1}}],["serif",{"2":{"117":1}}],["serve",{"2":{"24":1}}],["server",{"2":{"1":1,"3":4,"4":8,"5":3,"6":1,"8":7,"9":2,"13":1,"16":6,"21":1,"33":1,"34":13,"91":1}}],["services",{"2":{"1":1,"2":1,"3":5,"10":1,"16":1,"22":1,"25":1,"33":1,"68":1,"71":1,"105":1}}],["service",{"0":{"1":1,"115":1},"2":{"1":1,"3":4,"5":1,"16":1,"24":1,"33":1,"34":4,"56":2,"61":1,"66":1,"71":1,"75":1,"102":1,"105":1,"113":1,"115":2}}],["seo",{"0":{"34":1},"2":{"34":1}}],["selected",{"2":{"61":1,"117":1}}],["select",{"2":{"32":2,"61":6,"87":2}}],["self",{"2":{"24":1,"32":1,"33":1}}],["semantic",{"2":{"30":1}}],["semi",{"2":{"16":1}}],["search",{"2":{"16":1,"34":4}}],["several",{"2":{"8":1,"10":1,"12":2,"22":3,"23":1,"24":1,"34":1}}],["seed",{"2":{"72":1}}],["seem",{"2":{"67":1}}],["see",{"2":{"2":1,"12":1,"13":1,"16":2,"17":2,"34":1,"114":1}}],["secrets",{"2":{"8":2}}],["section",{"2":{"4":1,"21":1,"30":1,"87":1}}],["sections",{"2":{"2":1}}],["seconds",{"2":{"16":1}}],["secondary",{"2":{"16":1}}],["second",{"2":{"2":2,"16":3,"100":2}}],["security",{"2":{"2":5,"16":1,"25":1}}],["sense",{"2":{"22":1}}],["sentry",{"2":{"16":2}}],["sent",{"2":{"2":2}}],["send",{"2":{"5":1,"24":1,"34":1}}],["sends",{"2":{"2":1,"34":1}}],["sending",{"2":{"1":1}}],["senior",{"2":{"2":1}}],["setlocale",{"2":{"93":2}}],["setlogoutcallback",{"2":{"1":1}}],["setoptions",{"2":{"72":1}}],["sets",{"2":{"72":1}}],["setsomearr",{"2":{"24":1}}],["setitem",{"2":{"8":1}}],["setup>",{"2":{"14":1}}],["setup",{"2":{"8":4,"16":1,"21":1,"22":1,"64":1,"69":1,"73":1,"93":1}}],["setters",{"2":{"22":1}}],["settings",{"2":{"8":1,"11":2,"16":1,"87":1}}],["setting",{"0":{"88":1},"2":{"4":1,"8":1,"16":1,"17":1,"21":4,"67":1,"91":1}}],["settokencallback",{"2":{"1":1}}],["set",{"2":{"1":1,"2":2,"9":1,"15":3,"16":1,"17":2,"24":1,"33":1,"34":1,"69":2,"108":1,"112":1}}],["setbaseurl",{"2":{"1":1}}],["separately",{"2":{"68":1}}],["separated",{"2":{"4":1}}],["separate",{"2":{"1":3,"4":2,"10":2,"16":1,"22":2,"24":1,"32":1,"33":1,"115":1}}],["dx",{"2":{"32":1,"56":1}}],["drop",{"2":{"87":1}}],["dropdown",{"2":{"32":1}}],["drawers",{"0":{"77":1},"1":{"78":1,"79":1},"2":{"77":1}}],["drawer",{"2":{"61":1,"68":1,"73":1,"102":2}}],["draw",{"2":{"31":1,"33":1}}],["dream",{"2":{"21":1}}],["driving",{"2":{"33":5}}],["driver",{"2":{"33":2}}],["drive",{"2":{"2":4,"33":1}}],["dribbling",{"2":{"22":1}}],["drilling",{"2":{"12":2}}],["dprint",{"2":{"16":4}}],["dlint",{"2":{"16":4}}],["dash",{"2":{"72":1}}],["days",{"2":{"29":1,"32":1,"33":2}}],["day",{"2":{"18":2,"21":2,"33":1}}],["dangerfile",{"2":{"16":2}}],["dart",{"2":{"16":6}}],["dark",{"2":{"16":1,"103":1,"117":2}}],["dates",{"2":{"18":1,"21":1,"91":1}}],["date=`date",{"2":{"8":1}}],["date",{"0":{"21":1},"2":{"8":9,"16":1,"17":1,"21":1,"89":1}}],["datalayer",{"2":{"89":3}}],["databases",{"2":{"16":1}}],["database",{"2":{"3":5,"16":1,"22":3}}],["data",{"2":{"2":2,"3":6,"4":3,"5":1,"8":2,"11":3,"12":3,"17":1,"21":2,"22":5,"24":7,"25":1,"33":2,"34":4,"114":1}}],["dynamically",{"2":{"13":1,"24":1,"34":1,"68":1,"69":1,"103":1}}],["dynamic",{"2":{"13":1,"34":1,"73":1,"105":1}}],["dt",{"2":{"8":1}}],["d",{"2":{"8":1,"16":16}}],["due",{"2":{"5":1,"24":1}}],["during",{"2":{"4":1,"21":1,"102":1,"116":1}}],["duplicate",{"2":{"2":1}}],["diagrams",{"2":{"31":1}}],["dialyzer",{"2":{"16":1}}],["dialogstyle",{"2":{"16":1}}],["dies",{"2":{"22":1}}],["did",{"2":{"21":1}}],["divider",{"2":{"117":1}}],["divided",{"2":{"10":1}}],["division",{"2":{"32":1}}],["div",{"2":{"14":1,"69":4}}],["div>",{"2":{"12":6,"69":4,"93":2}}],["dirname",{"2":{"17":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,"114":1}}],["direction",{"2":{"69":2}}],["direct",{"2":{"22":1}}],["directly",{"2":{"17":1,"21":2,"26":1,"27":1,"34":1}}],["directories",{"2":{"14":1}}],["directory",{"2":{"8":3,"61":2,"73":1,"75":1}}],["directs",{"2":{"2":1}}],["disappears",{"2":{"76":1}}],["disable",{"2":{"21":1}}],["discussion",{"2":{"22":1}}],["disk",{"2":{"16":1,"17":1}}],["displaying",{"2":{"22":2,"25":1}}],["displaylanguage",{"2":{"16":1}}],["display",{"2":{"11":1,"13":2,"34":1,"69":1,"114":1}}],["dispatch",{"2":{"8":2}}],["distribution",{"2":{"34":1}}],["distributedfooter",{"0":{"85":1}}],["distributed",{"2":{"34":1,"68":1}}],["dist",{"2":{"8":2,"13":1,"16":1}}],["diffeditor",{"2":{"16":1}}],["differing",{"2":{"22":1}}],["differs",{"2":{"4":1}}],["difference",{"2":{"21":1,"22":1,"24":1,"33":1}}],["differences",{"2":{"2":1,"24":1}}],["differently",{"2":{"17":1,"34":1}}],["different",{"2":{"2":2,"3":1,"11":1,"15":2,"17":1,"21":1,"22":1,"23":1,"24":3,"25":2,"34":1,"100":1,"104":1,"105":3,"115":1}}],["diffdecorationsgutterwidth",{"2":{"16":1}}],["difficulties",{"2":{"5":1}}],["difficult",{"2":{"2":1,"33":1}}],["dozens",{"2":{"16":1,"17":1}}],["down",{"2":{"11":1,"24":1,"25":1,"58":1,"87":1,"100":1}}],["downloading",{"2":{"21":1,"91":1}}],["downloaded",{"2":{"13":1,"34":1}}],["download",{"2":{"8":1,"33":1}}],["don",{"2":{"8":1,"12":1,"13":1,"24":1,"26":2,"27":1,"34":2,"88":1,"94":1}}],["done",{"2":{"2":2,"23":1,"29":1,"64":1,"75":1}}],["document",{"0":{"31":1},"2":{"12":1,"32":1,"33":1}}],["documentation",{"2":{"8":1,"12":2,"13":1,"22":1,"31":1,"33":3,"34":1,"56":1,"58":1,"67":1}}],["docs",{"2":{"8":1,"9":1}}],["dockerignore",{"2":{"16":1}}],["dockerfile",{"2":{"16":2}}],["docker",{"0":{"7":1},"2":{"16":2}}],["domains",{"2":{"4":1}}],["domain",{"2":{"4":6,"9":4,"33":1,"88":2,"112":1}}],["do",{"2":{"3":3,"4":1,"9":1,"16":1,"17":1,"21":1,"22":2,"23":1,"24":2,"25":1,"26":1,"28":1,"29":1,"32":1,"33":4,"34":2,"64":1,"117":1}}],["doe",{"2":{"2":2}}],["doesn",{"2":{"3":1,"16":2,"24":1,"26":1}}],["does",{"2":{"1":1,"2":4,"4":1,"16":2,"21":3,"22":1,"24":1,"34":1,"58":1,"115":1}}],["degree",{"2":{"64":1}}],["dead",{"2":{"34":1}}],["debounce",{"2":{"26":1}}],["debugging",{"2":{"21":1}}],["debuganyway",{"2":{"16":1}}],["debug",{"2":{"16":1}}],["demonstrates",{"2":{"22":1}}],["deno",{"2":{"16":2}}],["desired",{"2":{"64":1}}],["designed",{"2":{"32":1}}],["designer",{"2":{"16":2}}],["design",{"2":{"15":1,"24":1,"33":2,"56":1,"58":1,"66":1,"68":1}}],["desktop",{"2":{"34":1,"69":3,"78":1,"106":1,"108":1}}],["descendant",{"2":{"22":2}}],["describe",{"2":{"31":1,"58":1}}],["describes",{"2":{"8":1}}],["description",{"2":{"8":1,"34":1,"112":3,"114":1}}],["deep",{"2":{"14":1,"105":1}}],["defining",{"2":{"67":1}}],["definitions",{"2":{"25":1}}],["definition",{"2":{"22":1}}],["defined",{"2":{"117":1}}],["define",{"2":{"22":1,"24":1}}],["defineconfig",{"2":{"17":1,"88":1}}],["defineprops",{"2":{"14":1}}],["defaultformatter",{"2":{"16":4}}],["default",{"0":{"103":1},"2":{"1":1,"8":2,"14":6,"16":2,"17":1,"72":1,"88":1,"93":1}}],["detailed",{"2":{"25":1}}],["details",{"0":{"74":1},"1":{"75":1,"76":1},"2":{"11":1,"12":1,"13":1,"30":1,"31":1,"87":1}}],["determined",{"2":{"2":1}}],["determines",{"2":{"2":1}}],["deleting",{"2":{"21":1}}],["delete",{"2":{"2":1,"21":1}}],["delivery",{"2":{"6":1}}],["de",{"2":{"5":1,"72":1}}],["deception",{"2":{"34":1}}],["decided",{"2":{"25":3}}],["decides",{"2":{"2":1,"22":1}}],["decomposition",{"2":{"24":1}}],["declensions",{"2":{"21":1,"91":1}}],["declared",{"2":{"4":2,"22":2}}],["declaration",{"2":{"4":1}}],["decade",{"2":{"15":1}}],["devdependencies",{"2":{"16":1,"17":1}}],["dev",{"2":{"8":10,"9":2,"17":1,"22":1,"34":1,"62":1,"63":1,"114":1}}],["devops",{"2":{"6":1}}],["developing",{"2":{"24":1,"25":1,"34":1,"64":1}}],["develop",{"2":{"24":1}}],["developed",{"2":{"10":2}}],["developers",{"2":{"12":1,"23":1,"32":2,"33":1,"58":1,"66":1,"68":2}}],["developer",{"2":{"3":2,"6":1,"22":3,"31":1,"32":1,"33":4,"56":2,"59":1,"64":1,"67":2,"71":1}}],["development",{"0":{"55":1,"104":1},"2":{"4":2,"6":1,"9":1,"10":1,"16":4,"21":1,"23":3,"24":1,"25":1,"32":2,"33":1,"34":1,"39":1,"44":1,"45":1,"67":2,"114":1}}],["devtoolsformatters",{"2":{"21":3}}],["devtools",{"2":{"3":1,"21":2,"22":4,"94":1}}],["deposit",{"2":{"91":1}}],["deposits",{"2":{"2":1}}],["deprecated",{"2":{"22":1}}],["deployed",{"2":{"8":2}}],["deploy",{"0":{"86":1},"1":{"87":1,"88":1},"2":{"8":21,"33":1,"68":1,"87":3,"102":2}}],["deployment",{"0":{"87":1},"2":{"6":1,"8":3,"41":1,"42":2,"87":2,"105":1}}],["depend",{"2":{"24":1}}],["dependency",{"2":{"22":1,"26":1,"32":2,"64":1}}],["dependencies",{"0":{"26":1},"2":{"8":2,"21":1,"24":2,"34":1,"64":1,"92":1,"94":1}}],["depends",{"2":{"4":1}}],["depending",{"2":{"2":1,"13":1,"33":1}}],["rgba",{"2":{"117":6}}],["richfooter",{"0":{"82":1}}],["rip",{"2":{"22":1}}],["rigor",{"2":{"5":1}}],["rights",{"2":{"2":1}}],["right",{"2":{"2":3,"16":2,"21":1,"33":1,"34":1,"76":1,"91":1,"113":1}}],["rspack",{"2":{"16":12}}],["rc",{"2":{"16":1}}],["ruslan",{"2":{"59":2}}],["rush",{"2":{"16":1}}],["rust",{"2":{"16":1}}],["rustfmt",{"2":{"16":2}}],["ruby",{"2":{"16":1}}],["ru",{"2":{"16":3,"58":2}}],["rules",{"2":{"16":2,"24":1,"33":1}}],["running",{"2":{"23":1}}],["runs",{"2":{"8":2}}],["run",{"2":{"3":2,"8":9,"16":3,"34":2,"114":1}}],["r",{"2":{"8":2,"22":1,"58":2}}],["rf",{"2":{"8":4}}],["rm",{"2":{"8":3}}],["range",{"2":{"67":1}}],["raise",{"2":{"31":1}}],["ram",{"2":{"16":1,"94":1}}],["raw",{"2":{"13":2,"15":1,"17":1}}],["rather",{"2":{"3":1,"5":1,"67":1}}],["rarely",{"2":{"2":1}}],["roboto",{"2":{"117":1}}],["robust",{"2":{"24":1}}],["row",{"2":{"69":1}}],["room",{"2":{"34":1}}],["root",{"2":{"8":2,"11":2,"15":1,"117":1}}],["routing",{"0":{"107":1}}],["routine",{"2":{"24":1}}],["router",{"2":{"12":4,"64":1,"107":1}}],["routes",{"2":{"10":1,"12":2,"107":1}}],["roughly",{"2":{"2":1,"4":1,"25":1}}],["rollup",{"2":{"16":2,"17":2}}],["rollback",{"2":{"8":1}}],["roles",{"2":{"2":1,"24":1}}],["role",{"2":{"2":2,"22":1,"24":1,"33":1}}],["rbac",{"2":{"2":1}}],["rtl",{"2":{"21":1,"91":1}}],["rt",{"2":{"2":4,"56":1}}],["rpc",{"0":{"72":1},"2":{"1":1,"5":7,"33":1,"61":1,"71":1,"72":5,"102":1}}],["reusable",{"2":{"68":1}}],["reuse",{"2":{"10":1}}],["reviews",{"2":{"34":1}}],["rehydration",{"2":{"34":1}}],["rewriting",{"2":{"22":1,"23":1}}],["reduces",{"2":{"34":1}}],["reduce",{"2":{"23":1,"32":1}}],["reddit",{"2":{"22":1,"58":1}}],["redis",{"2":{"22":1}}],["registration",{"2":{"105":1}}],["registers",{"2":{"24":1}}],["register",{"2":{"22":1,"33":2}}],["regarding",{"2":{"34":1}}],["regulate",{"2":{"12":1}}],["regular",{"0":{"28":1},"2":{"2":1,"17":1,"34":1}}],["reason",{"2":{"33":1}}],["reasons",{"2":{"32":1}}],["react",{"2":{"24":6,"33":2}}],["reactivity",{"2":{"22":1,"24":7,"91":1}}],["reactive",{"2":{"21":9,"22":11,"24":11,"68":1}}],["read",{"2":{"22":2,"33":2,"34":1,"73":1}}],["readable",{"2":{"21":1}}],["ready",{"2":{"16":1,"67":2,"68":2}}],["readme",{"2":{"16":2}}],["reality",{"2":{"26":1}}],["really",{"2":{"15":1,"23":1}}],["real",{"2":{"3":1,"23":1,"33":2}}],["renting",{"2":{"34":1}}],["renaming",{"2":{"28":1}}],["renamed",{"2":{"13":1}}],["renovate",{"2":{"16":2}}],["rendering",{"2":{"34":2}}],["renderwhitespace",{"2":{"16":1}}],["render",{"2":{"9":1}}],["refactoring",{"0":{"28":1},"2":{"28":1}}],["refs",{"2":{"22":2}}],["ref",{"2":{"21":7,"22":6,"24":2,"71":1}}],["reference",{"2":{"33":2}}],["refer",{"2":{"13":1}}],["referred",{"2":{"10":1}}],["refreshes",{"2":{"2":1}}],["refresh",{"2":{"2":1,"56":1}}],["repetitive",{"2":{"24":1}}],["replacing",{"2":{"21":1,"24":1}}],["replaced",{"2":{"21":1}}],["replacement",{"2":{"21":2}}],["replace",{"2":{"1":1,"25":1,"27":1,"32":2,"89":1}}],["replit",{"2":{"16":1}}],["repo",{"2":{"16":1}}],["repository",{"0":{"63":1},"2":{"6":1,"8":4,"10":1,"16":1,"33":1,"87":4,"88":1}}],["representation",{"2":{"13":1}}],["recalculate",{"2":{"24":1}}],["recent",{"2":{"21":1,"91":1}}],["recentchange",{"2":{"16":1}}],["receive",{"2":{"34":2}}],["receives",{"2":{"4":1,"34":1}}],["receiving",{"2":{"2":1}}],["recursive",{"2":{"8":1}}],["recognition",{"2":{"116":1}}],["recognized",{"2":{"58":1}}],["recommend",{"2":{"21":1}}],["recommended",{"2":{"8":1,"9":1,"16":1,"17":1,"21":1,"72":1,"94":1,"117":1}}],["reconnection",{"2":{"5":1}}],["re",{"2":{"2":2}}],["remain",{"2":{"22":1,"72":1}}],["remains",{"2":{"1":1}}],["remix",{"2":{"16":2}}],["removed",{"2":{"8":1,"116":1}}],["removed=`ls",{"2":{"8":1}}],["remove",{"2":{"8":2}}],["removes",{"2":{"2":1}}],["remote",{"2":{"8":12,"16":5}}],["reliably",{"2":{"16":1}}],["reliable",{"2":{"2":1,"8":1}}],["relevance",{"2":{"58":1}}],["relevant",{"2":{"3":1,"67":1}}],["release",{"2":{"16":4,"115":1}}],["releaserc",{"2":{"16":2}}],["reload",{"2":{"8":2,"105":1}}],["related",{"2":{"1":1,"2":1,"10":1,"22":1,"25":1}}],["require",{"2":{"9":1,"11":1}}],["requiresauth",{"2":{"12":1}}],["requires",{"2":{"5":1,"9":1,"15":1,"17":1,"21":1,"22":1,"91":1}}],["required",{"2":{"3":1,"8":1}}],["requirements",{"2":{"2":1,"32":1,"34":1}}],["requested",{"2":{"2":1,"4":2}}],["requesting",{"2":{"2":1}}],["requests",{"2":{"1":1,"4":3,"5":1,"16":2,"34":3,"72":1}}],["request",{"2":{"1":2,"2":2,"4":7,"34":2}}],["resume",{"2":{"33":1}}],["result",{"0":{"95":1},"2":{"2":1,"3":1,"8":1,"16":1,"22":1,"62":1,"64":1,"67":1}}],["respect",{"2":{"22":1}}],["response",{"2":{"4":4,"8":2}}],["responsible",{"2":{"2":1,"12":2,"22":2,"24":1,"117":1}}],["resides",{"2":{"22":1}}],["resx",{"2":{"16":2}}],["resolutions",{"2":{"25":1,"76":1,"78":1}}],["resolve",{"2":{"17":2}}],["resolver",{"2":{"16":1,"17":1}}],["resources",{"0":{"13":1},"1":{"14":1,"15":1},"2":{"2":1,"3":1,"4":1,"10":4,"13":7,"17":1,"33":1,"34":3,"94":1,"115":1,"116":1}}],["resource",{"0":{"55":1},"2":{"2":3,"4":6,"10":1,"13":3}}],["reserve",{"2":{"12":1}}],["resets",{"2":{"2":1}}],["restrictions",{"2":{"34":1}}],["rest",{"0":{"5":2,"71":1},"2":{"1":1,"5":2,"61":1,"71":1,"72":2}}],["returns",{"2":{"2":2,"3":1,"13":1,"21":1,"71":1}}],["return",{"2":{"1":1,"4":1,"14":2,"15":2,"71":1,"72":1}}],["og",{"2":{"112":6}}],["oop",{"2":{"22":1,"24":1,"25":3}}],["ok",{"2":{"21":2}}],["obtained",{"2":{"91":1}}],["obvious",{"2":{"58":1}}],["obj",{"2":{"21":1}}],["objectives",{"0":{"68":1}}],["objective",{"2":{"58":1}}],["object",{"2":{"15":1,"21":5,"22":1,"24":2,"25":3,"33":1}}],["objects",{"2":{"4":2,"21":4,"22":1,"24":1}}],["observer",{"2":{"21":1}}],["obsolete",{"2":{"17":1,"18":1,"21":1,"22":1,"26":1,"32":1,"67":1}}],["os",{"2":{"16":1}}],["overriding",{"2":{"117":1}}],["overrides",{"2":{"16":1}}],["overflow",{"2":{"76":1}}],["overwrite",{"2":{"61":3}}],["over",{"0":{"27":1},"2":{"22":1,"24":1,"34":1,"71":1}}],["overview",{"2":{"18":1}}],["overuse",{"2":{"12":2}}],["old",{"2":{"8":1,"15":1,"21":2,"33":1}}],["outdated",{"2":{"16":1,"33":1}}],["out",{"2":{"16":2,"18":1,"21":1,"22":1,"24":1,"33":2,"68":1,"108":1}}],["output",{"2":{"16":2,"34":1}}],["outer",{"2":{"12":1}}],["outside",{"2":{"4":1,"22":1}}],["our",{"2":{"8":2}}],["occurs",{"2":{"34":1}}],["occur",{"2":{"4":1}}],["otherwise",{"2":{"21":1}}],["others",{"2":{"12":1,"24":1,"105":1}}],["other",{"2":{"3":2,"4":1,"5":1,"6":1,"8":1,"9":2,"10":2,"13":2,"16":3,"21":1,"22":6,"24":2,"25":2,"31":1,"32":1,"34":3,"67":4,"68":1,"91":1,"105":3}}],["own",{"2":{"3":2,"5":1,"8":3,"10":1,"17":2,"21":1,"22":2,"26":1,"27":1,"32":2,"34":1,"89":1}}],["opinion",{"2":{"58":1}}],["optimization",{"2":{"34":1}}],["optional",{"2":{"55":1}}],["option",{"2":{"2":1,"33":1}}],["options",{"0":{"3":1,"101":1,"102":1},"1":{"102":1,"103":1,"104":1,"105":1},"2":{"2":1,"8":1,"9":1,"11":1,"16":1,"17":1,"21":2,"61":2,"68":3,"102":1}}],["operation",{"2":{"34":1}}],["operations",{"2":{"21":1}}],["open=",{"2":{"100":1}}],["opened",{"2":{"78":1}}],["opengraph",{"2":{"61":1}}],["openclose",{"2":{"16":1}}],["open",{"2":{"3":1,"33":2,"57":1,"61":1,"66":1,"75":1,"102":1,"112":1}}],["oauth",{"2":{"2":2}}],["onmounted",{"2":{"116":1}}],["ontaskerrors",{"2":{"16":1}}],["onecolumnlayout",{"0":{"108":1}}],["ones",{"2":{"17":1,"33":1,"117":1}}],["one",{"2":{"2":1,"4":1,"8":2,"12":4,"13":2,"17":2,"21":1,"22":8,"23":1,"32":1,"33":1,"34":1,"67":2,"92":1,"100":1}}],["once",{"2":{"2":1,"21":1}}],["onlyenabledextensions",{"2":{"16":1}}],["only",{"2":{"2":1,"3":1,"4":2,"6":1,"11":1,"15":1,"16":5,"21":3,"22":3,"24":1,"32":2,"33":2,"61":1,"64":2,"91":1,"94":1}}],["online",{"2":{"2":1,"9":1,"10":1,"16":1,"17":1,"34":1,"67":1,"68":1,"105":1}}],["on",{"2":{"2":9,"3":5,"4":3,"5":5,"6":2,"8":9,"9":4,"10":1,"13":2,"16":7,"17":2,"21":4,"22":10,"23":5,"24":8,"25":5,"29":2,"32":3,"33":13,"34":10,"56":2,"58":1,"61":1,"67":3,"69":1,"76":1,"78":2,"79":1,"91":1,"105":2,"106":1,"114":1,"116":1}}],["org",{"2":{"72":1}}],["organise",{"2":{"12":1}}],["organizing",{"2":{"9":1}}],["organizeimports",{"2":{"16":1}}],["organize",{"2":{"5":1,"24":1}}],["oreilly",{"2":{"33":1}}],["orientation",{"2":{"114":1}}],["oriented",{"2":{"24":2,"25":1}}],["originally",{"2":{"34":1}}],["origin",{"2":{"4":7}}],["ordinary",{"2":{"24":1}}],["orders",{"2":{"34":1}}],["order",{"2":{"2":1,"5":1,"34":1}}],["oracle",{"2":{"3":1,"9":1}}],["or",{"0":{"5":1,"20":1},"2":{"1":2,"2":1,"3":2,"4":4,"5":1,"9":1,"10":1,"11":3,"13":3,"15":1,"17":3,"21":3,"22":11,"24":4,"25":1,"26":1,"27":2,"32":4,"33":6,"34":3,"55":3,"61":1,"64":1,"67":4,"69":1,"71":1,"91":1}}],["often",{"2":{"13":1,"21":1,"23":1,"33":1,"34":1,"91":1}}],["offline",{"2":{"34":2}}],["off",{"2":{"16":2,"22":1,"24":1}}],["officially",{"2":{"22":1}}],["official",{"2":{"12":1,"16":1,"22":1,"58":1}}],["offers",{"2":{"24":1}}],["offer",{"2":{"3":1,"32":1,"33":1}}],["of",{"0":{"27":1,"55":1},"2":{"1":2,"2":12,"3":2,"4":8,"5":5,"6":3,"8":13,"9":1,"10":4,"11":2,"13":4,"15":1,"16":9,"17":5,"18":3,"21":20,"22":30,"23":7,"24":17,"25":8,"26":4,"27":1,"29":2,"31":2,"32":12,"33":11,"34":20,"55":1,"56":4,"58":5,"59":1,"61":2,"63":1,"64":1,"66":1,"67":3,"68":6,"71":4,"72":2,"73":1,"75":1,"77":1,"80":1,"87":2,"88":1,"91":7,"92":3,"93":1,"102":3,"104":2,"105":6,"107":1,"108":1,"115":5,"116":1}}],["would",{"2":{"22":2,"33":1,"64":1}}],["word",{"2":{"55":1}}],["wordseparators",{"2":{"16":1}}],["words",{"2":{"6":1,"22":2,"34":1,"67":1}}],["worth",{"2":{"33":1}}],["world",{"2":{"32":1,"34":1}}],["worsens",{"2":{"32":1}}],["workable",{"2":{"67":1}}],["workbox",{"2":{"34":2,"115":1}}],["workbench",{"2":{"16":11}}],["worker",{"0":{"115":1},"2":{"34":3,"56":2,"61":1,"66":1,"75":1,"102":1,"113":1,"115":2}}],["workflow",{"2":{"8":2,"61":1,"102":1}}],["workflows",{"2":{"8":3}}],["workingissueformatscm",{"2":{"16":1}}],["working",{"2":{"3":1,"4":1,"6":2,"13":1,"16":1,"18":1,"19":1,"24":1,"56":2,"64":1}}],["work",{"2":{"2":1,"3":2,"5":1,"8":1,"10":1,"12":1,"16":5,"22":2,"23":1,"26":1,"33":2,"113":1}}],["workspace",{"2":{"16":3}}],["works",{"2":{"2":2,"17":1,"21":3,"33":1,"34":2,"94":1}}],["www",{"2":{"4":1,"8":6,"89":1}}],["walk",{"2":{"34":1}}],["water",{"2":{"33":1}}],["watch",{"2":{"24":1}}],["watchman",{"2":{"16":2}}],["was",{"2":{"21":1,"22":2,"24":2,"32":1,"34":5}}],["warm",{"2":{"16":1}}],["wants",{"2":{"3":1}}],["want",{"2":{"3":2,"11":1,"21":1,"25":2,"33":1,"87":1}}],["ways",{"2":{"33":1}}],["way",{"2":{"2":3,"5":1,"8":2,"12":1,"17":1,"21":1,"22":1,"32":2,"34":2,"55":1}}],["welcome",{"2":{"55":1,"57":1}}],["well",{"2":{"13":1,"16":2,"20":1,"21":1,"24":1,"33":3,"34":2,"67":1,"68":1,"94":1}}],["went",{"2":{"32":1}}],["weight",{"2":{"32":1}}],["were",{"2":{"21":1,"24":1,"32":1,"33":1,"34":1}}],["webapp",{"0":{"61":1,"65":1},"1":{"62":1,"66":1,"67":1},"2":{"37":1,"57":2,"61":7,"63":2,"66":1,"87":2,"88":1,"114":1}}],["webdriverio",{"2":{"23":1}}],["webpack",{"2":{"16":13,"17":4}}],["webp",{"2":{"15":1}}],["webstorm",{"2":{"16":2}}],["website",{"2":{"8":3,"9":9,"10":1,"17":1,"34":2,"56":1,"66":1,"67":1,"68":2,"87":1,"112":1}}],["websocket",{"2":{"5":1}}],["websockets",{"2":{"1":1,"5":3,"33":1,"71":1}}],["webservers",{"2":{"16":1}}],["webserver",{"2":{"4":1,"9":2,"16":1,"34":1}}],["web",{"0":{"62":1},"2":{"4":3,"5":2,"10":1,"16":1,"23":1,"25":1,"32":2,"34":8,"64":2,"67":2,"68":3,"72":1,"114":1}}],["we",{"2":{"2":1,"8":4,"21":2,"25":7,"32":1,"33":1}}],["wrap",{"2":{"25":1,"32":1}}],["wrappers",{"0":{"27":1},"2":{"27":1}}],["wrapper",{"2":{"1":1,"24":1,"34":2,"64":1}}],["writes",{"2":{"34":1}}],["write",{"2":{"3":2,"8":1,"22":2,"24":1,"33":1,"34":1}}],["written",{"2":{"2":1,"3":1,"23":1}}],["writing",{"2":{"2":1,"3":1,"23":1,"33":1,"34":1}}],["while",{"2":{"12":1}}],["which",{"2":{"2":1,"3":1,"4":2,"5":1,"9":1,"10":1,"13":2,"16":1,"17":1,"21":2,"22":6,"24":4,"26":1,"32":1,"34":5,"61":1,"67":2,"87":1,"117":2}}],["why",{"2":{"5":1,"16":1,"22":2,"24":2,"25":1,"32":2}}],["where",{"2":{"2":1,"3":1,"9":1,"12":1,"15":1,"16":1,"22":2,"23":1,"24":4,"28":1,"34":2,"68":1}}],["whether",{"2":{"2":2,"12":1,"22":1,"61":1}}],["when",{"0":{"101":1},"1":{"102":1,"103":1,"104":1,"105":1},"2":{"2":6,"3":1,"4":2,"5":1,"8":2,"13":1,"16":2,"21":2,"22":3,"24":3,"32":1,"33":1,"34":9,"64":1,"68":1,"73":1,"76":1,"106":1,"108":1}}],["whole",{"2":{"32":2,"34":1}}],["whom",{"2":{"2":1}}],["who",{"2":{"2":1,"24":2,"33":1}}],["whatever",{"2":{"32":1}}],["what",{"2":{"1":1,"2":2,"3":2,"4":1,"5":1,"6":1,"8":1,"10":1,"12":1,"15":1,"16":1,"19":1,"22":3,"23":1,"24":3,"25":1,"32":1,"33":2}}],["wireframe",{"2":{"68":1}}],["wide",{"2":{"67":1}}],["widgets",{"2":{"22":1}}],["width",{"2":{"14":7,"108":2,"117":1}}],["windi",{"2":{"16":10}}],["window",{"2":{"8":1,"10":1,"16":4,"21":3,"64":1,"89":2,"114":1}}],["wise",{"2":{"10":1}}],["within",{"2":{"21":1}}],["without",{"2":{"3":2,"6":1,"11":2,"12":3,"16":1,"21":1,"23":1,"24":2,"32":1,"33":1,"34":1,"61":1,"64":1,"67":1,"71":1,"92":1,"108":1,"113":1,"114":1}}],["with",{"2":{"1":2,"2":7,"3":9,"4":2,"5":4,"8":12,"9":3,"10":2,"11":1,"12":4,"13":2,"15":3,"16":6,"17":3,"18":1,"19":1,"21":3,"22":6,"23":3,"24":2,"25":4,"26":1,"27":1,"29":1,"32":2,"33":8,"34":11,"56":1,"59":1,"61":2,"63":1,"64":2,"66":1,"67":3,"68":8,"69":1,"72":1,"73":2,"79":1,"89":1,"91":2,"94":1,"95":1,"102":1,"103":1,"105":1,"106":1,"115":1}}],["will",{"2":{"1":1,"3":3,"4":3,"5":2,"8":5,"9":1,"13":1,"15":1,"21":3,"22":1,"23":4,"24":3,"26":1,"27":2,"29":1,"31":1,"32":1,"33":2,"34":3,"61":3,"63":2,"68":1,"71":1,"115":1}}],["pwa",{"0":{"34":1,"113":1},"1":{"114":1,"115":1},"2":{"34":12,"56":1,"61":2,"66":2,"68":1,"102":1}}],["pwd",{"2":{"8":1}}],["pc",{"2":{"16":2}}],["pdm",{"2":{"16":2}}],["pdf",{"2":{"13":1,"16":1}}],["python",{"2":{"33":1,"34":1}}],["pyproject",{"2":{"16":2}}],["pyrightconfig",{"2":{"16":2}}],["pinia",{"2":{"22":14,"42":1}}],["picked",{"2":{"16":1}}],["picture",{"2":{"15":1,"34":1}}],["pictures",{"2":{"13":1,"15":1,"34":1}}],["pipelines",{"2":{"16":2}}],["psalm",{"2":{"16":1}}],["pm2",{"2":{"16":4}}],["pm",{"2":{"16":1}}],["px`",{"2":{"14":4}}],["pnp",{"2":{"16":2}}],["pnpm",{"2":{"8":12,"16":6,"17":2,"61":3,"62":2,"63":2,"66":1}}],["png`",{"2":{"13":1}}],["png",{"2":{"13":3,"15":3,"73":1}}],["p",{"2":{"8":1}}],["people",{"2":{"25":1}}],["pet",{"2":{"8":1}}],["perfect",{"2":{"24":1}}],["perfectly",{"2":{"24":1}}],["performant",{"2":{"24":1}}],["performance",{"2":{"21":1,"22":1,"26":1,"34":1}}],["performed",{"2":{"24":1}}],["perform",{"2":{"24":1}}],["percent",{"2":{"21":1,"91":1}}],["perspective",{"2":{"22":2}}],["persistentsessionreviveprocess",{"2":{"16":1}}],["person",{"2":{"2":1,"16":1,"33":2}}],["personal",{"2":{"2":1}}],["pereditorgroup",{"2":{"16":1}}],["per",{"2":{"9":1,"24":1}}],["permissions",{"2":{"2":1,"8":1}}],["permission",{"2":{"2":1}}],["phpcs",{"2":{"16":2}}],["phpunit",{"2":{"16":1}}],["php",{"2":{"3":1,"16":2,"33":1,"34":2}}],["photo",{"2":{"2":1}}],["pure",{"2":{"29":1,"32":1,"64":1}}],["purpose",{"2":{"21":1,"22":1,"34":1}}],["purposes",{"2":{"8":1}}],["pug",{"2":{"21":1}}],["pugtools",{"2":{"16":1}}],["pullapprove",{"2":{"16":2}}],["puppeteer",{"2":{"16":10}}],["publishing",{"2":{"61":1}}],["public",{"2":{"3":1,"13":4,"33":1}}],["pubspec",{"2":{"16":3}}],["pubxml",{"2":{"16":2}}],["push",{"2":{"6":1,"8":4,"24":1,"89":1}}],["put",{"2":{"8":1,"10":1,"13":2,"16":1,"22":2,"33":1,"88":1}}],["putting",{"2":{"3":1}}],["puts",{"2":{"2":1}}],["pleasant",{"2":{"32":1}}],["please",{"2":{"16":1}}],["plenty",{"2":{"3":1}}],["plugging",{"2":{"64":1}}],["plug",{"2":{"26":2}}],["plugins",{"2":{"16":1,"17":4,"22":1,"103":1}}],["plugin",{"2":{"16":1,"17":2,"34":3,"75":3}}],["plus",{"2":{"2":1,"8":1,"22":1}}],["planned",{"0":{"105":1},"2":{"68":1}}],["plans",{"2":{"3":2,"9":2}}],["play",{"2":{"33":1}}],["plays",{"2":{"24":1}}],["played",{"2":{"22":1,"33":1}}],["playground",{"2":{"16":1}}],["playwright",{"2":{"16":10}}],["places",{"2":{"34":1}}],["place",{"2":{"21":1,"24":1}}],["placed",{"2":{"9":1,"13":2}}],["placeholder",{"2":{"3":1}}],["placing",{"2":{"3":1,"34":1}}],["pba",{"2":{"2":1}}],["pops",{"2":{"108":1}}],["populated",{"2":{"22":1}}],["popular",{"2":{"3":1,"8":1,"16":1,"17":1,"21":1,"32":1,"34":1,"68":2,"91":1,"105":1}}],["popups",{"2":{"21":1}}],["polymorphism",{"2":{"25":1}}],["policy",{"2":{"2":2}}],["points",{"2":{"58":1}}],["point",{"2":{"22":1,"34":2,"56":1}}],["poorly",{"2":{"21":1}}],["portfolio",{"2":{"66":1,"67":1,"68":1}}],["port",{"2":{"4":1}}],["portal",{"2":{"2":1}}],["position",{"2":{"24":1,"67":1}}],["postcss",{"2":{"16":10}}],["postcssrc",{"2":{"16":10}}],["postman",{"2":{"4":1,"16":1}}],["postgresql",{"2":{"3":1}}],["possibilities",{"2":{"16":1}}],["possibility",{"2":{"2":1,"23":1,"26":1,"68":2}}],["possibly",{"2":{"3":1,"8":1}}],["possible",{"2":{"2":2,"21":1,"22":1,"24":3,"32":1,"34":2,"61":1,"64":1,"109":1,"117":1}}],["poke",{"2":{"3":1}}],["powerful",{"2":{"12":1}}],["power",{"2":{"2":1,"22":1,"25":1}}],["pr",{"2":{"55":1}}],["practical",{"2":{"33":1}}],["practice",{"2":{"21":1,"22":2,"67":1}}],["practices",{"0":{"12":1},"2":{"2":1,"32":1,"33":5,"56":1,"58":1,"67":2,"68":2}}],["price",{"2":{"34":1}}],["primitive",{"2":{"22":1}}],["primitives",{"2":{"21":2}}],["primevue",{"2":{"18":1}}],["private",{"2":{"8":6,"10":1,"22":1}}],["print",{"2":{"21":1}}],["printwidth",{"2":{"16":1}}],["printf",{"2":{"8":1}}],["printed",{"2":{"4":1}}],["principle",{"2":{"4":1,"24":1}}],["preloader",{"2":{"104":1}}],["preserving",{"2":{"91":1}}],["presence",{"2":{"23":1,"24":1}}],["presentation",{"2":{"32":1}}],["present",{"2":{"22":1}}],["preprocessor",{"2":{"64":1}}],["precisely",{"2":{"34":1}}],["prerenderer",{"2":{"34":1}}],["pre",{"2":{"33":1,"34":1}}],["prevent",{"2":{"76":1}}],["prevalent",{"2":{"33":1}}],["prevalence",{"2":{"24":1}}],["previous",{"2":{"33":1}}],["previously",{"2":{"8":1}}],["preview",{"2":{"16":1}}],["pretentious",{"2":{"21":1}}],["prettier",{"2":{"16":14}}],["pretty",{"2":{"3":1,"94":2}}],["preferredtagnamecase",{"2":{"16":1}}],["promise",{"2":{"71":2}}],["promises",{"2":{"33":1}}],["proven",{"2":{"56":1,"67":1}}],["providing",{"2":{"12":1}}],["provides",{"2":{"4":1}}],["provider",{"2":{"3":2,"25":1}}],["providers",{"2":{"3":1,"5":1,"9":3,"33":1,"105":1}}],["provided",{"2":{"3":2,"107":1}}],["provide",{"2":{"3":3,"9":2,"10":1,"11":1,"12":2,"22":3,"32":1}}],["progressive",{"2":{"34":1}}],["programmatically",{"2":{"21":1}}],["programmers",{"2":{"24":2,"58":1}}],["programmer",{"2":{"21":1,"24":2,"25":1}}],["programming",{"2":{"3":2,"24":3,"33":2}}],["programs",{"2":{"16":1}}],["program",{"2":{"4":1,"21":1,"24":2,"25":1}}],["professional",{"2":{"28":1}}],["pros",{"2":{"22":1,"32":2}}],["procfile",{"2":{"16":2}}],["processed",{"2":{"33":1}}],["processing",{"2":{"25":1}}],["processor",{"2":{"16":1}}],["process",{"2":{"6":1,"8":1,"10":1,"13":1,"23":1,"34":1}}],["proj",{"2":{"16":2}}],["projectname",{"2":{"61":1}}],["projects",{"2":{"8":1,"10":2,"17":1,"23":2,"24":1,"32":1,"33":1,"57":1}}],["project",{"0":{"31":1,"57":1},"2":{"3":1,"6":1,"8":10,"9":1,"10":4,"16":1,"17":3,"22":1,"25":1,"29":1,"31":1,"32":1,"33":1,"56":2,"61":6,"62":1,"66":2,"67":1,"87":1}}],["proposed",{"2":{"34":1}}],["property=",{"2":{"112":7}}],["properties",{"2":{"34":1}}],["proper",{"2":{"32":1}}],["prop",{"2":{"11":1,"12":2,"22":1}}],["props",{"2":{"11":1,"12":1,"14":11,"22":2}}],["probability",{"2":{"23":1}}],["probably",{"2":{"10":1,"24":1,"34":1}}],["problems",{"2":{"4":2,"22":1,"34":1}}],["problem",{"2":{"3":1,"8":1,"13":1,"22":1,"33":1,"34":1}}],["prod",{"2":{"8":5}}],["production",{"2":{"17":1,"23":1}}],["productive",{"2":{"16":1}}],["product",{"2":{"6":1,"10":2,"33":1,"34":1}}],["products",{"2":{"1":3}}],["proxy",{"2":{"4":2,"5":1,"21":2,"24":2}}],["protocols",{"0":{"5":1},"2":{"5":1,"33":1}}],["protocol",{"2":{"4":1,"9":1,"72":1}}],["protect",{"2":{"4":1}}],["palettes",{"2":{"105":1}}],["paid",{"2":{"33":1}}],["payment",{"2":{"25":1}}],["pascal",{"2":{"16":1}}],["pass",{"2":{"11":1,"22":3}}],["passing",{"2":{"11":1,"12":1}}],["passes",{"2":{"2":1}}],["password",{"2":{"2":1,"22":1}}],["paths",{"2":{"17":2}}],["path",{"2":{"12":4,"14":1,"17":3}}],["pattern",{"2":{"12":1,"21":1,"22":2,"24":1}}],["patterns",{"0":{"10":1},"1":{"11":1,"12":1},"2":{"16":1,"32":1,"33":2,"58":1}}],["packages",{"2":{"16":2,"17":1,"68":1}}],["package",{"2":{"10":1,"16":8,"17":1,"18":1,"21":1,"26":1,"64":2,"94":2}}],["panel",{"2":{"10":1,"107":1}}],["page",{"2":{"4":6,"13":1,"23":1,"34":8,"100":1}}],["pagespeed",{"2":{"34":2}}],["pages",{"0":{"86":1},"1":{"87":1,"88":1},"2":{"4":3,"6":1,"8":11,"9":3,"12":1,"32":1,"33":1,"34":2,"61":1,"87":6,"102":2}}],["paragraphs",{"2":{"33":1,"91":1}}],["parameter",{"2":{"61":1,"88":1,"91":1}}],["parameters",{"2":{"8":1,"61":1,"68":1,"69":1,"105":1}}],["params",{"2":{"1":2,"72":1}}],["particular",{"2":{"91":1}}],["participation",{"0":{"57":1}}],["partially",{"2":{"22":3,"24":2}}],["part",{"2":{"21":1,"22":1,"33":2,"102":2}}],["party",{"0":{"27":1},"2":{"2":1,"4":5,"5":1,"22":1,"26":1,"34":1,"64":2,"115":1}}],["parts",{"2":{"2":1,"105":1}}],["vwa",{"2":{"108":1,"117":11}}],["v1",{"0":{"36":1,"38":1,"40":1,"43":1,"46":1},"1":{"37":1,"39":1,"41":1,"42":1,"44":1,"45":1,"47":1}}],["vulnerability",{"2":{"26":1}}],["vulnerabilities",{"2":{"22":1}}],["vuesence",{"2":{"63":1}}],["vuefaq",{"2":{"59":1}}],["vuetify",{"2":{"32":1}}],["vuejs",{"2":{"22":1,"58":4}}],["vuex",{"2":{"22":6,"42":1}}],["vue",{"0":{"22":1,"33":1,"49":1,"61":1,"65":1},"1":{"62":1,"66":1,"67":1},"2":{"8":1,"10":2,"11":1,"12":2,"13":1,"14":2,"16":15,"17":4,"20":1,"21":7,"22":12,"23":1,"24":17,"32":2,"33":20,"34":1,"37":2,"39":1,"49":1,"55":1,"57":2,"58":2,"61":7,"62":1,"63":2,"64":3,"66":3,"67":4,"68":3,"69":2,"73":2,"87":2,"88":1,"93":1,"94":2,"107":1,"116":1}}],["vetur",{"2":{"16":2}}],["verified",{"2":{"34":1,"58":1}}],["verifies",{"2":{"2":2}}],["vercel",{"2":{"9":1,"16":2,"105":1}}],["versionrc",{"2":{"16":2}}],["versions",{"2":{"16":3}}],["versioning",{"2":{"10":1,"115":1}}],["version",{"2":{"8":8,"16":3,"33":1,"34":1,"71":1,"105":1,"115":2}}],["very",{"2":{"2":3,"3":2,"9":1,"16":3,"21":4,"22":1,"23":1,"31":1,"32":1,"33":2,"34":3,"55":1,"72":1,"91":3}}],["vbproj",{"2":{"16":1}}],["vb",{"2":{"16":6}}],["volar",{"2":{"16":4}}],["v",{"2":{"14":3}}],["vs",{"2":{"10":1,"16":7,"24":1,"94":1}}],["vscode",{"2":{"8":1,"16":9}}],["v4",{"2":{"8":5}}],["v2",{"2":{"8":3}}],["v3",{"2":{"8":4}}],["vars",{"2":{"117":1}}],["various",{"2":{"33":1,"105":1}}],["variations",{"2":{"68":1}}],["variant",{"2":{"5":1,"21":1}}],["variants",{"2":{"2":1,"104":1,"105":3,"109":1}}],["variables",{"2":{"21":1,"22":1,"24":2,"117":2}}],["variable",{"2":{"2":1,"21":2,"22":3,"24":6,"108":1}}],["var",{"2":{"8":4}}],["validation",{"2":{"22":1}}],["validate",{"2":{"16":1}}],["valid",{"2":{"2":2}}],["values",{"2":{"61":1,"112":1}}],["value",{"2":{"1":2,"8":1,"16":1,"21":1,"22":1,"24":4,"71":1,"89":1,"93":1,"115":1}}],["visual",{"2":{"24":1,"56":1}}],["visualization",{"2":{"22":1,"24":1,"32":1}}],["visualizer",{"2":{"17":4}}],["visuals",{"2":{"16":1}}],["visible",{"2":{"2":1,"16":1}}],["videos",{"2":{"33":3}}],["video",{"2":{"13":1,"33":1,"34":1}}],["view",{"2":{"12":3,"22":3,"24":2,"56":1,"68":1}}],["views",{"2":{"10":1,"12":1}}],["virtual",{"2":{"3":1,"9":1,"21":1,"33":1}}],["via",{"0":{"61":1},"1":{"62":1},"2":{"1":1,"2":3,"3":1,"5":1,"8":1,"9":1,"13":2,"16":1,"21":2,"22":1,"69":1,"75":1,"107":1,"117":1}}],["vitest",{"2":{"16":10,"23":1}}],["vitepress",{"2":{"8":1,"31":1,"33":1,"67":1}}],["vite",{"0":{"88":1},"2":{"1":1,"4":1,"13":1,"14":1,"16":3,"17":13,"34":3,"58":1,"64":1,"72":1,"75":2,"88":1}}],["effective",{"2":{"68":1}}],["effort",{"2":{"25":1}}],["efficiency",{"2":{"21":1}}],["efficiently",{"2":{"24":1,"25":1,"67":1,"68":1}}],["efficient",{"2":{"21":1,"24":1,"34":1,"64":2}}],["e2e2e3",{"2":{"117":2}}],["e2e",{"2":{"23":5}}],["empty",{"2":{"67":1}}],["email",{"2":{"59":1}}],["embla",{"2":{"20":1}}],["emmet",{"2":{"16":2}}],["eex",{"2":{"16":1}}],["eol",{"2":{"16":1}}],["education",{"2":{"114":1}}],["edited",{"2":{"114":1}}],["edit",{"2":{"55":1}}],["editorconfig",{"2":{"16":2}}],["editortab",{"2":{"16":1}}],["editorgroup",{"2":{"16":1}}],["editor",{"2":{"16":31}}],["edge",{"2":{"3":2}}],["element",{"2":{"24":1,"56":1,"69":1}}],["elements",{"2":{"2":1,"6":1,"21":4,"23":1,"24":1,"30":1,"34":2}}],["else",{"2":{"14":1,"16":1,"33":1}}],["e88a22df",{"2":{"13":1}}],["evolution",{"2":{"32":1}}],["evolving",{"2":{"24":1}}],["evan",{"2":{"24":1}}],["evaluate",{"2":{"12":1}}],["ever",{"2":{"11":1}}],["everyone",{"2":{"34":1}}],["everybody",{"2":{"22":1}}],["everything",{"2":{"16":1,"21":2,"24":1,"56":1,"63":1}}],["every",{"2":{"1":1}}],["events",{"2":{"22":1}}],["event",{"2":{"5":1,"16":1,"22":1}}],["even",{"2":{"2":1,"4":1,"15":1,"21":1,"22":2,"24":1,"32":1,"33":3,"91":1}}],["ecosystem",{"2":{"16":1,"21":1,"68":1}}],["economical",{"2":{"3":1}}],["echo",{"2":{"8":8}}],["established",{"2":{"67":1}}],["es6",{"2":{"21":1,"24":1}}],["esnext",{"2":{"17":1}}],["esbuild",{"2":{"17":1}}],["esbenp",{"2":{"16":4}}],["eslint",{"2":{"16":17,"17":3,"33":1,"64":2}}],["especially",{"2":{"5":1,"23":1,"68":1}}],["essence",{"2":{"2":1}}],["errors",{"2":{"16":1}}],["error",{"2":{"4":1,"8":1}}],["e",{"2":{"3":1,"11":1,"13":1,"22":1,"24":1,"34":1,"64":1}}],["etc",{"2":{"3":1,"10":1,"17":1,"23":1,"30":1,"34":1,"56":1,"66":2,"67":1,"68":4,"75":1,"117":1}}],["either",{"2":{"2":1,"13":1,"32":1}}],["enhance",{"2":{"116":1}}],["enough",{"2":{"34":1,"67":1}}],["english",{"2":{"33":1}}],["engines",{"2":{"34":1}}],["engine",{"2":{"21":1,"33":1,"34":1}}],["engineer",{"2":{"6":1,"59":1}}],["encapsulates",{"2":{"24":1}}],["encapsulated",{"2":{"24":1}}],["encoded",{"2":{"13":1}}],["entering",{"2":{"61":1}}],["enter",{"2":{"55":1}}],["enters",{"2":{"24":1}}],["entrance",{"2":{"34":1}}],["entry",{"2":{"24":1,"34":1}}],["entities",{"2":{"24":1}}],["entity",{"2":{"22":3}}],["entirely",{"2":{"116":1}}],["entire",{"2":{"15":1,"21":1,"22":1,"91":1}}],["en",{"2":{"16":3}}],["enablesmartcommit",{"2":{"16":1}}],["enable",{"2":{"16":4,"21":1,"68":2}}],["enabled",{"2":{"2":1,"16":9,"21":1,"63":1}}],["endpoint",{"2":{"3":2}}],["endpoints",{"2":{"3":2}}],["end",{"2":{"2":1,"3":5,"5":1,"6":1,"16":1,"23":4,"24":1,"25":1,"34":1,"68":1}}],["envrc",{"2":{"16":12}}],["envs",{"2":{"8":2}}],["environment",{"2":{"8":3,"16":1,"67":1}}],["environments",{"2":{"8":1,"9":1}}],["env",{"2":{"1":1,"8":26,"16":38,"72":1}}],["earlier",{"2":{"16":1}}],["eager",{"2":{"15":2}}],["easy",{"2":{"9":1,"12":1,"13":1,"33":1,"64":1}}],["easingthemes",{"2":{"8":2}}],["easier",{"2":{"8":1,"24":2,"27":2,"32":1,"34":1}}],["easiest",{"2":{"3":1,"33":1}}],["easily",{"2":{"1":1,"33":1,"71":1}}],["each",{"2":{"2":4,"8":3,"10":4,"16":1,"17":2,"22":3,"24":2,"34":1,"68":1,"69":1,"71":1,"115":1}}],["existing",{"2":{"33":1,"61":1}}],["exist",{"2":{"24":1}}],["exiting",{"2":{"8":1}}],["excellent",{"2":{"33":1}}],["exceptional",{"2":{"34":1}}],["except",{"2":{"22":1}}],["exclude",{"2":{"8":1,"16":1}}],["execution",{"2":{"21":1}}],["executes",{"2":{"34":1}}],["execute",{"2":{"8":1}}],["executed",{"2":{"3":1}}],["exs",{"2":{"16":5}}],["extreme",{"2":{"33":1}}],["extractor",{"2":{"16":11}}],["external",{"2":{"22":1}}],["extensibility",{"2":{"32":1}}],["extension",{"2":{"16":1,"24":1,"94":2}}],["extensions",{"0":{"94":1},"2":{"4":1,"16":6,"73":1,"94":1}}],["extend",{"2":{"17":1}}],["ex",{"2":{"16":1}}],["express",{"2":{"34":1}}],["experiment",{"2":{"33":1}}],["experimenting",{"2":{"24":1}}],["experience",{"2":{"5":1,"33":3,"34":1,"56":4,"59":1,"116":1}}],["experienced",{"2":{"5":1,"33":2,"58":2,"67":1,"68":1}}],["expediency",{"2":{"23":1}}],["expanding",{"2":{"105":1}}],["expand",{"2":{"16":1,"33":1}}],["expandmode",{"2":{"16":1}}],["explained",{"2":{"33":1}}],["explorer",{"2":{"16":6}}],["explicitly",{"2":{"64":1,"67":1}}],["explicit",{"2":{"1":1}}],["expires",{"2":{"2":2}}],["expired",{"2":{"2":1}}],["exports",{"2":{"15":1}}],["export",{"2":{"1":2,"12":1,"15":1,"17":1,"22":2,"72":2}}],["examples",{"2":{"33":1,"68":1}}],["example",{"2":{"1":2,"2":5,"3":5,"4":2,"6":2,"8":1,"10":3,"12":2,"15":2,"16":2,"22":4,"24":4,"26":1,"27":1,"30":1,"34":1,"93":1,"108":1}}],["hmr",{"2":{"17":1}}],["hurry",{"2":{"26":1}}],["huskyrc",{"2":{"16":2}}],["huge",{"2":{"15":1}}],["hxx",{"2":{"16":3}}],["hpp",{"2":{"16":3}}],["h",{"2":{"8":1,"16":4}}],["hotel",{"2":{"34":1}}],["home",{"2":{"34":1,"61":1,"114":1}}],["horizons",{"2":{"33":1}}],["hood",{"2":{"24":1,"33":1}}],["hooks",{"2":{"16":4}}],["holding",{"2":{"22":2}}],["hoppscotch",{"2":{"16":1}}],["houdini",{"2":{"16":1}}],["hover",{"2":{"16":1}}],["hosts",{"2":{"22":1}}],["hosted",{"2":{"9":1}}],["hosting",{"0":{"9":1},"2":{"9":3,"68":1}}],["host",{"2":{"4":1,"8":10,"9":2}}],["however",{"2":{"18":1,"22":2,"94":1}}],["how",{"2":{"2":1,"3":3,"5":1,"10":1,"12":1,"13":1,"15":1,"16":1,"17":3,"21":1,"22":3,"32":1,"33":3,"34":2,"37":1,"39":1}}],["html5",{"2":{"30":1,"51":1,"64":1}}],["htmlnanorc",{"2":{"16":20}}],["html=",{"2":{"14":1}}],["html",{"0":{"51":1,"75":1},"2":{"4":1,"8":2,"9":1,"13":2,"16":6,"24":3,"33":1,"34":10,"69":1,"75":2,"89":2,"112":2,"116":1}}],["https",{"2":{"4":6,"9":1,"16":2,"34":1,"63":1,"71":1,"72":1,"87":1,"89":1}}],["httponly",{"2":{"2":3}}],["http",{"2":{"1":11,"3":1,"4":3,"13":1,"71":5,"72":4}}],["hello",{"2":{"91":1}}],["helpful",{"0":{"19":1},"1":{"20":1,"21":1},"2":{"45":1}}],["helps",{"2":{"15":1,"33":1,"67":1}}],["help",{"2":{"4":1,"16":1,"32":1,"33":3}}],["heavy",{"2":{"34":1}}],["heavyweight",{"2":{"18":1,"21":1,"91":1}}],["heading",{"2":{"87":1}}],["headless",{"2":{"23":1,"32":1,"68":1}}],["header>",{"2":{"73":1,"100":2}}],["header",{"2":{"10":1,"30":1,"61":2,"68":2,"73":2,"97":1,"98":1,"99":1,"102":1,"105":1,"106":1,"108":1}}],["headers",{"0":{"96":1},"1":{"97":1,"98":1,"99":1,"100":1},"2":{"4":1,"72":1,"96":1,"100":1}}],["heidisql",{"2":{"16":1}}],["height",{"2":{"14":7}}],["heex",{"2":{"16":1}}],["hexcolorlength",{"2":{"16":1}}],["heroku",{"2":{"9":1,"105":1}}],["here",{"2":{"3":1,"5":1,"18":1,"22":3,"33":1,"92":1}}],["he",{"2":{"2":1,"22":1,"24":1}}],["half",{"2":{"92":1}}],["hack",{"2":{"76":1}}],["hamburger",{"2":{"73":1,"78":1,"106":1,"108":1}}],["harmful",{"2":{"33":1}}],["hardware",{"2":{"34":2}}],["hard",{"2":{"17":1}}],["happen",{"2":{"22":1}}],["happened",{"2":{"22":1}}],["had",{"2":{"21":1,"22":1}}],["handled",{"2":{"34":1}}],["handle",{"2":{"33":1,"34":1}}],["handles",{"2":{"24":1}}],["handling",{"2":{"25":1}}],["handy",{"0":{"18":1},"2":{"16":1,"31":1}}],["hand",{"2":{"16":1,"22":1,"67":2}}],["have",{"2":{"2":3,"3":1,"8":1,"11":1,"12":1,"13":1,"16":2,"21":3,"22":4,"24":2,"25":2,"26":1,"32":2,"33":1,"34":1,"67":1,"88":2,"116":1}}],["hash",{"2":{"13":1}}],["hassles",{"2":{"2":1}}],["has",{"2":{"2":7,"3":1,"5":1,"8":2,"10":1,"17":1,"21":3,"22":5,"24":3,"34":1,"87":1,"91":2,"94":1}}],["hide=",{"2":{"100":1}}],["hidden",{"2":{"1":1,"76":1,"106":1}}],["high",{"2":{"64":1}}],["highly",{"2":{"23":1}}],["highlightmodifiedtabs",{"2":{"16":1}}],["hierarchical",{"2":{"32":1}}],["hierarchize",{"2":{"24":1}}],["hierarchy",{"2":{"22":2}}],["hints",{"0":{"19":1},"1":{"20":1,"21":1},"2":{"45":1}}],["himself",{"2":{"22":1,"32":1,"67":1}}],["him",{"2":{"2":1,"6":1,"25":2}}],["historically",{"2":{"22":1}}],["history",{"2":{"16":5}}],["histoire",{"2":{"16":10}}],["his",{"2":{"2":2,"3":1,"16":1}}],["uri",{"2":{"72":1}}],["url",{"2":{"1":1,"13":2,"15":1,"72":1,"112":2,"114":1}}],["ux",{"2":{"34":2,"56":1,"64":1,"79":1,"102":1,"115":1}}],["uis",{"2":{"24":1}}],["ui",{"0":{"27":1,"32":1},"2":{"17":1,"18":2,"23":1,"24":2,"25":2,"27":1,"29":1,"32":9,"56":1,"64":1,"68":1,"73":1,"98":1,"99":1}}],["u",{"2":{"12":1}}],["utility",{"2":{"22":1,"73":1}}],["utilities",{"0":{"27":1},"2":{"10":2,"27":1}}],["utils",{"2":{"1":3,"10":1,"14":2,"71":3,"72":5,"73":2,"75":1,"93":1}}],["upper",{"2":{"69":1}}],["upgrading",{"2":{"34":1}}],["upgrade",{"2":{"32":1}}],["up",{"2":{"8":1,"16":3,"17":1,"21":1,"23":1,"25":2,"32":3,"33":1,"67":1,"72":1,"91":1}}],["updating",{"2":{"8":1,"24":1}}],["updates",{"2":{"24":1}}],["updated",{"2":{"23":1,"24":2}}],["update",{"2":{"8":3,"16":1}}],["upload",{"2":{"8":3,"33":1}}],["ubuntu",{"2":{"8":3,"61":1}}],["usability",{"2":{"56":1}}],["usage",{"0":{"93":1},"2":{"21":1}}],["usual",{"2":{"24":1}}],["usually",{"2":{"5":1,"12":1,"21":1,"22":2,"23":1,"24":1,"33":1,"34":1,"67":1,"91":1}}],["us",{"2":{"16":1}}],["using",{"2":{"3":2,"4":1,"5":1,"8":1,"9":1,"10":1,"13":1,"17":2,"22":3,"24":1,"32":1,"34":2,"55":1,"56":1,"68":1,"104":1}}],["usetouchswipe",{"2":{"79":1}}],["useappconfig",{"2":{"73":3}}],["useauthstore",{"2":{"22":1}}],["useauthservice",{"2":{"22":1}}],["useauth",{"2":{"1":4,"22":1}}],["uselessly",{"2":{"33":1}}],["useless",{"2":{"33":1,"94":1}}],["usenewswidget",{"2":{"24":1}}],["usei18nlight",{"0":{"92":1},"2":{"93":2}}],["usei18n",{"2":{"10":1,"24":1,"93":4}}],["usescreenwidth",{"2":{"69":6}}],["usescreensize",{"2":{"24":1}}],["useshoppingcart",{"2":{"24":1}}],["uses",{"2":{"8":11,"14":1,"17":1,"21":3,"24":1,"64":2,"73":2,"87":1}}],["usefulness",{"2":{"23":1}}],["useful",{"2":{"6":1,"8":1,"16":4,"22":1,"23":1,"25":1,"33":3,"34":2,"39":1,"63":1,"94":1,"105":1}}],["use",{"0":{"11":1,"27":1,"29":1,"30":1},"2":{"2":1,"3":1,"5":2,"10":3,"13":3,"16":2,"17":2,"21":3,"22":3,"23":1,"24":2,"25":2,"27":2,"29":1,"31":1,"32":2,"33":2,"34":4,"64":3,"68":1,"72":1,"73":1,"87":1,"93":1,"94":2,"115":1}}],["used",{"2":{"2":3,"4":3,"8":2,"10":1,"17":2,"21":2,"22":2,"24":3,"25":1,"33":1,"58":1,"64":3,"69":1,"72":1,"108":1,"115":1}}],["userloggedin",{"2":{"22":1}}],["useraccountview",{"2":{"12":1}}],["username",{"2":{"2":1,"8":2,"22":1}}],["user",{"2":{"1":2,"2":16,"8":8,"10":1,"11":2,"16":3,"21":1,"22":3,"23":1,"24":4,"25":1,"34":3,"56":4,"64":1,"68":1,"100":1,"106":1,"114":1,"116":1,"117":1}}],["userid",{"2":{"1":1}}],["users",{"2":{"1":7,"2":2,"25":1,"34":2}}],["userdata",{"2":{"1":1}}],["unwanted",{"2":{"67":1}}],["unnecessarily",{"2":{"64":1}}],["unnecessary",{"2":{"2":1,"5":1,"22":1}}],["unless",{"2":{"29":1,"64":1}}],["unlike",{"2":{"22":1}}],["unlighthouse",{"2":{"16":2}}],["unequivocally",{"2":{"24":1}}],["unfortunate",{"2":{"22":1}}],["unfortunately",{"2":{"16":1}}],["unoptimized",{"2":{"34":1}}],["unocss",{"2":{"16":10}}],["uno",{"2":{"16":10}}],["untrackedchanges",{"2":{"16":1}}],["unified",{"2":{"32":1}}],["unification",{"2":{"5":1}}],["unit",{"2":{"23":6}}],["unique",{"2":{"22":2}}],["unicodehighlight",{"2":{"16":1}}],["universal",{"2":{"13":2}}],["under",{"2":{"6":1,"24":1,"57":1,"87":5}}],["understanding",{"2":{"33":1}}],["understand",{"2":{"12":1,"22":1,"33":2,"34":1}}],["understandable",{"2":{"5":1}}],["understood",{"2":{"2":1}}],["undeservedly",{"2":{"2":1}}],["=+",{"2":{"16":1}}],["==",{"2":{"8":3}}],["=>",{"2":{"8":2,"14":2,"93":1}}],["=",{"2":{"1":5,"8":1,"12":3,"14":3,"15":6,"21":6,"22":1,"24":1,"69":1,"71":3,"72":2,"73":2,"89":1,"93":3}}],["fcp",{"2":{"34":1}}],["fnc",{"2":{"18":1,"21":1}}],["fly",{"2":{"34":1,"91":1}}],["flagship",{"2":{"24":1}}],["flake",{"2":{"16":2}}],["flow",{"2":{"21":1,"24":1,"53":1}}],["flowconfig",{"2":{"16":2}}],["fls",{"2":{"16":1}}],["flex",{"2":{"69":3}}],["flexbox",{"2":{"29":1,"30":1,"52":2}}],["flexible",{"2":{"22":1,"24":1}}],["flexibility",{"2":{"5":1,"22":1}}],["fledged",{"2":{"3":2,"64":1}}],["fdb",{"2":{"16":1}}],["feature",{"2":{"24":1}}],["features",{"0":{"30":1},"2":{"3":1,"21":1,"22":1,"34":2,"91":1}}],["fetish",{"2":{"23":1}}],["fetch",{"2":{"1":1,"8":1,"67":1,"71":1}}],["ferferga",{"2":{"22":1}}],["few",{"2":{"4":1,"18":1,"67":1,"68":1}}],["future",{"2":{"68":1}}],["further",{"2":{"66":1,"67":1,"68":1}}],["fundamental",{"2":{"24":1}}],["functional",{"2":{"22":1,"68":2}}],["functionality",{"2":{"21":2,"25":1,"31":1,"32":1,"61":1,"63":2,"64":4,"66":1,"67":1,"68":2,"79":1,"91":2,"92":1,"95":1,"105":1}}],["function",{"2":{"14":1,"15":3,"21":1,"22":3,"25":1,"26":2,"64":1,"69":2,"71":1,"79":1,"89":1,"91":1,"93":1}}],["functions",{"2":{"3":3,"10":1,"22":9,"24":2,"25":1}}],["fu",{"2":{"16":1,"64":1}}],["fullstack",{"2":{"5":1,"16":1}}],["fullstackers",{"2":{"5":1}}],["full",{"2":{"3":2,"22":1,"32":1,"59":1,"64":1}}],["frequently",{"2":{"58":2}}],["freezed",{"2":{"16":1}}],["free",{"2":{"3":3,"9":2,"33":3}}],["friendly",{"2":{"17":1,"33":1}}],["fragments",{"2":{"68":1,"75":1}}],["frantically",{"2":{"16":1}}],["frameworks",{"0":{"24":1},"2":{"24":3,"42":1,"67":1}}],["framework",{"2":{"4":1,"21":4,"22":1,"24":1,"64":1,"67":2,"91":1,"105":1}}],["front",{"2":{"2":6,"3":4,"5":1,"6":1,"16":1,"23":2,"24":1,"25":1,"68":1}}],["frontenders",{"0":{"3":1}}],["frontend",{"0":{"24":1,"25":1},"1":{"26":1,"27":1,"28":1,"29":1,"30":1,"31":1},"2":{"2":3,"3":3,"4":1,"5":2,"9":1,"16":1,"22":5,"23":2,"24":5,"25":3,"33":2,"34":1,"37":1,"39":1,"42":2,"58":1,"67":1}}],["from",{"0":{"63":1},"2":{"1":10,"2":1,"3":1,"4":7,"8":3,"9":1,"13":9,"14":3,"15":3,"16":1,"17":3,"21":1,"22":8,"23":2,"24":3,"25":1,"28":1,"33":7,"34":7,"56":1,"58":1,"68":1,"69":1,"71":2,"72":5,"73":3,"77":1,"87":1,"88":1,"91":1,"93":2,"106":1,"109":1}}],["fix",{"2":{"16":1,"25":1}}],["fixall",{"2":{"16":2}}],["field",{"2":{"15":2,"22":1,"24":2}}],["finance",{"2":{"91":1}}],["final",{"2":{"25":1,"32":1}}],["finished",{"2":{"33":1}}],["fine",{"2":{"16":1,"68":1}}],["finding",{"2":{"91":1}}],["find",{"2":{"15":1,"16":1,"34":1,"93":1}}],["fingerprint",{"2":{"2":1}}],["filling",{"2":{"66":1,"68":1}}],["fill",{"2":{"14":1}}],["filenesting",{"2":{"16":3}}],["filename",{"2":{"15":10}}],["filelistlayout",{"2":{"16":1}}],["file=",{"2":{"8":1}}],["files",{"2":{"8":3,"9":1,"13":1,"14":1,"16":4,"17":2,"34":2,"73":1,"93":1}}],["file",{"2":{"4":1,"8":9,"14":1,"16":3,"34":2,"61":2,"75":1,"114":1,"117":2}}],["fi",{"2":{"8":2}}],["firesbase",{"2":{"105":1}}],["firestore",{"2":{"33":1}}],["firebase",{"2":{"3":2,"9":2,"16":4,"105":1}}],["fira",{"2":{"16":1}}],["first",{"2":{"2":2,"15":1,"16":1,"22":2,"33":2,"34":4,"58":1,"100":1,"115":1}}],["fight",{"2":{"2":1}}],["follows",{"2":{"71":1}}],["follow",{"2":{"33":1}}],["following",{"2":{"25":1,"80":1,"102":1}}],["folder",{"2":{"8":1,"13":6}}],["found",{"2":{"22":1}}],["four",{"2":{"2":1,"69":1}}],["font",{"2":{"117":1}}],["fonts",{"2":{"115":1}}],["fontweight",{"2":{"16":1}}],["fontligatures",{"2":{"16":1}}],["fontfamily",{"2":{"16":1}}],["fontaliasing",{"2":{"16":1}}],["footers",{"0":{"80":1},"1":{"81":1,"82":1,"83":1,"84":1,"85":1},"2":{"80":1}}],["footer",{"2":{"10":1,"61":2,"68":2,"102":1,"105":1,"106":1}}],["fork",{"2":{"55":1}}],["forgotten",{"2":{"29":1}}],["forget",{"2":{"21":1}}],["foreign",{"2":{"22":1,"32":1}}],["forbidden",{"2":{"2":1}}],["forces",{"2":{"8":1}}],["force",{"2":{"2":1}}],["forms",{"2":{"34":1,"105":1}}],["formulate",{"2":{"16":10}}],["formkit",{"2":{"16":10}}],["formatters",{"2":{"21":2}}],["formatter",{"2":{"16":1}}],["formatting",{"2":{"16":2,"21":1,"34":1,"64":1}}],["formatonsave",{"2":{"16":1}}],["formats",{"2":{"15":1,"16":1}}],["format",{"2":{"3":1,"5":1,"8":3,"15":2,"16":2,"34":2,"61":1}}],["form",{"2":{"2":1,"3":2,"21":1,"22":1,"55":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":7,"13":2,"15":4,"16":14,"17":5,"18":2,"19":1,"20":1,"21":7,"22":13,"23":3,"24":8,"25":2,"26":1,"27":3,"28":1,"29":1,"30":1,"31":1,"32":4,"33":9,"34":16,"58":1,"61":1,"63":1,"64":4,"66":2,"67":6,"68":2,"69":2,"71":1,"72":2,"73":1,"78":2,"89":1,"91":3,"94":2,"102":6,"105":5,"108":1,"112":1,"114":1,"115":3,"117":1}}],["family",{"2":{"117":1}}],["familiarize",{"2":{"67":1,"68":1}}],["facebook",{"2":{"112":1}}],["facilitate",{"2":{"64":1}}],["fact",{"2":{"21":1,"22":1}}],["factor",{"2":{"24":1}}],["facto",{"2":{"5":1,"72":1}}],["fans",{"2":{"16":1}}],["faster",{"2":{"16":1,"17":2,"24":1,"29":1}}],["fast",{"2":{"16":1,"32":1}}],["fall",{"2":{"22":1,"24":1}}],["fallback",{"2":{"15":1}}],["false",{"2":{"1":1,"8":2,"16":27,"22":1,"61":4}}],["fairly",{"2":{"10":1,"33":1}}],["faq",{"2":{"8":1,"58":1}}],["favorite",{"2":{"1":1}}],["msg",{"2":{"93":1}}],["my",{"2":{"17":1,"22":1,"61":3,"62":1,"66":1,"87":2,"88":1}}],["mysql",{"2":{"16":1,"33":1}}],["mjs",{"2":{"16":4}}],["m",{"2":{"8":2}}],["mdsvex",{"2":{"16":1}}],["md",{"2":{"8":1,"16":3}}],["mkdir",{"2":{"8":2}}],["mvp",{"2":{"23":1}}],["mvc",{"2":{"22":1,"24":1}}],["mv",{"2":{"8":1}}],["multithreaded",{"2":{"24":1}}],["multiple",{"2":{"17":1,"21":1,"25":1,"64":1}}],["multicursormodifier",{"2":{"16":1}}],["much",{"2":{"8":1,"16":2,"17":1,"21":1,"22":1,"24":2,"27":2,"32":4,"33":1,"34":3}}],["must",{"2":{"2":1,"8":2,"13":1,"34":1,"114":1}}],["mit",{"2":{"57":1}}],["mitt",{"2":{"5":1}}],["mistake",{"2":{"25":1}}],["middle",{"2":{"25":1}}],["microservices",{"2":{"25":1}}],["microservice",{"2":{"24":1}}],["microsoft",{"2":{"3":1,"9":1,"16":1,"34":1}}],["micro",{"2":{"16":1}}],["mixins",{"2":{"21":4}}],["mix",{"2":{"16":3,"24":1}}],["minutes",{"2":{"33":1,"68":1}}],["mind",{"2":{"22":1}}],["minimalistic",{"2":{"67":1}}],["minimal",{"2":{"64":1}}],["minimum",{"2":{"63":1}}],["miniserver",{"2":{"16":1}}],["mini",{"2":{"16":2}}],["miniature",{"2":{"3":1}}],["minheight",{"2":{"14":1}}],["minwidth",{"2":{"14":1}}],["might",{"2":{"12":1,"16":1,"22":1,"32":1}}],["megabytes",{"2":{"92":1}}],["mention",{"2":{"34":1}}],["mentor",{"2":{"33":2}}],["menus",{"2":{"16":1}}],["menu",{"2":{"10":1,"12":2,"87":1,"102":1}}],["mess",{"2":{"23":1}}],["message",{"2":{"5":1,"55":1,"91":1}}],["messages",{"2":{"5":2}}],["mechanisms",{"2":{"22":1}}],["means",{"2":{"21":1,"32":1,"64":1,"67":1}}],["measures",{"2":{"2":1}}],["me",{"0":{"18":1}}],["metrics",{"2":{"34":2}}],["met",{"2":{"33":1}}],["methods",{"2":{"4":1,"21":1,"22":1,"33":1}}],["method",{"2":{"2":1,"17":1,"34":2,"61":2,"63":1,"72":1}}],["metaframwork",{"2":{"67":1}}],["metadata",{"2":{"16":1}}],["meta",{"2":{"1":1,"12":1,"14":1,"15":2,"61":1,"66":1,"72":1,"73":1,"102":1,"112":15}}],["moves",{"2":{"106":1}}],["moving",{"2":{"28":1}}],["mobile",{"2":{"34":1,"69":4,"78":1,"106":1,"108":1}}],["morgan",{"2":{"33":1}}],["more",{"2":{"2":1,"4":1,"5":2,"8":1,"10":1,"12":2,"13":1,"16":4,"17":1,"21":4,"22":3,"23":1,"24":6,"25":1,"32":1,"33":3,"34":4,"87":1,"114":1}}],["motivation",{"2":{"33":1}}],["moments",{"2":{"23":1,"33":1}}],["moment",{"2":{"18":1,"21":2,"34":1,"109":1}}],["mouse",{"2":{"16":1}}],["mocha",{"2":{"16":10}}],["monitor",{"2":{"16":2,"24":1}}],["monitoring",{"2":{"2":1}}],["money",{"2":{"16":1}}],["monospace",{"2":{"16":1}}],["mono",{"2":{"16":1}}],["modal",{"2":{"64":1}}],["modifiers",{"2":{"22":1}}],["mod",{"2":{"16":1}}],["modes",{"2":{"106":2,"108":2}}],["models",{"2":{"29":1}}],["model",{"2":{"22":3,"24":2,"32":1}}],["mode",{"2":{"16":3,"22":2,"23":1,"69":1,"114":1}}],["modern",{"0":{"30":1},"2":{"9":1,"15":1,"16":1,"17":1,"21":1,"33":1,"64":1,"68":1}}],["modular",{"2":{"10":1}}],["modules",{"2":{"10":1,"15":6,"16":2,"17":1,"22":2,"25":1,"28":1}}],["module",{"0":{"70":1},"1":{"71":1,"72":1},"2":{"1":2,"10":7,"16":1,"22":2,"24":1,"25":1,"66":2,"68":2,"72":1,"102":2,"105":1}}],["mostly",{"2":{"5":1,"67":1}}],["most",{"2":{"2":1,"3":2,"8":1,"10":2,"16":1,"17":2,"23":1,"24":2,"25":1,"33":2,"34":2,"58":1}}],["max",{"2":{"108":1,"117":1}}],["maximum",{"2":{"108":1}}],["margin",{"2":{"76":1}}],["markdownlint",{"2":{"16":2}}],["markdown",{"0":{"54":1},"2":{"16":1,"54":1}}],["magnitude",{"2":{"34":1}}],["magic",{"2":{"21":1}}],["mat",{"2":{"34":1}}],["matter",{"2":{"33":1}}],["match",{"2":{"8":1,"114":1}}],["may",{"2":{"17":1,"22":1,"24":1,"26":2,"33":1,"34":1,"58":1,"67":1}}],["makarov",{"2":{"59":2}}],["making",{"2":{"17":1,"34":1,"55":1}}],["makes",{"2":{"5":1,"8":1,"22":2,"24":2,"87":1}}],["make",{"2":{"1":1,"2":2,"3":2,"10":1,"12":1,"21":2,"22":1,"24":1,"25":1,"26":1,"27":3,"33":1,"34":1,"61":1,"66":1,"115":1}}],["machine",{"2":{"16":1}}],["macos",{"2":{"16":1}}],["made",{"2":{"16":1,"22":1,"24":1,"34":1,"67":1,"68":1}}],["mailmap",{"2":{"16":1}}],["mainly",{"2":{"22":1,"24":1}}],["mainlayout",{"0":{"106":1},"1":{"107":1},"2":{"12":2,"61":2,"108":1}}],["maintainability",{"2":{"32":1}}],["maintainers",{"2":{"16":1}}],["maintenanceview",{"2":{"12":1}}],["maintenance",{"2":{"12":2}}],["main",{"2":{"1":1,"2":1,"6":1,"8":6,"10":1,"16":1,"22":2,"23":2,"25":1,"31":1,"33":1,"58":1,"76":1,"93":1,"107":1}}],["map",{"2":{"15":2,"16":7}}],["mastery",{"2":{"33":1}}],["master",{"2":{"8":3,"16":1}}],["masked",{"2":{"14":1}}],["mask",{"2":{"4":2}}],["major",{"2":{"3":1}}],["mantinelayeredheader",{"0":{"99":1}}],["mantine",{"2":{"98":1,"99":1}}],["mantinerichfooter",{"0":{"84":1},"2":{"61":2}}],["mantinesimplefooter",{"0":{"83":1}}],["mantinesimpleheader",{"0":{"98":1},"2":{"61":2}}],["mantinesimplenavbar",{"0":{"111":1},"2":{"61":2}}],["manifest",{"0":{"114":1},"2":{"34":3,"61":1,"66":1,"102":1,"113":1,"114":2}}],["manipulating",{"2":{"2":1}}],["managing",{"2":{"22":2}}],["manageable",{"2":{"115":1}}],["managed",{"2":{"34":1}}],["manage",{"2":{"24":1}}],["management",{"0":{"22":1},"2":{"22":3}}],["manager",{"2":{"2":3,"8":1}}],["manual",{"2":{"16":1,"33":1}}],["manually",{"2":{"8":1,"16":1,"61":1}}],["many",{"2":{"2":1,"3":1,"9":1,"13":1,"15":1,"16":2,"24":1,"25":1,"33":1,"34":1,"67":1}}],["l",{"2":{"93":2}}],["luxury",{"2":{"34":1}}],["lumps",{"2":{"24":1}}],["ll",{"2":{"17":1,"33":1}}],["lt",{"2":{"16":1}}],["left",{"2":{"106":1}}],["least",{"2":{"16":1,"22":1,"25":1,"31":1,"33":2}}],["learning",{"0":{"33":1},"2":{"32":1,"33":3,"67":1}}],["learn",{"2":{"8":1,"25":1,"29":1,"33":1,"37":1,"39":1,"68":1}}],["lerna",{"2":{"16":2}}],["leex",{"2":{"16":1}}],["less",{"2":{"16":1,"34":1}}],["length",{"2":{"15":2}}],["let",{"2":{"15":1,"25":2,"29":1}}],["leverage",{"0":{"3":1},"2":{"68":1}}],["levels",{"2":{"2":1,"24":1}}],["level",{"2":{"2":2,"11":2,"21":1,"23":1,"25":1,"31":1,"33":3,"58":1,"67":1}}],["lying",{"2":{"6":1}}],["launching",{"0":{"62":1}}],["launch",{"2":{"47":1}}],["launched",{"2":{"23":1,"34":1}}],["lazy",{"2":{"34":1}}],["labor",{"2":{"34":2}}],["laptop",{"2":{"16":1}}],["later",{"2":{"26":1,"34":1,"64":1}}],["latexmk",{"2":{"16":1}}],["latest",{"2":{"8":2}}],["lang=",{"2":{"14":1,"69":1,"73":1,"93":1}}],["languages",{"2":{"11":1,"24":1,"25":2}}],["language",{"0":{"30":1},"2":{"3":2,"4":1,"5":1,"16":1,"21":2,"22":1,"33":1,"91":2}}],["layout",{"2":{"12":2,"29":1,"32":3,"61":2,"64":1,"66":1,"68":1,"102":2,"105":1,"106":1,"108":3,"117":1}}],["layouts",{"2":{"10":1,"12":2,"68":1}}],["layered",{"2":{"99":1}}],["layer",{"2":{"1":1,"32":1,"34":1,"61":1,"71":1,"102":1}}],["lastindexof",{"2":{"15":2}}],["last",{"2":{"8":1,"16":1}}],["lamda",{"2":{"3":1}}],["lambda",{"2":{"3":1}}],["large",{"2":{"3":1,"8":1,"21":2,"23":2,"24":4,"76":1,"91":1}}],["lof",{"2":{"16":1}}],["lock",{"2":{"16":13}}],["located",{"2":{"32":1,"75":2,"93":1,"108":1,"109":1,"116":1}}],["location",{"2":{"8":1}}],["locally",{"2":{"34":1}}],["locale",{"2":{"21":1,"93":3}}],["locales",{"2":{"21":1,"64":1,"91":1,"93":4}}],["localizing",{"2":{"21":1,"91":1}}],["localization",{"2":{"21":2,"91":2}}],["local",{"2":{"16":1,"22":2,"25":1}}],["localstoragename",{"2":{"8":3}}],["localstorage",{"2":{"2":2,"8":3,"117":1}}],["lot",{"2":{"16":3,"17":1,"21":1,"24":2,"33":2,"34":1,"91":1}}],["lose",{"2":{"22":1,"34":1}}],["loss",{"2":{"15":1}}],["losing",{"2":{"2":1}}],["loose",{"2":{"10":1}}],["loosely",{"2":{"10":1}}],["looks",{"2":{"22":1,"34":2}}],["look",{"2":{"1":1,"5":1,"15":1,"16":1,"18":1,"22":1,"33":1,"71":1}}],["loaded",{"2":{"34":1,"116":1}}],["loadicons",{"2":{"15":2}}],["loading",{"2":{"1":2,"8":1,"13":1}}],["load",{"2":{"3":1,"34":2}}],["lower",{"2":{"24":1}}],["low",{"2":{"2":1,"67":1}}],["longer",{"2":{"2":1,"16":1,"21":1,"22":1,"26":1}}],["log",{"2":{"8":1,"16":1,"21":1}}],["logically",{"2":{"28":1}}],["logical",{"2":{"10":1,"21":1,"22":1,"34":1}}],["logic",{"2":{"3":3,"22":11,"24":4,"32":2,"71":1}}],["login",{"2":{"2":6,"22":1,"23":1,"105":1}}],["logs",{"2":{"2":2,"8":1,"16":1}}],["logged",{"2":{"2":1,"22":1}}],["logout",{"2":{"1":1,"22":1}}],["light",{"2":{"117":1}}],["lightweight",{"2":{"64":1}}],["lighthouserc",{"2":{"16":20}}],["little",{"2":{"34":3}}],["lives",{"2":{"24":1}}],["lived",{"2":{"2":2}}],["license",{"2":{"16":1,"57":1}}],["limitations",{"2":{"32":1}}],["limit",{"2":{"16":3}}],["lib",{"2":{"16":1}}],["libraries",{"0":{"27":1,"32":1},"2":{"15":1,"17":1,"18":1,"19":1,"29":1,"32":9,"64":1,"67":2,"68":1,"104":1,"115":1}}],["library",{"0":{"18":1},"2":{"1":1,"10":1,"21":1,"22":6,"24":1,"25":1,"26":2,"27":2,"32":2,"64":2,"91":1}}],["lifehack",{"2":{"22":1}}],["life",{"2":{"8":1}}],["lifetime",{"2":{"2":4}}],["linux",{"2":{"16":1}}],["linting",{"2":{"23":1,"64":1}}],["linter",{"2":{"16":1}}],["lintstagedrc",{"2":{"16":2}}],["lint",{"2":{"16":4}}],["linenumbers",{"2":{"16":1}}],["lines",{"2":{"4":1,"26":1,"34":1,"92":1}}],["line",{"2":{"4":1,"16":1,"17":1,"33":1}}],["links",{"2":{"17":1}}],["link",{"0":{"0":1},"1":{"1":1},"2":{"88":1}}],["lists",{"2":{"91":1}}],["listeners",{"2":{"24":1}}],["list",{"2":{"4":2,"16":1,"17":1}}],["lies",{"2":{"3":1}}],["likely",{"2":{"22":1}}],["likelihood",{"2":{"10":1}}],["like",{"2":{"1":1,"4":1,"9":1,"11":1,"13":1,"17":2,"21":2,"22":5,"25":1,"32":5,"33":2,"34":5,"61":1,"67":1,"88":1,"115":1}}],["c2c2c4",{"2":{"117":1}}],["czrc",{"2":{"16":2}}],["cz",{"2":{"16":2}}],["cypress",{"2":{"16":10,"23":1}}],["cmakepresets",{"2":{"16":1}}],["cmake",{"2":{"16":3}}],["cmakelists",{"2":{"16":1}}],["cxx",{"2":{"16":1}}],["cjs",{"2":{"16":4}}],["cc",{"2":{"16":1}}],["c",{"2":{"16":1,"61":1,"117":9}}],["csproj",{"2":{"16":1}}],["cspell",{"2":{"16":2}}],["cshtml",{"2":{"16":2}}],["cs",{"2":{"16":12}}],["csshtml",{"2":{"76":1}}],["css3",{"0":{"29":1},"2":{"29":1,"30":1,"32":1,"64":1}}],["cssnano",{"2":{"16":10}}],["cssnanorc",{"2":{"16":10}}],["css",{"0":{"32":1,"52":1,"76":1},"2":{"9":1,"16":5,"18":1,"24":1,"29":1,"32":9,"33":1,"34":1,"64":1,"68":1,"69":2,"105":1,"108":1,"115":1,"116":1,"117":4}}],["ctrlcmd",{"2":{"16":1}}],["cpu",{"2":{"94":1}}],["cpp",{"2":{"16":1}}],["cp",{"2":{"8":1}}],["curve",{"2":{"32":1}}],["cursorstyle",{"2":{"16":1}}],["cursorsmoothcaretanimation",{"2":{"16":1}}],["cursorblinking",{"2":{"16":1}}],["currently",{"2":{"77":1,"80":1,"102":1}}],["currentcolor",{"2":{"14":2}}],["current",{"2":{"8":1,"21":1,"61":1}}],["customize",{"2":{"117":1}}],["customization",{"2":{"16":3,"17":1,"64":2,"66":1,"68":1,"105":1,"113":1}}],["customer",{"2":{"25":1,"29":1,"34":1}}],["custom",{"2":{"3":1,"9":1,"16":2,"17":1,"21":3,"25":1,"32":2,"88":2,"117":1}}],["cd",{"0":{"6":1},"2":{"6":5,"8":4,"23":1,"33":1,"42":1,"62":1,"63":1,"105":1}}],["citation",{"2":{"16":1}}],["circleci",{"2":{"16":2}}],["ci",{"0":{"6":1},"2":{"6":5,"8":1,"23":1,"33":1,"42":1,"105":1}}],["clicked",{"2":{"108":1}}],["clicks",{"2":{"106":1}}],["click",{"2":{"87":1}}],["clicking",{"2":{"78":1}}],["click=",{"2":{"73":1,"93":1}}],["cli",{"2":{"16":2,"17":1}}],["clippy",{"2":{"16":2}}],["clipboard",{"2":{"16":4}}],["clients",{"2":{"4":1}}],["client",{"2":{"4":9,"5":2,"16":2,"34":2,"71":2,"115":2}}],["clone",{"2":{"63":1}}],["close",{"2":{"34":2}}],["closeonfiledelete",{"2":{"16":1}}],["cloud",{"2":{"3":4,"6":1,"9":2,"33":1}}],["clamps",{"2":{"24":1}}],["clangd",{"2":{"16":1}}],["clang",{"2":{"16":2}}],["classes",{"2":{"22":2,"25":1,"53":1,"68":1,"69":2}}],["classpath",{"2":{"16":1}}],["class=",{"2":{"14":1,"69":4,"73":2}}],["class",{"2":{"13":1,"16":1,"22":1,"25":1,"32":1,"116":1}}],["clarity",{"2":{"5":1}}],["clear",{"2":{"12":1,"32":1,"67":1,"115":1}}],["cleared",{"2":{"2":1}}],["clean",{"2":{"8":1,"64":1,"92":1}}],["certified",{"2":{"59":2}}],["certification",{"2":{"33":2}}],["certifications",{"2":{"33":1}}],["certificate",{"2":{"9":3}}],["certificates",{"2":{"9":1}}],["certbot",{"2":{"9":1}}],["certain",{"2":{"2":2,"3":1,"21":1,"22":1,"25":1,"34":1,"64":1,"67":2,"68":1}}],["center",{"2":{"2":1}}],["crm",{"2":{"68":1}}],["crawler",{"2":{"34":1}}],["crowdin",{"2":{"16":2}}],["cross",{"2":{"4":2,"16":1}}],["credits",{"2":{"16":1}}],["credo",{"2":{"16":1}}],["creator",{"2":{"24":1}}],["creation",{"2":{"16":1,"23":1}}],["creating",{"0":{"101":1},"1":{"102":1,"103":1,"104":1,"105":1},"2":{"4":1,"12":1,"16":1,"17":1,"24":1,"34":1,"64":1,"67":2,"68":1}}],["create",{"0":{"17":1,"61":1},"1":{"62":1},"2":{"12":1,"13":1,"17":2,"22":1,"25":1,"32":1,"55":1,"57":1,"61":5,"66":1,"67":4,"68":2,"87":1,"117":1}}],["created",{"2":{"8":1,"34":2,"58":1,"115":1}}],["creates",{"2":{"2":1,"21":1,"71":1}}],["crud",{"2":{"3":1}}],["critical",{"2":{"2":1}}],["cryptography",{"2":{"2":1}}],["cheat",{"0":{"48":1},"1":{"49":1,"50":1,"51":1,"52":1,"53":1,"54":1},"2":{"49":1,"50":1,"51":1,"52":4}}],["checkout",{"2":{"8":4}}],["check",{"2":{"2":1,"8":1,"16":1,"23":1,"33":2,"34":1,"105":1}}],["checks",{"2":{"2":2,"16":1}}],["checking",{"2":{"2":1,"22":3}}],["chat",{"2":{"58":1}}],["chaff",{"2":{"33":1}}],["changing",{"2":{"24":1,"25":1,"68":1,"71":1,"91":1,"107":1}}],["changelocale",{"2":{"93":2}}],["changelog",{"0":{"35":1},"1":{"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1},"2":{"16":1}}],["changed",{"0":{"37":1,"39":1,"42":1,"45":1},"2":{"13":1,"24":1}}],["changes",{"2":{"6":1,"16":2,"21":2,"22":1,"24":3,"55":1}}],["change",{"2":{"1":1,"2":1,"21":3,"22":1,"24":3,"25":1,"32":1,"64":1,"105":1,"115":1}}],["chromium",{"2":{"21":1}}],["chrome",{"2":{"21":2,"34":1}}],["choosing",{"2":{"33":1}}],["choose",{"2":{"16":1,"68":1,"77":1,"109":1}}],["choice",{"2":{"8":2,"16":1,"66":1,"71":1}}],["children",{"2":{"12":2}}],["chgrp",{"2":{"8":2}}],["came",{"2":{"34":2}}],["calc",{"2":{"76":1}}],["calculations",{"2":{"24":1}}],["call",{"2":{"71":1}}],["calling",{"2":{"22":1}}],["called",{"2":{"3":1,"22":4,"87":1}}],["calls",{"2":{"1":1,"21":1,"71":2,"72":1,"91":1}}],["categories",{"2":{"25":1,"114":1}}],["category",{"2":{"22":1}}],["catch",{"2":{"21":1}}],["catalog",{"2":{"10":1}}],["capabilities",{"2":{"17":1,"18":1,"21":1}}],["capture",{"2":{"2":1,"16":95}}],["caches",{"2":{"115":1}}],["cached",{"2":{"34":1}}],["cache",{"2":{"16":1,"105":1,"115":2}}],["caching",{"2":{"8":1,"22":1,"34":1,"115":2}}],["card",{"2":{"67":1,"112":1}}],["car",{"2":{"33":1}}],["carousel",{"0":{"20":1},"2":{"20":1}}],["cargo",{"2":{"16":2}}],["careful",{"2":{"23":1}}],["care",{"2":{"15":1,"24":1}}],["cause",{"2":{"5":1}}],["cases",{"0":{"11":1},"2":{"2":1,"10":1,"12":2,"18":1,"21":1,"22":2,"34":2,"108":1}}],["case",{"2":{"2":4,"3":1,"8":2,"9":1,"10":1,"17":1,"21":1,"22":1,"23":1,"24":2,"31":1,"33":1,"61":1}}],["cannot",{"2":{"68":1}}],["can",{"2":{"1":1,"2":3,"3":4,"4":3,"5":2,"8":1,"9":3,"10":2,"11":2,"12":4,"13":4,"16":4,"17":1,"21":2,"22":10,"23":1,"24":8,"25":3,"32":3,"33":8,"34":8,"55":1,"61":1,"67":1,"69":2,"71":1,"78":1,"88":1,"91":1,"100":1,"108":1,"115":1,"116":1}}],["covers",{"2":{"58":1}}],["coincides",{"2":{"34":1}}],["cost",{"2":{"34":1}}],["copy",{"2":{"26":1}}],["copying",{"2":{"16":1,"17":1}}],["cop",{"2":{"24":1}}],["collect",{"2":{"68":1}}],["collects",{"2":{"17":1}}],["colleagues",{"2":{"33":1}}],["column",{"2":{"32":1,"69":1}}],["columnar",{"2":{"29":1}}],["colortheme",{"2":{"16":1}}],["color",{"2":{"14":3,"105":1}}],["coolcosmos",{"2":{"22":1}}],["cooler",{"2":{"16":1}}],["cookie",{"2":{"2":4}}],["could",{"2":{"16":1,"67":1}}],["couple",{"2":{"16":1,"21":1,"29":1,"91":1}}],["coupled",{"2":{"11":1}}],["coupling",{"2":{"10":1,"12":1}}],["counterpart",{"2":{"34":1}}],["counterparties",{"2":{"24":1}}],["count`",{"2":{"8":1}}],["count=5",{"2":{"8":1}}],["courses",{"2":{"33":2}}],["course",{"2":{"5":1,"25":1,"33":1,"34":1}}],["corporation",{"2":{"114":1}}],["corrections",{"2":{"55":1}}],["corresponding",{"2":{"8":1,"21":1,"64":1}}],["corridor",{"2":{"34":1}}],["cors",{"0":{"4":1},"2":{"4":8,"39":1}}],["combination",{"2":{"68":1}}],["combustion",{"2":{"33":1}}],["comfort",{"2":{"34":1}}],["comfortable",{"2":{"16":2,"22":1}}],["comfortably",{"2":{"10":1}}],["come",{"2":{"34":1,"58":1}}],["comes",{"2":{"25":1}}],["coming",{"2":{"25":1}}],["com",{"2":{"3":1,"4":9,"8":10,"9":5,"16":2,"59":1,"63":1,"71":1,"88":1,"89":1}}],["command",{"2":{"17":1,"61":1}}],["commands",{"2":{"8":1,"16":1}}],["communicate",{"2":{"12":1,"72":1}}],["communications",{"2":{"5":1}}],["communication",{"2":{"1":2,"5":2,"102":1}}],["commenting",{"2":{"56":1}}],["comments",{"2":{"2":1,"64":1}}],["commercial",{"2":{"8":1,"33":1}}],["commitlint",{"2":{"16":4}}],["commit",{"2":{"6":1}}],["common",{"2":{"2":2,"21":1,"24":1}}],["complicated",{"2":{"34":1}}],["completely",{"2":{"33":1}}],["completion",{"2":{"16":1}}],["complex",{"2":{"2":1,"5":1,"22":1,"24":1,"32":1,"34":1}}],["complexity",{"2":{"1":1,"24":2,"58":1}}],["competent",{"2":{"33":1,"56":1}}],["computations",{"2":{"25":1}}],["computer",{"2":{"16":1,"17":1,"34":1}}],["computed",{"2":{"14":3}}],["compileroptions",{"2":{"17":1}}],["compile",{"2":{"16":1}}],["companies",{"2":{"33":1}}],["company",{"2":{"2":1}}],["comparable",{"2":{"23":1}}],["compare",{"2":{"16":6}}],["compression",{"2":{"15":1}}],["compound",{"2":{"91":1}}],["composition",{"2":{"21":3,"22":1,"33":1,"42":1,"64":1}}],["composite",{"2":{"10":1,"22":1}}],["composable",{"2":{"21":1,"22":14,"24":2,"25":2,"64":1,"69":2,"79":1,"91":1}}],["composables",{"2":{"1":1,"10":1,"22":2,"69":1,"73":1,"93":2}}],["compose",{"2":{"16":1}}],["composer",{"2":{"16":2}}],["components",{"0":{"27":1},"2":{"1":1,"10":2,"11":3,"12":3,"16":1,"17":1,"18":1,"22":4,"24":4,"25":2,"27":3,"28":1,"32":5,"61":1,"63":1,"68":1,"73":1,"105":2,"117":1}}],["component",{"2":{"1":1,"11":2,"12":4,"13":1,"15":1,"16":7,"21":1,"22":18,"24":2,"32":3,"68":1,"73":2,"79":1,"93":1,"103":2,"117":1}}],["connoisseurs",{"2":{"16":1}}],["connected",{"2":{"10":1,"13":1}}],["connect",{"2":{"9":1,"10":1,"13":1,"22":1,"68":1}}],["connection",{"2":{"5":1,"16":2,"93":1}}],["conduct",{"2":{"16":1}}],["conditions",{"2":{"13":1}}],["confusing",{"2":{"22":1}}],["conflict",{"2":{"16":1}}],["conf",{"2":{"16":1}}],["config",{"0":{"88":1},"2":{"16":226,"17":3,"61":4,"64":1,"75":1,"88":1,"89":1}}],["configs",{"2":{"16":1}}],["configure",{"2":{"17":2}}],["configured",{"2":{"4":1,"8":1}}],["configuring",{"0":{"16":1}}],["configurations",{"2":{"16":1,"34":1}}],["configuration",{"2":{"8":1,"11":2,"16":1,"61":1,"69":1,"75":1,"102":1}}],["confirmsync",{"2":{"16":1}}],["confirmdraganddrop",{"2":{"16":1}}],["confirmdelete",{"2":{"16":1}}],["consume",{"2":{"94":1}}],["consultant",{"2":{"59":1}}],["cons",{"2":{"22":2,"32":2}}],["consists",{"2":{"73":1}}],["consist",{"2":{"22":1}}],["consistency",{"2":{"22":1}}],["considers",{"2":{"22":1}}],["consider",{"2":{"12":1,"25":1,"34":1}}],["considerations",{"0":{"12":1}}],["console",{"2":{"8":1,"21":3}}],["constraints",{"2":{"22":1}}],["construct",{"2":{"22":1}}],["constant",{"2":{"2":1}}],["constantly",{"2":{"2":1}}],["const",{"2":{"1":3,"12":2,"14":3,"15":5,"21":1,"22":1,"69":1,"71":2,"72":2,"73":1,"93":2}}],["contacts",{"2":{"55":1}}],["container",{"2":{"30":1,"69":2}}],["contain",{"2":{"4":1,"8":1,"32":1,"100":1}}],["contains",{"2":{"4":2,"22":1}}],["continue",{"2":{"29":1,"64":1}}],["continuous",{"2":{"6":2}}],["controversial",{"2":{"67":1}}],["controlled",{"2":{"79":1,"116":1,"117":1}}],["controller",{"2":{"16":1,"22":3,"24":2}}],["controls",{"2":{"21":1,"24":1}}],["control",{"2":{"2":1,"4":4,"24":1,"53":1}}],["contributions",{"2":{"57":1}}],["contributing",{"2":{"16":1}}],["contribute",{"0":{"55":1}}],["contributors",{"2":{"16":1}}],["content=",{"2":{"112":11}}],["content",{"2":{"34":5,"61":1,"66":1,"68":1,"72":1,"107":1}}],["contentlayer",{"2":{"16":10}}],["contents",{"2":{"8":1}}],["concepts",{"2":{"25":1}}],["concept",{"2":{"2":1,"24":1,"25":1}}],["convenience",{"2":{"1":1,"2":1,"56":2}}],["conveniently",{"2":{"67":1}}],["convenient",{"2":{"1":1,"5":2,"8":1,"9":1,"10":1,"12":1,"16":2,"21":1,"22":2,"32":3,"33":1,"66":1,"72":1}}],["codesandbox",{"2":{"16":1}}],["coder",{"2":{"16":1}}],["codeowners",{"2":{"16":1}}],["codecov",{"2":{"16":10}}],["codelens",{"2":{"16":4}}],["codeaction",{"2":{"16":1}}],["codeactions",{"2":{"16":1}}],["codeactionsonsave",{"2":{"16":2}}],["codeium",{"2":{"16":1}}],["code",{"0":{"75":1},"2":{"1":4,"3":2,"4":1,"5":1,"6":2,"8":2,"10":1,"16":11,"21":1,"22":1,"24":5,"25":1,"26":1,"28":3,"32":3,"33":4,"34":2,"56":1,"61":1,"64":1,"66":1,"67":1,"68":2,"69":1,"71":2,"72":1,"75":2,"87":1,"89":1,"93":4,"94":2,"102":1,"116":1}}],["ignite",{"2":{"116":1}}],["ignoredlocales",{"2":{"16":1}}],["ignore",{"2":{"16":2,"61":1}}],["ignoretrimwhitespace",{"2":{"16":1}}],["ignorerecommendations",{"2":{"16":1}}],["io",{"2":{"87":1}}],["illustration",{"2":{"64":1}}],["illogical",{"2":{"22":1}}],["irretrievably",{"2":{"18":1,"21":1}}],["ie6",{"2":{"32":1}}],["iex",{"2":{"16":1}}],["ie11",{"2":{"15":1}}],["ie",{"2":{"15":1}}],["iconify",{"2":{"15":1,"16":2}}],["icon",{"2":{"13":2,"14":1,"15":1,"34":1,"73":2,"78":1,"103":1,"106":1,"108":1}}],["icons",{"0":{"15":1},"2":{"13":3,"14":2,"15":2,"17":1,"114":1}}],["i18next",{"0":{"91":1,"94":1},"2":{"21":1,"91":1,"92":1,"94":3,"95":1}}],["i18n",{"0":{"90":1},"1":{"91":1,"92":1,"93":1,"94":1,"95":1},"2":{"11":1,"16":3,"21":3,"64":1,"66":1,"68":1,"91":2,"93":1,"94":1,"104":2}}],["imagine",{"2":{"22":1}}],["imageresources",{"2":{"15":3}}],["imageraw",{"2":{"13":1}}],["imagenameinvariable",{"2":{"13":1}}],["image",{"2":{"13":4,"112":4}}],["imageurl",{"2":{"13":1}}],["images",{"2":{"8":1,"13":10,"15":3,"34":2,"73":1,"112":1,"115":1}}],["imgurl",{"2":{"13":2}}],["img",{"2":{"13":6,"14":1}}],["immediately",{"2":{"13":1,"34":2}}],["impression",{"2":{"56":1}}],["improve",{"2":{"33":1,"34":1,"102":1,"115":1}}],["improvement",{"2":{"21":1}}],["improving",{"2":{"28":1}}],["implemented",{"2":{"69":1,"71":1,"79":1}}],["implements",{"2":{"64":1,"72":1,"117":1}}],["implementations",{"2":{"21":1}}],["implementation",{"0":{"74":1},"1":{"75":1,"76":1},"2":{"5":1,"21":2,"26":1,"31":1,"92":1,"94":1,"115":1}}],["implies",{"2":{"34":1}}],["impose",{"2":{"67":1}}],["impossible",{"2":{"22":1,"33":1}}],["important",{"2":{"23":1,"31":1}}],["importing",{"2":{"13":1}}],["imported",{"2":{"13":1}}],["import",{"2":{"1":7,"13":4,"14":4,"15":7,"16":2,"17":3,"22":2,"69":1,"71":1,"72":5,"73":3,"93":1}}],["id=g",{"2":{"89":1}}],["idx",{"2":{"16":1}}],["identifiers",{"2":{"73":1}}],["identifying",{"2":{"34":1}}],["ideally",{"2":{"22":1}}],["idea",{"2":{"22":1,"34":1}}],["ide",{"0":{"16":1},"2":{"16":1,"56":1}}],["id",{"2":{"8":2,"89":1}}],["i",{"2":{"5":1,"11":1,"13":1,"16":2,"17":1,"22":4,"23":1,"24":1,"25":2,"33":5,"62":1,"63":1}}],["ip",{"2":{"2":1}}],["iphones",{"2":{"2":1}}],["if=",{"2":{"14":1}}],["if",{"2":{"2":5,"3":1,"4":5,"8":5,"9":1,"10":1,"13":2,"15":1,"16":1,"17":3,"21":1,"22":5,"26":2,"27":1,"32":2,"33":4,"34":3,"64":1,"68":1,"87":1,"88":2,"94":1,"108":1}}],["inefficient",{"2":{"34":1}}],["inexpensive",{"2":{"9":1}}],["ingredient",{"2":{"23":1}}],["innovation",{"2":{"22":1}}],["inner",{"2":{"12":1}}],["involved",{"2":{"67":1}}],["invented",{"2":{"24":1,"34":1}}],["invents",{"2":{"22":1}}],["invisiblecharacters",{"2":{"16":1}}],["inheritance",{"2":{"21":1,"25":2}}],["inplace",{"2":{"16":1}}],["input",{"2":{"16":1,"24":1}}],["inputs",{"2":{"8":5}}],["inlinesuggest",{"2":{"16":1}}],["insertfinalnewline",{"2":{"16":1}}],["inside",{"2":{"11":1,"16":1,"21":2,"22":1,"102":1,"109":1}}],["instances",{"2":{"22":1}}],["installation",{"0":{"61":1,"63":1},"1":{"62":1},"2":{"34":1,"61":1}}],["installed",{"2":{"8":1,"34":1,"61":1,"63":1}}],["install",{"2":{"3":2,"8":11,"9":1,"16":1,"33":1,"61":1,"114":1}}],["instructions",{"2":{"8":1}}],["instead",{"2":{"4":1,"17":1,"21":1,"22":1,"34":1,"72":2,"116":1}}],["injection",{"2":{"75":2}}],["injections",{"0":{"75":1},"2":{"75":2}}],["injecting",{"2":{"12":1}}],["injected",{"2":{"68":1}}],["inject",{"2":{"10":1,"11":3,"12":2,"22":2}}],["inc",{"2":{"114":1}}],["include",{"2":{"64":1,"105":1}}],["includes",{"2":{"56":1,"64":1}}],["including",{"2":{"16":1,"17":1,"21":1,"32":1,"68":1,"105":1}}],["increasing",{"2":{"25":1}}],["increase",{"2":{"25":1,"58":1}}],["increased",{"2":{"13":1}}],["increases",{"2":{"10":1,"13":1,"26":1,"34":1}}],["inch",{"2":{"16":1}}],["inconvenient",{"2":{"13":1}}],["incoming",{"2":{"5":1}}],["indirect",{"2":{"22":1}}],["individually",{"2":{"2":1}}],["ind",{"2":{"16":1}}],["indent",{"2":{"16":1}}],["independent",{"2":{"22":1,"59":1}}],["independently",{"2":{"10":1}}],["independence",{"2":{"10":1}}],["indexed",{"2":{"34":1}}],["indexing",{"2":{"34":1}}],["index",{"0":{"75":1},"2":{"8":2,"34":3,"75":1,"89":1,"112":1,"116":1}}],["info",{"2":{"4":3}}],["informational",{"2":{"8":1}}],["information",{"2":{"2":2,"8":1,"11":1,"17":1,"33":1,"58":3,"114":1}}],["initi18n",{"2":{"93":2}}],["initialized",{"2":{"73":1}}],["initialization",{"2":{"72":1,"89":1,"93":1}}],["initializing",{"0":{"62":1}}],["initial",{"2":{"47":1}}],["initially",{"2":{"10":1}}],["initiating",{"2":{"4":1}}],["init",{"2":{"1":1,"8":2,"72":1}}],["introduction",{"0":{"58":1},"1":{"59":1}}],["introduce",{"2":{"26":1}}],["introduced",{"2":{"21":2,"22":1,"24":2}}],["intl",{"2":{"18":1,"21":1}}],["intensive",{"2":{"34":1}}],["intended",{"2":{"33":1}}],["integrate",{"2":{"68":2}}],["integrated",{"2":{"16":5,"113":1}}],["integrating",{"2":{"64":1}}],["integration",{"2":{"6":1,"22":1,"23":1,"64":1,"102":1,"105":1}}],["interaction",{"2":{"25":1}}],["interactivity",{"2":{"24":1}}],["intermediate",{"2":{"24":1,"33":1}}],["intermediary",{"2":{"4":1}}],["intersection",{"2":{"21":1}}],["interval",{"2":{"16":1}}],["internal",{"2":{"24":1,"33":1}}],["internally",{"2":{"13":1}}],["internationalization",{"2":{"11":1,"21":3,"91":2,"104":1}}],["internet",{"2":{"3":3,"4":3,"33":3}}],["interesting",{"2":{"8":1,"22":1,"58":1}}],["interfaces",{"2":{"53":1}}],["interface",{"2":{"3":1,"23":1,"56":1}}],["interceptors",{"2":{"1":1,"71":2,"72":1}}],["into",{"2":{"1":3,"2":1,"6":1,"10":3,"11":2,"13":1,"17":1,"24":2,"32":2,"34":2,"75":1,"113":1}}],["in",{"0":{"22":1,"75":1,"88":1,"104":1},"2":{"1":3,"2":19,"3":13,"4":3,"5":2,"6":2,"8":7,"9":1,"10":4,"11":2,"12":2,"13":11,"15":4,"16":14,"17":9,"18":2,"21":18,"22":32,"23":6,"24":15,"25":5,"26":3,"32":4,"33":9,"34":22,"56":1,"58":2,"59":1,"61":3,"62":1,"64":6,"67":2,"68":1,"69":3,"71":2,"72":1,"73":1,"75":1,"76":1,"87":2,"88":1,"91":2,"92":1,"93":3,"94":3,"98":1,"99":1,"102":1,"106":3,"108":4,"114":1,"115":2,"116":2,"117":3}}],["isdraweropen",{"2":{"73":3}}],["isn",{"2":{"22":2}}],["isauthenticated",{"2":{"22":1}}],["ist",{"2":{"16":1}}],["issues",{"2":{"105":1}}],["issuenumberlabel",{"2":{"16":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":5,"13":4,"15":3,"16":13,"17":8,"18":2,"20":1,"21":10,"22":35,"23":5,"24":13,"25":5,"26":2,"28":1,"29":1,"31":1,"32":5,"33":15,"34":21,"55":1,"58":1,"61":1,"63":1,"64":5,"67":3,"68":1,"69":1,"71":2,"72":3,"75":1,"76":1,"78":1,"79":2,"88":1,"91":1,"92":1,"94":3,"95":2,"106":1,"107":1,"108":3,"109":2,"115":2,"116":3,"117":4}}],["itself",{"2":{"8":1,"21":2,"22":1,"23":1,"28":1,"34":1,"67":1}}],["its",{"2":{"2":3,"3":2,"4":1,"8":3,"10":1,"13":1,"16":1,"17":2,"21":1,"22":2,"24":3,"26":1,"31":1,"32":1,"33":1,"34":8,"56":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":2,"15":1,"16":11,"17":4,"21":6,"22":19,"23":1,"24":11,"25":7,"26":5,"27":1,"29":3,"32":3,"33":11,"34":17,"61":4,"63":1,"64":2,"66":1,"67":5,"68":2,"75":1,"78":1,"91":3,"94":2,"109":1,"114":2,"116":1,"117":1}}],["twitter",{"2":{"59":1,"112":8}}],["twenty",{"2":{"33":1}}],["two",{"2":{"2":2,"10":1,"12":1,"25":1,"33":3,"34":3,"77":1,"100":1,"109":1}}],["tune",{"2":{"68":1}}],["tutorial",{"2":{"33":3}}],["turn",{"2":{"22":1}}],["turned",{"2":{"16":1}}],["turbo",{"2":{"16":2}}],["txt",{"2":{"16":1}}],["tsc",{"2":{"17":1}}],["tsconfig",{"2":{"16":11,"17":2}}],["tsup",{"2":{"16":2}}],["tslint",{"2":{"16":2}}],["tsdoc",{"2":{"16":11}}],["tsdk",{"2":{"16":1}}],["tsx",{"2":{"16":3}}],["ts",{"2":{"16":33,"22":1,"69":1,"71":1,"72":1,"73":3,"75":1,"88":1,"93":2}}],["tmp",{"2":{"16":1}}],["title",{"2":{"33":1,"112":4}}],["titlebarstyle",{"2":{"16":1}}],["tied",{"2":{"29":1}}],["tips",{"2":{"25":1,"39":1}}],["tip",{"2":{"21":1,"24":1,"33":1,"72":1}}],["tidy",{"2":{"16":1}}],["tight",{"2":{"12":1}}],["tightly",{"2":{"11":1,"24":1}}],["times",{"2":{"17":2,"22":2,"34":1}}],["timestamp",{"2":{"8":1}}],["time",{"0":{"21":1},"2":{"2":2,"5":1,"8":1,"10":1,"16":1,"21":2,"22":1,"23":6,"25":1,"26":1,"28":2,"33":2,"67":1,"91":1}}],["tapping",{"2":{"78":1}}],["tablet",{"2":{"69":4,"78":1,"106":1,"108":1}}],["tabs",{"2":{"16":1}}],["tabsize",{"2":{"16":1}}],["tags",{"2":{"61":1,"66":1,"102":1,"112":4}}],["tag",{"2":{"32":1,"89":2,"116":1}}],["taking",{"2":{"24":1,"33":1}}],["taken",{"2":{"24":1}}],["takes",{"2":{"22":1}}],["take",{"2":{"5":1,"16":1,"21":1,"23":2,"34":1,"67":1,"91":1}}],["task",{"2":{"16":1,"24":1,"68":1}}],["tasks",{"2":{"16":2,"67":3}}],["tazerc",{"2":{"16":2}}],["tailwind",{"2":{"16":10,"29":1,"32":2}}],["tail",{"2":{"8":1}}],["target",{"2":{"8":15,"17":1}}],["type=",{"2":{"93":1}}],["types",{"2":{"17":1,"22":2,"23":1,"53":1,"77":1,"80":1,"115":1}}],["typescript",{"0":{"53":1},"2":{"5":1,"12":1,"16":6,"17":3,"22":2,"53":4,"64":1}}],["typedoc",{"2":{"16":2}}],["type",{"2":{"8":1,"12":1,"14":7,"22":1,"32":1,"72":1,"112":1}}],["typicode",{"2":{"3":1,"71":1}}],["t",{"2":{"3":1,"8":1,"12":1,"13":1,"16":2,"17":3,"22":2,"24":3,"25":1,"26":3,"27":1,"34":2,"64":1,"88":1,"91":2,"93":2,"94":1}}],["telegram",{"2":{"58":1}}],["tells",{"2":{"61":1}}],["tell",{"0":{"18":1}}],["team",{"2":{"34":1}}],["teams",{"2":{"24":1}}],["teaches",{"2":{"33":2}}],["teacher",{"2":{"33":1}}],["techniques",{"2":{"68":1}}],["technical",{"2":{"31":1}}],["technologies",{"2":{"17":1,"21":1,"33":1,"67":2}}],["technology",{"2":{"6":1}}],["terserrc",{"2":{"16":10}}],["terminal",{"2":{"16":5}}],["terms",{"2":{"3":1,"21":1,"32":1,"34":1}}],["tex",{"2":{"16":1}}],["textbooks",{"2":{"33":1}}],["textbook",{"2":{"33":1}}],["textlint",{"2":{"16":2}}],["text",{"2":{"11":1,"34":4,"91":1,"117":6}}],["temporarily",{"2":{"21":1}}],["temporary",{"2":{"4":1}}],["templates",{"2":{"34":1,"67":1,"105":1}}],["template>",{"2":{"12":6,"14":2,"32":2,"73":2,"93":2,"100":2}}],["template",{"2":{"10":1,"13":1,"24":1,"32":1,"64":1,"66":2,"68":1,"100":3,"102":2}}],["testnet",{"2":{"72":1}}],["testjsonrpc",{"2":{"72":1}}],["testrest",{"2":{"71":2}}],["tests",{"2":{"22":1,"23":11,"34":1}}],["testing",{"0":{"23":1},"2":{"3":1,"6":1,"23":6,"63":1,"105":1}}],["test",{"2":{"3":1,"8":1,"16":1,"23":1,"68":1,"93":1}}],["tricks",{"0":{"76":1}}],["tries",{"2":{"16":1}}],["triggerexpansionontab",{"2":{"16":1}}],["training",{"2":{"33":2}}],["traffic",{"2":{"33":1}}],["tragedy",{"2":{"32":1}}],["tracking",{"2":{"21":1}}],["tracks",{"2":{"21":1}}],["track",{"2":{"21":3,"24":1}}],["travis",{"2":{"16":2}}],["transactions",{"2":{"91":1}}],["transmission",{"2":{"33":1}}],["transform",{"2":{"24":1}}],["transformer",{"2":{"16":1}}],["transfer",{"2":{"8":1,"16":1}}],["translation",{"2":{"11":1,"91":2}}],["translate",{"2":{"5":1}}],["transition",{"2":{"6":1}}],["transpile",{"2":{"17":1}}],["transparently",{"2":{"10":1}}],["transparent",{"2":{"2":1,"8":1,"12":1,"15":1}}],["transport",{"2":{"1":1,"5":1,"33":1,"71":3}}],["trend",{"2":{"32":1}}],["tree",{"2":{"15":1,"16":3,"22":3,"26":1}}],["trevis",{"2":{"6":1}}],["trying",{"2":{"25":1}}],["try",{"2":{"15":2,"16":1,"25":1,"29":1,"33":3}}],["trusted",{"2":{"4":2}}],["true",{"2":{"1":1,"8":1,"12":1,"15":2,"16":61,"61":4}}],["those",{"2":{"68":1}}],["thorough",{"2":{"22":1}}],["than",{"2":{"17":2,"21":1,"22":3,"24":1,"29":1,"32":1,"34":2,"95":1}}],["that",{"2":{"2":5,"3":3,"4":4,"9":1,"10":3,"11":5,"12":1,"13":1,"16":1,"17":1,"21":2,"22":20,"23":3,"24":5,"25":1,"32":3,"33":7,"34":6,"58":1,"64":4,"67":4,"68":1,"69":1,"71":1,"88":1,"91":1}}],["threshold",{"2":{"24":1,"100":2}}],["thread",{"2":{"24":1}}],["three",{"2":{"8":2,"115":1}}],["throw",{"2":{"8":1}}],["throughout",{"2":{"10":1,"22":1}}],["through",{"2":{"2":1,"11":1,"12":1,"17":1,"32":1,"33":1,"64":1}}],["thus",{"2":{"3":1}}],["think",{"2":{"22":1,"25":1}}],["thinner",{"2":{"21":1}}],["thing",{"2":{"5":1,"32":1}}],["things",{"2":{"3":1,"16":1,"21":2,"25":1,"34":1,"91":2}}],["third",{"0":{"27":1},"2":{"2":1,"4":5,"5":1,"22":1,"26":1,"34":1,"64":2,"115":1}}],["this",{"0":{"55":1},"2":{"1":1,"2":4,"3":1,"4":1,"8":4,"9":2,"10":2,"12":1,"13":2,"16":5,"17":2,"18":1,"21":3,"22":11,"23":3,"24":13,"25":4,"27":1,"28":1,"31":1,"32":2,"33":6,"34":7,"56":1,"58":1,"61":3,"63":1,"68":1,"88":1,"91":1,"115":2}}],["theoretical",{"2":{"25":1}}],["themetoggle",{"2":{"117":1}}],["themes",{"0":{"117":1},"2":{"11":1,"25":1,"66":1,"68":2,"105":2,"117":4}}],["theme",{"2":{"11":1,"103":2,"117":2}}],["themselves",{"2":{"9":1,"24":1,"67":1,"68":1,"75":1}}],["them",{"2":{"8":1,"11":4,"12":4,"13":3,"16":2,"17":1,"21":1,"22":4,"23":1,"25":1,"27":3,"28":1,"32":1,"33":1,"34":1,"64":1,"94":1}}],["these",{"2":{"3":2,"4":1,"21":1,"22":1,"23":1,"34":1}}],["theft",{"2":{"2":1}}],["they",{"2":{"2":1,"8":1,"13":4,"17":1,"21":1,"22":2,"24":2,"28":1,"32":1,"33":1,"34":1}}],["their",{"2":{"2":1,"3":3,"13":1,"17":1,"18":1,"22":1,"23":1,"24":1,"32":1,"33":1,"34":1,"68":1,"73":1}}],["therefore",{"2":{"32":1}}],["there",{"2":{"2":3,"3":4,"8":2,"10":2,"12":1,"13":1,"15":1,"16":3,"18":3,"22":6,"23":2,"24":2,"25":1,"26":1,"32":1,"33":4,"34":2,"67":2,"75":1,"77":1,"94":1,"95":1}}],["then",{"2":{"1":1,"2":2,"3":1,"8":4,"15":1,"17":1,"22":3,"34":6}}],["the",{"0":{"16":1,"31":1,"55":1,"59":1,"63":1,"75":1},"2":{"1":11,"2":67,"3":16,"4":40,"5":13,"6":2,"8":43,"9":4,"10":11,"11":3,"12":8,"13":22,"14":1,"15":5,"16":16,"17":9,"18":2,"20":1,"21":35,"22":50,"23":17,"24":41,"25":14,"26":3,"27":2,"28":2,"29":1,"31":2,"32":20,"33":28,"34":55,"55":2,"56":6,"57":1,"58":9,"61":9,"64":12,"67":7,"68":12,"69":2,"71":9,"72":6,"73":4,"75":3,"76":2,"78":1,"80":1,"87":10,"88":3,"89":1,"91":10,"92":1,"94":2,"95":2,"100":3,"102":5,"103":1,"104":1,"105":3,"106":3,"107":2,"108":7,"109":3,"113":1,"114":2,"115":5,"116":7,"117":6}}],["touch",{"2":{"79":2}}],["touchslideoutdrawer",{"0":{"79":1},"2":{"79":1}}],["touched",{"2":{"58":1}}],["toggle",{"2":{"73":1,"103":1}}],["together",{"2":{"24":1,"26":1}}],["todos",{"2":{"71":1}}],["toaster",{"2":{"64":1}}],["top",{"2":{"58":1,"102":1}}],["topics",{"2":{"58":1}}],["topic",{"2":{"23":1}}],["too",{"2":{"33":1,"34":1}}],["took",{"2":{"25":1}}],["tool",{"2":{"16":3,"17":1,"31":1,"67":1}}],["toolchain",{"2":{"16":1}}],["tools",{"2":{"6":1,"21":1,"23":1,"34":1,"67":1}}],["toml",{"2":{"16":10}}],["toc",{"2":{"16":1}}],["tokens",{"2":{"2":2,"11":1,"105":1}}],["token",{"2":{"1":1,"2":15,"56":4}}],["to",{"0":{"3":1,"5":2,"55":1,"86":2},"1":{"87":2,"88":2},"2":{"1":7,"2":33,"3":15,"4":11,"5":8,"6":1,"8":30,"9":8,"10":9,"11":4,"12":5,"13":8,"14":1,"15":3,"16":12,"17":12,"21":6,"22":26,"23":5,"24":19,"25":17,"26":3,"27":2,"28":2,"29":5,"32":7,"33":21,"34":26,"37":1,"39":1,"55":1,"61":2,"64":4,"67":8,"68":11,"71":3,"72":2,"73":2,"75":1,"76":1,"77":1,"79":1,"87":3,"88":1,"94":2,"102":3,"103":1,"105":3,"108":1,"109":1,"114":2,"115":1,"116":1,"117":2}}],["aesthetics",{"2":{"56":1}}],["afraid",{"2":{"33":1}}],["affects",{"2":{"26":1}}],["after",{"2":{"5":1,"6":1,"8":3,"9":1,"34":2,"95":1,"100":1,"116":1}}],["agnostic",{"2":{"71":1}}],["ago",{"2":{"21":1}}],["against",{"2":{"8":1,"92":1}}],["again",{"2":{"5":1,"33":1}}],["azure",{"2":{"16":2}}],["air",{"2":{"16":1}}],["ava",{"2":{"16":10}}],["available",{"0":{"102":1,"103":1},"2":{"13":1,"15":1,"22":2,"34":1,"63":1,"68":1,"80":1,"87":1,"102":1}}],["avoids",{"2":{"24":1}}],["avoided",{"2":{"21":1}}],["avoid",{"0":{"26":1},"2":{"12":1,"75":1,"105":1}}],["aux",{"2":{"16":1}}],["audio",{"2":{"13":1}}],["autocompleterefs",{"2":{"16":1}}],["autodetection",{"2":{"16":1}}],["autodetectcolorscheme",{"2":{"16":1}}],["autofetch",{"2":{"16":1}}],["autoupdate",{"2":{"16":1}}],["auto",{"2":{"8":1,"14":1,"16":1,"114":1}}],["automatically",{"2":{"8":1,"24":1,"87":1}}],["automation",{"2":{"8":1,"33":1,"87":1}}],["automating",{"2":{"6":1}}],["automate",{"2":{"8":1}}],["author",{"0":{"59":1},"2":{"58":1}}],["authors",{"2":{"16":3}}],["authorization",{"0":{"2":1},"2":{"2":6}}],["authentication",{"0":{"2":1},"2":{"2":7,"3":1,"11":3,"22":1,"56":2,"105":1}}],["authinterceptor",{"2":{"1":2}}],["auth",{"2":{"1":3,"66":1,"68":1,"105":2}}],["away",{"2":{"113":1}}],["await",{"2":{"1":2,"71":1}}],["aws",{"2":{"3":1,"59":1}}],["abbreviations",{"0":{"56":1}}],["above",{"2":{"34":1,"88":1,"92":1}}],["about",{"0":{"24":1,"59":1},"2":{"15":1,"21":1,"22":2,"33":1,"34":1,"42":1,"114":1}}],["able",{"2":{"8":1,"24":1,"29":1,"68":1}}],["ability",{"2":{"3":4,"9":1,"33":1,"68":3,"103":1,"105":1}}],["absolutely",{"2":{"33":2}}],["absolute",{"2":{"3":1}}],["abstracting",{"2":{"1":1}}],["abstraction",{"0":{"0":1},"1":{"1":1},"2":{"71":1,"102":1}}],["among",{"2":{"23":1}}],["amount",{"2":{"2":1,"25":1}}],["ambiguous",{"2":{"22":1}}],["amazon",{"2":{"3":2,"9":2}}],["along",{"2":{"23":1,"34":1}}],["alias",{"2":{"17":5}}],["alg",{"2":{"16":1}}],["always",{"2":{"11":1,"13":1,"22":2,"26":1,"78":1}}],["alternative",{"2":{"3":1}}],["already",{"2":{"3":1,"8":1,"23":1,"24":1,"25":1,"33":1}}],["also",{"2":{"2":3,"3":2,"6":1,"8":1,"9":2,"12":1,"16":1,"17":3,"22":4,"23":1,"24":4,"27":1,"32":2,"33":4,"34":2,"55":1,"61":1,"71":1,"75":1,"108":1}}],["ally",{"2":{"16":3,"94":2}}],["allowcompoundwords",{"2":{"16":1}}],["allowing",{"2":{"6":1}}],["allowed",{"2":{"4":1,"34":1}}],["allows",{"2":{"4":4,"10":2,"16":2,"22":1,"24":1,"25":1,"34":2,"71":1,"73":1,"114":1,"115":1}}],["allow",{"2":{"2":2,"4":4,"9":1,"17":1,"67":1}}],["all",{"2":{"1":1,"2":1,"4":4,"16":1,"22":3,"24":6,"25":2,"32":1,"33":2,"34":4,"63":1,"73":1,"96":1,"103":1,"108":2,"115":1,"116":1,"117":1}}],["attribute",{"2":{"73":1}}],["attributes",{"2":{"32":1}}],["attempt",{"2":{"5":1}}],["at",{"2":{"2":10,"4":1,"5":2,"8":1,"10":1,"11":2,"16":3,"21":2,"22":2,"23":4,"24":1,"25":2,"31":1,"33":5,"34":3,"56":1,"67":1,"71":1,"87":1,"91":1,"109":1}}],["aside",{"2":{"30":1}}],["aspect",{"2":{"23":1,"24":1}}],["aspx",{"2":{"16":1}}],["astro",{"2":{"16":1,"67":1}}],["ashx",{"2":{"16":1}}],["ascx",{"2":{"16":1}}],["asax",{"2":{"16":1}}],["associated",{"2":{"22":1}}],["assets",{"2":{"10":1,"13":5,"15":2,"73":1,"115":1}}],["assigned",{"2":{"2":1}}],["asked",{"2":{"58":1}}],["ask",{"2":{"2":1}}],["as",{"0":{"95":1},"2":{"2":5,"3":1,"4":2,"5":1,"10":3,"11":2,"13":4,"15":3,"16":4,"17":1,"21":2,"22":5,"23":1,"24":2,"31":1,"32":5,"33":2,"34":10,"58":1,"64":3,"67":4,"68":5,"71":1,"73":1,"88":1,"94":1}}],["asynchronous",{"2":{"71":1}}],["async",{"2":{"1":1,"71":1,"72":1,"89":1}}],["arguments",{"2":{"89":1}}],["architect",{"2":{"59":1}}],["architecture",{"0":{"25":1},"1":{"26":1,"27":1,"28":1,"29":1,"30":1,"31":1},"2":{"10":2,"25":2,"56":1,"68":1}}],["architecturally",{"2":{"22":1}}],["architectural",{"0":{"10":1},"1":{"11":1,"12":1},"2":{"21":1}}],["arrays",{"2":{"91":1}}],["array",{"2":{"21":6,"24":2,"33":1}}],["articles",{"2":{"32":1}}],["article",{"2":{"18":1,"21":1,"23":1,"30":1}}],["artisan",{"2":{"16":1}}],["area",{"2":{"22":1}}],["are",{"2":{"2":6,"3":3,"4":2,"6":1,"8":4,"9":1,"10":3,"12":3,"13":6,"16":4,"17":2,"18":2,"19":1,"21":5,"22":8,"23":7,"24":5,"25":5,"32":2,"33":6,"34":6,"57":2,"58":1,"67":1,"69":1,"75":2,"77":1,"80":1,"93":1,"96":1,"102":1,"113":1,"115":1,"117":2}}],["around",{"2":{"1":1,"3":1,"22":1,"33":1,"34":1}}],["adaptive",{"2":{"67":1,"96":1}}],["adapter",{"2":{"61":1,"72":2,"102":1}}],["adaptability",{"0":{"69":1},"2":{"25":1,"29":1,"32":1,"69":1}}],["advent",{"2":{"34":1}}],["advertising",{"2":{"26":1}}],["advance",{"2":{"34":1}}],["advantage",{"2":{"22":1}}],["advisable",{"2":{"33":1}}],["adding",{"2":{"21":1,"24":1,"64":1}}],["additional",{"2":{"6":1,"34":1}}],["addition",{"2":{"5":1,"8":2,"10":1,"24":1,"34":2,"102":1}}],["addextraspaceontop",{"2":{"16":1}}],["added",{"2":{"13":1,"34":1}}],["add",{"2":{"4":1,"8":1,"16":1,"25":3,"32":1,"55":1,"61":6,"66":3}}],["adds",{"2":{"4":1,"32":1,"61":1,"66":1,"79":1,"89":1,"112":1}}],["addresponseinterceptor",{"2":{"1":2,"72":1}}],["admin",{"2":{"2":2,"10":1}}],["animation",{"2":{"34":1}}],["answers",{"2":{"58":3}}],["answer",{"2":{"33":1,"55":1}}],["angular",{"2":{"24":2}}],["analytics",{"0":{"89":1,"112":1},"2":{"61":1,"66":1,"75":1,"102":2}}],["analysis",{"2":{"16":1,"53":1}}],["analogy",{"2":{"25":1,"33":1}}],["analogs",{"2":{"22":1}}],["analog",{"2":{"22":2}}],["annotations",{"2":{"16":1}}],["antony",{"2":{"16":1,"64":1}}],["antfu",{"2":{"16":3}}],["antialiased",{"2":{"16":1}}],["anti",{"2":{"12":1}}],["another",{"2":{"8":1,"22":5,"25":1,"27":1,"33":1,"34":1,"67":1,"71":1}}],["anyone",{"2":{"22":1}}],["anywhere",{"2":{"22":1}}],["anything",{"2":{"8":1}}],["any",{"2":{"2":2,"3":1,"4":2,"5":2,"11":1,"13":1,"22":3,"24":1,"29":1,"32":1,"34":1,"55":1,"92":1,"114":1}}],["an",{"0":{"17":1,"101":1},"1":{"102":1,"103":1,"104":1,"105":1},"2":{"2":3,"3":2,"4":4,"5":3,"8":2,"9":1,"10":1,"11":1,"12":3,"13":1,"17":3,"21":4,"22":8,"24":4,"25":2,"32":1,"33":7,"34":3,"67":3,"71":1,"73":1,"91":1,"94":2}}],["and",{"0":{"2":1,"12":1,"17":1,"21":1,"27":1,"30":1,"32":1,"34":1,"56":1,"62":1},"2":{"1":3,"2":24,"3":13,"4":3,"5":3,"6":1,"8":22,"9":4,"10":8,"11":2,"12":6,"13":6,"16":18,"17":6,"18":3,"21":20,"22":39,"23":5,"24":22,"25":9,"26":3,"27":1,"28":4,"29":4,"30":1,"31":2,"32":20,"33":37,"34":31,"42":1,"55":1,"56":2,"57":1,"58":8,"61":3,"63":1,"64":5,"66":3,"67":7,"68":10,"69":2,"72":1,"73":3,"78":3,"79":1,"87":5,"91":2,"92":1,"93":1,"94":2,"102":2,"105":8,"106":4,"108":2,"113":2,"114":1,"115":3,"116":1,"117":2}}],["acme",{"2":{"114":3}}],["acr",{"2":{"16":1}}],["across",{"2":{"12":1}}],["acn",{"2":{"16":1}}],["act",{"2":{"68":1}}],["actively",{"2":{"24":1}}],["active",{"2":{"16":1}}],["activitybar",{"2":{"16":1}}],["actions",{"0":{"8":1,"86":1},"1":{"87":1,"88":1},"2":{"2":1,"6":2,"8":12,"16":1,"23":1,"33":1,"41":1,"68":1,"87":1,"102":1,"105":1}}],["action",{"2":{"2":2,"8":9,"16":1,"61":1,"87":2}}],["actually",{"2":{"67":1}}],["actual",{"2":{"8":1,"34":1}}],["accepts",{"2":{"61":1}}],["accessing",{"2":{"16":1,"34":2}}],["accessibility",{"2":{"32":1}}],["accessibilitysupport",{"2":{"16":1}}],["accessible",{"2":{"9":1}}],["accesses",{"2":{"3":1}}],["accessed",{"2":{"3":1,"4":1,"13":1,"88":1}}],["access",{"2":{"1":1,"2":14,"3":5,"4":13,"8":1,"11":1,"22":2,"56":1,"71":1}}],["accomplish",{"2":{"25":1}}],["accompanying",{"2":{"22":1}}],["according",{"2":{"22":1}}],["accordingly",{"2":{"4":1,"34":1}}],["accordian",{"2":{"11":1}}],["accordianpanel",{"2":{"11":1}}],["accountroutes",{"2":{"12":2}}],["account",{"2":{"1":1,"2":2,"10":1,"12":2,"13":1,"15":1,"34":1}}],["axios",{"2":{"1":1,"67":1,"71":1}}],["apollo",{"2":{"16":2}}],["apache",{"2":{"9":1}}],["appveyor",{"2":{"16":2}}],["appsettings",{"2":{"16":2}}],["appsidebar",{"2":{"12":1}}],["apparent",{"2":{"15":1}}],["appfooter",{"2":{"12":2}}],["appheader>",{"2":{"100":1}}],["appheadersecond",{"2":{"100":1}}],["appheaderfirst",{"2":{"100":1}}],["appheader",{"2":{"12":2,"100":1}}],["approaches",{"2":{"24":1}}],["approach",{"2":{"12":1,"32":1,"34":1,"67":1}}],["app",{"2":{"10":1,"12":3,"14":2,"34":3,"61":1,"69":1,"116":1}}],["applied",{"2":{"76":1}}],["applicants",{"2":{"24":1}}],["applications",{"2":{"2":1,"34":3,"67":1,"68":1}}],["application",{"0":{"13":1,"17":1,"25":1,"62":1,"101":1},"1":{"14":1,"15":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"102":1,"103":1,"104":1,"105":1},"2":{"1":1,"3":2,"5":1,"8":1,"10":4,"11":1,"12":1,"13":4,"17":3,"21":1,"22":4,"23":1,"24":1,"25":2,"26":1,"32":1,"33":1,"34":8,"56":3,"61":1,"64":4,"67":3,"68":7,"71":2,"72":2,"73":1,"76":1,"102":6,"104":1,"105":4,"113":1,"114":2,"115":1,"116":3,"117":1}}],["applying",{"2":{"64":1}}],["appleboy",{"2":{"8":3}}],["appears",{"2":{"11":1,"23":1,"76":1,"100":1}}],["appear",{"2":{"4":1,"16":1,"34":1}}],["apidata",{"2":{"71":2}}],["apis",{"2":{"3":1,"5":1,"33":1}}],["api",{"0":{"1":1,"70":1,"71":1},"1":{"71":1,"72":1},"2":{"1":10,"3":4,"5":1,"9":2,"10":2,"16":14,"21":4,"22":2,"24":1,"33":2,"34":1,"42":1,"61":2,"64":1,"66":1,"68":2,"71":5,"72":6,"102":3}}],["a",{"0":{"18":1,"62":1,"65":1,"95":1},"1":{"66":1,"67":1},"2":{"1":4,"2":12,"3":24,"4":11,"5":6,"6":8,"8":9,"9":9,"10":11,"11":1,"12":2,"13":3,"15":4,"16":15,"17":7,"18":2,"21":19,"22":33,"23":5,"24":23,"25":11,"26":6,"29":2,"31":2,"32":6,"33":29,"34":33,"55":2,"61":2,"62":1,"63":1,"64":6,"66":2,"67":13,"68":8,"71":2,"72":1,"76":1,"79":1,"87":3,"88":2,"91":6,"92":2,"93":1,"103":1,"114":1,"115":1,"116":2}}]],"serializationVersion":2}';export{e as default}; diff --git a/assets/chunks/@localSearchIndexen.QcUKwSxw.js b/assets/chunks/@localSearchIndexen.QcUKwSxw.js deleted file mode 100644 index 361c77009..000000000 --- a/assets/chunks/@localSearchIndexen.QcUKwSxw.js +++ /dev/null @@ -1 +0,0 @@ -const e='{"documentCount":118,"nextId":118,"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/assets.html#application-resources","14":"/en/development/assets.html#baseicon","15":"/en/development/assets.html#icons-js","16":"/en/development/building.html#create-and-build-an-application","17":"/en/development/ide.html#configuring-the-ide","18":"/en/development/libraries.html#tell-me-a-handy-library","19":"/en/development/misc.html#helpful-hints","20":"/en/development/misc.html#carousel-or-slider","21":"/en/development/misc.html#date-and-time","22":"/en/development/stores.html#state-management-in-vue-3","23":"/en/development/testing.html#testing","24":"/en/frontend/about-frameworks.html#about-frontend-frameworks","25":"/en/frontend/css-ui-libs.html#css-and-ui-libraries","26":"/en/frontend/architecture.html#frontend-application-architecture","27":"/en/frontend/architecture.html#avoid-dependencies","28":"/en/frontend/architecture.html#use-wrappers-over-components-of-ui-libraries-and-third-party-utilities","29":"/en/frontend/architecture.html#regular-refactoring","30":"/en/frontend/architecture.html#use-css3","31":"/en/frontend/architecture.html#use-modern-standards-and-language-features","32":"/en/frontend/architecture.html#document-the-project","33":"/en/frontend/learning.html#learning-vue","34":"/en/frontend/spa-pwa-ssr-ssg.html#spa-pwa-ssg-ssr-and-seo","35":"/en/misc/CHANGELOG.html#changelog","36":"/en/misc/CHANGELOG.html#v1-4-24-11-2023","37":"/en/misc/CHANGELOG.html#changed","38":"/en/misc/CHANGELOG.html#v1-3-10-10-2023","39":"/en/misc/CHANGELOG.html#changed-1","40":"/en/misc/CHANGELOG.html#v1-2-28-09-2023","41":"/en/misc/CHANGELOG.html#new","42":"/en/misc/CHANGELOG.html#changed-2","43":"/en/misc/CHANGELOG.html#v1-1-15-09-2023","44":"/en/misc/CHANGELOG.html#new-1","45":"/en/misc/CHANGELOG.html#changed-3","46":"/en/misc/CHANGELOG.html#v1-0-11-09-2023","47":"/en/misc/CHANGELOG.html#new-2","48":"/en/misc/cheat-sheets.html#cheat-sheet","49":"/en/misc/cheat-sheets.html#vue","50":"/en/misc/cheat-sheets.html#javascript","51":"/en/misc/cheat-sheets.html#html","52":"/en/misc/cheat-sheets.html#css","53":"/en/misc/cheat-sheets.html#typescript","54":"/en/misc/cheat-sheets.html#markdown","55":"/en/misc/contribute.html#contribute-to-the-development-of-this-resource","56":"/en/misc/glossary.html#glossary-and-abbreviations","57":"/en/vue-webapp/contribution.html#project-participation","58":"/en/misc/introduction.html#introduction","59":"/en/misc/introduction.html#about-the-author","60":"/en/vue-webapp/getting-started.html#getting-started","61":"/en/vue-webapp/getting-started.html#installation-via-create-vue-webapp","62":"/en/vue-webapp/getting-started.html#initializing-and-launching-a-web-application","63":"/en/vue-webapp/getting-started.html#installation-from-the-repository","64":"/en/vue-webapp/guidelines.html#guidelines","65":"/en/vue-webapp/#scaffolding-a-vue-webapp","66":"/en/vue-webapp/#summary","67":"/en/vue-webapp/#justification","68":"/en/vue-webapp/options/adaptability.html#adaptability","69":"/en/vue-webapp/objectives.html#objectives","70":"/en/vue-webapp/options/api.html#api-module","71":"/en/vue-webapp/options/api.html#api-rest","72":"/en/vue-webapp/options/api.html#json-rpc","73":"/en/vue-webapp/options/baseIcon.html#baseicon","74":"/en/vue-webapp/options/drawer.html#navigation-drawers","75":"/en/vue-webapp/options/drawer.html#simpledrawer","76":"/en/vue-webapp/options/drawer.html#touchslideoutdrawer","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/footer.html#footers","81":"/en/vue-webapp/options/footer.html#simplefooter","82":"/en/vue-webapp/options/footer.html#richfooter","83":"/en/vue-webapp/options/footer.html#mantinesimplefooter","84":"/en/vue-webapp/options/footer.html#mantinerichfooter","85":"/en/vue-webapp/options/footer.html#distributedfooter","86":"/en/vue-webapp/options/ga-gp.html#github-actions-script-to-deploy-to-github-pages","87":"/en/vue-webapp/options/ga-gp.html#deployment","88":"/en/vue-webapp/options/ga-gp.html#setting-base-in-vite-config","89":"/en/vue-webapp/options/header.html#headers","90":"/en/vue-webapp/options/header.html#simpleheader","91":"/en/vue-webapp/options/header.html#mantinesimpleheader","92":"/en/vue-webapp/options/header.html#mantinelayeredheader","93":"/en/vue-webapp/options/header.html#slidingheader","94":"/en/vue-webapp/options/google-analytics.html#google-analytics","95":"/en/vue-webapp/options/i18n.html#i18n","96":"/en/vue-webapp/options/i18n.html#i18next","97":"/en/vue-webapp/options/i18n.html#usei18nlight","98":"/en/vue-webapp/options/i18n.html#usage","99":"/en/vue-webapp/options/i18n.html#i18next-extensions","100":"/en/vue-webapp/options/i18n.html#as-a-result","101":"/en/vue-webapp/options/#options-when-creating-an-application","102":"/en/vue-webapp/options/#available-options","103":"/en/vue-webapp/options/#available-by-default","104":"/en/vue-webapp/options/#in-development","105":"/en/vue-webapp/options/#planned","106":"/en/vue-webapp/options/layout-main.html#mainlayout","107":"/en/vue-webapp/options/layout-main.html#routing","108":"/en/vue-webapp/options/layout-one-column.html#onecolumnlayout","109":"/en/vue-webapp/options/navbar.html#navbar","110":"/en/vue-webapp/options/navbar.html#simplenavbar","111":"/en/vue-webapp/options/navbar.html#mantinesimplenavbar","112":"/en/vue-webapp/options/pwa.html#pwa","113":"/en/vue-webapp/options/pwa.html#manifest-json","114":"/en/vue-webapp/options/pwa.html#service-worker","115":"/en/vue-webapp/options/open-graph.html#google-analytics","116":"/en/vue-webapp/options/splash-screen.html#splash-screen","117":"/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,150],"13":[2,1,178],"14":[1,3,71],"15":[2,3,116],"16":[5,1,209],"17":[3,1,815],"18":[5,1,49],"19":[2,1,9],"20":[3,3,17],"21":[3,3,312],"22":[5,1,468],"23":[1,1,149],"24":[3,1,368],"25":[4,1,214],"26":[3,1,189],"27":[2,4,79],"28":[11,4,41],"29":[2,4,30],"30":[2,4,48],"31":[6,4,18],"32":[3,4,36],"33":[2,1,408],"34":[6,1,457],"35":[1,1,1],"36":[6,1,1],"37":[1,7,8],"38":[5,1,1],"39":[1,6,11],"40":[6,1,1],"41":[1,7,4],"42":[1,7,14],"43":[6,1,1],"44":[1,7,3],"45":[1,7,4],"46":[6,1,1],"47":[1,7,3],"48":[2,1,1],"49":[1,3,5],"50":[1,3,4],"51":[1,3,4],"52":[1,3,6],"53":[1,3,8],"54":[1,3,2],"55":[7,1,42],"56":[3,1,61],"57":[2,1,15],"58":[1,1,80],"59":[4,2,29],"60":[2,1,1],"61":[5,2,136],"62":[6,7,14],"63":[4,2,37],"64":[1,1,134],"65":[4,1,1],"66":[1,4,63],"67":[1,4,158],"68":[1,1,79],"69":[1,1,169],"70":[2,1,1],"71":[3,2,92],"72":[2,2,89],"73":[1,1,65],"74":[2,1,12],"75":[1,2,23],"76":[1,2,24],"77":[2,1,1],"78":[6,2,44],"79":[2,2,30],"80":[1,1,9],"81":[1,1,1],"82":[1,1,1],"83":[1,1,1],"84":[1,1,1],"85":[1,1,1],"86":[6,1,1],"87":[1,6,67],"88":[5,6,46],"89":[1,1,5],"90":[1,1,4],"91":[1,1,8],"92":[1,1,8],"93":[1,1,30],"94":[2,1,45],"95":[1,1,1],"96":[1,1,99],"97":[1,1,22],"98":[1,1,56],"99":[2,1,56],"100":[3,1,17],"101":[5,1,1],"102":[2,5,73],"103":[3,5,20],"104":[2,5,12],"105":[1,5,74],"106":[1,1,28],"107":[1,1,13],"108":[1,1,46],"109":[1,1,17],"110":[1,1,1],"111":[1,1,1],"112":[1,1,16],"113":[2,1,56],"114":[2,1,66],"115":[2,1,34],"116":[2,1,49],"117":[1,1,83]},"averageFieldLength":[2.423728813559323,2.11864406779661,74.5508474576271],"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":"Application Resources","titles":[]},"14":{"title":"BaseIcon","titles":["Application Resources",null,null]},"15":{"title":"icons.js","titles":["Application Resources",null,null]},"16":{"title":"Create and build an application","titles":[]},"17":{"title":"Configuring the IDE","titles":[]},"18":{"title":"Tell me a handy library","titles":[]},"19":{"title":"Helpful hints","titles":[]},"20":{"title":"Carousel or slider","titles":["Helpful hints",null]},"21":{"title":"Date and time","titles":["Helpful hints",null]},"22":{"title":"State management in Vue 3","titles":[]},"23":{"title":"Testing","titles":[]},"24":{"title":"About frontend frameworks","titles":[]},"25":{"title":"CSS and UI libraries","titles":[]},"26":{"title":"Frontend application architecture","titles":[]},"27":{"title":"Avoid dependencies","titles":["Frontend application architecture",null,null,null,null]},"28":{"title":"Use wrappers over components of UI libraries and third-party utilities","titles":["Frontend application architecture",null,null,null,null]},"29":{"title":"Regular refactoring","titles":["Frontend application architecture",null,null,null,null]},"30":{"title":"Use CSS3","titles":["Frontend application architecture",null,null,null,null]},"31":{"title":"Use modern standards and language features","titles":["Frontend application architecture",null,null,null,null]},"32":{"title":"Document the project","titles":["Frontend application architecture",null,null,null,null]},"33":{"title":"Learning Vue","titles":[]},"34":{"title":"SPA, PWA, SSG, SSR and SEO","titles":[]},"35":{"title":"Changelog","titles":[]},"36":{"title":"v1.4 (24-11-2023)","titles":["Changelog"]},"37":{"title":"Changed","titles":["Changelog","v1.4 (24-11-2023)",null]},"38":{"title":"v1.3 (10-10-2023)","titles":["Changelog"]},"39":{"title":"Changed","titles":["Changelog","v1.3 (10-10-2023)",null]},"40":{"title":"v1.2 (28-09-2023)","titles":["Changelog"]},"41":{"title":"New","titles":["Changelog","v1.2 (28-09-2023)",null]},"42":{"title":"Changed","titles":["Changelog","v1.2 (28-09-2023)",null]},"43":{"title":"v1.1 (15-09-2023)","titles":["Changelog"]},"44":{"title":"New","titles":["Changelog","v1.1 (15-09-2023)"]},"45":{"title":"Changed","titles":["Changelog","v1.1 (15-09-2023)"]},"46":{"title":"v1.0 (11-09-2023)","titles":["Changelog"]},"47":{"title":"New","titles":["Changelog","v1.0 (11-09-2023)"]},"48":{"title":"Cheat Sheet","titles":[]},"49":{"title":"Vue","titles":["Cheat Sheet",null]},"50":{"title":"JavaScript","titles":["Cheat Sheet",null]},"51":{"title":"HTML","titles":["Cheat Sheet",null]},"52":{"title":"CSS","titles":["Cheat Sheet",null]},"53":{"title":"Typescript","titles":["Cheat Sheet",null]},"54":{"title":"Markdown","titles":["Cheat Sheet",null]},"55":{"title":"Contribute to the development of this resource","titles":[]},"56":{"title":"Glossary and abbreviations","titles":[]},"57":{"title":"Project participation","titles":[]},"58":{"title":"Introduction","titles":[]},"59":{"title":"About the author:","titles":["Introduction",null]},"60":{"title":"Getting started","titles":[]},"61":{"title":"Installation via create vue-webapp","titles":["Getting started"]},"62":{"title":"Initializing and launching a web application","titles":["Getting started","Installation via create vue-webapp"]},"63":{"title":"Installation from the repository","titles":["Getting started"]},"64":{"title":"Guidelines","titles":[]},"65":{"title":"Scaffolding a Vue webapp","titles":[]},"66":{"title":"Summary","titles":["Scaffolding a Vue webapp"]},"67":{"title":"Justification","titles":["Scaffolding a Vue webapp"]},"68":{"title":"Adaptability","titles":[]},"69":{"title":"Objectives","titles":[]},"70":{"title":"API module","titles":[]},"71":{"title":"API (REST)","titles":["API module"]},"72":{"title":"JSON-RPC","titles":["API module"]},"73":{"title":"BaseIcon","titles":[]},"74":{"title":"Navigation drawers","titles":[]},"75":{"title":"SimpleDrawer","titles":["Navigation drawers"]},"76":{"title":"TouchSlideoutDrawer","titles":["Navigation drawers"]},"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":"Footers","titles":[]},"81":{"title":"SimpleFooter","titles":["Footers"]},"82":{"title":"RichFooter","titles":["Footers"]},"83":{"title":"MantineSimpleFooter","titles":["Footers"]},"84":{"title":"MantineRichFooter","titles":["Footers"]},"85":{"title":"DistributedFooter","titles":["Footers"]},"86":{"title":"GitHub Actions script to deploy to GitHub Pages","titles":[]},"87":{"title":"Deployment","titles":["GitHub Actions script to deploy to GitHub Pages"]},"88":{"title":"Setting base in Vite config","titles":["GitHub Actions script to deploy to GitHub Pages"]},"89":{"title":"Headers","titles":[]},"90":{"title":"SimpleHeader","titles":["Headers"]},"91":{"title":"MantineSimpleHeader","titles":["Headers"]},"92":{"title":"MantineLayeredHeader","titles":["Headers"]},"93":{"title":"SlidingHeader","titles":["Headers"]},"94":{"title":"Google analytics","titles":[]},"95":{"title":"i18n","titles":[]},"96":{"title":"i18next","titles":["i18n"]},"97":{"title":"useI18nLight","titles":["i18n"]},"98":{"title":"Usage","titles":["i18n"]},"99":{"title":"i18next extensions","titles":["i18n"]},"100":{"title":"As a result","titles":["i18n"]},"101":{"title":"Options when creating an application","titles":[]},"102":{"title":"Available options","titles":["Options when creating an application"]},"103":{"title":"Available by default","titles":["Options when creating an application"]},"104":{"title":"In development","titles":["Options when creating an application"]},"105":{"title":"Planned","titles":["Options when creating an application"]},"106":{"title":"MainLayout","titles":[]},"107":{"title":"Routing","titles":["MainLayout"]},"108":{"title":"OneColumnLayout","titles":[]},"109":{"title":"Navbar","titles":[]},"110":{"title":"SimpleNavbar","titles":["Navbar"]},"111":{"title":"MantineSimpleNavbar","titles":["Navbar"]},"112":{"title":"PWA","titles":[]},"113":{"title":"Manifest.json","titles":["PWA"]},"114":{"title":"Service worker","titles":["PWA"]},"115":{"title":"Google analytics","titles":[]},"116":{"title":"Splash screen","titles":[]},"117":{"title":"Themes","titles":[]}},"dirtCount":0,"index":[["6",{"2":{"117":1}}],["67",{"2":{"117":3}}],["60",{"2":{"117":6}}],["78",{"2":{"117":1}}],["767",{"2":{"68":1}}],["70",{"2":{"33":1,"97":1}}],["√",{"2":{"61":13,"66":5}}],["q",{"2":{"55":1}}],["qbutton",{"2":{"25":1}}],["questions",{"2":{"58":3}}],["question",{"2":{"33":1,"55":1}}],["questionable",{"2":{"23":1}}],["queries",{"2":{"5":1}}],["query",{"2":{"3":1,"5":1,"31":1}}],["quasar",{"2":{"17":2,"18":1}}],["quality",{"2":{"15":1,"17":1,"25":1,"33":3,"56":2}}],["quickly",{"2":{"26":1,"67":3,"69":1}}],["quick",{"2":{"23":1}}],["quieter",{"2":{"17":1}}],["quiet",{"2":{"17":1}}],["quite",{"2":{"2":1,"17":1,"18":1,"22":1,"24":1,"33":1,"34":2,"67":3,"99":1}}],["quote",{"2":{"25":1}}],["quot",{"2":{"2":2,"3":2,"4":4,"21":6,"22":8,"24":4,"26":4,"30":2,"33":5,"34":4,"61":6,"67":4,"75":2,"87":14,"96":8,"106":2,"108":2}}],["zuckerberg",{"2":{"24":1}}],["zero",{"2":{"2":1,"17":1}}],["^",{"2":{"17":1}}],["^20",{"2":{"16":1}}],["400",{"2":{"93":1}}],["401",{"2":{"2":2}}],["480",{"2":{"68":1}}],["4",{"0":{"36":1},"1":{"37":1},"2":{"15":2,"17":1,"33":1}}],[">",{"2":{"8":1,"12":8,"13":5,"14":2,"17":1,"25":2,"55":2,"68":5,"73":3,"93":3,"94":2,"98":2,"115":15}}],[">>",{"2":{"8":5}}],["`~",{"2":{"17":1}}],["`$",{"2":{"14":4}}],["`",{"2":{"8":3,"13":1}}],["+page",{"2":{"17":6}}],["+layout",{"2":{"17":7}}],["+$backups",{"2":{"8":1}}],["+",{"2":{"8":1,"15":2}}],["||",{"2":{"94":1}}],["|",{"2":{"8":4,"17":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,"13":1,"17":96,"62":2,"63":3}}],["kb",{"2":{"100":1}}],["kits",{"2":{"67":1}}],["kill",{"2":{"33":1}}],["kids",{"2":{"33":1}}],["kinds",{"2":{"33":1}}],["kind",{"2":{"22":1,"34":1}}],["karma",{"2":{"17":10}}],["keen",{"2":{"20":1}}],["keeps",{"2":{"24":1}}],["keep",{"2":{"17":1,"22":1,"33":1}}],["keys",{"2":{"22":1}}],["keyboard",{"2":{"17":2}}],["key",{"2":{"8":10,"21":1,"96":1}}],["knows",{"2":{"33":2}}],["knowledge",{"2":{"33":2}}],["known",{"2":{"20":1,"21":1}}],["know",{"2":{"3":1,"16":1,"25":1,"33":3}}],["🚀",{"2":{"8":1}}],["🛎️",{"2":{"8":1}}],["56",{"2":{"117":1}}],["50",{"2":{"100":1}}],["50kb",{"2":{"21":1}}],["58",{"2":{"17":1}}],["5",{"2":{"8":3,"22":1}}],["86",{"2":{"117":1}}],["8",{"2":{"8":2}}],["yes",{"2":{"61":8,"66":4}}],["yet",{"2":{"24":1}}],["years",{"2":{"21":2,"34":1,"58":1,"59":1,"96":1}}],["year",{"2":{"9":1,"33":1}}],["yielded",{"2":{"22":1}}],["yarnrc",{"2":{"17":2}}],["yarn",{"2":{"16":1,"17":4}}],["yamllint",{"2":{"17":2}}],["yaml",{"2":{"8":7,"17":7}}],["y",{"2":{"8":1}}],["yougithubusername",{"2":{"87":1}}],["youtube",{"2":{"33":2}}],["you",{"2":{"1":1,"2":3,"3":5,"5":2,"9":6,"10":3,"11":3,"12":3,"13":3,"15":1,"16":6,"17":6,"21":4,"22":9,"23":1,"24":3,"25":3,"26":6,"27":2,"28":1,"30":1,"33":9,"34":9,"55":1,"61":1,"67":2,"87":1,"88":3,"94":1,"99":1,"114":1,"115":1}}],["yourname",{"2":{"88":1}}],["yourself",{"2":{"9":2,"16":1,"17":1,"33":1}}],["your",{"0":{"3":1},"2":{"1":3,"2":4,"3":4,"4":1,"5":1,"8":18,"9":5,"11":1,"12":1,"13":3,"16":1,"17":3,"21":1,"22":6,"25":3,"26":1,"27":3,"28":1,"29":1,"32":1,"33":5,"34":4,"55":1,"87":2,"88":1,"94":1,"113":1,"115":1}}],["99",{"2":{"5":1,"22":3}}],["95",{"2":{"2":1,"18":1,"21":1}}],["09",{"0":{"40":1,"43":1,"46":1},"1":{"41":1,"42":1,"44":1,"45":1,"47":1}}],["04",{"2":{"17":1}}],["0",{"0":{"46":1},"1":{"47":1},"2":{"5":1,"8":5,"34":2,"72":2,"117":5}}],["38",{"2":{"117":1}}],["300",{"2":{"17":1}}],["30",{"2":{"17":1}}],["3",{"0":{"22":1,"38":1},"1":{"39":1},"2":{"4":1,"5":1,"10":2,"16":1,"17":2,"21":3,"22":9,"24":3,"33":5,"49":1,"58":2,"64":2,"66":1,"69":1,"72":1,"117":2}}],["1443",{"2":{"72":1}}],["1px",{"2":{"68":1}}],["1199",{"2":{"68":1}}],["11",{"0":{"36":1,"46":1},"1":{"37":1,"47":1}}],["1280px",{"2":{"117":1}}],["12",{"2":{"33":1}}],["15",{"0":{"43":1},"1":{"44":1,"45":1},"2":{"27":1}}],["16gb",{"2":{"17":1}}],["10",{"0":{"38":2},"1":{"39":2},"2":{"17":1,"21":1,"33":2}}],["100vw",{"2":{"79":1}}],["10000",{"2":{"68":1}}],["1000",{"2":{"22":1}}],["100",{"2":{"14":2,"34":1,"79":1}}],["1",{"0":{"43":1},"1":{"44":1,"45":1},"2":{"4":6,"15":2,"16":1,"21":2,"22":2,"33":2,"34":1,"71":1,"72":1,"79":1,"117":2}}],["nice",{"2":{"76":1}}],["nix",{"2":{"17":3}}],["nls",{"2":{"17":2}}],["nx",{"2":{"17":2}}],["nvmrc",{"2":{"17":2}}],["number",{"2":{"21":1,"23":1,"26":1,"105":1}}],["numbers",{"2":{"21":1,"96":1}}],["nuxt",{"2":{"17":2,"67":1}}],["null",{"2":{"17":1}}],["npx",{"2":{"16":2}}],["npm",{"2":{"10":1,"16":1,"17":4,"21":1,"27":1,"69":1,"96":1}}],["n",{"2":{"8":1,"17":1,"33":1}}],["naming",{"2":{"69":1}}],["namely",{"2":{"22":1}}],["named",{"2":{"15":2}}],["name=",{"2":{"13":1,"73":1,"115":4}}],["names",{"2":{"4":1,"13":1,"73":1}}],["name",{"2":{"4":1,"8":13,"12":2,"13":3,"14":4,"15":8,"55":1,"61":1,"66":1,"73":1,"87":1,"88":1,"103":1,"113":2}}],["navbar",{"0":{"109":1},"1":{"110":1,"111":1},"2":{"61":2,"102":1,"109":1}}],["navigationdrawer",{"2":{"61":1,"109":1}}],["navigation",{"0":{"74":1},"1":{"75":1,"76":1},"2":{"61":1,"69":1,"74":1,"102":2,"108":1}}],["native",{"2":{"24":1,"34":3,"113":1}}],["nativetabs",{"2":{"17":1}}],["nature",{"2":{"18":1}}],["naturally",{"2":{"8":1,"22":1}}],["nginx",{"2":{"3":1,"9":1}}],["next",{"2":{"17":2,"33":1}}],["nest",{"2":{"17":2}}],["nesting",{"2":{"17":2}}],["nested",{"2":{"12":1}}],["netlify",{"2":{"9":1,"17":2}}],["networks",{"2":{"72":1,"102":1}}],["network",{"2":{"3":1}}],["newitem",{"2":{"24":3}}],["news",{"2":{"22":2}}],["newer",{"2":{"16":1}}],["new",{"0":{"41":1,"44":1,"47":1},"2":{"8":5,"15":2,"17":1,"24":2,"25":1,"27":2,"33":1,"34":1,"55":1,"68":1,"94":1,"99":1,"105":1,"114":1,"117":1}}],["nevertheless",{"2":{"67":1}}],["never",{"2":{"5":1,"17":1,"33":1}}],["needs",{"2":{"11":1,"13":1,"22":1,"23":1,"25":1,"34":1}}],["needed",{"2":{"8":1,"13":1,"21":1,"26":1,"64":2,"69":1,"88":1,"96":1,"99":1,"116":1}}],["need",{"2":{"3":1,"5":1,"8":2,"9":1,"10":2,"11":2,"12":1,"13":1,"16":4,"21":1,"22":1,"23":1,"24":3,"26":3,"27":1,"33":3,"34":3,"67":2,"88":1,"99":1}}],["necessary",{"2":{"2":1,"8":1,"17":1,"23":1,"33":1,"34":1,"64":2,"67":1,"100":1}}],["novice",{"2":{"67":1,"69":1}}],["non",{"2":{"22":2,"33":1,"58":1}}],["nontrivial",{"2":{"17":1}}],["normal",{"2":{"13":1,"17":1,"34":2}}],["now",{"2":{"9":1,"33":1}}],["nosql",{"2":{"3":1,"22":1}}],["nodemon",{"2":{"17":4}}],["node",{"2":{"3":2,"8":2,"16":3,"17":7,"33":1,"34":1}}],["no",{"2":{"2":1,"15":1,"17":1,"21":1,"22":4,"27":1,"34":1,"61":8,"66":4}}],["nothing",{"2":{"25":1}}],["notified",{"2":{"24":1}}],["notificationinterceptor",{"2":{"1":2,"72":2}}],["notebook",{"2":{"68":3,"75":1,"106":1,"108":1}}],["notes",{"2":{"34":1}}],["note",{"2":{"16":1,"25":1,"33":1}}],["not",{"0":{"5":1},"2":{"1":1,"2":6,"3":3,"4":3,"5":1,"6":1,"15":1,"17":4,"20":1,"21":7,"22":7,"23":1,"24":4,"25":1,"26":2,"27":2,"30":1,"33":5,"34":7,"58":1,"64":3,"67":1,"88":1,"114":1}}],["x",{"2":{"21":2,"79":1}}],["xshell",{"2":{"17":1}}],["xss",{"2":{"2":1}}],["xo",{"2":{"17":4}}],["xmlhttprequest",{"2":{"34":1}}],["xml",{"2":{"17":4}}],["xaml",{"2":{"17":2}}],["xdv",{"2":{"17":1}}],["x3c",{"2":{"12":20,"13":4,"14":8,"17":1,"25":4,"68":10,"73":7,"93":8,"94":5,"98":8,"115":15}}],["x26",{"2":{"8":4,"17":1,"68":2}}],["xhr",{"2":{"1":1,"71":1}}],["235",{"2":{"117":4}}],["255",{"2":{"117":2}}],["28",{"0":{"40":1},"1":{"41":1,"42":1}}],["22+",{"2":{"17":1}}],["29",{"2":{"17":1}}],["245",{"2":{"117":3}}],["24",{"0":{"36":1},"1":{"37":1},"2":{"14":2}}],["26",{"2":{"13":1}}],["20+",{"2":{"59":1}}],["2022",{"2":{"58":1}}],["2023",{"0":{"36":1,"38":1,"40":1,"43":1,"46":1},"1":{"37":1,"39":1,"41":1,"42":1,"44":1,"45":1,"47":1},"2":{"17":1,"33":1,"58":1}}],["2016",{"2":{"33":1}}],["200",{"2":{"17":1,"34":1,"93":1}}],["20~30",{"2":{"16":1}}],["20",{"2":{"8":1,"22":1,"33":1}}],["2",{"0":{"40":1},"1":{"41":1,"42":1},"2":{"2":1,"4":1,"17":3,"21":5,"22":2,"24":1,"25":1,"33":3,"34":1,"52":2,"72":1,"117":2}}],["gave",{"2":{"34":1}}],["gatsby",{"2":{"17":5}}],["gateway",{"2":{"3":1}}],["gql",{"2":{"17":2}}],["gz",{"2":{"17":1}}],["goes",{"2":{"17":1,"28":1}}],["governance",{"2":{"17":1}}],["go",{"2":{"17":6,"33":1,"67":1,"87":1}}],["good",{"2":{"3":1,"17":1,"19":1,"20":1,"22":1,"23":1,"24":1,"25":2,"26":3,"27":1,"29":1,"33":3}}],["googletagmanager",{"2":{"94":1}}],["googleanalytics",{"2":{"61":1}}],["google",{"0":{"94":1,"115":1},"2":{"2":8,"3":4,"9":1,"21":1,"27":1,"33":1,"34":3,"61":1,"66":1,"78":1,"94":2,"102":2}}],["gutter",{"2":{"117":1}}],["guidelines",{"0":{"64":1}}],["guide",{"2":{"33":2}}],["guides",{"2":{"17":1}}],["gui",{"2":{"24":1}}],["gulp",{"2":{"17":2}}],["guest",{"2":{"2":1}}],["glass",{"2":{"33":1}}],["gls",{"2":{"17":1}}],["glossary",{"0":{"56":1}}],["glo",{"2":{"17":1}}],["glob",{"2":{"14":1,"15":2,"73":1}}],["global",{"2":{"11":1,"22":7,"26":1,"69":1,"104":1}}],["glg",{"2":{"17":1}}],["glitches",{"2":{"17":1}}],["gtag",{"2":{"94":5}}],["gt",{"2":{"8":1,"17":1,"34":2}}],["gh",{"2":{"8":2,"87":3}}],["gitpod",{"2":{"17":2}}],["gitmessage",{"2":{"17":1}}],["gitmodules",{"2":{"17":1}}],["gitattributes",{"2":{"17":1}}],["gitlens",{"2":{"17":4}}],["gitlab",{"2":{"6":1,"17":2}}],["gitignore",{"2":{"8":1,"17":1}}],["githubactionsgithubpagesworkflow",{"2":{"61":1}}],["githubpullrequests",{"2":{"17":1}}],["githubissues",{"2":{"17":1}}],["github",{"0":{"8":1,"86":2},"1":{"87":2,"88":2},"2":{"6":2,"8":23,"9":3,"17":7,"33":2,"41":1,"55":1,"61":2,"63":1,"66":1,"69":1,"87":6,"102":3,"105":1}}],["git",{"2":{"6":1,"8":3,"10":1,"17":10,"63":2}}],["gives",{"2":{"5":2,"17":1,"21":1}}],["given",{"2":{"3":1}}],["give",{"2":{"2":2,"24":1,"34":1}}],["grpc",{"2":{"71":1}}],["grid",{"2":{"31":1,"52":2}}],["growth",{"2":{"29":1}}],["grown",{"2":{"21":1,"96":1}}],["grunt",{"2":{"17":2}}],["greateŕl",{"2":{"24":1}}],["great",{"2":{"16":1,"17":1}}],["greatly",{"2":{"5":1,"10":1,"67":1,"114":1}}],["gray",{"2":{"68":1}}],["graphql",{"2":{"71":1}}],["graph",{"2":{"61":1,"66":1,"78":1,"102":1,"115":1}}],["graphgl",{"2":{"5":1}}],["grains",{"2":{"33":1}}],["grab",{"2":{"8":1}}],["grant",{"2":{"4":1}}],["granted",{"2":{"4":2}}],["granular",{"2":{"2":1}}],["g",{"2":{"3":1,"13":1,"17":1,"22":1,"34":1,"64":1,"94":1}}],["gmail",{"2":{"2":1,"59":1}}],["gemfile",{"2":{"17":2}}],["generation",{"2":{"34":2}}],["generating",{"2":{"16":1,"34":1}}],["generated",{"2":{"34":2}}],["generate",{"2":{"8":1,"9":1,"34":1}}],["generates",{"2":{"2":2,"3":1,"34":1}}],["generalize",{"2":{"69":1}}],["generally",{"2":{"58":1}}],["general",{"2":{"13":1,"17":3,"33":1,"34":1,"56":1,"69":2}}],["generalroutes",{"2":{"12":2}}],["genuinely",{"2":{"12":1}}],["getbestblockhash",{"2":{"72":1}}],["getting",{"0":{"60":1},"1":{"61":1,"62":1,"63":1}}],["getters",{"2":{"22":2}}],["gettoken",{"2":{"1":1}}],["getimageurl",{"2":{"14":2,"15":2}}],["getitem",{"2":{"8":1}}],["getsvgicon",{"2":{"14":3,"15":2}}],["gets",{"2":{"2":1,"13":2,"17":1}}],["get",{"2":{"1":1,"2":1,"3":1,"4":1,"6":1,"9":2,"15":2,"24":1,"33":1,"34":2,"71":1}}],["getuserdata",{"2":{"1":2}}],["b",{"2":{"21":2,"26":1}}],["bzl",{"2":{"17":1}}],["bbl",{"2":{"17":1}}],["blank",{"2":{"116":1}}],["blame",{"2":{"17":3}}],["blg",{"2":{"17":1}}],["bloating",{"2":{"78":1}}],["blocks",{"2":{"69":2}}],["block",{"2":{"17":1}}],["bloc",{"2":{"17":1}}],["blog",{"2":{"2":1,"66":1,"67":1,"69":1}}],["bit",{"2":{"22":1,"24":1,"27":1,"34":2}}],["bidirectional",{"2":{"5":1}}],["big",{"2":{"2":1,"24":1,"33":1}}],["bunch",{"2":{"21":1,"22":1,"96":1}}],["bundleconfig",{"2":{"17":2}}],["bundle",{"2":{"3":1,"16":4,"21":1,"25":1,"27":1,"100":1}}],["buying",{"2":{"9":1}}],["built",{"2":{"8":1,"22":1,"34":1}}],["builds",{"2":{"16":1}}],["builders",{"2":{"16":1}}],["builder",{"2":{"16":5,"64":1,"66":1,"69":1}}],["building",{"2":{"9":1,"16":1,"69":1,"102":1}}],["builddata",{"2":{"8":4}}],["build",{"0":{"16":1},"2":{"6":1,"8":12,"16":3,"17":4,"23":1,"69":1,"87":2,"100":1,"102":1}}],["bus",{"2":{"5":1}}],["business",{"2":{"3":1,"22":7,"24":1,"66":1,"67":3,"69":1,"71":1}}],["button>",{"2":{"98":1}}],["buttons",{"2":{"26":1}}],["button",{"2":{"25":1,"26":1,"98":2}}],["but",{"2":{"2":5,"3":3,"4":1,"5":1,"6":1,"8":1,"12":1,"13":1,"17":1,"21":4,"22":4,"23":1,"24":4,"25":1,"26":2,"27":2,"33":6,"34":6,"63":1,"64":2,"67":1,"72":1,"76":1,"96":1,"108":1}}],["border",{"2":{"68":1,"117":1}}],["born",{"2":{"34":1}}],["box",{"2":{"68":4,"69":1}}],["body",{"2":{"68":1,"116":1}}],["bottom",{"2":{"102":1}}],["bot",{"2":{"34":2}}],["bots",{"2":{"34":2}}],["bother",{"2":{"3":1}}],["both",{"2":{"3":2,"5":1,"8":2,"10":1,"16":1,"17":1,"22":1,"29":1,"33":4,"58":2,"99":1,"105":1}}],["book",{"2":{"33":6,"58":1}}],["booting",{"2":{"17":1}}],["boilerplates",{"2":{"69":1}}],["boilerplate",{"2":{"24":1,"67":1}}],["bound",{"2":{"22":3}}],["boundary",{"2":{"17":1}}],["bower",{"2":{"17":3}}],["bonuses",{"2":{"2":1}}],["broken",{"2":{"33":1}}],["browserslist",{"2":{"17":2}}],["browsers",{"2":{"9":1,"21":1,"34":1}}],["browser",{"2":{"2":3,"4":5,"8":1,"13":1,"16":1,"17":1,"23":1,"34":5,"62":1,"105":1,"113":1,"114":1}}],["brings",{"2":{"25":1}}],["bring",{"2":{"22":1,"26":1}}],["brand",{"2":{"116":1}}],["branch",{"2":{"8":5,"34":1,"87":6}}],["branches",{"2":{"8":2,"22":1}}],["bracketpairs",{"2":{"17":1}}],["breakpoint",{"2":{"68":1}}],["break",{"2":{"2":1,"24":1}}],["bar",{"2":{"102":1}}],["bad",{"2":{"21":2,"22":2,"25":2}}],["babel",{"2":{"17":10}}],["babelrc",{"2":{"17":10}}],["bazelproject",{"2":{"17":1}}],["bazelignore",{"2":{"17":1}}],["bazelrc",{"2":{"17":1}}],["bazel",{"2":{"17":3}}],["bandle",{"2":{"13":2}}],["banner",{"2":{"13":1}}],["bash$",{"2":{"61":1}}],["bashpnpm",{"2":{"61":1}}],["basics",{"2":{"33":1}}],["basic",{"2":{"26":1,"33":3}}],["basically",{"2":{"3":1,"22":1}}],["basis",{"2":{"22":1}}],["basetoggle",{"2":{"103":1}}],["baseurl",{"2":{"72":1}}],["baseinput",{"2":{"28":1}}],["baseicon",{"0":{"14":1,"73":1},"2":{"13":2,"16":2,"73":5,"103":1}}],["basebutton",{"2":{"25":2,"28":1}}],["basebuttonandstringhelpers",{"2":{"10":1}}],["base",{"0":{"88":1},"2":{"14":1,"88":2,"117":1}}],["base64",{"2":{"13":1}}],["based",{"2":{"2":2,"8":1,"21":2}}],["baas",{"2":{"3":6}}],["battery",{"2":{"2":1}}],["backers",{"2":{"17":1}}],["backend",{"0":{"0":1,"3":1},"1":{"1":1},"2":{"1":4,"2":6,"3":8,"4":6,"5":2,"9":1,"23":1,"24":3,"33":2,"34":1,"39":1,"67":1,"71":2,"72":2,"102":1}}],["background",{"2":{"15":1}}],["backroute",{"2":{"12":1}}],["backups",{"2":{"8":2}}],["backup",{"2":{"8":9}}],["back",{"2":{"2":3,"3":1,"5":1,"17":1,"24":1,"25":1,"33":1}}],["bedroom",{"2":{"34":1}}],["benefit",{"2":{"34":1}}],["believed",{"2":{"33":1}}],["belong",{"2":{"22":1}}],["below",{"2":{"4":1,"55":1}}],["besides",{"2":{"27":1,"33":1}}],["best",{"0":{"12":1},"2":{"2":1,"12":2,"15":1,"17":2,"33":5,"56":1,"58":1,"67":3,"69":2}}],["beautiful",{"2":{"25":1,"34":1}}],["beyond",{"2":{"24":1}}],["better",{"2":{"24":1,"30":1,"33":2,"34":1,"99":1}}],["between",{"2":{"4":1,"12":1,"22":2,"24":1,"33":2,"34":1}}],["behavior",{"2":{"24":1}}],["behind",{"2":{"24":1}}],["beforehand",{"2":{"33":2}}],["before",{"2":{"13":1,"33":1,"34":1}}],["been",{"2":{"13":1,"21":1,"24":1,"34":2,"116":1}}],["beginners",{"2":{"17":1,"58":1}}],["beginner",{"2":{"5":1,"33":1}}],["becoming",{"2":{"67":1}}],["become",{"2":{"22":1,"24":1,"25":2,"27":1,"33":1}}],["becomes",{"2":{"4":1,"22":2}}],["became",{"2":{"22":2}}],["because",{"2":{"2":1,"5":1,"8":1,"21":1,"22":1,"34":1}}],["be",{"2":{"2":2,"3":2,"8":9,"9":4,"10":2,"12":3,"13":3,"17":2,"21":3,"22":9,"23":4,"24":9,"25":1,"26":1,"29":1,"30":2,"33":6,"34":6,"58":1,"61":2,"63":2,"64":3,"67":2,"68":2,"69":2,"71":1,"75":1,"88":1,"96":1,"108":1,"113":1}}],["being",{"2":{"2":1}}],["bypass",{"2":{"34":1}}],["by",{"0":{"103":1},"2":{"2":5,"3":4,"4":5,"8":1,"12":1,"13":3,"16":1,"17":1,"21":3,"22":4,"23":1,"24":3,"25":1,"33":3,"34":8,"61":1,"75":1,"76":1,"96":2,"98":1,"102":1,"108":1,"116":1,"117":2}}],["jl65gwrnqqq",{"2":{"94":1}}],["jl65gwrnqq",{"2":{"94":1}}],["jumping",{"2":{"79":1}}],["justification",{"0":{"67":1}}],["justifications",{"2":{"26":1}}],["just",{"2":{"2":2,"12":1,"17":1,"21":1,"22":3,"25":2,"33":1,"64":1,"67":1}}],["jest",{"2":{"17":10,"23":1}}],["jenkins",{"2":{"6":1,"17":2}}],["j",{"2":{"16":1}}],["jpg",{"2":{"15":1}}],["jpeg",{"2":{"9":1}}],["jasmine",{"2":{"17":10}}],["java",{"2":{"17":1,"59":1}}],["javascript",{"0":{"50":1},"2":{"3":1,"13":1,"16":2,"17":2,"18":1,"21":4,"22":2,"24":1,"25":3,"26":1,"33":4,"34":4,"50":1,"64":1,"68":1,"100":1}}],["jamesives",{"2":{"8":3,"87":1}}],["job",{"2":{"24":2}}],["jobs",{"2":{"8":2}}],["john",{"2":{"2":2,"96":1}}],["jwt",{"2":{"2":4,"56":2,"105":1}}],["jslint",{"2":{"17":2}}],["jsconfig",{"2":{"17":11}}],["jsconst",{"2":{"8":1,"15":1,"21":2}}],["jsx",{"2":{"17":3}}],["jsexport",{"2":{"12":1,"88":1}}],["jsonrpc",{"2":{"61":1,"72":6}}],["json5",{"2":{"17":1}}],["jsonc",{"2":{"17":1}}],["jsonplaceholder",{"2":{"3":1,"71":1}}],["json",{"0":{"72":1,"113":1},"2":{"1":1,"3":1,"5":7,"8":4,"13":1,"15":4,"16":4,"17":50,"33":1,"34":2,"61":5,"64":1,"71":1,"72":6,"98":1,"99":1,"102":1,"113":2}}],["jsimport",{"2":{"1":3,"13":1,"16":1,"71":1,"72":1,"98":1}}],["js",{"0":{"15":1},"2":{"1":4,"2":1,"3":3,"9":1,"11":1,"13":4,"14":1,"15":1,"16":3,"17":21,"18":2,"20":1,"21":3,"22":1,"24":4,"26":1,"33":4,"34":1,"58":1,"68":1,"69":1,"71":1,"72":1,"94":3,"114":3}}],["snippets",{"2":{"78":1,"102":1}}],["snickerbockers",{"2":{"8":2}}],["skeleton",{"2":{"67":1}}],["skill",{"2":{"25":1,"33":1}}],["sd",{"2":{"59":1}}],["sw",{"2":{"34":1,"56":1}}],["swagger",{"2":{"33":1}}],["switch",{"2":{"28":1,"71":1}}],["switching",{"2":{"5":1,"103":1,"117":2}}],["swiper",{"2":{"20":1}}],["slidingheader",{"0":{"93":1}}],["slider",{"0":{"20":1},"2":{"20":1}}],["sleeping",{"2":{"34":1}}],["slowing",{"2":{"26":1}}],["slower",{"2":{"22":2}}],["slot",{"2":{"11":1}}],["svelte",{"2":{"17":3,"24":2}}],["svgo",{"2":{"17":10}}],["svgs",{"2":{"16":1}}],["svgresources",{"2":{"15":4}}],["svg",{"2":{"14":2,"15":2,"17":2,"73":1}}],["syntax",{"2":{"64":1}}],["synthesizing",{"2":{"22":1}}],["synctex",{"2":{"17":1}}],["systems",{"2":{"24":2,"26":1}}],["system",{"2":{"2":4,"24":2,"25":1,"71":1}}],["smartphone",{"2":{"34":2}}],["smaller",{"2":{"24":1,"100":1}}],["small",{"2":{"2":2,"3":1,"13":1,"18":1,"22":1,"25":1,"34":1}}],["smoothscrolling",{"2":{"17":1}}],["sftp",{"2":{"17":1}}],["sfc",{"2":{"17":2,"24":1}}],["src=",{"2":{"13":3,"14":1,"94":1}}],["src",{"2":{"13":1,"16":2,"78":1,"98":1}}],["s3",{"2":{"9":1}}],["ssg",{"0":{"34":1},"2":{"34":3}}],["ssd",{"2":{"17":1}}],["ssrs",{"2":{"34":1}}],["ssr",{"0":{"34":1},"2":{"17":1,"22":2,"34":8}}],["ss06",{"2":{"17":1}}],["ss03",{"2":{"17":1}}],["ss02",{"2":{"17":1}}],["ss01",{"2":{"17":1}}],["ssl",{"2":{"9":2}}],["ssh",{"2":{"8":14,"17":2}}],["sso",{"2":{"2":2}}],["sql",{"2":{"5":1,"8":1,"17":1,"22":2,"33":1}}],["sh$",{"2":{"61":1,"62":1,"63":1,"66":1}}],["sheet",{"0":{"48":1},"1":{"49":1,"50":1,"51":1,"52":1,"53":1,"54":1},"2":{"49":1,"50":1,"51":1,"52":4}}],["shell",{"2":{"10":2,"17":1,"34":1}}],["shims",{"2":{"17":1}}],["sh",{"2":{"17":2}}],["shrinkwrap",{"2":{"17":2}}],["shnpx",{"2":{"16":1}}],["shpnpm",{"2":{"16":1}}],["shadow",{"2":{"26":1}}],["shallowref",{"2":{"21":2}}],["shaking",{"2":{"15":1,"27":1}}],["shared",{"2":{"11":1,"17":1,"22":1}}],["share",{"2":{"11":1,"12":1,"22":1}}],["sharing",{"2":{"4":1}}],["showcase",{"2":{"69":1,"105":1}}],["show",{"2":{"34":1}}],["showed",{"2":{"33":1,"34":1}}],["shows",{"2":{"22":1}}],["showsuggestionsassnippets",{"2":{"17":1}}],["showdocumentation",{"2":{"17":1}}],["showing",{"2":{"8":1}}],["shown",{"2":{"4":1,"12":1,"21":1,"24":1}}],["should",{"2":{"2":3,"3":1,"8":1,"13":1,"17":1,"21":2,"22":4,"23":1,"24":2,"29":1,"33":1,"61":1,"64":2,"67":1,"69":1,"94":1,"115":1}}],["shortens",{"2":{"25":1}}],["short",{"2":{"2":1,"33":1,"113":1}}],["scope",{"2":{"113":1}}],["scoped>",{"2":{"14":1}}],["scaffolder",{"2":{"66":1,"69":1}}],["scaffolded",{"2":{"64":1}}],["scaffold",{"2":{"61":1,"69":1}}],["scaffolding",{"0":{"65":1},"1":{"66":1,"67":1},"2":{"61":1,"67":1,"69":1}}],["scalable",{"2":{"24":1}}],["school",{"2":{"33":1}}],["screens",{"2":{"76":1}}],["screenwidthfactor",{"2":{"68":1}}],["screen",{"0":{"116":1},"2":{"34":1,"61":1,"66":2,"69":1,"75":1,"78":1,"79":2,"102":2,"113":1,"116":4}}],["scrollbar",{"2":{"79":1}}],["scroll",{"2":{"21":1}}],["scrolls",{"2":{"21":1,"93":1}}],["script>",{"2":{"14":1,"68":1,"73":1,"94":3,"98":1}}],["scripts",{"2":{"8":1,"23":1,"34":1,"105":1}}],["script",{"0":{"86":1},"1":{"87":1,"88":1},"2":{"3":2,"8":2,"14":1,"17":1,"21":1,"34":1,"64":1,"68":1,"73":1,"94":1,"98":1,"102":1}}],["scmitem",{"2":{"17":1}}],["scmgroupinline",{"2":{"17":1}}],["scmgroup",{"2":{"17":1}}],["scm",{"2":{"17":2}}],["scss",{"2":{"14":1,"17":1,"64":1,"68":2,"117":1}}],["scenario",{"2":{"2":1,"12":1}}],["sans",{"2":{"117":1}}],["sandboxes",{"2":{"17":1}}],["sandbox",{"2":{"16":1}}],["saw",{"2":{"34":1}}],["says",{"2":{"26":1}}],["say",{"2":{"26":1}}],["sass",{"2":{"17":1}}],["sample",{"2":{"8":2}}],["same",{"2":{"2":2,"5":2,"10":3,"16":1,"17":1,"21":1,"22":4,"23":2,"24":1,"26":1,"28":1,"67":1,"72":1,"87":1,"96":1}}],["saved",{"2":{"8":1}}],["save",{"2":{"2":1,"3":1,"17":1,"25":1,"27":1}}],["saves",{"2":{"2":1,"8":1,"16":1}}],["saving",{"2":{"2":1}}],["sun",{"2":{"59":1}}],["suffer",{"2":{"30":1}}],["sufficient",{"2":{"18":1,"21":1}}],["summary",{"0":{"66":1}}],["sum",{"2":{"17":2}}],["support",{"2":{"21":2,"22":3,"26":1,"33":1,"96":1,"103":1,"117":1}}],["supports",{"2":{"16":1}}],["supported",{"2":{"15":1,"21":1,"22":1,"27":1,"114":1}}],["supabase",{"2":{"3":2,"33":1}}],["success",{"2":{"10":1}}],["such",{"2":{"2":1,"3":1,"4":1,"10":1,"11":1,"22":1,"34":1,"64":1}}],["sudo",{"2":{"8":3}}],["subjective",{"2":{"58":1}}],["substring",{"2":{"15":2}}],["subdirectory",{"2":{"10":1,"13":1}}],["subdirectories",{"2":{"8":1}}],["subdomains",{"2":{"9":1}}],["submodules",{"2":{"8":4,"10":2}}],["suggestselection",{"2":{"17":1}}],["suggest",{"2":{"5":1,"33":1,"55":1}}],["suitable",{"2":{"3":1,"10":2,"17":1,"22":1,"24":1,"34":2}}],["suspicious",{"2":{"2":1}}],["sure",{"2":{"2":1,"33":1}}],["sort",{"2":{"22":1}}],["sophisticated",{"2":{"17":1}}],["social",{"2":{"13":1,"102":1}}],["solving",{"2":{"67":3}}],["solvery",{"2":{"33":1}}],["solve",{"2":{"8":1,"13":1,"22":1,"33":1}}],["solid",{"2":{"18":1,"68":1}}],["solutions",{"2":{"34":1,"59":1,"69":1}}],["solution",{"2":{"3":2,"4":2,"5":1,"8":1,"12":1,"17":1,"34":1,"67":1}}],["software",{"2":{"5":1,"9":1,"23":1,"24":1,"32":1}}],["source",{"2":{"4":2,"8":1,"17":4,"33":2,"57":1,"87":1}}],["sources",{"2":{"4":2,"33":1,"58":1}}],["sooner",{"2":{"27":1}}],["soon",{"2":{"2":1}}],["somehow",{"2":{"34":1}}],["somearr",{"2":{"24":4}}],["someone",{"2":{"23":1,"34":1}}],["someimage",{"2":{"13":1}}],["sometimes",{"2":{"10":2,"22":1,"25":1}}],["something",{"2":{"2":1,"22":1,"23":1,"26":1,"33":1}}],["somefunc",{"2":{"3":1}}],["somewhere",{"2":{"3":1}}],["some",{"2":{"2":1,"3":2,"9":1,"12":2,"17":1,"19":1,"21":2,"22":3,"25":1,"27":1,"28":1,"33":3,"34":3,"67":1}}],["so",{"2":{"2":3,"8":1,"9":2,"17":1,"20":1,"21":1,"22":2,"24":1,"33":1,"34":3,"64":1,"67":1,"88":1,"99":2}}],["study",{"2":{"33":1}}],["studying",{"2":{"33":1}}],["student",{"2":{"33":1}}],["stylized",{"2":{"25":1}}],["styling",{"2":{"24":1,"28":1,"69":1}}],["stylus",{"2":{"21":1}}],["styles",{"2":{"25":4}}],["stylelint",{"2":{"17":4}}],["styleci",{"2":{"17":2}}],["style>",{"2":{"14":1}}],["style",{"2":{"14":1,"17":1,"25":1,"33":2,"56":1,"69":1,"91":1,"92":1}}],["style=",{"2":{"14":2}}],["step",{"2":{"34":1}}],["steps",{"2":{"2":1,"8":2}}],["steate",{"2":{"22":1}}],["steit",{"2":{"21":1,"22":1}}],["storage",{"2":{"22":1}}],["storages",{"2":{"22":2}}],["story",{"2":{"17":1}}],["storefront",{"2":{"67":1}}],["stored",{"2":{"33":1,"117":1}}],["stores",{"2":{"22":4,"42":1,"44":1}}],["store",{"2":{"2":2,"8":1,"10":1,"11":1,"22":8,"34":2,"66":1,"67":1,"69":1}}],["stick",{"2":{"25":1}}],["sticky",{"2":{"17":1,"90":1,"91":1,"92":1}}],["stickyscroll",{"2":{"17":1}}],["still",{"2":{"12":1,"33":1,"34":1}}],["structured",{"2":{"34":1}}],["structuring",{"2":{"29":1}}],["strategy",{"2":{"114":1}}],["strategies",{"2":{"33":1}}],["straightforward",{"2":{"12":1}}],["strengthen",{"2":{"116":1}}],["streets",{"2":{"33":1}}],["stretch",{"2":{"26":1}}],["strong",{"2":{"15":1}}],["string",{"2":{"2":1,"4":1,"13":1,"14":6,"21":1}}],["stand",{"2":{"24":1}}],["standalone",{"2":{"3":1,"24":1,"113":1}}],["standards",{"0":{"31":1},"2":{"25":1}}],["standard",{"2":{"2":2,"4":1,"5":1,"18":1,"21":2,"33":1,"72":1,"106":1}}],["stack",{"2":{"22":1,"59":1}}],["stackblitz",{"2":{"17":3}}],["stage",{"2":{"26":1}}],["staged",{"2":{"17":2}}],["staging",{"2":{"8":5}}],["states",{"2":{"22":2}}],["stateful",{"2":{"22":1}}],["state",{"0":{"22":1},"2":{"17":1,"22":13,"24":1,"26":1}}],["statistics",{"2":{"16":1}}],["static",{"2":{"9":1,"13":1,"26":1,"34":3}}],["stash",{"2":{"17":3}}],["starter",{"2":{"67":1}}],["started",{"0":{"60":1},"1":{"61":1,"62":1,"63":1}}],["startup",{"2":{"23":1,"102":1,"105":1,"116":1}}],["start",{"2":{"3":1,"5":1,"33":1,"34":1,"67":1,"113":1}}],["s",{"2":{"2":4,"3":2,"5":1,"8":1,"13":1,"14":1,"16":2,"17":3,"18":1,"22":5,"24":4,"25":1,"26":2,"33":3,"34":3,"56":3,"64":1,"67":1,"71":2}}],["splashscreen",{"2":{"61":1}}],["splash",{"0":{"116":1},"2":{"61":1,"66":2,"69":1,"78":1,"102":2,"116":4}}],["split",{"2":{"22":1}}],["splide",{"2":{"20":1}}],["spite",{"2":{"33":1}}],["spinning",{"2":{"17":1}}],["spread",{"2":{"22":1}}],["sponsors",{"2":{"17":1}}],["spend",{"2":{"17":1,"30":1}}],["spec",{"2":{"17":1}}],["specifying",{"2":{"61":1}}],["specify",{"2":{"24":1,"103":1}}],["specified",{"2":{"4":1,"99":1}}],["specifications",{"2":{"34":1}}],["specification",{"2":{"33":1,"72":1}}],["specifically",{"2":{"4":1}}],["specific",{"2":{"3":1,"4":1,"5":1,"12":1,"64":3,"67":1,"69":3}}],["specialized",{"2":{"4":1}}],["special",{"2":{"4":1,"5":1}}],["speeds",{"2":{"25":1}}],["speed",{"2":{"13":1,"25":1,"26":2,"34":1}}],["speaking",{"2":{"2":1,"4":1,"24":1,"26":1}}],["space",{"2":{"16":1}}],["spaces",{"2":{"4":1}}],["spa",{"0":{"34":1},"2":{"2":1,"34":10,"69":1}}],["silent",{"2":{"61":1}}],["since",{"2":{"34":1}}],["singleton",{"2":{"22":1}}],["singlequote",{"2":{"17":1}}],["singleclick",{"2":{"17":1}}],["single",{"2":{"2":1,"10":1,"24":1,"34":1}}],["situations",{"2":{"26":1}}],["situation",{"2":{"22":1,"24":1}}],["sites",{"2":{"3":1,"34":2}}],["site",{"2":{"2":7,"3":1,"4":3,"6":1,"8":17,"9":2,"21":2,"22":1,"23":1,"24":1,"26":2,"33":3,"34":5,"56":1,"67":1,"69":1,"87":1,"88":1,"96":3}}],["simulates",{"2":{"23":1}}],["similar",{"2":{"22":1,"24":1,"33":1,"34":1,"67":1,"76":1,"108":1}}],["simply",{"2":{"26":1}}],["simplified",{"2":{"34":1}}],["simplifies",{"2":{"5":1}}],["simplistically",{"2":{"24":1}}],["simplenavbar",{"0":{"110":1}}],["simpleheader",{"0":{"90":1}}],["simplefooter",{"0":{"81":1}}],["simpledrawer",{"0":{"75":1},"2":{"61":2,"76":1}}],["simpledialog",{"2":{"17":1}}],["simpler",{"2":{"21":1}}],["simple",{"2":{"1":1,"2":1,"6":1,"17":4,"21":1,"24":1,"33":1,"34":4,"69":1,"90":1,"91":1,"96":2,"112":1}}],["size=",{"2":{"13":1}}],["size",{"2":{"13":2,"14":5,"27":1}}],["sidebar",{"2":{"87":1,"106":2,"108":2}}],["sidebarlayout",{"2":{"12":2}}],["side",{"2":{"10":1,"12":2,"34":3,"114":1}}],["significantly",{"2":{"34":1}}],["significant",{"2":{"21":1,"24":1,"34":1}}],["signing",{"2":{"2":1}}],["sign",{"2":{"2":1}}],["serif",{"2":{"117":1}}],["serve",{"2":{"24":1}}],["server",{"2":{"1":1,"3":4,"4":8,"5":3,"6":1,"8":7,"9":2,"13":1,"17":6,"21":1,"33":1,"34":13,"96":1}}],["services",{"2":{"1":1,"2":1,"3":5,"10":1,"17":1,"22":1,"26":1,"33":1,"69":1,"71":1,"105":1}}],["service",{"0":{"1":1,"114":1},"2":{"1":1,"3":4,"5":1,"17":1,"24":1,"33":1,"34":4,"56":2,"61":1,"66":1,"71":1,"78":1,"102":1,"105":1,"112":1,"114":2}}],["seo",{"0":{"34":1},"2":{"34":1}}],["semantic",{"2":{"31":1}}],["semi",{"2":{"17":1}}],["selected",{"2":{"61":1,"117":1}}],["select",{"2":{"25":2,"61":6,"87":2}}],["self",{"2":{"24":1,"25":1,"33":1}}],["search",{"2":{"17":1,"34":4}}],["several",{"2":{"8":1,"10":1,"12":2,"22":3,"23":1,"24":1,"34":1}}],["seed",{"2":{"72":1}}],["seem",{"2":{"67":1}}],["see",{"2":{"2":1,"12":1,"13":1,"16":2,"17":2,"34":1,"113":1}}],["secrets",{"2":{"8":2}}],["section",{"2":{"4":1,"21":1,"31":1,"87":1}}],["sections",{"2":{"2":1}}],["seconds",{"2":{"17":1}}],["secondary",{"2":{"17":1}}],["second",{"2":{"2":2,"17":3,"93":2}}],["security",{"2":{"2":5,"17":1,"26":1}}],["sense",{"2":{"22":1}}],["sentry",{"2":{"17":2}}],["sent",{"2":{"2":2}}],["send",{"2":{"5":1,"24":1,"34":1}}],["sends",{"2":{"2":1,"34":1}}],["sending",{"2":{"1":1}}],["senior",{"2":{"2":1}}],["setlocale",{"2":{"98":2}}],["setlogoutcallback",{"2":{"1":1}}],["setoptions",{"2":{"72":1}}],["sets",{"2":{"72":1}}],["setsomearr",{"2":{"24":1}}],["setitem",{"2":{"8":1}}],["setup>",{"2":{"14":1}}],["setup",{"2":{"8":4,"17":1,"21":1,"22":1,"64":1,"68":1,"73":1,"98":1}}],["setters",{"2":{"22":1}}],["settings",{"2":{"8":1,"11":2,"17":1,"87":1}}],["setting",{"0":{"88":1},"2":{"4":1,"8":1,"16":1,"17":1,"21":4,"67":1,"96":1}}],["settokencallback",{"2":{"1":1}}],["set",{"2":{"1":1,"2":2,"9":1,"15":3,"16":2,"17":1,"24":1,"33":1,"34":1,"68":2,"108":1,"115":1}}],["setbaseurl",{"2":{"1":1}}],["separately",{"2":{"69":1}}],["separated",{"2":{"4":1}}],["separate",{"2":{"1":3,"4":2,"10":2,"17":1,"22":2,"24":1,"25":1,"33":1,"114":1}}],["dx",{"2":{"25":1,"56":1}}],["drop",{"2":{"87":1}}],["dropdown",{"2":{"25":1}}],["drawers",{"0":{"74":1},"1":{"75":1,"76":1},"2":{"74":1}}],["drawer",{"2":{"61":1,"69":1,"73":1,"102":2}}],["draw",{"2":{"32":1,"33":1}}],["dream",{"2":{"21":1}}],["driving",{"2":{"33":5}}],["driver",{"2":{"33":2}}],["drive",{"2":{"2":4,"33":1}}],["dribbling",{"2":{"22":1}}],["drilling",{"2":{"12":2}}],["dprint",{"2":{"17":4}}],["dlint",{"2":{"17":4}}],["dash",{"2":{"72":1}}],["days",{"2":{"25":1,"30":1,"33":2}}],["day",{"2":{"18":2,"21":2,"33":1}}],["dangerfile",{"2":{"17":2}}],["dart",{"2":{"17":6}}],["dark",{"2":{"17":1,"103":1,"117":2}}],["dates",{"2":{"18":1,"21":1,"96":1}}],["date=`date",{"2":{"8":1}}],["date",{"0":{"21":1},"2":{"8":9,"16":1,"17":1,"21":1,"94":1}}],["datalayer",{"2":{"94":3}}],["databases",{"2":{"17":1}}],["database",{"2":{"3":5,"17":1,"22":3}}],["data",{"2":{"2":2,"3":6,"4":3,"5":1,"8":2,"11":3,"12":3,"16":1,"21":2,"22":5,"24":7,"26":1,"33":2,"34":4,"113":1}}],["dynamically",{"2":{"13":1,"24":1,"34":1,"68":1,"69":1,"103":1}}],["dynamic",{"2":{"13":1,"34":1,"73":1,"105":1}}],["dt",{"2":{"8":1}}],["d",{"2":{"8":1,"17":16}}],["due",{"2":{"5":1,"24":1}}],["during",{"2":{"4":1,"21":1,"102":1,"116":1}}],["duplicate",{"2":{"2":1}}],["diagrams",{"2":{"32":1}}],["dialyzer",{"2":{"17":1}}],["dialogstyle",{"2":{"17":1}}],["dies",{"2":{"22":1}}],["did",{"2":{"21":1}}],["divider",{"2":{"117":1}}],["divided",{"2":{"10":1}}],["division",{"2":{"25":1}}],["div",{"2":{"14":1,"68":4}}],["div>",{"2":{"12":6,"68":4,"98":2}}],["dirname",{"2":{"16":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,"113":1}}],["direction",{"2":{"68":2}}],["direct",{"2":{"22":1}}],["directly",{"2":{"16":1,"21":2,"27":1,"28":1,"34":1}}],["directories",{"2":{"14":1}}],["directory",{"2":{"8":3,"61":2,"73":1,"78":1}}],["directs",{"2":{"2":1}}],["disappears",{"2":{"79":1}}],["disable",{"2":{"21":1}}],["discussion",{"2":{"22":1}}],["disk",{"2":{"16":1,"17":1}}],["displaying",{"2":{"22":2,"26":1}}],["displaylanguage",{"2":{"17":1}}],["display",{"2":{"11":1,"13":2,"34":1,"68":1,"113":1}}],["dispatch",{"2":{"8":2}}],["distribution",{"2":{"34":1}}],["distributedfooter",{"0":{"85":1}}],["distributed",{"2":{"34":1,"69":1}}],["dist",{"2":{"8":2,"13":1,"17":1}}],["diffeditor",{"2":{"17":1}}],["differing",{"2":{"22":1}}],["differs",{"2":{"4":1}}],["difference",{"2":{"21":1,"22":1,"24":1,"33":1}}],["differences",{"2":{"2":1,"24":1}}],["differently",{"2":{"16":1,"34":1}}],["different",{"2":{"2":2,"3":1,"11":1,"15":2,"16":1,"21":1,"22":1,"23":1,"24":3,"26":2,"34":1,"93":1,"104":1,"105":3,"114":1}}],["diffdecorationsgutterwidth",{"2":{"17":1}}],["difficulties",{"2":{"5":1}}],["difficult",{"2":{"2":1,"33":1}}],["dozens",{"2":{"16":1,"17":1}}],["down",{"2":{"11":1,"24":1,"26":1,"58":1,"87":1,"93":1}}],["downloading",{"2":{"21":1,"96":1}}],["downloaded",{"2":{"13":1,"34":1}}],["download",{"2":{"8":1,"33":1}}],["don",{"2":{"8":1,"12":1,"13":1,"24":1,"27":2,"28":1,"34":2,"88":1,"99":1}}],["done",{"2":{"2":2,"23":1,"30":1,"64":1,"78":1}}],["document",{"0":{"32":1},"2":{"12":1,"25":1,"33":1}}],["documentation",{"2":{"8":1,"12":2,"13":1,"22":1,"32":1,"33":3,"34":1,"56":1,"58":1,"67":1}}],["docs",{"2":{"8":1,"9":1}}],["dockerignore",{"2":{"17":1}}],["dockerfile",{"2":{"17":2}}],["docker",{"0":{"7":1},"2":{"17":2}}],["domains",{"2":{"4":1}}],["domain",{"2":{"4":6,"9":4,"33":1,"88":2,"115":1}}],["do",{"2":{"3":3,"4":1,"9":1,"16":1,"17":1,"21":1,"22":2,"23":1,"24":2,"25":1,"26":1,"27":1,"29":1,"30":1,"33":4,"34":2,"64":1,"117":1}}],["doe",{"2":{"2":2}}],["doesn",{"2":{"3":1,"17":2,"24":1,"27":1}}],["does",{"2":{"1":1,"2":4,"4":1,"17":2,"21":3,"22":1,"24":1,"34":1,"58":1,"114":1}}],["degree",{"2":{"64":1}}],["dead",{"2":{"34":1}}],["debounce",{"2":{"27":1}}],["debugging",{"2":{"21":1}}],["debuganyway",{"2":{"17":1}}],["debug",{"2":{"17":1}}],["demonstrates",{"2":{"22":1}}],["deno",{"2":{"17":2}}],["desired",{"2":{"64":1}}],["designed",{"2":{"25":1}}],["designer",{"2":{"17":2}}],["design",{"2":{"15":1,"24":1,"33":2,"56":1,"58":1,"66":1,"69":1}}],["desktop",{"2":{"34":1,"68":3,"75":1,"106":1,"108":1}}],["descendant",{"2":{"22":2}}],["describe",{"2":{"32":1,"58":1}}],["describes",{"2":{"8":1}}],["description",{"2":{"8":1,"34":1,"113":1,"115":3}}],["deep",{"2":{"14":1,"105":1}}],["defining",{"2":{"67":1}}],["definitions",{"2":{"26":1}}],["definition",{"2":{"22":1}}],["defined",{"2":{"117":1}}],["define",{"2":{"22":1,"24":1}}],["defineconfig",{"2":{"16":1,"88":1}}],["defineprops",{"2":{"14":1}}],["defaultformatter",{"2":{"17":4}}],["default",{"0":{"103":1},"2":{"1":1,"8":2,"14":6,"16":1,"17":2,"72":1,"88":1,"98":1}}],["detailed",{"2":{"26":1}}],["details",{"0":{"77":1},"1":{"78":1,"79":1},"2":{"11":1,"12":1,"13":1,"31":1,"32":1,"87":1}}],["determined",{"2":{"2":1}}],["determines",{"2":{"2":1}}],["deleting",{"2":{"21":1}}],["delete",{"2":{"2":1,"21":1}}],["delivery",{"2":{"6":1}}],["de",{"2":{"5":1,"72":1}}],["deception",{"2":{"34":1}}],["decided",{"2":{"26":3}}],["decides",{"2":{"2":1,"22":1}}],["decomposition",{"2":{"24":1}}],["declensions",{"2":{"21":1,"96":1}}],["declared",{"2":{"4":2,"22":2}}],["declaration",{"2":{"4":1}}],["decade",{"2":{"15":1}}],["devdependencies",{"2":{"16":1,"17":1}}],["dev",{"2":{"8":10,"9":2,"16":1,"22":1,"34":1,"62":1,"63":1,"113":1}}],["devops",{"2":{"6":1}}],["developing",{"2":{"24":1,"26":1,"34":1,"64":1}}],["develop",{"2":{"24":1}}],["developed",{"2":{"10":2}}],["developers",{"2":{"12":1,"23":1,"25":2,"33":1,"58":1,"66":1,"69":2}}],["developer",{"2":{"3":2,"6":1,"22":3,"25":1,"32":1,"33":4,"56":2,"59":1,"64":1,"67":2,"71":1}}],["development",{"0":{"55":1,"104":1},"2":{"4":2,"6":1,"9":1,"10":1,"17":4,"21":1,"23":3,"24":1,"25":2,"26":1,"33":1,"34":1,"39":1,"44":1,"45":1,"67":2,"113":1}}],["devtoolsformatters",{"2":{"21":3}}],["devtools",{"2":{"3":1,"21":2,"22":4,"99":1}}],["deposit",{"2":{"96":1}}],["deposits",{"2":{"2":1}}],["deprecated",{"2":{"22":1}}],["deployed",{"2":{"8":2}}],["deploy",{"0":{"86":1},"1":{"87":1,"88":1},"2":{"8":21,"33":1,"69":1,"87":3,"102":2}}],["deployment",{"0":{"87":1},"2":{"6":1,"8":3,"41":1,"42":2,"87":2,"105":1}}],["depend",{"2":{"24":1}}],["dependency",{"2":{"22":1,"25":2,"27":1,"64":1}}],["dependencies",{"0":{"27":1},"2":{"8":2,"21":1,"24":2,"34":1,"64":1,"97":1,"99":1}}],["depends",{"2":{"4":1}}],["depending",{"2":{"2":1,"13":1,"33":1}}],["rgba",{"2":{"117":6}}],["richfooter",{"0":{"82":1}}],["rip",{"2":{"22":1}}],["rigor",{"2":{"5":1}}],["rights",{"2":{"2":1}}],["right",{"2":{"2":3,"17":2,"21":1,"33":1,"34":1,"79":1,"96":1,"112":1}}],["rspack",{"2":{"17":12}}],["rc",{"2":{"17":1}}],["ruslan",{"2":{"59":2}}],["rush",{"2":{"17":1}}],["rust",{"2":{"17":1}}],["rustfmt",{"2":{"17":2}}],["ruby",{"2":{"17":1}}],["ru",{"2":{"17":3,"58":2}}],["rules",{"2":{"17":2,"24":1,"33":1}}],["running",{"2":{"23":1}}],["runs",{"2":{"8":2}}],["run",{"2":{"3":2,"8":9,"17":3,"34":2,"113":1}}],["r",{"2":{"8":2,"22":1,"58":2}}],["rf",{"2":{"8":4}}],["rm",{"2":{"8":3}}],["range",{"2":{"67":1}}],["raise",{"2":{"32":1}}],["ram",{"2":{"17":1,"99":1}}],["raw",{"2":{"13":2,"15":1,"16":1}}],["rather",{"2":{"3":1,"5":1,"67":1}}],["rarely",{"2":{"2":1}}],["roboto",{"2":{"117":1}}],["robust",{"2":{"24":1}}],["row",{"2":{"68":1}}],["room",{"2":{"34":1}}],["root",{"2":{"8":2,"11":2,"15":1,"117":1}}],["routing",{"0":{"107":1}}],["routine",{"2":{"24":1}}],["router",{"2":{"12":4,"64":1,"107":1}}],["routes",{"2":{"10":1,"12":2,"107":1}}],["roughly",{"2":{"2":1,"4":1,"26":1}}],["rollup",{"2":{"16":2,"17":2}}],["rollback",{"2":{"8":1}}],["roles",{"2":{"2":1,"24":1}}],["role",{"2":{"2":2,"22":1,"24":1,"33":1}}],["rbac",{"2":{"2":1}}],["rtl",{"2":{"21":1,"96":1}}],["rt",{"2":{"2":4,"56":1}}],["rpc",{"0":{"72":1},"2":{"1":1,"5":7,"33":1,"61":1,"71":1,"72":5,"102":1}}],["reusable",{"2":{"69":1}}],["reuse",{"2":{"10":1}}],["reviews",{"2":{"34":1}}],["rehydration",{"2":{"34":1}}],["rewriting",{"2":{"22":1,"23":1}}],["reduces",{"2":{"34":1}}],["reduce",{"2":{"23":1,"25":1}}],["reddit",{"2":{"22":1,"58":1}}],["redis",{"2":{"22":1}}],["registration",{"2":{"105":1}}],["registers",{"2":{"24":1}}],["register",{"2":{"22":1,"33":2}}],["regarding",{"2":{"34":1}}],["regulate",{"2":{"12":1}}],["regular",{"0":{"29":1},"2":{"2":1,"16":1,"34":1}}],["reason",{"2":{"33":1}}],["reasons",{"2":{"25":1}}],["react",{"2":{"24":6,"33":2}}],["reactivity",{"2":{"22":1,"24":7,"96":1}}],["reactive",{"2":{"21":9,"22":11,"24":11,"69":1}}],["read",{"2":{"22":2,"33":2,"34":1,"73":1}}],["readable",{"2":{"21":1}}],["ready",{"2":{"17":1,"67":2,"69":2}}],["readme",{"2":{"17":2}}],["reality",{"2":{"27":1}}],["really",{"2":{"15":1,"23":1}}],["real",{"2":{"3":1,"23":1,"33":2}}],["renting",{"2":{"34":1}}],["renaming",{"2":{"29":1}}],["renamed",{"2":{"13":1}}],["renovate",{"2":{"17":2}}],["rendering",{"2":{"34":2}}],["renderwhitespace",{"2":{"17":1}}],["render",{"2":{"9":1}}],["refactoring",{"0":{"29":1},"2":{"29":1}}],["refs",{"2":{"22":2}}],["ref",{"2":{"21":7,"22":6,"24":2,"71":1}}],["reference",{"2":{"33":2}}],["refer",{"2":{"13":1}}],["referred",{"2":{"10":1}}],["refreshes",{"2":{"2":1}}],["refresh",{"2":{"2":1,"56":1}}],["repetitive",{"2":{"24":1}}],["replacing",{"2":{"21":1,"24":1}}],["replaced",{"2":{"21":1}}],["replacement",{"2":{"21":2}}],["replace",{"2":{"1":1,"25":2,"26":1,"28":1,"94":1}}],["replit",{"2":{"17":1}}],["repo",{"2":{"17":1}}],["repository",{"0":{"63":1},"2":{"6":1,"8":4,"10":1,"17":1,"33":1,"87":4,"88":1}}],["representation",{"2":{"13":1}}],["recalculate",{"2":{"24":1}}],["recent",{"2":{"21":1,"96":1}}],["recentchange",{"2":{"17":1}}],["receive",{"2":{"34":2}}],["receives",{"2":{"4":1,"34":1}}],["receiving",{"2":{"2":1}}],["recursive",{"2":{"8":1}}],["recognition",{"2":{"116":1}}],["recognized",{"2":{"58":1}}],["recommend",{"2":{"21":1}}],["recommended",{"2":{"8":1,"9":1,"16":1,"17":1,"21":1,"72":1,"99":1,"117":1}}],["reconnection",{"2":{"5":1}}],["re",{"2":{"2":2}}],["remain",{"2":{"22":1,"72":1}}],["remains",{"2":{"1":1}}],["remix",{"2":{"17":2}}],["removed",{"2":{"8":1,"116":1}}],["removed=`ls",{"2":{"8":1}}],["remove",{"2":{"8":2}}],["removes",{"2":{"2":1}}],["remote",{"2":{"8":12,"17":5}}],["reliably",{"2":{"17":1}}],["reliable",{"2":{"2":1,"8":1}}],["relevance",{"2":{"58":1}}],["relevant",{"2":{"3":1,"67":1}}],["release",{"2":{"17":4,"114":1}}],["releaserc",{"2":{"17":2}}],["reload",{"2":{"8":2,"105":1}}],["related",{"2":{"1":1,"2":1,"10":1,"22":1,"26":1}}],["require",{"2":{"9":1,"11":1}}],["requiresauth",{"2":{"12":1}}],["requires",{"2":{"5":1,"9":1,"15":1,"16":1,"21":1,"22":1,"96":1}}],["required",{"2":{"3":1,"8":1}}],["requirements",{"2":{"2":1,"25":1,"34":1}}],["requested",{"2":{"2":1,"4":2}}],["requesting",{"2":{"2":1}}],["requests",{"2":{"1":1,"4":3,"5":1,"17":2,"34":3,"72":1}}],["request",{"2":{"1":2,"2":2,"4":7,"34":2}}],["resume",{"2":{"33":1}}],["result",{"0":{"100":1},"2":{"2":1,"3":1,"8":1,"17":1,"22":1,"62":1,"64":1,"67":1}}],["respect",{"2":{"22":1}}],["response",{"2":{"4":4,"8":2}}],["responsible",{"2":{"2":1,"12":2,"22":2,"24":1,"117":1}}],["resides",{"2":{"22":1}}],["resx",{"2":{"17":2}}],["resolutions",{"2":{"26":1,"75":1,"79":1}}],["resolver",{"2":{"16":1,"17":1}}],["resolve",{"2":{"16":2}}],["resources",{"0":{"13":1},"1":{"14":1,"15":1},"2":{"2":1,"3":1,"4":1,"10":4,"13":7,"16":1,"33":1,"34":3,"99":1,"114":1,"116":1}}],["resource",{"0":{"55":1},"2":{"2":3,"4":6,"10":1,"13":3}}],["reserve",{"2":{"12":1}}],["resets",{"2":{"2":1}}],["restrictions",{"2":{"34":1}}],["rest",{"0":{"5":2,"71":1},"2":{"1":1,"5":2,"61":1,"71":1,"72":2}}],["returns",{"2":{"2":2,"3":1,"13":1,"21":1,"71":1}}],["return",{"2":{"1":1,"4":1,"14":2,"15":2,"71":1,"72":1}}],["og",{"2":{"115":6}}],["oop",{"2":{"22":1,"24":1,"26":3}}],["ok",{"2":{"21":2}}],["os",{"2":{"17":1}}],["overriding",{"2":{"117":1}}],["overrides",{"2":{"17":1}}],["overflow",{"2":{"79":1}}],["overwrite",{"2":{"61":3}}],["over",{"0":{"28":1},"2":{"22":1,"24":1,"34":1,"71":1}}],["overview",{"2":{"18":1}}],["overuse",{"2":{"12":2}}],["obtained",{"2":{"96":1}}],["obvious",{"2":{"58":1}}],["obj",{"2":{"21":1}}],["objectives",{"0":{"69":1}}],["objective",{"2":{"58":1}}],["object",{"2":{"15":1,"21":5,"22":1,"24":2,"26":3,"33":1}}],["objects",{"2":{"4":2,"21":4,"22":1,"24":1}}],["observer",{"2":{"21":1}}],["obsolete",{"2":{"16":1,"18":1,"21":1,"22":1,"25":1,"27":1,"67":1}}],["old",{"2":{"8":1,"15":1,"21":2,"33":1}}],["outdated",{"2":{"17":1,"33":1}}],["out",{"2":{"17":2,"18":1,"21":1,"22":1,"24":1,"33":2,"69":1,"108":1}}],["output",{"2":{"17":2,"34":1}}],["outer",{"2":{"12":1}}],["outside",{"2":{"4":1,"22":1}}],["our",{"2":{"8":2}}],["occurs",{"2":{"34":1}}],["occur",{"2":{"4":1}}],["otherwise",{"2":{"21":1}}],["others",{"2":{"12":1,"24":1,"105":1}}],["other",{"2":{"3":2,"4":1,"5":1,"6":1,"8":1,"9":2,"10":2,"13":2,"17":3,"21":1,"22":6,"24":2,"25":1,"26":2,"32":1,"34":3,"67":4,"69":1,"96":1,"105":3}}],["own",{"2":{"3":2,"5":1,"8":3,"10":1,"16":2,"21":1,"22":2,"25":2,"27":1,"28":1,"34":1,"94":1}}],["opinion",{"2":{"58":1}}],["optimization",{"2":{"34":1}}],["optional",{"2":{"55":1}}],["option",{"2":{"2":1,"33":1}}],["options",{"0":{"3":1,"101":1,"102":1},"1":{"102":1,"103":1,"104":1,"105":1},"2":{"2":1,"8":1,"9":1,"11":1,"16":1,"17":1,"21":2,"61":2,"69":3,"102":1}}],["operation",{"2":{"34":1}}],["operations",{"2":{"21":1}}],["open=",{"2":{"93":1}}],["opened",{"2":{"75":1}}],["opengraph",{"2":{"61":1}}],["openclose",{"2":{"17":1}}],["open",{"2":{"3":1,"33":2,"57":1,"61":1,"66":1,"78":1,"102":1,"115":1}}],["oauth",{"2":{"2":2}}],["onmounted",{"2":{"116":1}}],["ontaskerrors",{"2":{"17":1}}],["onecolumnlayout",{"0":{"108":1}}],["ones",{"2":{"16":1,"33":1,"117":1}}],["one",{"2":{"2":1,"4":1,"8":2,"12":4,"13":2,"16":2,"21":1,"22":8,"23":1,"25":1,"33":1,"34":1,"67":2,"93":1,"97":1}}],["once",{"2":{"2":1,"21":1}}],["onlyenabledextensions",{"2":{"17":1}}],["only",{"2":{"2":1,"3":1,"4":2,"6":1,"11":1,"15":1,"17":5,"21":3,"22":3,"24":1,"25":2,"33":2,"61":1,"64":2,"96":1,"99":1}}],["online",{"2":{"2":1,"9":1,"10":1,"16":1,"17":1,"34":1,"67":1,"69":1,"105":1}}],["on",{"2":{"2":9,"3":5,"4":3,"5":5,"6":2,"8":9,"9":4,"10":1,"13":2,"16":2,"17":7,"21":4,"22":10,"23":5,"24":8,"25":3,"26":5,"30":2,"33":13,"34":10,"56":2,"58":1,"61":1,"67":3,"68":1,"75":2,"76":1,"79":1,"96":1,"105":2,"106":1,"113":1,"116":1}}],["org",{"2":{"72":1}}],["organise",{"2":{"12":1}}],["organizing",{"2":{"9":1}}],["organizeimports",{"2":{"17":1}}],["organize",{"2":{"5":1,"24":1}}],["oreilly",{"2":{"33":1}}],["orientation",{"2":{"113":1}}],["oriented",{"2":{"24":2,"26":1}}],["originally",{"2":{"34":1}}],["origin",{"2":{"4":7}}],["ordinary",{"2":{"24":1}}],["orders",{"2":{"34":1}}],["order",{"2":{"2":1,"5":1,"34":1}}],["oracle",{"2":{"3":1,"9":1}}],["or",{"0":{"5":1,"20":1},"2":{"1":2,"2":1,"3":2,"4":4,"5":1,"9":1,"10":1,"11":3,"13":3,"15":1,"16":3,"21":3,"22":11,"24":4,"25":4,"26":1,"27":1,"28":2,"33":6,"34":3,"55":3,"61":1,"64":1,"67":4,"68":1,"71":1,"96":1}}],["often",{"2":{"13":1,"21":1,"23":1,"33":1,"34":1,"96":1}}],["offline",{"2":{"34":2}}],["off",{"2":{"17":2,"22":1,"24":1}}],["officially",{"2":{"22":1}}],["official",{"2":{"12":1,"17":1,"22":1,"58":1}}],["offers",{"2":{"24":1}}],["offer",{"2":{"3":1,"25":1,"33":1}}],["of",{"0":{"28":1,"55":1},"2":{"1":2,"2":12,"3":2,"4":8,"5":5,"6":3,"8":13,"9":1,"10":4,"11":2,"13":4,"15":1,"16":5,"17":9,"18":3,"21":20,"22":30,"23":7,"24":17,"25":12,"26":8,"27":4,"28":1,"30":2,"32":2,"33":11,"34":20,"55":1,"56":4,"58":5,"59":1,"61":2,"63":1,"64":1,"66":1,"67":3,"69":6,"71":4,"72":2,"73":1,"74":1,"78":1,"80":1,"87":2,"88":1,"96":7,"97":3,"98":1,"102":3,"104":2,"105":6,"107":1,"108":1,"114":5,"116":1}}],["would",{"2":{"22":2,"33":1,"64":1}}],["word",{"2":{"55":1}}],["wordseparators",{"2":{"17":1}}],["words",{"2":{"6":1,"22":2,"34":1,"67":1}}],["worth",{"2":{"33":1}}],["world",{"2":{"25":1,"34":1}}],["worsens",{"2":{"25":1}}],["workable",{"2":{"67":1}}],["workbox",{"2":{"34":2,"114":1}}],["workbench",{"2":{"17":11}}],["worker",{"0":{"114":1},"2":{"34":3,"56":2,"61":1,"66":1,"78":1,"102":1,"112":1,"114":2}}],["workflow",{"2":{"8":2,"61":1,"102":1}}],["workflows",{"2":{"8":3}}],["workingissueformatscm",{"2":{"17":1}}],["working",{"2":{"3":1,"4":1,"6":2,"13":1,"17":1,"18":1,"19":1,"24":1,"56":2,"64":1}}],["work",{"2":{"2":1,"3":2,"5":1,"8":1,"10":1,"12":1,"17":5,"22":2,"23":1,"27":1,"33":2,"112":1}}],["workspace",{"2":{"17":3}}],["works",{"2":{"2":2,"16":1,"21":3,"33":1,"34":2,"99":1}}],["www",{"2":{"4":1,"8":6,"94":1}}],["walk",{"2":{"34":1}}],["water",{"2":{"33":1}}],["watch",{"2":{"24":1}}],["watchman",{"2":{"17":2}}],["was",{"2":{"21":1,"22":2,"24":2,"25":1,"34":5}}],["warm",{"2":{"17":1}}],["wants",{"2":{"3":1}}],["want",{"2":{"3":2,"11":1,"21":1,"26":2,"33":1,"87":1}}],["ways",{"2":{"33":1}}],["way",{"2":{"2":3,"5":1,"8":2,"12":1,"16":1,"21":1,"22":1,"25":2,"34":2,"55":1}}],["welcome",{"2":{"55":1,"57":1}}],["well",{"2":{"13":1,"17":2,"20":1,"21":1,"24":1,"33":3,"34":2,"67":1,"69":1,"99":1}}],["went",{"2":{"25":1}}],["weight",{"2":{"25":1}}],["were",{"2":{"21":1,"24":1,"25":1,"33":1,"34":1}}],["webapp",{"0":{"61":1,"65":1},"1":{"62":1,"66":1,"67":1},"2":{"37":1,"57":2,"61":7,"63":2,"66":1,"87":2,"88":1,"113":1}}],["webdriverio",{"2":{"23":1}}],["webpack",{"2":{"16":4,"17":13}}],["webp",{"2":{"15":1}}],["webstorm",{"2":{"17":2}}],["website",{"2":{"8":3,"9":9,"10":1,"16":1,"34":2,"56":1,"66":1,"67":1,"69":2,"87":1,"115":1}}],["websocket",{"2":{"5":1}}],["websockets",{"2":{"1":1,"5":3,"33":1,"71":1}}],["webservers",{"2":{"17":1}}],["webserver",{"2":{"4":1,"9":2,"17":1,"34":1}}],["web",{"0":{"62":1},"2":{"4":3,"5":2,"10":1,"17":1,"23":1,"25":2,"26":1,"34":8,"64":2,"67":2,"69":3,"72":1,"113":1}}],["we",{"2":{"2":1,"8":4,"21":2,"25":1,"26":7,"33":1}}],["wrap",{"2":{"25":1,"26":1}}],["wrappers",{"0":{"28":1},"2":{"28":1}}],["wrapper",{"2":{"1":1,"24":1,"34":2,"64":1}}],["writes",{"2":{"34":1}}],["write",{"2":{"3":2,"8":1,"22":2,"24":1,"33":1,"34":1}}],["written",{"2":{"2":1,"3":1,"23":1}}],["writing",{"2":{"2":1,"3":1,"23":1,"33":1,"34":1}}],["while",{"2":{"12":1}}],["which",{"2":{"2":1,"3":1,"4":2,"5":1,"9":1,"10":1,"13":2,"16":1,"17":1,"21":2,"22":6,"24":4,"25":1,"27":1,"34":5,"61":1,"67":2,"87":1,"117":2}}],["why",{"2":{"5":1,"17":1,"22":2,"24":2,"25":2,"26":1}}],["where",{"2":{"2":1,"3":1,"9":1,"12":1,"15":1,"17":1,"22":2,"23":1,"24":4,"29":1,"34":2,"69":1}}],["whether",{"2":{"2":2,"12":1,"22":1,"61":1}}],["when",{"0":{"101":1},"1":{"102":1,"103":1,"104":1,"105":1},"2":{"2":6,"3":1,"4":2,"5":1,"8":2,"13":1,"17":2,"21":2,"22":3,"24":3,"25":1,"33":1,"34":9,"64":1,"69":1,"73":1,"79":1,"106":1,"108":1}}],["whole",{"2":{"25":2,"34":1}}],["whom",{"2":{"2":1}}],["who",{"2":{"2":1,"24":2,"33":1}}],["whatever",{"2":{"25":1}}],["what",{"2":{"1":1,"2":2,"3":2,"4":1,"5":1,"6":1,"8":1,"10":1,"12":1,"15":1,"17":1,"19":1,"22":3,"23":1,"24":3,"25":1,"26":1,"33":2}}],["wireframe",{"2":{"69":1}}],["wide",{"2":{"67":1}}],["widgets",{"2":{"22":1}}],["width",{"2":{"14":7,"108":2,"117":1}}],["windi",{"2":{"17":10}}],["window",{"2":{"8":1,"10":1,"17":4,"21":3,"64":1,"94":2,"113":1}}],["wise",{"2":{"10":1}}],["within",{"2":{"21":1}}],["without",{"2":{"3":2,"6":1,"11":2,"12":3,"17":1,"21":1,"23":1,"24":2,"25":1,"33":1,"34":1,"61":1,"64":1,"67":1,"71":1,"97":1,"108":1,"112":1,"113":1}}],["with",{"2":{"1":2,"2":7,"3":9,"4":2,"5":4,"8":12,"9":3,"10":2,"11":1,"12":4,"13":2,"15":3,"16":3,"17":6,"18":1,"19":1,"21":3,"22":6,"23":3,"24":2,"25":2,"26":4,"27":1,"28":1,"30":1,"33":8,"34":11,"56":1,"59":1,"61":2,"63":1,"64":2,"66":1,"67":3,"68":1,"69":8,"72":1,"73":2,"76":1,"94":1,"96":2,"99":1,"100":1,"102":1,"103":1,"105":1,"106":1,"114":1}}],["will",{"2":{"1":1,"3":3,"4":3,"5":2,"8":5,"9":1,"13":1,"15":1,"21":3,"22":1,"23":4,"24":3,"25":1,"27":1,"28":2,"30":1,"32":1,"33":2,"34":3,"61":3,"63":2,"69":1,"71":1,"114":1}}],["pwa",{"0":{"34":1,"112":1},"1":{"113":1,"114":1},"2":{"34":12,"56":1,"61":2,"66":2,"69":1,"102":1}}],["pwd",{"2":{"8":1}}],["pc",{"2":{"17":2}}],["pdm",{"2":{"17":2}}],["pdf",{"2":{"13":1,"17":1}}],["python",{"2":{"33":1,"34":1}}],["pyproject",{"2":{"17":2}}],["pyrightconfig",{"2":{"17":2}}],["pinia",{"2":{"22":14,"42":1}}],["picked",{"2":{"17":1}}],["picture",{"2":{"15":1,"34":1}}],["pictures",{"2":{"13":1,"15":1,"34":1}}],["pipelines",{"2":{"17":2}}],["psalm",{"2":{"17":1}}],["pm2",{"2":{"17":4}}],["pm",{"2":{"17":1}}],["px`",{"2":{"14":4}}],["pnp",{"2":{"17":2}}],["pnpm",{"2":{"8":12,"16":2,"17":6,"61":3,"62":2,"63":2,"66":1}}],["png`",{"2":{"13":1}}],["png",{"2":{"13":3,"15":3,"73":1}}],["p",{"2":{"8":1}}],["people",{"2":{"26":1}}],["pet",{"2":{"8":1}}],["perfect",{"2":{"24":1}}],["perfectly",{"2":{"24":1}}],["performant",{"2":{"24":1}}],["performance",{"2":{"21":1,"22":1,"27":1,"34":1}}],["performed",{"2":{"24":1}}],["perform",{"2":{"24":1}}],["percent",{"2":{"21":1,"96":1}}],["perspective",{"2":{"22":2}}],["persistentsessionreviveprocess",{"2":{"17":1}}],["person",{"2":{"2":1,"17":1,"33":2}}],["personal",{"2":{"2":1}}],["pereditorgroup",{"2":{"17":1}}],["per",{"2":{"9":1,"24":1}}],["permissions",{"2":{"2":1,"8":1}}],["permission",{"2":{"2":1}}],["phpcs",{"2":{"17":2}}],["phpunit",{"2":{"17":1}}],["php",{"2":{"3":1,"17":2,"33":1,"34":2}}],["photo",{"2":{"2":1}}],["pure",{"2":{"25":1,"30":1,"64":1}}],["purpose",{"2":{"21":1,"22":1,"34":1}}],["purposes",{"2":{"8":1}}],["pug",{"2":{"21":1}}],["pugtools",{"2":{"17":1}}],["pullapprove",{"2":{"17":2}}],["puppeteer",{"2":{"17":10}}],["publishing",{"2":{"61":1}}],["public",{"2":{"3":1,"13":4,"33":1}}],["pubspec",{"2":{"17":3}}],["pubxml",{"2":{"17":2}}],["push",{"2":{"6":1,"8":4,"24":1,"94":1}}],["put",{"2":{"8":1,"10":1,"13":2,"17":1,"22":2,"33":1,"88":1}}],["putting",{"2":{"3":1}}],["puts",{"2":{"2":1}}],["pleasant",{"2":{"25":1}}],["please",{"2":{"17":1}}],["plenty",{"2":{"3":1}}],["plugging",{"2":{"64":1}}],["plug",{"2":{"27":2}}],["plugin",{"2":{"16":2,"17":1,"34":3,"78":3}}],["plugins",{"2":{"16":4,"17":1,"22":1,"103":1}}],["plus",{"2":{"2":1,"8":1,"22":1}}],["planned",{"0":{"105":1},"2":{"69":1}}],["plans",{"2":{"3":2,"9":2}}],["play",{"2":{"33":1}}],["plays",{"2":{"24":1}}],["played",{"2":{"22":1,"33":1}}],["playground",{"2":{"17":1}}],["playwright",{"2":{"17":10}}],["places",{"2":{"34":1}}],["place",{"2":{"21":1,"24":1}}],["placed",{"2":{"9":1,"13":2}}],["placeholder",{"2":{"3":1}}],["placing",{"2":{"3":1,"34":1}}],["pba",{"2":{"2":1}}],["pops",{"2":{"108":1}}],["populated",{"2":{"22":1}}],["popular",{"2":{"3":1,"8":1,"16":1,"17":1,"21":1,"25":1,"34":1,"69":2,"96":1,"105":1}}],["popups",{"2":{"21":1}}],["polymorphism",{"2":{"26":1}}],["policy",{"2":{"2":2}}],["points",{"2":{"58":1}}],["point",{"2":{"22":1,"34":2,"56":1}}],["poorly",{"2":{"21":1}}],["portfolio",{"2":{"66":1,"67":1,"69":1}}],["port",{"2":{"4":1}}],["portal",{"2":{"2":1}}],["position",{"2":{"24":1,"67":1}}],["postcss",{"2":{"17":10}}],["postcssrc",{"2":{"17":10}}],["postman",{"2":{"4":1,"17":1}}],["postgresql",{"2":{"3":1}}],["possibilities",{"2":{"17":1}}],["possibility",{"2":{"2":1,"23":1,"27":1,"69":2}}],["possibly",{"2":{"3":1,"8":1}}],["possible",{"2":{"2":2,"21":1,"22":1,"24":3,"25":1,"34":2,"61":1,"64":1,"109":1,"117":1}}],["poke",{"2":{"3":1}}],["powerful",{"2":{"12":1}}],["power",{"2":{"2":1,"22":1,"26":1}}],["pr",{"2":{"55":1}}],["practical",{"2":{"33":1}}],["practice",{"2":{"21":1,"22":2,"67":1}}],["practices",{"0":{"12":1},"2":{"2":1,"25":1,"33":5,"56":1,"58":1,"67":2,"69":2}}],["price",{"2":{"34":1}}],["primitive",{"2":{"22":1}}],["primitives",{"2":{"21":2}}],["primevue",{"2":{"18":1}}],["private",{"2":{"8":6,"10":1,"22":1}}],["print",{"2":{"21":1}}],["printwidth",{"2":{"17":1}}],["printf",{"2":{"8":1}}],["printed",{"2":{"4":1}}],["principle",{"2":{"4":1,"24":1}}],["preloader",{"2":{"104":1}}],["preserving",{"2":{"96":1}}],["presence",{"2":{"23":1,"24":1}}],["presentation",{"2":{"25":1}}],["present",{"2":{"22":1}}],["preprocessor",{"2":{"64":1}}],["precisely",{"2":{"34":1}}],["prerenderer",{"2":{"34":1}}],["pre",{"2":{"33":1,"34":1}}],["prevent",{"2":{"79":1}}],["prevalent",{"2":{"33":1}}],["prevalence",{"2":{"24":1}}],["previous",{"2":{"33":1}}],["previously",{"2":{"8":1}}],["preview",{"2":{"17":1}}],["pretentious",{"2":{"21":1}}],["prettier",{"2":{"17":14}}],["pretty",{"2":{"3":1,"99":2}}],["preferredtagnamecase",{"2":{"17":1}}],["promise",{"2":{"71":2}}],["promises",{"2":{"33":1}}],["proven",{"2":{"56":1,"67":1}}],["providing",{"2":{"12":1}}],["provides",{"2":{"4":1}}],["provider",{"2":{"3":2,"26":1}}],["providers",{"2":{"3":1,"5":1,"9":3,"33":1,"105":1}}],["provided",{"2":{"3":2,"107":1}}],["provide",{"2":{"3":3,"9":2,"10":1,"11":1,"12":2,"22":3,"25":1}}],["progressive",{"2":{"34":1}}],["programmatically",{"2":{"21":1}}],["programmers",{"2":{"24":2,"58":1}}],["programmer",{"2":{"21":1,"24":2,"26":1}}],["programming",{"2":{"3":2,"24":3,"33":2}}],["programs",{"2":{"17":1}}],["program",{"2":{"4":1,"21":1,"24":2,"26":1}}],["professional",{"2":{"29":1}}],["pros",{"2":{"22":1,"25":2}}],["procfile",{"2":{"17":2}}],["processed",{"2":{"33":1}}],["processing",{"2":{"26":1}}],["processor",{"2":{"17":1}}],["process",{"2":{"6":1,"8":1,"10":1,"13":1,"23":1,"34":1}}],["proj",{"2":{"17":2}}],["projectname",{"2":{"61":1}}],["projects",{"2":{"8":1,"10":2,"16":1,"23":2,"24":1,"25":1,"33":1,"57":1}}],["project",{"0":{"32":1,"57":1},"2":{"3":1,"6":1,"8":10,"9":1,"10":4,"16":3,"17":1,"22":1,"25":1,"26":1,"30":1,"32":1,"33":1,"56":2,"61":6,"62":1,"66":2,"67":1,"87":1}}],["proposed",{"2":{"34":1}}],["property=",{"2":{"115":7}}],["properties",{"2":{"34":1}}],["proper",{"2":{"25":1}}],["prop",{"2":{"11":1,"12":2,"22":1}}],["props",{"2":{"11":1,"12":1,"14":11,"22":2}}],["probability",{"2":{"23":1}}],["probably",{"2":{"10":1,"24":1,"34":1}}],["problems",{"2":{"4":2,"22":1,"34":1}}],["problem",{"2":{"3":1,"8":1,"13":1,"22":1,"33":1,"34":1}}],["prod",{"2":{"8":5}}],["productive",{"2":{"17":1}}],["production",{"2":{"16":1,"23":1}}],["product",{"2":{"6":1,"10":2,"33":1,"34":1}}],["products",{"2":{"1":3}}],["proxy",{"2":{"4":2,"5":1,"21":2,"24":2}}],["protocols",{"0":{"5":1},"2":{"5":1,"33":1}}],["protocol",{"2":{"4":1,"9":1,"72":1}}],["protect",{"2":{"4":1}}],["palettes",{"2":{"105":1}}],["paid",{"2":{"33":1}}],["payment",{"2":{"26":1}}],["pascal",{"2":{"17":1}}],["pass",{"2":{"11":1,"22":3}}],["passing",{"2":{"11":1,"12":1}}],["passes",{"2":{"2":1}}],["password",{"2":{"2":1,"22":1}}],["paths",{"2":{"16":2}}],["path",{"2":{"12":4,"14":1,"16":3}}],["pattern",{"2":{"12":1,"21":1,"22":2,"24":1}}],["patterns",{"0":{"10":1},"1":{"11":1,"12":1},"2":{"17":1,"25":1,"33":2,"58":1}}],["packages",{"2":{"16":1,"17":2,"69":1}}],["package",{"2":{"10":1,"16":1,"17":8,"18":1,"21":1,"27":1,"64":2,"99":2}}],["panel",{"2":{"10":1,"107":1}}],["page",{"2":{"4":6,"13":1,"23":1,"34":8,"93":1}}],["pagespeed",{"2":{"34":2}}],["pages",{"0":{"86":1},"1":{"87":1,"88":1},"2":{"4":3,"6":1,"8":11,"9":3,"12":1,"25":1,"33":1,"34":2,"61":1,"87":6,"102":2}}],["paragraphs",{"2":{"33":1,"96":1}}],["parameter",{"2":{"61":1,"88":1,"96":1}}],["parameters",{"2":{"8":1,"61":1,"68":1,"69":1,"105":1}}],["params",{"2":{"1":2,"72":1}}],["particular",{"2":{"96":1}}],["participation",{"0":{"57":1}}],["partially",{"2":{"22":3,"24":2}}],["part",{"2":{"21":1,"22":1,"33":2,"102":2}}],["party",{"0":{"28":1},"2":{"2":1,"4":5,"5":1,"22":1,"27":1,"34":1,"64":2,"114":1}}],["parts",{"2":{"2":1,"105":1}}],["vwa",{"2":{"108":1,"117":11}}],["v1",{"0":{"36":1,"38":1,"40":1,"43":1,"46":1},"1":{"37":1,"39":1,"41":1,"42":1,"44":1,"45":1,"47":1}}],["vulnerability",{"2":{"27":1}}],["vulnerabilities",{"2":{"22":1}}],["vuesence",{"2":{"63":1}}],["vuefaq",{"2":{"59":1}}],["vuetify",{"2":{"25":1}}],["vuejs",{"2":{"22":1,"58":4}}],["vuex",{"2":{"22":6,"42":1}}],["vue",{"0":{"22":1,"33":1,"49":1,"61":1,"65":1},"1":{"62":1,"66":1,"67":1},"2":{"8":1,"10":2,"11":1,"12":2,"13":1,"14":2,"16":4,"17":15,"20":1,"21":7,"22":12,"23":1,"24":17,"25":2,"33":20,"34":1,"37":2,"39":1,"49":1,"55":1,"57":2,"58":2,"61":7,"62":1,"63":2,"64":3,"66":3,"67":4,"68":2,"69":3,"73":2,"87":2,"88":1,"98":1,"99":2,"107":1,"116":1}}],["vetur",{"2":{"17":2}}],["verified",{"2":{"34":1,"58":1}}],["verifies",{"2":{"2":2}}],["vercel",{"2":{"9":1,"17":2,"105":1}}],["versionrc",{"2":{"17":2}}],["versions",{"2":{"17":3}}],["versioning",{"2":{"10":1,"114":1}}],["version",{"2":{"8":8,"17":3,"33":1,"34":1,"71":1,"105":1,"114":2}}],["very",{"2":{"2":3,"3":2,"9":1,"17":3,"21":4,"22":1,"23":1,"25":1,"32":1,"33":2,"34":3,"55":1,"72":1,"96":3}}],["vbproj",{"2":{"17":1}}],["vb",{"2":{"17":6}}],["volar",{"2":{"17":4}}],["v",{"2":{"14":3}}],["vs",{"2":{"10":1,"17":7,"24":1,"99":1}}],["vscode",{"2":{"8":1,"17":9}}],["v4",{"2":{"8":5}}],["v2",{"2":{"8":3}}],["v3",{"2":{"8":4}}],["vars",{"2":{"117":1}}],["various",{"2":{"33":1,"105":1}}],["variations",{"2":{"69":1}}],["variant",{"2":{"5":1,"21":1}}],["variants",{"2":{"2":1,"104":1,"105":3,"109":1}}],["variables",{"2":{"21":1,"22":1,"24":2,"117":2}}],["variable",{"2":{"2":1,"21":2,"22":3,"24":6,"108":1}}],["var",{"2":{"8":4}}],["validation",{"2":{"22":1}}],["validate",{"2":{"17":1}}],["valid",{"2":{"2":2}}],["values",{"2":{"61":1,"115":1}}],["value",{"2":{"1":2,"8":1,"17":1,"21":1,"22":1,"24":4,"71":1,"94":1,"98":1,"114":1}}],["visual",{"2":{"24":1,"56":1}}],["visualization",{"2":{"22":1,"24":1,"25":1}}],["visualizer",{"2":{"16":4}}],["visuals",{"2":{"17":1}}],["visible",{"2":{"2":1,"17":1}}],["videos",{"2":{"33":3}}],["video",{"2":{"13":1,"33":1,"34":1}}],["view",{"2":{"12":3,"22":3,"24":2,"56":1,"69":1}}],["views",{"2":{"10":1,"12":1}}],["virtual",{"2":{"3":1,"9":1,"21":1,"33":1}}],["via",{"0":{"61":1},"1":{"62":1},"2":{"1":1,"2":3,"3":1,"5":1,"8":1,"9":1,"13":2,"17":1,"21":2,"22":1,"68":1,"78":1,"107":1,"117":1}}],["vitest",{"2":{"17":10,"23":1}}],["vitepress",{"2":{"8":1,"32":1,"33":1,"67":1}}],["vite",{"0":{"88":1},"2":{"1":1,"4":1,"13":1,"14":1,"16":13,"17":3,"34":3,"58":1,"64":1,"72":1,"78":2,"88":1}}],["effective",{"2":{"69":1}}],["effort",{"2":{"26":1}}],["efficiency",{"2":{"21":1}}],["efficiently",{"2":{"24":1,"26":1,"67":1,"69":1}}],["efficient",{"2":{"21":1,"24":1,"34":1,"64":2}}],["e2e2e3",{"2":{"117":2}}],["e2e",{"2":{"23":5}}],["empty",{"2":{"67":1}}],["email",{"2":{"59":1}}],["embla",{"2":{"20":1}}],["emmet",{"2":{"17":2}}],["eex",{"2":{"17":1}}],["eol",{"2":{"17":1}}],["education",{"2":{"113":1}}],["edited",{"2":{"113":1}}],["edit",{"2":{"55":1}}],["editorconfig",{"2":{"17":2}}],["editortab",{"2":{"17":1}}],["editorgroup",{"2":{"17":1}}],["editor",{"2":{"17":31}}],["edge",{"2":{"3":2}}],["element",{"2":{"24":1,"56":1,"68":1}}],["elements",{"2":{"2":1,"6":1,"21":4,"23":1,"24":1,"31":1,"34":2}}],["else",{"2":{"14":1,"17":1,"33":1}}],["e88a22df",{"2":{"13":1}}],["evolution",{"2":{"25":1}}],["evolving",{"2":{"24":1}}],["evan",{"2":{"24":1}}],["evaluate",{"2":{"12":1}}],["ever",{"2":{"11":1}}],["everyone",{"2":{"34":1}}],["everybody",{"2":{"22":1}}],["everything",{"2":{"17":1,"21":2,"24":1,"56":1,"63":1}}],["every",{"2":{"1":1}}],["events",{"2":{"22":1}}],["event",{"2":{"5":1,"17":1,"22":1}}],["even",{"2":{"2":1,"4":1,"15":1,"21":1,"22":2,"24":1,"25":1,"33":3,"96":1}}],["ecosystem",{"2":{"17":1,"21":1,"69":1}}],["economical",{"2":{"3":1}}],["echo",{"2":{"8":8}}],["established",{"2":{"67":1}}],["es6",{"2":{"21":1,"24":1}}],["esbenp",{"2":{"17":4}}],["esbuild",{"2":{"16":1}}],["eslint",{"2":{"16":3,"17":17,"33":1,"64":2}}],["esnext",{"2":{"16":1}}],["especially",{"2":{"5":1,"23":1,"69":1}}],["essence",{"2":{"2":1}}],["errors",{"2":{"17":1}}],["error",{"2":{"4":1,"8":1}}],["e",{"2":{"3":1,"11":1,"13":1,"22":1,"24":1,"34":1,"64":1}}],["etc",{"2":{"3":1,"10":1,"16":1,"23":1,"31":1,"34":1,"56":1,"66":2,"67":1,"69":4,"78":1,"117":1}}],["either",{"2":{"2":1,"13":1,"25":1}}],["enhance",{"2":{"116":1}}],["enough",{"2":{"34":1,"67":1}}],["english",{"2":{"33":1}}],["engines",{"2":{"34":1}}],["engine",{"2":{"21":1,"33":1,"34":1}}],["engineer",{"2":{"6":1,"59":1}}],["encapsulates",{"2":{"24":1}}],["encapsulated",{"2":{"24":1}}],["encoded",{"2":{"13":1}}],["entering",{"2":{"61":1}}],["enter",{"2":{"55":1}}],["enters",{"2":{"24":1}}],["entrance",{"2":{"34":1}}],["entry",{"2":{"24":1,"34":1}}],["entities",{"2":{"24":1}}],["entity",{"2":{"22":3}}],["entirely",{"2":{"116":1}}],["entire",{"2":{"15":1,"21":1,"22":1,"96":1}}],["en",{"2":{"17":3}}],["enablesmartcommit",{"2":{"17":1}}],["enable",{"2":{"17":4,"21":1,"69":2}}],["enabled",{"2":{"2":1,"17":9,"21":1,"63":1}}],["endpoint",{"2":{"3":2}}],["endpoints",{"2":{"3":2}}],["end",{"2":{"2":1,"3":5,"5":1,"6":1,"17":1,"23":4,"24":1,"26":1,"34":1,"69":1}}],["envrc",{"2":{"17":12}}],["envs",{"2":{"8":2}}],["environment",{"2":{"8":3,"17":1,"67":1}}],["environments",{"2":{"8":1,"9":1}}],["env",{"2":{"1":1,"8":26,"17":38,"72":1}}],["earlier",{"2":{"17":1}}],["eager",{"2":{"15":2}}],["easy",{"2":{"9":1,"12":1,"13":1,"33":1,"64":1}}],["easingthemes",{"2":{"8":2}}],["easier",{"2":{"8":1,"24":2,"25":1,"28":2,"34":1}}],["easiest",{"2":{"3":1,"33":1}}],["easily",{"2":{"1":1,"33":1,"71":1}}],["each",{"2":{"2":4,"8":3,"10":4,"16":2,"17":1,"22":3,"24":2,"34":1,"68":1,"69":1,"71":1,"114":1}}],["existing",{"2":{"33":1,"61":1}}],["exist",{"2":{"24":1}}],["exiting",{"2":{"8":1}}],["excellent",{"2":{"33":1}}],["exceptional",{"2":{"34":1}}],["except",{"2":{"22":1}}],["exclude",{"2":{"8":1,"17":1}}],["execution",{"2":{"21":1}}],["executes",{"2":{"34":1}}],["execute",{"2":{"8":1}}],["executed",{"2":{"3":1}}],["exs",{"2":{"17":5}}],["extreme",{"2":{"33":1}}],["extractor",{"2":{"17":11}}],["external",{"2":{"22":1}}],["extensibility",{"2":{"25":1}}],["extension",{"2":{"17":1,"24":1,"99":2}}],["extensions",{"0":{"99":1},"2":{"4":1,"17":6,"73":1,"99":1}}],["extend",{"2":{"16":1}}],["ex",{"2":{"17":1}}],["express",{"2":{"34":1}}],["experiment",{"2":{"33":1}}],["experimenting",{"2":{"24":1}}],["experience",{"2":{"5":1,"33":3,"34":1,"56":4,"59":1,"116":1}}],["experienced",{"2":{"5":1,"33":2,"58":2,"67":1,"69":1}}],["expediency",{"2":{"23":1}}],["expanding",{"2":{"105":1}}],["expand",{"2":{"17":1,"33":1}}],["expandmode",{"2":{"17":1}}],["explained",{"2":{"33":1}}],["explorer",{"2":{"17":6}}],["explicitly",{"2":{"64":1,"67":1}}],["explicit",{"2":{"1":1}}],["expires",{"2":{"2":2}}],["expired",{"2":{"2":1}}],["exports",{"2":{"15":1}}],["export",{"2":{"1":2,"12":1,"15":1,"16":1,"22":2,"72":2}}],["examples",{"2":{"33":1,"69":1}}],["example",{"2":{"1":2,"2":5,"3":5,"4":2,"6":2,"8":1,"10":3,"12":2,"15":2,"17":2,"22":4,"24":4,"27":1,"28":1,"31":1,"34":1,"98":1,"108":1}}],["hurry",{"2":{"27":1}}],["huskyrc",{"2":{"17":2}}],["huge",{"2":{"15":1}}],["hxx",{"2":{"17":3}}],["hpp",{"2":{"17":3}}],["hmr",{"2":{"16":1}}],["h",{"2":{"8":1,"17":4}}],["hotel",{"2":{"34":1}}],["home",{"2":{"34":1,"61":1,"113":1}}],["horizons",{"2":{"33":1}}],["hood",{"2":{"24":1,"33":1}}],["hooks",{"2":{"17":4}}],["holding",{"2":{"22":2}}],["hoppscotch",{"2":{"17":1}}],["houdini",{"2":{"17":1}}],["hover",{"2":{"17":1}}],["hosts",{"2":{"22":1}}],["hosted",{"2":{"9":1}}],["hosting",{"0":{"9":1},"2":{"9":3,"69":1}}],["host",{"2":{"4":1,"8":10,"9":2}}],["however",{"2":{"18":1,"22":2,"99":1}}],["how",{"2":{"2":1,"3":3,"5":1,"10":1,"12":1,"13":1,"15":1,"16":3,"17":1,"21":1,"22":3,"25":1,"33":3,"34":2,"37":1,"39":1}}],["html5",{"2":{"31":1,"51":1,"64":1}}],["htmlnanorc",{"2":{"17":20}}],["html=",{"2":{"14":1}}],["html",{"0":{"51":1,"78":1},"2":{"4":1,"8":2,"9":1,"13":2,"17":6,"24":3,"33":1,"34":10,"68":1,"78":2,"94":2,"115":2,"116":1}}],["https",{"2":{"4":6,"9":1,"17":2,"34":1,"63":1,"71":1,"72":1,"87":1,"94":1}}],["httponly",{"2":{"2":3}}],["http",{"2":{"1":11,"3":1,"4":3,"13":1,"71":5,"72":4}}],["hello",{"2":{"96":1}}],["helpful",{"0":{"19":1},"1":{"20":1,"21":1},"2":{"45":1}}],["helps",{"2":{"15":1,"33":1,"67":1}}],["help",{"2":{"4":1,"17":1,"25":1,"33":3}}],["heavy",{"2":{"34":1}}],["heavyweight",{"2":{"18":1,"21":1,"96":1}}],["heading",{"2":{"87":1}}],["headless",{"2":{"23":1,"25":1,"69":1}}],["header>",{"2":{"73":1,"93":2}}],["header",{"2":{"10":1,"31":1,"61":2,"69":2,"73":2,"90":1,"91":1,"92":1,"102":1,"105":1,"106":1,"108":1}}],["headers",{"0":{"89":1},"1":{"90":1,"91":1,"92":1,"93":1},"2":{"4":1,"72":1,"89":1,"93":1}}],["heidisql",{"2":{"17":1}}],["height",{"2":{"14":7}}],["heex",{"2":{"17":1}}],["hexcolorlength",{"2":{"17":1}}],["heroku",{"2":{"9":1,"105":1}}],["here",{"2":{"3":1,"5":1,"18":1,"22":3,"33":1,"97":1}}],["he",{"2":{"2":1,"22":1,"24":1}}],["half",{"2":{"97":1}}],["hack",{"2":{"79":1}}],["hamburger",{"2":{"73":1,"75":1,"106":1,"108":1}}],["harmful",{"2":{"33":1}}],["hardware",{"2":{"34":2}}],["hard",{"2":{"16":1}}],["happen",{"2":{"22":1}}],["happened",{"2":{"22":1}}],["had",{"2":{"21":1,"22":1}}],["handled",{"2":{"34":1}}],["handle",{"2":{"33":1,"34":1}}],["handles",{"2":{"24":1}}],["handling",{"2":{"26":1}}],["handy",{"0":{"18":1},"2":{"17":1,"32":1}}],["hand",{"2":{"17":1,"22":1,"67":2}}],["have",{"2":{"2":3,"3":1,"8":1,"11":1,"12":1,"13":1,"17":2,"21":3,"22":4,"24":2,"25":2,"26":2,"27":1,"33":1,"34":1,"67":1,"88":2,"116":1}}],["hash",{"2":{"13":1}}],["hassles",{"2":{"2":1}}],["has",{"2":{"2":7,"3":1,"5":1,"8":2,"10":1,"16":1,"21":3,"22":5,"24":3,"34":1,"87":1,"96":2,"99":1}}],["hide=",{"2":{"93":1}}],["hidden",{"2":{"1":1,"79":1,"106":1}}],["high",{"2":{"64":1}}],["highly",{"2":{"23":1}}],["highlightmodifiedtabs",{"2":{"17":1}}],["hierarchical",{"2":{"25":1}}],["hierarchize",{"2":{"24":1}}],["hierarchy",{"2":{"22":2}}],["hints",{"0":{"19":1},"1":{"20":1,"21":1},"2":{"45":1}}],["himself",{"2":{"22":1,"25":1,"67":1}}],["him",{"2":{"2":1,"6":1,"26":2}}],["historically",{"2":{"22":1}}],["history",{"2":{"17":5}}],["histoire",{"2":{"17":10}}],["his",{"2":{"2":2,"3":1,"17":1}}],["uri",{"2":{"72":1}}],["url",{"2":{"1":1,"13":2,"15":1,"72":1,"113":1,"115":2}}],["ux",{"2":{"34":2,"56":1,"64":1,"76":1,"102":1,"114":1}}],["uis",{"2":{"24":1}}],["ui",{"0":{"25":1,"28":1},"2":{"16":1,"18":2,"23":1,"24":2,"25":9,"26":2,"28":1,"30":1,"56":1,"64":1,"69":1,"73":1,"91":1,"92":1}}],["u",{"2":{"12":1}}],["utility",{"2":{"22":1,"73":1}}],["utilities",{"0":{"28":1},"2":{"10":2,"28":1}}],["utils",{"2":{"1":3,"10":1,"14":2,"71":3,"72":5,"73":2,"78":1,"98":1}}],["upper",{"2":{"68":1}}],["upgrading",{"2":{"34":1}}],["upgrade",{"2":{"25":1}}],["up",{"2":{"8":1,"16":1,"17":3,"21":1,"23":1,"25":3,"26":2,"33":1,"67":1,"72":1,"96":1}}],["updating",{"2":{"8":1,"24":1}}],["updates",{"2":{"24":1}}],["updated",{"2":{"23":1,"24":2}}],["update",{"2":{"8":3,"17":1}}],["upload",{"2":{"8":3,"33":1}}],["ubuntu",{"2":{"8":3,"61":1}}],["usability",{"2":{"56":1}}],["usage",{"0":{"98":1},"2":{"21":1}}],["usual",{"2":{"24":1}}],["usually",{"2":{"5":1,"12":1,"21":1,"22":2,"23":1,"24":1,"33":1,"34":1,"67":1,"96":1}}],["us",{"2":{"17":1}}],["using",{"2":{"3":2,"4":1,"5":1,"8":1,"9":1,"10":1,"13":1,"16":2,"22":3,"24":1,"25":1,"34":2,"55":1,"56":1,"69":1,"104":1}}],["usetouchswipe",{"2":{"76":1}}],["useappconfig",{"2":{"73":3}}],["useauthstore",{"2":{"22":1}}],["useauthservice",{"2":{"22":1}}],["useauth",{"2":{"1":4,"22":1}}],["uselessly",{"2":{"33":1}}],["useless",{"2":{"33":1,"99":1}}],["usenewswidget",{"2":{"24":1}}],["usei18nlight",{"0":{"97":1},"2":{"98":2}}],["usei18n",{"2":{"10":1,"24":1,"98":4}}],["usescreenwidth",{"2":{"68":6}}],["usescreensize",{"2":{"24":1}}],["useshoppingcart",{"2":{"24":1}}],["uses",{"2":{"8":11,"14":1,"16":1,"21":3,"24":1,"64":2,"73":2,"87":1}}],["usefulness",{"2":{"23":1}}],["useful",{"2":{"6":1,"8":1,"17":4,"22":1,"23":1,"26":1,"33":3,"34":2,"39":1,"63":1,"99":1,"105":1}}],["use",{"0":{"11":1,"28":1,"30":1,"31":1},"2":{"2":1,"3":1,"5":2,"10":3,"13":3,"16":2,"17":2,"21":3,"22":3,"23":1,"24":2,"25":2,"26":2,"28":2,"30":1,"32":1,"33":2,"34":4,"64":3,"69":1,"72":1,"73":1,"87":1,"98":1,"99":2,"114":1}}],["used",{"2":{"2":3,"4":3,"8":2,"10":1,"16":2,"21":2,"22":2,"24":3,"26":1,"33":1,"58":1,"64":3,"68":1,"72":1,"108":1,"114":1}}],["userloggedin",{"2":{"22":1}}],["useraccountview",{"2":{"12":1}}],["username",{"2":{"2":1,"8":2,"22":1}}],["user",{"2":{"1":2,"2":16,"8":8,"10":1,"11":2,"17":3,"21":1,"22":3,"23":1,"24":4,"26":1,"34":3,"56":4,"64":1,"69":1,"93":1,"106":1,"113":1,"116":1,"117":1}}],["userid",{"2":{"1":1}}],["users",{"2":{"1":7,"2":2,"26":1,"34":2}}],["userdata",{"2":{"1":1}}],["unwanted",{"2":{"67":1}}],["unnecessarily",{"2":{"64":1}}],["unnecessary",{"2":{"2":1,"5":1,"22":1}}],["unless",{"2":{"30":1,"64":1}}],["unlike",{"2":{"22":1}}],["unlighthouse",{"2":{"17":2}}],["unequivocally",{"2":{"24":1}}],["unfortunate",{"2":{"22":1}}],["unfortunately",{"2":{"17":1}}],["unoptimized",{"2":{"34":1}}],["unocss",{"2":{"17":10}}],["uno",{"2":{"17":10}}],["untrackedchanges",{"2":{"17":1}}],["unified",{"2":{"25":1}}],["unification",{"2":{"5":1}}],["unit",{"2":{"23":6}}],["unique",{"2":{"22":2}}],["unicodehighlight",{"2":{"17":1}}],["universal",{"2":{"13":2}}],["under",{"2":{"6":1,"24":1,"57":1,"87":5}}],["understanding",{"2":{"33":1}}],["understand",{"2":{"12":1,"22":1,"33":2,"34":1}}],["understandable",{"2":{"5":1}}],["understood",{"2":{"2":1}}],["undeservedly",{"2":{"2":1}}],["=+",{"2":{"17":1}}],["==",{"2":{"8":3}}],["=>",{"2":{"8":2,"14":2,"98":1}}],["=",{"2":{"1":5,"8":1,"12":3,"14":3,"15":6,"21":6,"22":1,"24":1,"68":1,"71":3,"72":2,"73":2,"94":1,"98":3}}],["fcp",{"2":{"34":1}}],["fnc",{"2":{"18":1,"21":1}}],["fly",{"2":{"34":1,"96":1}}],["flagship",{"2":{"24":1}}],["flake",{"2":{"17":2}}],["flow",{"2":{"21":1,"24":1,"53":1}}],["flowconfig",{"2":{"17":2}}],["fls",{"2":{"17":1}}],["flex",{"2":{"68":3}}],["flexbox",{"2":{"30":1,"31":1,"52":2}}],["flexible",{"2":{"22":1,"24":1}}],["flexibility",{"2":{"5":1,"22":1}}],["fledged",{"2":{"3":2,"64":1}}],["fdb",{"2":{"17":1}}],["feature",{"2":{"24":1}}],["features",{"0":{"31":1},"2":{"3":1,"21":1,"22":1,"34":2,"96":1}}],["fetish",{"2":{"23":1}}],["fetch",{"2":{"1":1,"8":1,"67":1,"71":1}}],["ferferga",{"2":{"22":1}}],["few",{"2":{"4":1,"18":1,"67":1,"69":1}}],["future",{"2":{"69":1}}],["further",{"2":{"66":1,"67":1,"69":1}}],["fundamental",{"2":{"24":1}}],["functional",{"2":{"22":1,"69":2}}],["functionality",{"2":{"21":2,"25":1,"26":1,"32":1,"61":1,"63":2,"64":4,"66":1,"67":1,"69":2,"76":1,"96":2,"97":1,"100":1,"105":1}}],["function",{"2":{"14":1,"15":3,"21":1,"22":3,"26":1,"27":2,"64":1,"68":2,"71":1,"76":1,"94":1,"96":1,"98":1}}],["functions",{"2":{"3":3,"10":1,"22":9,"24":2,"26":1}}],["fu",{"2":{"17":1,"64":1}}],["fullstack",{"2":{"5":1,"17":1}}],["fullstackers",{"2":{"5":1}}],["full",{"2":{"3":2,"22":1,"25":1,"59":1,"64":1}}],["frequently",{"2":{"58":2}}],["freezed",{"2":{"17":1}}],["free",{"2":{"3":3,"9":2,"33":3}}],["fragments",{"2":{"69":1,"78":1}}],["frantically",{"2":{"17":1}}],["frameworks",{"0":{"24":1},"2":{"24":3,"42":1,"67":1}}],["framework",{"2":{"4":1,"21":4,"22":1,"24":1,"64":1,"67":2,"96":1,"105":1}}],["friendly",{"2":{"16":1,"33":1}}],["front",{"2":{"2":6,"3":4,"5":1,"6":1,"17":1,"23":2,"24":1,"26":1,"69":1}}],["frontenders",{"0":{"3":1}}],["frontend",{"0":{"24":1,"26":1},"1":{"27":1,"28":1,"29":1,"30":1,"31":1,"32":1},"2":{"2":3,"3":3,"4":1,"5":2,"9":1,"17":1,"22":5,"23":2,"24":5,"26":3,"33":2,"34":1,"37":1,"39":1,"42":2,"58":1,"67":1}}],["from",{"0":{"63":1},"2":{"1":10,"2":1,"3":1,"4":7,"8":3,"9":1,"13":9,"14":3,"15":3,"16":3,"17":1,"21":1,"22":8,"23":2,"24":3,"26":1,"29":1,"33":7,"34":7,"56":1,"58":1,"68":1,"69":1,"71":2,"72":5,"73":3,"74":1,"87":1,"88":1,"96":1,"98":2,"106":1,"109":1}}],["fix",{"2":{"17":1,"26":1}}],["fixall",{"2":{"17":2}}],["field",{"2":{"15":2,"22":1,"24":2}}],["finance",{"2":{"96":1}}],["final",{"2":{"25":1,"26":1}}],["finished",{"2":{"33":1}}],["fine",{"2":{"17":1,"69":1}}],["finding",{"2":{"96":1}}],["find",{"2":{"15":1,"17":1,"34":1,"98":1}}],["fingerprint",{"2":{"2":1}}],["filling",{"2":{"66":1,"69":1}}],["fill",{"2":{"14":1}}],["filenesting",{"2":{"17":3}}],["filename",{"2":{"15":10}}],["filelistlayout",{"2":{"17":1}}],["file=",{"2":{"8":1}}],["files",{"2":{"8":3,"9":1,"13":1,"14":1,"16":2,"17":4,"34":2,"73":1,"98":1}}],["file",{"2":{"4":1,"8":9,"14":1,"17":3,"34":2,"61":2,"78":1,"113":1,"117":2}}],["fi",{"2":{"8":2}}],["firesbase",{"2":{"105":1}}],["firestore",{"2":{"33":1}}],["firebase",{"2":{"3":2,"9":2,"17":4,"105":1}}],["fira",{"2":{"17":1}}],["first",{"2":{"2":2,"15":1,"17":1,"22":2,"33":2,"34":4,"58":1,"93":1,"114":1}}],["fight",{"2":{"2":1}}],["follows",{"2":{"71":1}}],["follow",{"2":{"33":1}}],["following",{"2":{"26":1,"80":1,"102":1}}],["folder",{"2":{"8":1,"13":6}}],["found",{"2":{"22":1}}],["four",{"2":{"2":1,"68":1}}],["font",{"2":{"117":1}}],["fonts",{"2":{"114":1}}],["fontweight",{"2":{"17":1}}],["fontligatures",{"2":{"17":1}}],["fontfamily",{"2":{"17":1}}],["fontaliasing",{"2":{"17":1}}],["footers",{"0":{"80":1},"1":{"81":1,"82":1,"83":1,"84":1,"85":1},"2":{"80":1}}],["footer",{"2":{"10":1,"61":2,"69":2,"102":1,"105":1,"106":1}}],["fork",{"2":{"55":1}}],["forgotten",{"2":{"30":1}}],["forget",{"2":{"21":1}}],["foreign",{"2":{"22":1,"25":1}}],["forbidden",{"2":{"2":1}}],["forces",{"2":{"8":1}}],["force",{"2":{"2":1}}],["forms",{"2":{"34":1,"105":1}}],["formulate",{"2":{"17":10}}],["formkit",{"2":{"17":10}}],["formatters",{"2":{"21":2}}],["formatter",{"2":{"17":1}}],["formatting",{"2":{"17":2,"21":1,"34":1,"64":1}}],["formatonsave",{"2":{"17":1}}],["formats",{"2":{"15":1,"17":1}}],["format",{"2":{"3":1,"5":1,"8":3,"15":2,"17":2,"34":2,"61":1}}],["form",{"2":{"2":1,"3":2,"21":1,"22":1,"55":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":7,"13":2,"15":4,"16":5,"17":14,"18":2,"19":1,"20":1,"21":7,"22":13,"23":3,"24":8,"25":4,"26":2,"27":1,"28":3,"29":1,"30":1,"31":1,"32":1,"33":9,"34":16,"58":1,"61":1,"63":1,"64":4,"66":2,"67":6,"68":2,"69":2,"71":1,"72":2,"73":1,"75":2,"94":1,"96":3,"99":2,"102":6,"105":5,"108":1,"113":1,"114":3,"115":1,"117":1}}],["family",{"2":{"117":1}}],["familiarize",{"2":{"67":1,"69":1}}],["facebook",{"2":{"115":1}}],["facilitate",{"2":{"64":1}}],["fact",{"2":{"21":1,"22":1}}],["factor",{"2":{"24":1}}],["facto",{"2":{"5":1,"72":1}}],["fans",{"2":{"17":1}}],["fast",{"2":{"17":1,"25":1}}],["faster",{"2":{"16":2,"17":1,"24":1,"30":1}}],["fall",{"2":{"22":1,"24":1}}],["fallback",{"2":{"15":1}}],["false",{"2":{"1":1,"8":2,"17":27,"22":1,"61":4}}],["fairly",{"2":{"10":1,"33":1}}],["faq",{"2":{"8":1,"58":1}}],["favorite",{"2":{"1":1}}],["msg",{"2":{"98":1}}],["mjs",{"2":{"17":4}}],["mysql",{"2":{"17":1,"33":1}}],["my",{"2":{"16":1,"22":1,"61":3,"62":1,"66":1,"87":2,"88":1}}],["m",{"2":{"8":2}}],["mdsvex",{"2":{"17":1}}],["md",{"2":{"8":1,"17":3}}],["mkdir",{"2":{"8":2}}],["mvp",{"2":{"23":1}}],["mvc",{"2":{"22":1,"24":1}}],["mv",{"2":{"8":1}}],["multithreaded",{"2":{"24":1}}],["multicursormodifier",{"2":{"17":1}}],["multiple",{"2":{"16":1,"21":1,"26":1,"64":1}}],["much",{"2":{"8":1,"16":1,"17":2,"21":1,"22":1,"24":2,"25":4,"28":2,"33":1,"34":3}}],["must",{"2":{"2":1,"8":2,"13":1,"34":1,"113":1}}],["mit",{"2":{"57":1}}],["mitt",{"2":{"5":1}}],["mistake",{"2":{"26":1}}],["middle",{"2":{"26":1}}],["microservices",{"2":{"26":1}}],["microservice",{"2":{"24":1}}],["microsoft",{"2":{"3":1,"9":1,"17":1,"34":1}}],["micro",{"2":{"17":1}}],["mixins",{"2":{"21":4}}],["mix",{"2":{"17":3,"24":1}}],["minutes",{"2":{"33":1,"69":1}}],["mind",{"2":{"22":1}}],["minimalistic",{"2":{"67":1}}],["minimal",{"2":{"64":1}}],["minimum",{"2":{"63":1}}],["miniserver",{"2":{"17":1}}],["mini",{"2":{"17":2}}],["miniature",{"2":{"3":1}}],["minheight",{"2":{"14":1}}],["minwidth",{"2":{"14":1}}],["might",{"2":{"12":1,"17":1,"22":1,"25":1}}],["megabytes",{"2":{"97":1}}],["mention",{"2":{"34":1}}],["mentor",{"2":{"33":2}}],["menus",{"2":{"17":1}}],["menu",{"2":{"10":1,"12":2,"87":1,"102":1}}],["mess",{"2":{"23":1}}],["message",{"2":{"5":1,"55":1,"96":1}}],["messages",{"2":{"5":2}}],["mechanisms",{"2":{"22":1}}],["means",{"2":{"21":1,"25":1,"64":1,"67":1}}],["measures",{"2":{"2":1}}],["me",{"0":{"18":1}}],["metrics",{"2":{"34":2}}],["met",{"2":{"33":1}}],["methods",{"2":{"4":1,"21":1,"22":1,"33":1}}],["method",{"2":{"2":1,"16":1,"34":2,"61":2,"63":1,"72":1}}],["metaframwork",{"2":{"67":1}}],["metadata",{"2":{"17":1}}],["meta",{"2":{"1":1,"12":1,"14":1,"15":2,"61":1,"66":1,"72":1,"73":1,"102":1,"115":15}}],["moves",{"2":{"106":1}}],["moving",{"2":{"29":1}}],["mobile",{"2":{"34":1,"68":4,"75":1,"106":1,"108":1}}],["morgan",{"2":{"33":1}}],["more",{"2":{"2":1,"4":1,"5":2,"8":1,"10":1,"12":2,"13":1,"16":1,"17":4,"21":4,"22":3,"23":1,"24":6,"25":1,"26":1,"33":3,"34":4,"87":1,"113":1}}],["motivation",{"2":{"33":1}}],["moments",{"2":{"23":1,"33":1}}],["moment",{"2":{"18":1,"21":2,"34":1,"109":1}}],["mouse",{"2":{"17":1}}],["mocha",{"2":{"17":10}}],["monitor",{"2":{"17":2,"24":1}}],["monitoring",{"2":{"2":1}}],["money",{"2":{"17":1}}],["monospace",{"2":{"17":1}}],["mono",{"2":{"17":1}}],["modal",{"2":{"64":1}}],["modifiers",{"2":{"22":1}}],["mod",{"2":{"17":1}}],["modes",{"2":{"106":2,"108":2}}],["models",{"2":{"30":1}}],["model",{"2":{"22":3,"24":2,"25":1}}],["mode",{"2":{"17":3,"22":2,"23":1,"68":1,"113":1}}],["modern",{"0":{"31":1},"2":{"9":1,"15":1,"16":1,"17":1,"21":1,"33":1,"64":1,"69":1}}],["modular",{"2":{"10":1}}],["modules",{"2":{"10":1,"15":6,"16":1,"17":2,"22":2,"26":1,"29":1}}],["module",{"0":{"70":1},"1":{"71":1,"72":1},"2":{"1":2,"10":7,"17":1,"22":2,"24":1,"26":1,"66":2,"69":2,"72":1,"102":2,"105":1}}],["mostly",{"2":{"5":1,"67":1}}],["most",{"2":{"2":1,"3":2,"8":1,"10":2,"16":2,"17":1,"23":1,"24":2,"26":1,"33":2,"34":2,"58":1}}],["max",{"2":{"108":1,"117":1}}],["maximum",{"2":{"108":1}}],["margin",{"2":{"79":1}}],["markdownlint",{"2":{"17":2}}],["markdown",{"0":{"54":1},"2":{"17":1,"54":1}}],["magnitude",{"2":{"34":1}}],["magic",{"2":{"21":1}}],["mat",{"2":{"34":1}}],["matter",{"2":{"33":1}}],["match",{"2":{"8":1,"113":1}}],["machine",{"2":{"17":1}}],["macos",{"2":{"17":1}}],["made",{"2":{"17":1,"22":1,"24":1,"34":1,"67":1,"69":1}}],["mailmap",{"2":{"17":1}}],["mainly",{"2":{"22":1,"24":1}}],["mainlayout",{"0":{"106":1},"1":{"107":1},"2":{"12":2,"61":2,"108":1}}],["maintainability",{"2":{"25":1}}],["maintainers",{"2":{"17":1}}],["maintenanceview",{"2":{"12":1}}],["maintenance",{"2":{"12":2}}],["main",{"2":{"1":1,"2":1,"6":1,"8":6,"10":1,"17":1,"22":2,"23":2,"26":1,"32":1,"33":1,"58":1,"79":1,"98":1,"107":1}}],["may",{"2":{"16":1,"22":1,"24":1,"27":2,"33":1,"34":1,"58":1,"67":1}}],["makarov",{"2":{"59":2}}],["making",{"2":{"16":1,"34":1,"55":1}}],["makes",{"2":{"5":1,"8":1,"22":2,"24":2,"87":1}}],["make",{"2":{"1":1,"2":2,"3":2,"10":1,"12":1,"21":2,"22":1,"24":1,"26":1,"27":1,"28":3,"33":1,"34":1,"61":1,"66":1,"114":1}}],["map",{"2":{"15":2,"17":7}}],["mastery",{"2":{"33":1}}],["master",{"2":{"8":3,"17":1}}],["masked",{"2":{"14":1}}],["mask",{"2":{"4":2}}],["major",{"2":{"3":1}}],["mantinelayeredheader",{"0":{"92":1}}],["mantine",{"2":{"91":1,"92":1}}],["mantinerichfooter",{"0":{"84":1},"2":{"61":2}}],["mantinesimplefooter",{"0":{"83":1}}],["mantinesimpleheader",{"0":{"91":1},"2":{"61":2}}],["mantinesimplenavbar",{"0":{"111":1},"2":{"61":2}}],["manifest",{"0":{"113":1},"2":{"34":3,"61":1,"66":1,"102":1,"112":1,"113":2}}],["manipulating",{"2":{"2":1}}],["managing",{"2":{"22":2}}],["manageable",{"2":{"114":1}}],["managed",{"2":{"34":1}}],["manage",{"2":{"24":1}}],["management",{"0":{"22":1},"2":{"22":3}}],["manager",{"2":{"2":3,"8":1}}],["manual",{"2":{"17":1,"33":1}}],["manually",{"2":{"8":1,"17":1,"61":1}}],["many",{"2":{"2":1,"3":1,"9":1,"13":1,"15":1,"17":2,"24":1,"26":1,"33":1,"34":1,"67":1}}],["l",{"2":{"98":2}}],["luxury",{"2":{"34":1}}],["lumps",{"2":{"24":1}}],["lt",{"2":{"17":1}}],["ll",{"2":{"16":1,"33":1}}],["left",{"2":{"106":1}}],["least",{"2":{"17":1,"22":1,"26":1,"32":1,"33":2}}],["learning",{"0":{"33":1},"2":{"25":1,"33":3,"67":1}}],["learn",{"2":{"8":1,"26":1,"30":1,"33":1,"37":1,"39":1,"69":1}}],["lerna",{"2":{"17":2}}],["leex",{"2":{"17":1}}],["less",{"2":{"17":1,"34":1}}],["length",{"2":{"15":2}}],["let",{"2":{"15":1,"26":2,"30":1}}],["leverage",{"0":{"3":1},"2":{"69":1}}],["levels",{"2":{"2":1,"24":1}}],["level",{"2":{"2":2,"11":2,"21":1,"23":1,"26":1,"32":1,"33":3,"58":1,"67":1}}],["lying",{"2":{"6":1}}],["launching",{"0":{"62":1}}],["launch",{"2":{"47":1}}],["launched",{"2":{"23":1,"34":1}}],["lazy",{"2":{"34":1}}],["labor",{"2":{"34":2}}],["laptop",{"2":{"17":1}}],["later",{"2":{"27":1,"34":1,"64":1}}],["latexmk",{"2":{"17":1}}],["latest",{"2":{"8":2}}],["lang=",{"2":{"14":1,"68":1,"73":1,"98":1}}],["languages",{"2":{"11":1,"24":1,"26":2}}],["language",{"0":{"31":1},"2":{"3":2,"4":1,"5":1,"17":1,"21":2,"22":1,"33":1,"96":2}}],["layout",{"2":{"12":2,"25":3,"30":1,"61":2,"64":1,"66":1,"69":1,"102":2,"105":1,"106":1,"108":3,"117":1}}],["layouts",{"2":{"10":1,"12":2,"69":1}}],["layered",{"2":{"92":1}}],["layer",{"2":{"1":1,"25":1,"34":1,"61":1,"71":1,"102":1}}],["lastindexof",{"2":{"15":2}}],["last",{"2":{"8":1,"17":1}}],["lamda",{"2":{"3":1}}],["lambda",{"2":{"3":1}}],["large",{"2":{"3":1,"8":1,"21":2,"23":2,"24":4,"79":1,"96":1}}],["lof",{"2":{"17":1}}],["lock",{"2":{"17":13}}],["located",{"2":{"25":1,"78":2,"98":1,"108":1,"109":1,"116":1}}],["location",{"2":{"8":1}}],["locally",{"2":{"34":1}}],["locale",{"2":{"21":1,"98":3}}],["locales",{"2":{"21":1,"64":1,"96":1,"98":4}}],["localizing",{"2":{"21":1,"96":1}}],["localization",{"2":{"21":2,"96":2}}],["local",{"2":{"17":1,"22":2,"26":1}}],["localstoragename",{"2":{"8":3}}],["localstorage",{"2":{"2":2,"8":3,"117":1}}],["lot",{"2":{"16":1,"17":3,"21":1,"24":2,"33":2,"34":1,"96":1}}],["lose",{"2":{"22":1,"34":1}}],["loss",{"2":{"15":1}}],["losing",{"2":{"2":1}}],["loose",{"2":{"10":1}}],["loosely",{"2":{"10":1}}],["looks",{"2":{"22":1,"34":2}}],["look",{"2":{"1":1,"5":1,"15":1,"17":1,"18":1,"22":1,"33":1,"71":1}}],["loaded",{"2":{"34":1,"116":1}}],["loadicons",{"2":{"15":2}}],["loading",{"2":{"1":2,"8":1,"13":1}}],["load",{"2":{"3":1,"34":2}}],["lower",{"2":{"24":1}}],["low",{"2":{"2":1,"67":1}}],["longer",{"2":{"2":1,"17":1,"21":1,"22":1,"27":1}}],["log",{"2":{"8":1,"17":1,"21":1}}],["logically",{"2":{"29":1}}],["logical",{"2":{"10":1,"21":1,"22":1,"34":1}}],["logic",{"2":{"3":3,"22":11,"24":4,"25":2,"71":1}}],["login",{"2":{"2":6,"22":1,"23":1,"105":1}}],["logs",{"2":{"2":2,"8":1,"17":1}}],["logged",{"2":{"2":1,"22":1}}],["logout",{"2":{"1":1,"22":1}}],["light",{"2":{"117":1}}],["lightweight",{"2":{"64":1}}],["lighthouserc",{"2":{"17":20}}],["little",{"2":{"34":3}}],["lives",{"2":{"24":1}}],["lived",{"2":{"2":2}}],["license",{"2":{"17":1,"57":1}}],["limitations",{"2":{"25":1}}],["limit",{"2":{"17":3}}],["lib",{"2":{"17":1}}],["libraries",{"0":{"25":1,"28":1},"2":{"15":1,"16":1,"18":1,"19":1,"25":9,"30":1,"64":1,"67":2,"69":1,"104":1,"114":1}}],["library",{"0":{"18":1},"2":{"1":1,"10":1,"21":1,"22":6,"24":1,"25":2,"26":1,"27":2,"28":2,"64":2,"96":1}}],["lifehack",{"2":{"22":1}}],["life",{"2":{"8":1}}],["lifetime",{"2":{"2":4}}],["linux",{"2":{"17":1}}],["linting",{"2":{"23":1,"64":1}}],["linter",{"2":{"17":1}}],["lintstagedrc",{"2":{"17":2}}],["lint",{"2":{"17":4}}],["linenumbers",{"2":{"17":1}}],["lines",{"2":{"4":1,"27":1,"34":1,"97":1}}],["line",{"2":{"4":1,"16":1,"17":1,"33":1}}],["links",{"2":{"16":1}}],["link",{"0":{"0":1},"1":{"1":1},"2":{"88":1}}],["lists",{"2":{"96":1}}],["listeners",{"2":{"24":1}}],["list",{"2":{"4":2,"16":1,"17":1}}],["lies",{"2":{"3":1}}],["likely",{"2":{"22":1}}],["likelihood",{"2":{"10":1}}],["like",{"2":{"1":1,"4":1,"9":1,"11":1,"13":1,"16":2,"21":2,"22":5,"25":5,"26":1,"33":2,"34":5,"61":1,"67":1,"88":1,"114":1}}],["c2c2c4",{"2":{"117":1}}],["czrc",{"2":{"17":2}}],["cz",{"2":{"17":2}}],["cypress",{"2":{"17":10,"23":1}}],["cmakepresets",{"2":{"17":1}}],["cmake",{"2":{"17":3}}],["cmakelists",{"2":{"17":1}}],["cxx",{"2":{"17":1}}],["cjs",{"2":{"17":4}}],["cc",{"2":{"17":1}}],["c",{"2":{"17":1,"61":1,"117":9}}],["csproj",{"2":{"17":1}}],["cspell",{"2":{"17":2}}],["cshtml",{"2":{"17":2}}],["cs",{"2":{"17":12}}],["csshtml",{"2":{"79":1}}],["css3",{"0":{"30":1},"2":{"25":1,"30":1,"31":1,"64":1}}],["cssnano",{"2":{"17":10}}],["cssnanorc",{"2":{"17":10}}],["css",{"0":{"25":1,"52":1,"79":1},"2":{"9":1,"17":5,"18":1,"24":1,"25":9,"30":1,"33":1,"34":1,"64":1,"68":2,"69":1,"105":1,"108":1,"114":1,"116":1,"117":4}}],["ctrlcmd",{"2":{"17":1}}],["cpu",{"2":{"99":1}}],["cpp",{"2":{"17":1}}],["cp",{"2":{"8":1}}],["curve",{"2":{"25":1}}],["cursorstyle",{"2":{"17":1}}],["cursorsmoothcaretanimation",{"2":{"17":1}}],["cursorblinking",{"2":{"17":1}}],["currently",{"2":{"74":1,"80":1,"102":1}}],["currentcolor",{"2":{"14":2}}],["current",{"2":{"8":1,"21":1,"61":1}}],["customize",{"2":{"117":1}}],["customization",{"2":{"16":1,"17":3,"64":2,"66":1,"69":1,"105":1,"112":1}}],["customer",{"2":{"26":1,"30":1,"34":1}}],["custom",{"2":{"3":1,"9":1,"16":1,"17":2,"21":3,"25":2,"26":1,"88":2,"117":1}}],["cd",{"0":{"6":1},"2":{"6":5,"8":4,"23":1,"33":1,"42":1,"62":1,"63":1,"105":1}}],["citation",{"2":{"17":1}}],["circleci",{"2":{"17":2}}],["ci",{"0":{"6":1},"2":{"6":5,"8":1,"23":1,"33":1,"42":1,"105":1}}],["clone",{"2":{"63":1}}],["close",{"2":{"34":2}}],["closeonfiledelete",{"2":{"17":1}}],["cloud",{"2":{"3":4,"6":1,"9":2,"33":1}}],["clicked",{"2":{"108":1}}],["clicks",{"2":{"106":1}}],["click",{"2":{"87":1}}],["clicking",{"2":{"75":1}}],["click=",{"2":{"73":1,"98":1}}],["clippy",{"2":{"17":2}}],["clipboard",{"2":{"17":4}}],["cli",{"2":{"16":1,"17":2}}],["clients",{"2":{"4":1}}],["client",{"2":{"4":9,"5":2,"17":2,"34":2,"71":2,"114":2}}],["clamps",{"2":{"24":1}}],["clangd",{"2":{"17":1}}],["clang",{"2":{"17":2}}],["classes",{"2":{"22":2,"26":1,"53":1,"68":2,"69":1}}],["classpath",{"2":{"17":1}}],["class=",{"2":{"14":1,"68":4,"73":2}}],["class",{"2":{"13":1,"17":1,"22":1,"25":1,"26":1,"116":1}}],["clarity",{"2":{"5":1}}],["clear",{"2":{"12":1,"25":1,"67":1,"114":1}}],["cleared",{"2":{"2":1}}],["clean",{"2":{"8":1,"64":1,"97":1}}],["certified",{"2":{"59":2}}],["certification",{"2":{"33":2}}],["certifications",{"2":{"33":1}}],["certificate",{"2":{"9":3}}],["certificates",{"2":{"9":1}}],["certbot",{"2":{"9":1}}],["certain",{"2":{"2":2,"3":1,"21":1,"22":1,"26":1,"34":1,"64":1,"67":2,"69":1}}],["center",{"2":{"2":1}}],["crm",{"2":{"69":1}}],["crawler",{"2":{"34":1}}],["crowdin",{"2":{"17":2}}],["cross",{"2":{"4":2,"17":1}}],["credits",{"2":{"17":1}}],["credo",{"2":{"17":1}}],["creator",{"2":{"24":1}}],["creation",{"2":{"17":1,"23":1}}],["creating",{"0":{"101":1},"1":{"102":1,"103":1,"104":1,"105":1},"2":{"4":1,"12":1,"16":1,"17":1,"24":1,"34":1,"64":1,"67":2,"69":1}}],["create",{"0":{"16":1,"61":1},"1":{"62":1},"2":{"12":1,"13":1,"16":2,"22":1,"25":1,"26":1,"55":1,"57":1,"61":5,"66":1,"67":4,"69":2,"87":1,"117":1}}],["created",{"2":{"8":1,"34":2,"58":1,"114":1}}],["creates",{"2":{"2":1,"21":1,"71":1}}],["crud",{"2":{"3":1}}],["critical",{"2":{"2":1}}],["cryptography",{"2":{"2":1}}],["cheat",{"0":{"48":1},"1":{"49":1,"50":1,"51":1,"52":1,"53":1,"54":1},"2":{"49":1,"50":1,"51":1,"52":4}}],["checkout",{"2":{"8":4}}],["check",{"2":{"2":1,"8":1,"17":1,"23":1,"33":2,"34":1,"105":1}}],["checks",{"2":{"2":2,"17":1}}],["checking",{"2":{"2":1,"22":3}}],["chat",{"2":{"58":1}}],["chaff",{"2":{"33":1}}],["changing",{"2":{"24":1,"26":1,"69":1,"71":1,"96":1,"107":1}}],["changelocale",{"2":{"98":2}}],["changelog",{"0":{"35":1},"1":{"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1},"2":{"17":1}}],["changed",{"0":{"37":1,"39":1,"42":1,"45":1},"2":{"13":1,"24":1}}],["changes",{"2":{"6":1,"17":2,"21":2,"22":1,"24":3,"55":1}}],["change",{"2":{"1":1,"2":1,"21":3,"22":1,"24":3,"25":1,"26":1,"64":1,"105":1,"114":1}}],["chromium",{"2":{"21":1}}],["chrome",{"2":{"21":2,"34":1}}],["choosing",{"2":{"33":1}}],["choose",{"2":{"17":1,"69":1,"74":1,"109":1}}],["choice",{"2":{"8":2,"17":1,"66":1,"71":1}}],["children",{"2":{"12":2}}],["chgrp",{"2":{"8":2}}],["came",{"2":{"34":2}}],["calc",{"2":{"79":1}}],["calculations",{"2":{"24":1}}],["call",{"2":{"71":1}}],["calling",{"2":{"22":1}}],["called",{"2":{"3":1,"22":4,"87":1}}],["calls",{"2":{"1":1,"21":1,"71":2,"72":1,"96":1}}],["categories",{"2":{"26":1,"113":1}}],["category",{"2":{"22":1}}],["catch",{"2":{"21":1}}],["catalog",{"2":{"10":1}}],["caches",{"2":{"114":1}}],["cached",{"2":{"34":1}}],["cache",{"2":{"17":1,"105":1,"114":2}}],["caching",{"2":{"8":1,"22":1,"34":1,"114":2}}],["card",{"2":{"67":1,"115":1}}],["car",{"2":{"33":1}}],["carousel",{"0":{"20":1},"2":{"20":1}}],["cargo",{"2":{"17":2}}],["careful",{"2":{"23":1}}],["care",{"2":{"15":1,"24":1}}],["capabilities",{"2":{"16":1,"18":1,"21":1}}],["capture",{"2":{"2":1,"17":95}}],["cause",{"2":{"5":1}}],["cases",{"0":{"11":1},"2":{"2":1,"10":1,"12":2,"18":1,"21":1,"22":2,"34":2,"108":1}}],["case",{"2":{"2":4,"3":1,"8":2,"9":1,"10":1,"16":1,"21":1,"22":1,"23":1,"24":2,"32":1,"33":1,"61":1}}],["cannot",{"2":{"69":1}}],["can",{"2":{"1":1,"2":3,"3":4,"4":3,"5":2,"8":1,"9":3,"10":2,"11":2,"12":4,"13":4,"16":1,"17":4,"21":2,"22":10,"23":1,"24":8,"25":3,"26":3,"33":8,"34":8,"55":1,"61":1,"67":1,"68":2,"71":1,"75":1,"88":1,"93":1,"96":1,"108":1,"114":1,"116":1}}],["covers",{"2":{"58":1}}],["coincides",{"2":{"34":1}}],["cost",{"2":{"34":1}}],["copy",{"2":{"27":1}}],["copying",{"2":{"16":1,"17":1}}],["cop",{"2":{"24":1}}],["coolcosmos",{"2":{"22":1}}],["cooler",{"2":{"17":1}}],["cookie",{"2":{"2":4}}],["collect",{"2":{"69":1}}],["collects",{"2":{"16":1}}],["colleagues",{"2":{"33":1}}],["columnar",{"2":{"30":1}}],["column",{"2":{"25":1,"68":1}}],["colortheme",{"2":{"17":1}}],["color",{"2":{"14":3,"105":1}}],["could",{"2":{"17":1,"67":1}}],["couple",{"2":{"17":1,"21":1,"30":1,"96":1}}],["coupled",{"2":{"11":1}}],["coupling",{"2":{"10":1,"12":1}}],["counterpart",{"2":{"34":1}}],["counterparties",{"2":{"24":1}}],["count`",{"2":{"8":1}}],["count=5",{"2":{"8":1}}],["courses",{"2":{"33":2}}],["course",{"2":{"5":1,"26":1,"33":1,"34":1}}],["corporation",{"2":{"113":1}}],["corrections",{"2":{"55":1}}],["corresponding",{"2":{"8":1,"21":1,"64":1}}],["corridor",{"2":{"34":1}}],["cors",{"0":{"4":1},"2":{"4":8,"39":1}}],["combination",{"2":{"69":1}}],["combustion",{"2":{"33":1}}],["comfort",{"2":{"34":1}}],["comfortable",{"2":{"17":2,"22":1}}],["comfortably",{"2":{"10":1}}],["come",{"2":{"34":1,"58":1}}],["comes",{"2":{"26":1}}],["coming",{"2":{"26":1}}],["com",{"2":{"3":1,"4":9,"8":10,"9":5,"17":2,"59":1,"63":1,"71":1,"88":1,"94":1}}],["command",{"2":{"16":1,"61":1}}],["commands",{"2":{"8":1,"17":1}}],["communicate",{"2":{"12":1,"72":1}}],["communications",{"2":{"5":1}}],["communication",{"2":{"1":2,"5":2,"102":1}}],["commenting",{"2":{"56":1}}],["comments",{"2":{"2":1,"64":1}}],["commercial",{"2":{"8":1,"33":1}}],["commitlint",{"2":{"17":4}}],["commit",{"2":{"6":1}}],["common",{"2":{"2":2,"21":1,"24":1}}],["complicated",{"2":{"34":1}}],["completely",{"2":{"33":1}}],["completion",{"2":{"17":1}}],["complex",{"2":{"2":1,"5":1,"22":1,"24":1,"25":1,"34":1}}],["complexity",{"2":{"1":1,"24":2,"58":1}}],["competent",{"2":{"33":1,"56":1}}],["computations",{"2":{"26":1}}],["computer",{"2":{"16":1,"17":1,"34":1}}],["computed",{"2":{"14":3}}],["compile",{"2":{"17":1}}],["compileroptions",{"2":{"16":1}}],["companies",{"2":{"33":1}}],["company",{"2":{"2":1}}],["comparable",{"2":{"23":1}}],["compare",{"2":{"17":6}}],["compression",{"2":{"15":1}}],["compound",{"2":{"96":1}}],["composition",{"2":{"21":3,"22":1,"33":1,"42":1,"64":1}}],["composite",{"2":{"10":1,"22":1}}],["composable",{"2":{"21":1,"22":14,"24":2,"26":2,"64":1,"68":2,"76":1,"96":1}}],["composables",{"2":{"1":1,"10":1,"22":2,"68":1,"73":1,"98":2}}],["compose",{"2":{"17":1}}],["composer",{"2":{"17":2}}],["components",{"0":{"28":1},"2":{"1":1,"10":2,"11":3,"12":3,"16":1,"17":1,"18":1,"22":4,"24":4,"25":5,"26":2,"28":3,"29":1,"61":1,"63":1,"69":1,"73":1,"105":2,"117":1}}],["component",{"2":{"1":1,"11":2,"12":4,"13":1,"15":1,"17":7,"21":1,"22":18,"24":2,"25":3,"69":1,"73":2,"76":1,"98":1,"103":2,"117":1}}],["connoisseurs",{"2":{"17":1}}],["connected",{"2":{"10":1,"13":1}}],["connect",{"2":{"9":1,"10":1,"13":1,"22":1,"69":1}}],["connection",{"2":{"5":1,"17":2,"98":1}}],["conduct",{"2":{"17":1}}],["conditions",{"2":{"13":1}}],["confusing",{"2":{"22":1}}],["conflict",{"2":{"17":1}}],["conf",{"2":{"17":1}}],["confirmsync",{"2":{"17":1}}],["confirmdraganddrop",{"2":{"17":1}}],["confirmdelete",{"2":{"17":1}}],["configs",{"2":{"17":1}}],["config",{"0":{"88":1},"2":{"16":3,"17":226,"61":4,"64":1,"78":1,"88":1,"94":1}}],["configuring",{"0":{"17":1}}],["configure",{"2":{"16":2}}],["configured",{"2":{"4":1,"8":1}}],["configurations",{"2":{"17":1,"34":1}}],["configuration",{"2":{"8":1,"11":2,"17":1,"61":1,"68":1,"78":1,"102":1}}],["consume",{"2":{"99":1}}],["consultant",{"2":{"59":1}}],["cons",{"2":{"22":2,"25":2}}],["consists",{"2":{"73":1}}],["consist",{"2":{"22":1}}],["consistency",{"2":{"22":1}}],["considers",{"2":{"22":1}}],["consider",{"2":{"12":1,"26":1,"34":1}}],["considerations",{"0":{"12":1}}],["console",{"2":{"8":1,"21":3}}],["constraints",{"2":{"22":1}}],["construct",{"2":{"22":1}}],["constant",{"2":{"2":1}}],["constantly",{"2":{"2":1}}],["const",{"2":{"1":3,"12":2,"14":3,"15":5,"21":1,"22":1,"68":1,"71":2,"72":2,"73":1,"98":2}}],["contacts",{"2":{"55":1}}],["container",{"2":{"31":1,"68":2}}],["contain",{"2":{"4":1,"8":1,"25":1,"93":1}}],["contains",{"2":{"4":2,"22":1}}],["continue",{"2":{"30":1,"64":1}}],["continuous",{"2":{"6":2}}],["controversial",{"2":{"67":1}}],["controlled",{"2":{"76":1,"116":1,"117":1}}],["controller",{"2":{"17":1,"22":3,"24":2}}],["controls",{"2":{"21":1,"24":1}}],["control",{"2":{"2":1,"4":4,"24":1,"53":1}}],["contributions",{"2":{"57":1}}],["contributing",{"2":{"17":1}}],["contribute",{"0":{"55":1}}],["contributors",{"2":{"17":1}}],["content=",{"2":{"115":11}}],["content",{"2":{"34":5,"61":1,"66":1,"69":1,"72":1,"107":1}}],["contentlayer",{"2":{"17":10}}],["contents",{"2":{"8":1}}],["concepts",{"2":{"26":1}}],["concept",{"2":{"2":1,"24":1,"26":1}}],["convenience",{"2":{"1":1,"2":1,"56":2}}],["conveniently",{"2":{"67":1}}],["convenient",{"2":{"1":1,"5":2,"8":1,"9":1,"10":1,"12":1,"17":2,"21":1,"22":2,"25":3,"33":1,"66":1,"72":1}}],["codesandbox",{"2":{"17":1}}],["coder",{"2":{"17":1}}],["codeowners",{"2":{"17":1}}],["codecov",{"2":{"17":10}}],["codelens",{"2":{"17":4}}],["codeaction",{"2":{"17":1}}],["codeactions",{"2":{"17":1}}],["codeactionsonsave",{"2":{"17":2}}],["codeium",{"2":{"17":1}}],["code",{"0":{"78":1},"2":{"1":4,"3":2,"4":1,"5":1,"6":2,"8":2,"10":1,"17":11,"21":1,"22":1,"24":5,"25":3,"26":1,"27":1,"29":3,"33":4,"34":2,"56":1,"61":1,"64":1,"66":1,"67":1,"68":1,"69":2,"71":2,"72":1,"78":2,"87":1,"94":1,"98":4,"99":2,"102":1,"116":1}}],["ignite",{"2":{"116":1}}],["ignoredlocales",{"2":{"17":1}}],["ignore",{"2":{"17":2,"61":1}}],["ignoretrimwhitespace",{"2":{"17":1}}],["ignorerecommendations",{"2":{"17":1}}],["io",{"2":{"87":1}}],["illustration",{"2":{"64":1}}],["illogical",{"2":{"22":1}}],["irretrievably",{"2":{"18":1,"21":1}}],["ie6",{"2":{"25":1}}],["iex",{"2":{"17":1}}],["ie11",{"2":{"15":1}}],["ie",{"2":{"15":1}}],["iconify",{"2":{"15":1,"17":2}}],["icon",{"2":{"13":2,"14":1,"15":1,"34":1,"73":2,"75":1,"103":1,"106":1,"108":1}}],["icons",{"0":{"15":1},"2":{"13":3,"14":2,"15":2,"16":1,"113":1}}],["i18next",{"0":{"96":1,"99":1},"2":{"21":1,"96":1,"97":1,"99":3,"100":1}}],["i18n",{"0":{"95":1},"1":{"96":1,"97":1,"98":1,"99":1,"100":1},"2":{"11":1,"17":3,"21":3,"64":1,"66":1,"69":1,"96":2,"98":1,"99":1,"104":2}}],["imagine",{"2":{"22":1}}],["imageresources",{"2":{"15":3}}],["imageraw",{"2":{"13":1}}],["imagenameinvariable",{"2":{"13":1}}],["image",{"2":{"13":4,"115":4}}],["imageurl",{"2":{"13":1}}],["images",{"2":{"8":1,"13":10,"15":3,"34":2,"73":1,"114":1,"115":1}}],["imgurl",{"2":{"13":2}}],["img",{"2":{"13":6,"14":1}}],["immediately",{"2":{"13":1,"34":2}}],["impression",{"2":{"56":1}}],["improve",{"2":{"33":1,"34":1,"102":1,"114":1}}],["improvement",{"2":{"21":1}}],["improving",{"2":{"29":1}}],["implemented",{"2":{"68":1,"71":1,"76":1}}],["implements",{"2":{"64":1,"72":1,"117":1}}],["implementations",{"2":{"21":1}}],["implementation",{"0":{"77":1},"1":{"78":1,"79":1},"2":{"5":1,"21":2,"27":1,"32":1,"97":1,"99":1,"114":1}}],["implies",{"2":{"34":1}}],["impose",{"2":{"67":1}}],["impossible",{"2":{"22":1,"33":1}}],["important",{"2":{"23":1,"32":1}}],["importing",{"2":{"13":1}}],["imported",{"2":{"13":1}}],["import",{"2":{"1":7,"13":4,"14":4,"15":7,"16":3,"17":2,"22":2,"68":1,"71":1,"72":5,"73":3,"98":1}}],["id=g",{"2":{"94":1}}],["idx",{"2":{"17":1}}],["identifiers",{"2":{"73":1}}],["identifying",{"2":{"34":1}}],["ideally",{"2":{"22":1}}],["idea",{"2":{"22":1,"34":1}}],["ide",{"0":{"17":1},"2":{"17":1,"56":1}}],["id",{"2":{"8":2,"94":1}}],["i",{"2":{"5":1,"11":1,"13":1,"16":1,"17":2,"22":4,"23":1,"24":1,"26":2,"33":5,"62":1,"63":1}}],["ip",{"2":{"2":1}}],["iphones",{"2":{"2":1}}],["if=",{"2":{"14":1}}],["if",{"2":{"2":5,"3":1,"4":5,"8":5,"9":1,"10":1,"13":2,"15":1,"16":3,"17":1,"21":1,"22":5,"25":2,"27":2,"28":1,"33":4,"34":3,"64":1,"69":1,"87":1,"88":2,"99":1,"108":1}}],["inefficient",{"2":{"34":1}}],["inexpensive",{"2":{"9":1}}],["ingredient",{"2":{"23":1}}],["innovation",{"2":{"22":1}}],["inner",{"2":{"12":1}}],["involved",{"2":{"67":1}}],["invented",{"2":{"24":1,"34":1}}],["invents",{"2":{"22":1}}],["invisiblecharacters",{"2":{"17":1}}],["inheritance",{"2":{"21":1,"26":2}}],["inplace",{"2":{"17":1}}],["input",{"2":{"17":1,"24":1}}],["inputs",{"2":{"8":5}}],["inlinesuggest",{"2":{"17":1}}],["insertfinalnewline",{"2":{"17":1}}],["inside",{"2":{"11":1,"17":1,"21":2,"22":1,"102":1,"109":1}}],["instances",{"2":{"22":1}}],["installation",{"0":{"61":1,"63":1},"1":{"62":1},"2":{"34":1,"61":1}}],["installed",{"2":{"8":1,"34":1,"61":1,"63":1}}],["install",{"2":{"3":2,"8":11,"9":1,"17":1,"33":1,"61":1,"113":1}}],["instructions",{"2":{"8":1}}],["instead",{"2":{"4":1,"16":1,"21":1,"22":1,"34":1,"72":2,"116":1}}],["injection",{"2":{"78":2}}],["injections",{"0":{"78":1},"2":{"78":2}}],["injecting",{"2":{"12":1}}],["injected",{"2":{"69":1}}],["inject",{"2":{"10":1,"11":3,"12":2,"22":2}}],["inc",{"2":{"113":1}}],["include",{"2":{"64":1,"105":1}}],["includes",{"2":{"56":1,"64":1}}],["including",{"2":{"16":1,"17":1,"21":1,"25":1,"69":1,"105":1}}],["increasing",{"2":{"26":1}}],["increase",{"2":{"26":1,"58":1}}],["increased",{"2":{"13":1}}],["increases",{"2":{"10":1,"13":1,"27":1,"34":1}}],["inch",{"2":{"17":1}}],["inconvenient",{"2":{"13":1}}],["incoming",{"2":{"5":1}}],["indirect",{"2":{"22":1}}],["individually",{"2":{"2":1}}],["ind",{"2":{"17":1}}],["indent",{"2":{"17":1}}],["independent",{"2":{"22":1,"59":1}}],["independently",{"2":{"10":1}}],["independence",{"2":{"10":1}}],["indexed",{"2":{"34":1}}],["indexing",{"2":{"34":1}}],["index",{"0":{"78":1},"2":{"8":2,"34":3,"78":1,"94":1,"115":1,"116":1}}],["info",{"2":{"4":3}}],["informational",{"2":{"8":1}}],["information",{"2":{"2":2,"8":1,"11":1,"16":1,"33":1,"58":3,"113":1}}],["initi18n",{"2":{"98":2}}],["initialized",{"2":{"73":1}}],["initialization",{"2":{"72":1,"94":1,"98":1}}],["initializing",{"0":{"62":1}}],["initial",{"2":{"47":1}}],["initially",{"2":{"10":1}}],["initiating",{"2":{"4":1}}],["init",{"2":{"1":1,"8":2,"72":1}}],["introduction",{"0":{"58":1},"1":{"59":1}}],["introduce",{"2":{"27":1}}],["introduced",{"2":{"21":2,"22":1,"24":2}}],["intl",{"2":{"18":1,"21":1}}],["intensive",{"2":{"34":1}}],["intended",{"2":{"33":1}}],["integrate",{"2":{"69":2}}],["integrated",{"2":{"17":5,"112":1}}],["integrating",{"2":{"64":1}}],["integration",{"2":{"6":1,"22":1,"23":1,"64":1,"102":1,"105":1}}],["interaction",{"2":{"26":1}}],["interactivity",{"2":{"24":1}}],["intermediate",{"2":{"24":1,"33":1}}],["intermediary",{"2":{"4":1}}],["intersection",{"2":{"21":1}}],["interval",{"2":{"17":1}}],["internal",{"2":{"24":1,"33":1}}],["internally",{"2":{"13":1}}],["internationalization",{"2":{"11":1,"21":3,"96":2,"104":1}}],["internet",{"2":{"3":3,"4":3,"33":3}}],["interesting",{"2":{"8":1,"22":1,"58":1}}],["interfaces",{"2":{"53":1}}],["interface",{"2":{"3":1,"23":1,"56":1}}],["interceptors",{"2":{"1":1,"71":2,"72":1}}],["into",{"2":{"1":3,"2":1,"6":1,"10":3,"11":2,"13":1,"16":1,"24":2,"25":2,"34":2,"78":1,"112":1}}],["in",{"0":{"22":1,"78":1,"88":1,"104":1},"2":{"1":3,"2":19,"3":13,"4":3,"5":2,"6":2,"8":7,"9":1,"10":4,"11":2,"12":2,"13":11,"15":4,"16":9,"17":14,"18":2,"21":18,"22":32,"23":6,"24":15,"25":4,"26":5,"27":3,"33":9,"34":22,"56":1,"58":2,"59":1,"61":3,"62":1,"64":6,"67":2,"68":3,"69":1,"71":2,"72":1,"73":1,"78":1,"79":1,"87":2,"88":1,"91":1,"92":1,"96":2,"97":1,"98":3,"99":3,"102":1,"106":3,"108":4,"113":1,"114":2,"116":2,"117":3}}],["isdraweropen",{"2":{"73":3}}],["isn",{"2":{"22":2}}],["isauthenticated",{"2":{"22":1}}],["ist",{"2":{"17":1}}],["issues",{"2":{"105":1}}],["issuenumberlabel",{"2":{"17":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":5,"13":4,"15":3,"16":8,"17":13,"18":2,"20":1,"21":10,"22":35,"23":5,"24":13,"25":5,"26":5,"27":2,"29":1,"30":1,"32":1,"33":15,"34":21,"55":1,"58":1,"61":1,"63":1,"64":5,"67":3,"68":1,"69":1,"71":2,"72":3,"75":1,"76":2,"78":1,"79":1,"88":1,"96":1,"97":1,"99":3,"100":2,"106":1,"107":1,"108":3,"109":2,"114":2,"116":3,"117":4}}],["itself",{"2":{"8":1,"21":2,"22":1,"23":1,"29":1,"34":1,"67":1}}],["its",{"2":{"2":3,"3":2,"4":1,"8":3,"10":1,"13":1,"16":2,"17":1,"21":1,"22":2,"24":3,"25":1,"27":1,"32":1,"33":1,"34":8,"56":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":2,"15":1,"16":4,"17":11,"21":6,"22":19,"23":1,"24":11,"25":3,"26":7,"27":5,"28":1,"30":3,"33":11,"34":17,"61":4,"63":1,"64":2,"66":1,"67":5,"69":2,"75":1,"78":1,"96":3,"99":2,"109":1,"113":2,"116":1,"117":1}}],["twitter",{"2":{"59":1,"115":8}}],["twenty",{"2":{"33":1}}],["two",{"2":{"2":2,"10":1,"12":1,"26":1,"33":3,"34":3,"74":1,"93":1,"109":1}}],["tune",{"2":{"69":1}}],["tutorial",{"2":{"33":3}}],["turn",{"2":{"22":1}}],["turned",{"2":{"17":1}}],["turbo",{"2":{"17":2}}],["txt",{"2":{"17":1}}],["tmp",{"2":{"17":1}}],["tsup",{"2":{"17":2}}],["tslint",{"2":{"17":2}}],["tsdoc",{"2":{"17":11}}],["tsdk",{"2":{"17":1}}],["tsx",{"2":{"17":3}}],["ts",{"2":{"17":33,"22":1,"68":1,"71":1,"72":1,"73":3,"78":1,"88":1,"98":2}}],["tsconfig",{"2":{"16":2,"17":11}}],["tsc",{"2":{"16":1}}],["title",{"2":{"33":1,"115":4}}],["titlebarstyle",{"2":{"17":1}}],["tied",{"2":{"30":1}}],["tips",{"2":{"26":1,"39":1}}],["tip",{"2":{"21":1,"24":1,"33":1,"72":1}}],["tidy",{"2":{"17":1}}],["tight",{"2":{"12":1}}],["tightly",{"2":{"11":1,"24":1}}],["times",{"2":{"16":2,"22":2,"34":1}}],["timestamp",{"2":{"8":1}}],["time",{"0":{"21":1},"2":{"2":2,"5":1,"8":1,"10":1,"17":1,"21":2,"22":1,"23":6,"26":1,"27":1,"29":2,"33":2,"67":1,"96":1}}],["tapping",{"2":{"75":1}}],["tablet",{"2":{"68":4,"75":1,"106":1,"108":1}}],["tabs",{"2":{"17":1}}],["tabsize",{"2":{"17":1}}],["tags",{"2":{"61":1,"66":1,"102":1,"115":4}}],["tag",{"2":{"25":1,"94":2,"116":1}}],["taking",{"2":{"24":1,"33":1}}],["taken",{"2":{"24":1}}],["takes",{"2":{"22":1}}],["take",{"2":{"5":1,"17":1,"21":1,"23":2,"34":1,"67":1,"96":1}}],["task",{"2":{"17":1,"24":1,"69":1}}],["tasks",{"2":{"17":2,"67":3}}],["tazerc",{"2":{"17":2}}],["tailwind",{"2":{"17":10,"25":2,"30":1}}],["tail",{"2":{"8":1}}],["target",{"2":{"8":15,"16":1}}],["type=",{"2":{"98":1}}],["typedoc",{"2":{"17":2}}],["types",{"2":{"16":1,"22":2,"23":1,"53":1,"74":1,"80":1,"114":1}}],["typescript",{"0":{"53":1},"2":{"5":1,"12":1,"16":3,"17":6,"22":2,"53":4,"64":1}}],["type",{"2":{"8":1,"12":1,"14":7,"22":1,"25":1,"72":1,"115":1}}],["typicode",{"2":{"3":1,"71":1}}],["t",{"2":{"3":1,"8":1,"12":1,"13":1,"16":3,"17":2,"22":2,"24":3,"26":1,"27":3,"28":1,"34":2,"64":1,"88":1,"96":2,"98":2,"99":1}}],["telegram",{"2":{"58":1}}],["tells",{"2":{"61":1}}],["tell",{"0":{"18":1}}],["team",{"2":{"34":1}}],["teams",{"2":{"24":1}}],["teaches",{"2":{"33":2}}],["teacher",{"2":{"33":1}}],["techniques",{"2":{"69":1}}],["technical",{"2":{"32":1}}],["technologies",{"2":{"16":1,"21":1,"33":1,"67":2}}],["technology",{"2":{"6":1}}],["terserrc",{"2":{"17":10}}],["terminal",{"2":{"17":5}}],["terms",{"2":{"3":1,"21":1,"25":1,"34":1}}],["tex",{"2":{"17":1}}],["textbooks",{"2":{"33":1}}],["textbook",{"2":{"33":1}}],["textlint",{"2":{"17":2}}],["text",{"2":{"11":1,"34":4,"96":1,"117":6}}],["temporarily",{"2":{"21":1}}],["temporary",{"2":{"4":1}}],["templates",{"2":{"34":1,"67":1,"105":1}}],["template>",{"2":{"12":6,"14":2,"25":2,"73":2,"93":2,"98":2}}],["template",{"2":{"10":1,"13":1,"24":1,"25":1,"64":1,"66":2,"69":1,"93":3,"102":2}}],["testnet",{"2":{"72":1}}],["testjsonrpc",{"2":{"72":1}}],["testrest",{"2":{"71":2}}],["tests",{"2":{"22":1,"23":11,"34":1}}],["testing",{"0":{"23":1},"2":{"3":1,"6":1,"23":6,"63":1,"105":1}}],["test",{"2":{"3":1,"8":1,"17":1,"23":1,"69":1,"98":1}}],["tricks",{"0":{"79":1}}],["tries",{"2":{"17":1}}],["triggerexpansionontab",{"2":{"17":1}}],["training",{"2":{"33":2}}],["traffic",{"2":{"33":1}}],["tragedy",{"2":{"25":1}}],["tracking",{"2":{"21":1}}],["tracks",{"2":{"21":1}}],["track",{"2":{"21":3,"24":1}}],["travis",{"2":{"17":2}}],["transactions",{"2":{"96":1}}],["transmission",{"2":{"33":1}}],["transform",{"2":{"24":1}}],["transformer",{"2":{"17":1}}],["transfer",{"2":{"8":1,"17":1}}],["translation",{"2":{"11":1,"96":2}}],["translate",{"2":{"5":1}}],["transition",{"2":{"6":1}}],["transpile",{"2":{"16":1}}],["transparently",{"2":{"10":1}}],["transparent",{"2":{"2":1,"8":1,"12":1,"15":1}}],["transport",{"2":{"1":1,"5":1,"33":1,"71":3}}],["trend",{"2":{"25":1}}],["tree",{"2":{"15":1,"17":3,"22":3,"27":1}}],["trevis",{"2":{"6":1}}],["trying",{"2":{"26":1}}],["try",{"2":{"15":2,"17":1,"26":1,"30":1,"33":3}}],["trusted",{"2":{"4":2}}],["true",{"2":{"1":1,"8":1,"12":1,"15":2,"17":61,"61":4}}],["those",{"2":{"69":1}}],["thorough",{"2":{"22":1}}],["than",{"2":{"16":2,"21":1,"22":3,"24":1,"25":1,"30":1,"34":2,"100":1}}],["that",{"2":{"2":5,"3":3,"4":4,"9":1,"10":3,"11":5,"12":1,"13":1,"16":1,"17":1,"21":2,"22":20,"23":3,"24":5,"25":3,"26":1,"33":7,"34":6,"58":1,"64":4,"67":4,"68":1,"69":1,"71":1,"88":1,"96":1}}],["threshold",{"2":{"24":1,"93":2}}],["thread",{"2":{"24":1}}],["three",{"2":{"8":2,"114":1}}],["throw",{"2":{"8":1}}],["throughout",{"2":{"10":1,"22":1}}],["through",{"2":{"2":1,"11":1,"12":1,"16":1,"25":1,"33":1,"64":1}}],["thus",{"2":{"3":1}}],["think",{"2":{"22":1,"26":1}}],["thinner",{"2":{"21":1}}],["thing",{"2":{"5":1,"25":1}}],["things",{"2":{"3":1,"17":1,"21":2,"26":1,"34":1,"96":2}}],["third",{"0":{"28":1},"2":{"2":1,"4":5,"5":1,"22":1,"27":1,"34":1,"64":2,"114":1}}],["this",{"0":{"55":1},"2":{"1":1,"2":4,"3":1,"4":1,"8":4,"9":2,"10":2,"12":1,"13":2,"16":2,"17":5,"18":1,"21":3,"22":11,"23":3,"24":13,"25":2,"26":4,"28":1,"29":1,"32":1,"33":6,"34":7,"56":1,"58":1,"61":3,"63":1,"69":1,"88":1,"96":1,"114":2}}],["theoretical",{"2":{"26":1}}],["themetoggle",{"2":{"117":1}}],["themes",{"0":{"117":1},"2":{"11":1,"26":1,"66":1,"69":2,"105":2,"117":4}}],["theme",{"2":{"11":1,"103":2,"117":2}}],["themselves",{"2":{"9":1,"24":1,"67":1,"69":1,"78":1}}],["them",{"2":{"8":1,"11":4,"12":4,"13":3,"16":1,"17":2,"21":1,"22":4,"23":1,"25":1,"26":1,"28":3,"29":1,"33":1,"34":1,"64":1,"99":1}}],["these",{"2":{"3":2,"4":1,"21":1,"22":1,"23":1,"34":1}}],["theft",{"2":{"2":1}}],["they",{"2":{"2":1,"8":1,"13":4,"16":1,"21":1,"22":2,"24":2,"25":1,"29":1,"33":1,"34":1}}],["their",{"2":{"2":1,"3":3,"13":1,"16":1,"18":1,"22":1,"23":1,"24":1,"25":1,"33":1,"34":1,"69":1,"73":1}}],["therefore",{"2":{"25":1}}],["there",{"2":{"2":3,"3":4,"8":2,"10":2,"12":1,"13":1,"15":1,"17":3,"18":3,"22":6,"23":2,"24":2,"25":1,"26":1,"27":1,"33":4,"34":2,"67":2,"74":1,"78":1,"99":1,"100":1}}],["then",{"2":{"1":1,"2":2,"3":1,"8":4,"15":1,"16":1,"22":3,"34":6}}],["the",{"0":{"17":1,"32":1,"55":1,"59":1,"63":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":8,"13":22,"14":1,"15":5,"16":9,"17":16,"18":2,"20":1,"21":35,"22":50,"23":17,"24":41,"25":20,"26":14,"27":3,"28":2,"29":2,"30":1,"32":2,"33":28,"34":55,"55":2,"56":6,"57":1,"58":9,"61":9,"64":12,"67":7,"68":2,"69":12,"71":9,"72":6,"73":4,"75":1,"78":3,"79":2,"80":1,"87":10,"88":3,"93":3,"94":1,"96":10,"97":1,"99":2,"100":2,"102":5,"103":1,"104":1,"105":3,"106":3,"107":2,"108":7,"109":3,"112":1,"113":2,"114":5,"116":7,"117":6}}],["touch",{"2":{"76":2}}],["touchslideoutdrawer",{"0":{"76":1},"2":{"76":1}}],["touched",{"2":{"58":1}}],["toggle",{"2":{"73":1,"103":1}}],["together",{"2":{"24":1,"27":1}}],["todos",{"2":{"71":1}}],["toaster",{"2":{"64":1}}],["top",{"2":{"58":1,"102":1}}],["topics",{"2":{"58":1}}],["topic",{"2":{"23":1}}],["too",{"2":{"33":1,"34":1}}],["took",{"2":{"26":1}}],["toolchain",{"2":{"17":1}}],["tool",{"2":{"16":1,"17":3,"32":1,"67":1}}],["tools",{"2":{"6":1,"21":1,"23":1,"34":1,"67":1}}],["toml",{"2":{"17":10}}],["toc",{"2":{"17":1}}],["tokens",{"2":{"2":2,"11":1,"105":1}}],["token",{"2":{"1":1,"2":15,"56":4}}],["to",{"0":{"3":1,"5":2,"55":1,"86":2},"1":{"87":2,"88":2},"2":{"1":7,"2":33,"3":15,"4":11,"5":8,"6":1,"8":30,"9":8,"10":9,"11":4,"12":5,"13":8,"14":1,"15":3,"16":12,"17":12,"21":6,"22":26,"23":5,"24":19,"25":7,"26":17,"27":3,"28":2,"29":2,"30":5,"33":21,"34":26,"37":1,"39":1,"55":1,"61":2,"64":4,"67":8,"69":11,"71":3,"72":2,"73":2,"74":1,"76":1,"78":1,"79":1,"87":3,"88":1,"99":2,"102":3,"103":1,"105":3,"108":1,"109":1,"113":2,"114":1,"116":1,"117":2}}],["aesthetics",{"2":{"56":1}}],["afraid",{"2":{"33":1}}],["affects",{"2":{"27":1}}],["after",{"2":{"5":1,"6":1,"8":3,"9":1,"34":2,"93":1,"100":1,"116":1}}],["agnostic",{"2":{"71":1}}],["ago",{"2":{"21":1}}],["against",{"2":{"8":1,"97":1}}],["again",{"2":{"5":1,"33":1}}],["azure",{"2":{"17":2}}],["air",{"2":{"17":1}}],["ava",{"2":{"17":10}}],["available",{"0":{"102":1,"103":1},"2":{"13":1,"15":1,"22":2,"34":1,"63":1,"69":1,"80":1,"87":1,"102":1}}],["avoids",{"2":{"24":1}}],["avoided",{"2":{"21":1}}],["avoid",{"0":{"27":1},"2":{"12":1,"78":1,"105":1}}],["aux",{"2":{"17":1}}],["audio",{"2":{"13":1}}],["autocompleterefs",{"2":{"17":1}}],["autodetection",{"2":{"17":1}}],["autodetectcolorscheme",{"2":{"17":1}}],["autofetch",{"2":{"17":1}}],["autoupdate",{"2":{"17":1}}],["auto",{"2":{"8":1,"14":1,"17":1,"113":1}}],["automatically",{"2":{"8":1,"24":1,"87":1}}],["automation",{"2":{"8":1,"33":1,"87":1}}],["automating",{"2":{"6":1}}],["automate",{"2":{"8":1}}],["author",{"0":{"59":1},"2":{"58":1}}],["authors",{"2":{"17":3}}],["authorization",{"0":{"2":1},"2":{"2":6}}],["authentication",{"0":{"2":1},"2":{"2":7,"3":1,"11":3,"22":1,"56":2,"105":1}}],["authinterceptor",{"2":{"1":2}}],["auth",{"2":{"1":3,"66":1,"69":1,"105":2}}],["away",{"2":{"112":1}}],["await",{"2":{"1":2,"71":1}}],["aws",{"2":{"3":1,"59":1}}],["abbreviations",{"0":{"56":1}}],["above",{"2":{"34":1,"88":1,"97":1}}],["about",{"0":{"24":1,"59":1},"2":{"15":1,"21":1,"22":2,"33":1,"34":1,"42":1,"113":1}}],["able",{"2":{"8":1,"24":1,"30":1,"69":1}}],["ability",{"2":{"3":4,"9":1,"33":1,"69":3,"103":1,"105":1}}],["absolutely",{"2":{"33":2}}],["absolute",{"2":{"3":1}}],["abstracting",{"2":{"1":1}}],["abstraction",{"0":{"0":1},"1":{"1":1},"2":{"71":1,"102":1}}],["among",{"2":{"23":1}}],["amount",{"2":{"2":1,"26":1}}],["ambiguous",{"2":{"22":1}}],["amazon",{"2":{"3":2,"9":2}}],["along",{"2":{"23":1,"34":1}}],["alg",{"2":{"17":1}}],["alias",{"2":{"16":5}}],["always",{"2":{"11":1,"13":1,"22":2,"27":1,"75":1}}],["alternative",{"2":{"3":1}}],["already",{"2":{"3":1,"8":1,"23":1,"24":1,"26":1,"33":1}}],["also",{"2":{"2":3,"3":2,"6":1,"8":1,"9":2,"12":1,"16":3,"17":1,"22":4,"23":1,"24":4,"25":2,"28":1,"33":4,"34":2,"55":1,"61":1,"71":1,"78":1,"108":1}}],["ally",{"2":{"17":3,"99":2}}],["allowcompoundwords",{"2":{"17":1}}],["allowing",{"2":{"6":1}}],["allowed",{"2":{"4":1,"34":1}}],["allows",{"2":{"4":4,"10":2,"17":2,"22":1,"24":1,"26":1,"34":2,"71":1,"73":1,"113":1,"114":1}}],["allow",{"2":{"2":2,"4":4,"9":1,"16":1,"67":1}}],["all",{"2":{"1":1,"2":1,"4":4,"17":1,"22":3,"24":6,"25":1,"26":2,"33":2,"34":4,"63":1,"73":1,"89":1,"103":1,"108":2,"114":1,"116":1,"117":1}}],["attribute",{"2":{"73":1}}],["attributes",{"2":{"25":1}}],["attempt",{"2":{"5":1}}],["at",{"2":{"2":10,"4":1,"5":2,"8":1,"10":1,"11":2,"17":3,"21":2,"22":2,"23":4,"24":1,"26":2,"32":1,"33":5,"34":3,"56":1,"67":1,"71":1,"87":1,"96":1,"109":1}}],["aside",{"2":{"31":1}}],["aspect",{"2":{"23":1,"24":1}}],["aspx",{"2":{"17":1}}],["astro",{"2":{"17":1,"67":1}}],["ashx",{"2":{"17":1}}],["ascx",{"2":{"17":1}}],["asax",{"2":{"17":1}}],["associated",{"2":{"22":1}}],["assets",{"2":{"10":1,"13":5,"15":2,"73":1,"114":1}}],["assigned",{"2":{"2":1}}],["asked",{"2":{"58":1}}],["ask",{"2":{"2":1}}],["as",{"0":{"100":1},"2":{"2":5,"3":1,"4":2,"5":1,"10":3,"11":2,"13":4,"15":3,"16":1,"17":4,"21":2,"22":5,"23":1,"24":2,"25":5,"32":1,"33":2,"34":10,"58":1,"64":3,"67":4,"69":5,"71":1,"73":1,"88":1,"99":1}}],["asynchronous",{"2":{"71":1}}],["async",{"2":{"1":1,"71":1,"72":1,"94":1}}],["arguments",{"2":{"94":1}}],["architect",{"2":{"59":1}}],["architecture",{"0":{"26":1},"1":{"27":1,"28":1,"29":1,"30":1,"31":1,"32":1},"2":{"10":2,"26":2,"56":1,"69":1}}],["architecturally",{"2":{"22":1}}],["architectural",{"0":{"10":1},"1":{"11":1,"12":1},"2":{"21":1}}],["arrays",{"2":{"96":1}}],["array",{"2":{"21":6,"24":2,"33":1}}],["articles",{"2":{"25":1}}],["article",{"2":{"18":1,"21":1,"23":1,"31":1}}],["artisan",{"2":{"17":1}}],["area",{"2":{"22":1}}],["are",{"2":{"2":6,"3":3,"4":2,"6":1,"8":4,"9":1,"10":3,"12":3,"13":6,"16":2,"17":4,"18":2,"19":1,"21":5,"22":8,"23":7,"24":5,"25":2,"26":5,"33":6,"34":6,"57":2,"58":1,"67":1,"68":1,"74":1,"78":2,"80":1,"89":1,"98":1,"102":1,"112":1,"114":1,"117":2}}],["around",{"2":{"1":1,"3":1,"22":1,"33":1,"34":1}}],["adaptive",{"2":{"67":1,"89":1}}],["adapter",{"2":{"61":1,"72":2,"102":1}}],["adaptability",{"0":{"68":1},"2":{"25":1,"26":1,"30":1,"68":1}}],["advent",{"2":{"34":1}}],["advertising",{"2":{"27":1}}],["advance",{"2":{"34":1}}],["advantage",{"2":{"22":1}}],["advisable",{"2":{"33":1}}],["adding",{"2":{"21":1,"24":1,"64":1}}],["additional",{"2":{"6":1,"34":1}}],["addition",{"2":{"5":1,"8":2,"10":1,"24":1,"34":2,"102":1}}],["addextraspaceontop",{"2":{"17":1}}],["added",{"2":{"13":1,"34":1}}],["add",{"2":{"4":1,"8":1,"17":1,"25":1,"26":3,"55":1,"61":6,"66":3}}],["adds",{"2":{"4":1,"25":1,"61":1,"66":1,"76":1,"94":1,"115":1}}],["addresponseinterceptor",{"2":{"1":2,"72":1}}],["admin",{"2":{"2":2,"10":1}}],["animation",{"2":{"34":1}}],["answers",{"2":{"58":3}}],["answer",{"2":{"33":1,"55":1}}],["angular",{"2":{"24":2}}],["analytics",{"0":{"94":1,"115":1},"2":{"61":1,"66":1,"78":1,"102":2}}],["analysis",{"2":{"17":1,"53":1}}],["analogy",{"2":{"26":1,"33":1}}],["analogs",{"2":{"22":1}}],["analog",{"2":{"22":2}}],["annotations",{"2":{"17":1}}],["antony",{"2":{"17":1,"64":1}}],["antfu",{"2":{"17":3}}],["antialiased",{"2":{"17":1}}],["anti",{"2":{"12":1}}],["another",{"2":{"8":1,"22":5,"26":1,"28":1,"33":1,"34":1,"67":1,"71":1}}],["anyone",{"2":{"22":1}}],["anywhere",{"2":{"22":1}}],["anything",{"2":{"8":1}}],["any",{"2":{"2":2,"3":1,"4":2,"5":2,"11":1,"13":1,"22":3,"24":1,"25":1,"30":1,"34":1,"55":1,"97":1,"113":1}}],["an",{"0":{"16":1,"101":1},"1":{"102":1,"103":1,"104":1,"105":1},"2":{"2":3,"3":2,"4":4,"5":3,"8":2,"9":1,"10":1,"11":1,"12":3,"13":1,"16":3,"21":4,"22":8,"24":4,"25":1,"26":2,"33":7,"34":3,"67":3,"71":1,"73":1,"96":1,"99":2}}],["and",{"0":{"2":1,"12":1,"16":1,"21":1,"25":1,"28":1,"31":1,"34":1,"56":1,"62":1},"2":{"1":3,"2":24,"3":13,"4":3,"5":3,"6":1,"8":22,"9":4,"10":8,"11":2,"12":6,"13":6,"16":6,"17":18,"18":3,"21":20,"22":39,"23":5,"24":22,"25":20,"26":9,"27":3,"28":1,"29":4,"30":4,"31":1,"32":2,"33":37,"34":31,"42":1,"55":1,"56":2,"57":1,"58":8,"61":3,"63":1,"64":5,"66":3,"67":7,"68":2,"69":10,"72":1,"73":3,"75":3,"76":1,"87":5,"96":2,"97":1,"98":1,"99":2,"102":2,"105":8,"106":4,"108":2,"112":2,"113":1,"114":3,"116":1,"117":2}}],["acme",{"2":{"113":3}}],["acr",{"2":{"17":1}}],["across",{"2":{"12":1}}],["acn",{"2":{"17":1}}],["act",{"2":{"69":1}}],["actively",{"2":{"24":1}}],["active",{"2":{"17":1}}],["activitybar",{"2":{"17":1}}],["actions",{"0":{"8":1,"86":1},"1":{"87":1,"88":1},"2":{"2":1,"6":2,"8":12,"17":1,"23":1,"33":1,"41":1,"69":1,"87":1,"102":1,"105":1}}],["action",{"2":{"2":2,"8":9,"17":1,"61":1,"87":2}}],["actually",{"2":{"67":1}}],["actual",{"2":{"8":1,"34":1}}],["accepts",{"2":{"61":1}}],["accessing",{"2":{"17":1,"34":2}}],["accessibility",{"2":{"25":1}}],["accessibilitysupport",{"2":{"17":1}}],["accessible",{"2":{"9":1}}],["accesses",{"2":{"3":1}}],["accessed",{"2":{"3":1,"4":1,"13":1,"88":1}}],["access",{"2":{"1":1,"2":14,"3":5,"4":13,"8":1,"11":1,"22":2,"56":1,"71":1}}],["accomplish",{"2":{"26":1}}],["accompanying",{"2":{"22":1}}],["according",{"2":{"22":1}}],["accordingly",{"2":{"4":1,"34":1}}],["accordian",{"2":{"11":1}}],["accordianpanel",{"2":{"11":1}}],["accountroutes",{"2":{"12":2}}],["account",{"2":{"1":1,"2":2,"10":1,"12":2,"13":1,"15":1,"34":1}}],["axios",{"2":{"1":1,"67":1,"71":1}}],["apollo",{"2":{"17":2}}],["apache",{"2":{"9":1}}],["appveyor",{"2":{"17":2}}],["appsettings",{"2":{"17":2}}],["appsidebar",{"2":{"12":1}}],["apparent",{"2":{"15":1}}],["appfooter",{"2":{"12":2}}],["appheader>",{"2":{"93":1}}],["appheadersecond",{"2":{"93":1}}],["appheaderfirst",{"2":{"93":1}}],["appheader",{"2":{"12":2,"93":1}}],["approaches",{"2":{"24":1}}],["approach",{"2":{"12":1,"25":1,"34":1,"67":1}}],["app",{"2":{"10":1,"12":3,"14":2,"34":3,"61":1,"68":1,"116":1}}],["applied",{"2":{"79":1}}],["applicants",{"2":{"24":1}}],["applications",{"2":{"2":1,"34":3,"67":1,"69":1}}],["application",{"0":{"13":1,"16":1,"26":1,"62":1,"101":1},"1":{"14":1,"15":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"102":1,"103":1,"104":1,"105":1},"2":{"1":1,"3":2,"5":1,"8":1,"10":4,"11":1,"12":1,"13":4,"16":3,"21":1,"22":4,"23":1,"24":1,"25":1,"26":2,"27":1,"33":1,"34":8,"56":3,"61":1,"64":4,"67":3,"69":7,"71":2,"72":2,"73":1,"79":1,"102":6,"104":1,"105":4,"112":1,"113":2,"114":1,"116":3,"117":1}}],["applying",{"2":{"64":1}}],["appleboy",{"2":{"8":3}}],["appears",{"2":{"11":1,"23":1,"79":1,"93":1}}],["appear",{"2":{"4":1,"17":1,"34":1}}],["apidata",{"2":{"71":2}}],["apis",{"2":{"3":1,"5":1,"33":1}}],["api",{"0":{"1":1,"70":1,"71":1},"1":{"71":1,"72":1},"2":{"1":10,"3":4,"5":1,"9":2,"10":2,"17":14,"21":4,"22":2,"24":1,"33":2,"34":1,"42":1,"61":2,"64":1,"66":1,"69":2,"71":5,"72":6,"102":3}}],["a",{"0":{"18":1,"62":1,"65":1,"100":1},"1":{"66":1,"67":1},"2":{"1":4,"2":12,"3":24,"4":11,"5":6,"6":8,"8":9,"9":9,"10":11,"11":1,"12":2,"13":3,"15":4,"16":7,"17":15,"18":2,"21":19,"22":33,"23":5,"24":23,"25":6,"26":11,"27":6,"30":2,"32":2,"33":29,"34":33,"55":2,"61":2,"62":1,"63":1,"64":6,"66":2,"67":13,"69":8,"71":2,"72":1,"76":1,"79":1,"87":3,"88":2,"96":6,"97":2,"98":1,"103":1,"113":1,"114":1,"116":2}}]],"serializationVersion":2}';export{e as default}; diff --git a/assets/chunks/@localSearchIndexru.3tdeHB2v.js b/assets/chunks/@localSearchIndexru.3tdeHB2v.js new file mode 100644 index 000000000..2c5632b6b --- /dev/null +++ b/assets/chunks/@localSearchIndexru.3tdeHB2v.js @@ -0,0 +1 @@ +const t='{"documentCount":546,"nextId":546,"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#category-table","46":"/ru/arty-crafty/backend/db-data-model.html#product-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/supabase-api.html#supabase-rest-api","52":"/ru/arty-crafty/backend/supabase-api.html#supabase-sdk","53":"/ru/arty-crafty/backend/supabase-api.html#установка","54":"/ru/arty-crafty/backend/supabase-api.html#использование","55":"/ru/arty-crafty/backend/supabase-api.html#supabase-rest-api-1","56":"/ru/arty-crafty/backend/supabase.html#supabase","57":"/ru/arty-crafty/backend/supabase.html#создание-проекта","58":"/ru/arty-crafty/backend/supabase.html#безопасность-и-доступ","59":"/ru/arty-crafty/#онлаин-маркетплеис","60":"/ru/arty-crafty/#проект-arty-crafty","61":"/ru/arty-crafty/#причины","62":"/ru/arty-crafty/#цель","63":"/ru/arty-crafty/#что-здесь-будет","64":"/ru/arty-crafty/#для-чего","65":"/ru/arty-crafty/introduction/development-stages.html#план-работы","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#тестирование-и-qa","72":"/ru/arty-crafty/introduction/development-stages.html#документирование","73":"/ru/arty-crafty/introduction/development-stages.html#поддержка","74":"/ru/arty-crafty/introduction/repository.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/showcase/codeium.html#codeium","81":"/ru/arty-crafty/showcase/codeium.html#автокомплит","82":"/ru/arty-crafty/showcase/codeium.html#чат-бот","83":"/ru/arty-crafty/showcase/codeium.html#explain-refactor-jsdoc","84":"/ru/arty-crafty/showcase/codeium.html#вывод","85":"/ru/arty-crafty/showcase/customization.html#кастомизация","86":"/ru/arty-crafty/showcase/customization.html#персонализация","87":"/ru/arty-crafty/showcase/customization.html#views","88":"/ru/arty-crafty/showcase/customization.html#routes","89":"/ru/arty-crafty/showcase/customization.html#header","90":"/ru/arty-crafty/showcase/customization.html#sidebar","91":"/ru/arty-crafty/showcase/customization.html#небольшои-рефакторинг","92":"/ru/arty-crafty/showcase/favourites.html#избранное","93":"/ru/arty-crafty/showcase/favourites.html#иконка-на-карточке-товара","94":"/ru/arty-crafty/showcase/favourites.html#композабл-usefavourites","95":"/ru/arty-crafty/showcase/favourites.html#сохранение-между-сессиями","96":"/ru/arty-crafty/showcase/favourites.html#бэджик","97":"/ru/arty-crafty/showcase/favourites.html#tag-и-cmv","98":"/ru/arty-crafty/showcase/project-setup.html#создание-проекта","99":"/ru/arty-crafty/showcase/project-setup.html#репозитории-на-github","100":"/ru/arty-crafty/showcase/project-setup.html#vue-webapp","101":"/ru/arty-crafty/showcase/product-category.html#категория-товаров","102":"/ru/arty-crafty/showcase/product-category.html#layout","103":"/ru/arty-crafty/showcase/product-category.html#данные-и-api","104":"/ru/backend/api.html#абстракция-канала-связи-с-бэкендом","105":"/ru/backend/api.html#api-сервис","106":"/ru/backend/auth.html#аутентификация-и-авторизация","107":"/ru/backend/backend.html#варианты-задеиствовать-свои-бэкенд-для-фронтендера","108":"/ru/backend/cors.html#cors","109":"/ru/backend/protocols.html#протоколы-to-rest-или-не-rest","110":"/ru/book/Appendix__Migrating_from_Vue_2.html#приложение-миграция-с-vue-2","111":"/ru/book/Appendix__Migrating_from_Vue_2.html#другои-способ-загрузки-и-запуска-приложения","112":"/ru/book/Appendix__Migrating_from_Vue_2.html#регистрация-глобальных-компонентов-плагинов-и-так-далее","113":"/ru/book/Appendix__Migrating_from_Vue_2.html#своиство-data-теперь-всегда-является-функциеи","114":"/ru/book/Appendix__Migrating_from_Vue_2.html#больше-реактивных-возможностеи","115":"/ru/book/Appendix__Migrating_from_Vue_2.html#изменения-в-v-model-props-и-events","116":"/ru/book/Appendix__Migrating_from_Vue_2.html#удалена-совместимость-со-старыми-браузерами","117":"/ru/book/Appendix__Migrating_from_Vue_2.html#изменения-в-организации-каталогов-и-фаилов","118":"/ru/book/Appendix__Migrating_from_Vue_2.html#изменения-в-роутере-и-state-manager","119":"/ru/book/Appendix__Migrating_from_Vue_2.html#новые-компоненты-и-другие-изменения","120":"/ru/book/Appendix__Migrating_from_Vue_2.html#другие-изменения","121":"/ru/book/Appendix__Migrating_from_Vue_2.html#итог","122":"/ru/book/Chapter_10__Deploying_Your_Application.html#развертывание-приложения","123":"/ru/book/Chapter_10__Deploying_Your_Application.html#технические-требования","124":"/ru/book/Chapter_10__Deploying_Your_Application.html#что-включает-в-себя-публикация-веб-приложения","125":"/ru/book/Chapter_10__Deploying_Your_Application.html#домены-серверы-доменных-имен-dns-и-записи-dns","126":"/ru/book/Chapter_10__Deploying_Your_Application.html#размышления-о-создании-приложения-для-развертывания","127":"/ru/book/Chapter_10__Deploying_Your_Application.html#chapter-5-to-do-spa-src-router-index-js","128":"/ru/book/Chapter_10__Deploying_Your_Application.html#опции-и-конфигурации-веб-сервера","129":"/ru/book/Chapter_10__Deploying_Your_Application.html#конфигурация-http-сервера-apache","130":"/ru/book/Chapter_10__Deploying_Your_Application.html#htaccess","131":"/ru/book/Chapter_10__Deploying_Your_Application.html#настроика-сервера-nginx","132":"/ru/book/Chapter_10__Deploying_Your_Application.html#etc-nginx-sites-available-default","133":"/ru/book/Chapter_10__Deploying_Your_Application.html#другие-серверы","134":"/ru/book/Chapter_10__Deploying_Your_Application.html#перенос-фаилов-на-сервер","135":"/ru/book/Chapter_10__Deploying_Your_Application.html#защита-веб-приложения-с-помощью-let-s-encrypt","136":"/ru/book/Chapter_10__Deploying_Your_Application.html#подведение-итогов","137":"/ru/book/Chapter_10__Deploying_Your_Application.html#вопросы-для-проверки","138":"/ru/book/Chapter_1__The_Vue_3_Framework.html#фреимворк-vue-3","139":"/ru/book/Chapter_1__The_Vue_3_Framework.html#прогрессивныи-фреимворк","140":"/ru/book/Chapter_1__The_Vue_3_Framework.html#использование-vue-в-веб-приложении","141":"/ru/book/Chapter_1__The_Vue_3_Framework.html#путь-сборщика-лучшии-путь","142":"/ru/book/Chapter_1__The_Vue_3_Framework.html#понимание-однофаиловых-компонентов","143":"/ru/book/Chapter_1__The_Vue_3_Framework.html#разные-варианты-options-composition-и-script-setup-api","144":"/ru/book/Chapter_1__The_Vue_3_Framework.html#изучение-встроенных-директив-в-vue-3","145":"/ru/book/Chapter_1__The_Vue_3_Framework.html#v-bind-сокращение","146":"/ru/book/Chapter_1__The_Vue_3_Framework.html#v-show","147":"/ru/book/Chapter_1__The_Vue_3_Framework.html#v-if-v-else-и-v-else-if","148":"/ru/book/Chapter_1__The_Vue_3_Framework.html#v-for-и-key","149":"/ru/book/Chapter_1__The_Vue_3_Framework.html#v-model","150":"/ru/book/Chapter_1__The_Vue_3_Framework.html#v-on-и-сокращение","151":"/ru/book/Chapter_1__The_Vue_3_Framework.html#встроенные-компоненты","152":"/ru/book/Chapter_1__The_Vue_3_Framework.html#кодовые-соглашения-code-conventions-в-книге","153":"/ru/book/Chapter_1__The_Vue_3_Framework.html#переменные-и-пропсы","154":"/ru/book/Chapter_1__The_Vue_3_Framework.html#константы","155":"/ru/book/Chapter_1__The_Vue_3_Framework.html#имена-классов-и-компонентов","156":"/ru/book/Chapter_1__The_Vue_3_Framework.html#функции-методы-события-и-имена-фаилов","157":"/ru/book/Chapter_1__The_Vue_3_Framework.html#экземпляры","158":"/ru/book/Chapter_1__The_Vue_3_Framework.html#подведение-итогов","159":"/ru/book/Chapter_1__The_Vue_3_Framework.html#вопросы-для-проверки","160":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#бонусная-глава-шаблоны-ux","161":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#технические-требования","162":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#ui-дизаин-против-ux-дизаина","163":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#принципы-проектирования-пользовательского-интерфеиса","164":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#достаточныи-контраст-или-различие-между-элементами","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#законы-проектирования-пользовательского-интерфеиса","169":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#закон-фитта","170":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#закон-хика","171":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#восемь-правил-бена-шнаидермана","172":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#принципы-проектирования-ux","173":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#общие-шаблоны-для-работы-с-данными","174":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#элементы-ввода-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#подсказки-tooltips","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#панели-прогресса-progress-bars-и-спиннеры","182":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#components-spinner-vue","183":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#пагинация-пеиджер-и-бесконечныи-скроллер","184":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#src-components-infinitescroller-vue","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#хлебные-крошки-breadcrumbs","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#аккордеонные-меню","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#отзывчивые-responsive-приложения","195":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#домашняя-ссылка","196":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#главная-hero-секция-призыв-к-деиствию-call-to-action-и-иконки-социальных-сетеи","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#приманка-для-тараканов-roach-motels","202":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#privacy-zuckering","203":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#предотвращение-сравнения-цен","204":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#ненаправленность","205":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#скрытые-расходы","206":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#приманка-и-подмена","207":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#подтверждение-позора-confirm-shaming","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#подведение-итогов","211":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#вопросы-для-проверки","212":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#установка-рабочего-проекта","213":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#технические-требования","214":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#настроика-проекта-и-инструменты","215":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#структура-папок-и-ее-модификации","216":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#интеграция-с-css-фреимворками","217":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#фреимворк-w3-css","218":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#fontawesome-это-просто-замечательно","219":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#опции-конфигурации-vite","220":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#приложение-to-do","221":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#app-vue","222":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#todos-vue","223":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#краткая-критика-нашего-приложения-to-do","224":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#подведение-итогов","225":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#вопросы-для-проверки","226":"/ru/book/Chapter_5__Single-Page_Applications.html#одностраничные-приложения","227":"/ru/book/Chapter_5__Single-Page_Applications.html#технические-требования","228":"/ru/book/Chapter_5__Single-Page_Applications.html#что-такое-spa","229":"/ru/book/Chapter_5__Single-Page_Applications.html#vue-3-роутер","230":"/ru/book/Chapter_5__Single-Page_Applications.html#установка","231":"/ru/book/Chapter_5__Single-Page_Applications.html#новое-приложение-to-do","232":"/ru/book/Chapter_5__Single-Page_Applications.html#определение-маршрутов-и-объект-router","233":"/ru/book/Chapter_5__Single-Page_Applications.html#src-router-index-js","234":"/ru/book/Chapter_5__Single-Page_Applications.html#src-main-js","235":"/ru/book/Chapter_5__Single-Page_Applications.html#шаблонные-компоненты-маршрутизатора","236":"/ru/book/Chapter_5__Single-Page_Applications.html#app-vue","237":"/ru/book/Chapter_5__Single-Page_Applications.html#вложенные-маршруты-именованные-представления-и-программная-навигация","238":"/ru/book/Chapter_5__Single-Page_Applications.html#определение-вложенных-маршрутов","239":"/ru/book/Chapter_5__Single-Page_Applications.html#src-views-directory-vue-component-lines-13-18","240":"/ru/book/Chapter_5__Single-Page_Applications.html#push","241":"/ru/book/Chapter_5__Single-Page_Applications.html#replace","242":"/ru/book/Chapter_5__Single-Page_Applications.html#go","243":"/ru/book/Chapter_5__Single-Page_Applications.html#исследование-шаблонов-аутентификации","244":"/ru/book/Chapter_5__Single-Page_Applications.html#простая-аутентификация-по-имени-пользователя-и-паролю","245":"/ru/book/Chapter_5__Single-Page_Applications.html#openid-и-сторонняя-аутентификация","246":"/ru/book/Chapter_5__Single-Page_Applications.html#_1","247":"/ru/book/Chapter_5__Single-Page_Applications.html#_2","248":"/ru/book/Chapter_5__Single-Page_Applications.html#_3","249":"/ru/book/Chapter_5__Single-Page_Applications.html#беспарольная-аутентификация-или-аутентификация-по-одноразовому-паролю-otp","250":"/ru/book/Chapter_5__Single-Page_Applications.html#_2fa-двухфакторная-аутентификация","251":"/ru/book/Chapter_5__Single-Page_Applications.html#web3-аутентификация","252":"/ru/book/Chapter_5__Single-Page_Applications.html#подведение-итогов","253":"/ru/book/Chapter_5__Single-Page_Applications.html#вопросы-для-проверки","254":"/ru/book/Chapter_6__Progressive_Web_Applications.html#прогрессивные-веб-приложения","255":"/ru/book/Chapter_6__Progressive_Web_Applications.html#технические-требования","256":"/ru/book/Chapter_6__Progressive_Web_Applications.html#pwa-или-устанавливаемые-spa","257":"/ru/book/Chapter_6__Progressive_Web_Applications.html#увеличение-spa-до-уровня-pwa","258":"/ru/book/Chapter_6__Progressive_Web_Applications.html#фаил-манифеста","259":"/ru/book/Chapter_6__Progressive_Web_Applications.html#необходимо","260":"/ru/book/Chapter_6__Progressive_Web_Applications.html#рекомендуется","261":"/ru/book/Chapter_6__Progressive_Web_Applications.html#описательные","262":"/ru/book/Chapter_6__Progressive_Web_Applications.html#тестирование-манифеста","263":"/ru/book/Chapter_6__Progressive_Web_Applications.html#подсказка-к-установке-install-prompt","264":"/ru/book/Chapter_6__Progressive_Web_Applications.html#service-workers","265":"/ru/book/Chapter_6__Progressive_Web_Applications.html#плагин-vite-pwa","266":"/ru/book/Chapter_6__Progressive_Web_Applications.html#тестирование-показателеи-pwa-с-помощью-google-lighthouse","267":"/ru/book/Chapter_6__Progressive_Web_Applications.html#подведение-итогов","268":"/ru/book/Chapter_6__Progressive_Web_Applications.html#вопросы-для-проверки","269":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#композиция-пользовательского-интерфеиса-с-помощью-компонентов","270":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#технические-требования","271":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#составление-страницы-с-помощью-компонентов","272":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#этап-1-определение-макетов-и-элементов-пользовательского-интерфеиса","273":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#шаг-2-определение-связеи-потока-данных-взаимодеиствии-и-событии","274":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#шаг-3-определение-элементов-пользовательскои-интерактивности-входов-диалогов-уведомлении-и-т-д","275":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#шаг-4-выявление-шаблонов-проектирования-и-компромиссов","276":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#компоненты-в-деталях","277":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#локальные-и-глобальные-компоненты","278":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#статическии-асинхронныи-и-динамическии-импорт","279":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#пропсы-события-и-директива-v-model","280":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#настраиваемые-контроллеры-ввода","281":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#инъекция-зависимости-с-помощью-provide-и-inject","282":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#специальные-компоненты","283":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#слоты-слоты-и-еще-раз-слоты","284":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#композабл-функции-composables-и-миксины","285":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#динамические-компоненты-с-помощью-component-is","286":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#реальныи-пример-плагин-модалов","287":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#настроика-нашего-проекта","288":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#конструкция","289":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#реализация","290":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#реализация-нашего-нового-приложения-to-do","291":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#небольшая-критика-нашего-нового-приложения-to-do","292":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#подведение-итогов","293":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#вопросы-для-проверки","294":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#принципы-и-шаблоны-проектирования-программного-обеспечения","295":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#каковы-принципы-проектирования-программного-обеспечения","296":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#неполныи-список-принципов-проектирования","297":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#separation-of-concerns-разделение-ответственности","298":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#composition-over-inheritance-композиция-над-наследованием","299":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#single-responsibility-principle-принцип-единои-ответственности","300":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#encapsulation-инкапсуляция","301":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#kic-keep-it-clean","302":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#dry-–-don-t-repeat-yourself-не-повторяися","303":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#kiss-keep-it-simple-and-short-держи-это-простым-и-коротким","304":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#code-for-the-next-пиши-код-для-следующего","305":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#что-такое-шаблон-проектирования-программного-обеспечения","306":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#краткии-справочныи-список-шаблонов","307":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#порождающие-шаблоны","308":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#поведенческие-шаблоны","309":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#структурные-шаблоны","310":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#асинхронные-шаблоны","311":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-singleton","312":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#когда-его-использовать","313":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#реализация","314":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#метод-1","315":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#метод-2","316":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-dependency-injection-инъекция-зависимостеи","317":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-dependency-injection-1-js","318":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-dependency-injection-2-js","319":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-dependency-injection-3-js","320":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-dependency-injection-4-js","321":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-dependency-injection-5-js","322":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-dependency-injection-6-js","323":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-dependency-injection-7-js","324":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-factory-фабрика","325":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-observer-наблюдатель","326":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-observer-1-js","327":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-command-команда","328":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-command-1-js","329":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-proxy","330":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-proxy-1-js","331":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-decorator-декоратор","332":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-decorator-1-vue","333":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-decorator-2-vue","334":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-facade-фасад","335":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-callback-обратныи-вызов","336":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-callback-1-js-синхронныи-фибоначчи","337":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-promise-обещаниe","338":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#подведение-итогов","339":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#вопросы-для-проверки","340":"/ru/book/Chapter_7__Data_Flow_Management.html#управление-потоками-данных","341":"/ru/book/Chapter_7__Data_Flow_Management.html#технические-требования","342":"/ru/book/Chapter_7__Data_Flow_Management.html#основное-взаимодеиствие-компонентов","343":"/ru/book/Chapter_7__Data_Flow_Management.html#basic-parentbasic-vue","344":"/ru/book/Chapter_7__Data_Flow_Management.html#basic-child-vue","345":"/ru/book/Chapter_7__Data_Flow_Management.html#реализация-шины-событии-с-помощью-шаблонов-singleton-и-observer","346":"/ru/book/Chapter_7__Data_Flow_Management.html#services-messagebus-js","347":"/ru/book/Chapter_7__Data_Flow_Management.html#bus-child-vue","348":"/ru/book/Chapter_7__Data_Flow_Management.html#реализация-базового-реактивного-состояния","349":"/ru/book/Chapter_7__Data_Flow_Management.html#service-simplestate-js","350":"/ru/book/Chapter_7__Data_Flow_Management.html#реализация-мощного-реактивного-стора-с-помощью-pinia","351":"/ru/book/Chapter_7__Data_Flow_Management.html#options-api-basic-store","352":"/ru/book/Chapter_7__Data_Flow_Management.html#stores-counter-js","353":"/ru/book/Chapter_7__Data_Flow_Management.html#main-js","354":"/ru/book/Chapter_7__Data_Flow_Management.html#pinia-childpinia-vue","355":"/ru/book/Chapter_7__Data_Flow_Management.html#хранилища-данных-браузера-сессионные-локальные-и-indexeddb","356":"/ru/book/Chapter_7__Data_Flow_Management.html#экспериментируем-с-шаблонами-reactivity-и-proxies","357":"/ru/book/Chapter_7__Data_Flow_Management.html#services-sessionstorage-js","358":"/ru/book/Chapter_7__Data_Flow_Management.html#session-storage-childsession-vue","359":"/ru/book/Chapter_7__Data_Flow_Management.html#подведение-итогов","360":"/ru/book/Chapter_7__Data_Flow_Management.html#вопросы-для-проверки","361":"/ru/book/#vue-js-3-шаблоны-проектирования-и-лучшие-практики","362":"/ru/book/#здесь-представлен-перевод-книги-vue-js-3-design-patterns-and-best-practices-на-русскии-язык","363":"/ru/book/#предисловие","364":"/ru/book/#для-кого-эта-книга","365":"/ru/book/#чтобы-получить-максимальную-пользу-от-этои-книги","366":"/ru/book/#купить-книгу","367":"/ru/book/#скачать-фаилы-кода-примеров","368":"/ru/book/#код-в-деиствии","369":"/ru/book/summary.html#что-включает-в-себя-эта-книга","370":"/ru/book/summary.html#глава-1-фреимворк-vue-3","371":"/ru/book/summary.html#глава-2-принципы-и-шаблоны-проектирования-программного-обеспечения","372":"/ru/book/summary.html#глава-3-создание-рабочего-проекта","373":"/ru/book/summary.html#глава-4-композиция-пользовательского-интерфеиса-с-помощью-компонентов","374":"/ru/book/summary.html#глава-5-одностраничные-приложения","375":"/ru/book/summary.html#глава-6-прогрессивные-веб-приложения","376":"/ru/book/summary.html#глава-7-управление-потоками-данных","377":"/ru/book/summary.html#глава-8-многопоточность-с-помощью-web-workers","378":"/ru/book/summary.html#глава-9-тестирование-и-контроль-исходных-текстов","379":"/ru/book/summary.html#глава-10-развертывание-приложения","380":"/ru/book/summary.html#глава-11-ux-patterns","381":"/ru/book/summary.html#приложение-миграция-с-vue-2-на-vue-3","382":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#многопоточность-с-web-workers","383":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#технические-требования","384":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#введение-в-web-workers","385":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#реализация-web-worker","386":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#my-worker-js","387":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#main-js","388":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#шаблон-business-delegate","389":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#шаблон-dispatcher","390":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#установка-конвеиера-взаимодеиствия-с-веб-рабочим","391":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#services-webworker-js","392":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#webworker-index-js","393":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#webworker-services-test-js","394":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#получение-доступа-к-indexeddb-с-помощью-dexiejs-в-web-worker","395":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#src-components-dbnotes-vue","396":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#src-webworker-services-dbservice-js","397":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#src-webworker-index-js","398":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#webworker-services-network-js","399":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#webworker-index-js-1","400":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#src-components-networkcommunication-vue","401":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#простои-nodejs-сервер-для-тестирования","402":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#server-index-js","403":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#подведение-итогов","404":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#вопросы-для-проверки","405":"/ru/book/Chapter_9__Testing_and_Source_Control.html#тестирование-и-системы-контроля-версии","406":"/ru/book/Chapter_9__Testing_and_Source_Control.html#технические-требования","407":"/ru/book/Chapter_9__Testing_and_Source_Control.html#что-такое-тестирование-и-tdd","408":"/ru/book/Chapter_9__Testing_and_Source_Control.html#что-тестировать","409":"/ru/book/Chapter_9__Testing_and_Source_Control.html#наш-базовыи-пример-приложения","410":"/ru/book/Chapter_9__Testing_and_Source_Control.html#установка-и-использование-vitest","411":"/ru/book/Chapter_9__Testing_and_Source_Control.html#src-tests-fibonacci-test-js","412":"/ru/book/Chapter_9__Testing_and_Source_Control.html#специальныи-случаи-утверждения-намеренная-ошибка","413":"/ru/book/Chapter_9__Testing_and_Source_Control.html#специальныи-случаи-утверждения-асинхронныи-код","414":"/ru/book/Chapter_9__Testing_and_Source_Control.html#установка-vue-test-utils","415":"/ru/book/Chapter_9__Testing_and_Source_Control.html#src-tests-fibonaccioutput-test-js","416":"/ru/book/Chapter_9__Testing_and_Source_Control.html#src-tests-fibonacciinput-test-js","417":"/ru/book/Chapter_9__Testing_and_Source_Control.html#in-source-тестирование","418":"/ru/book/Chapter_9__Testing_and_Source_Control.html#покрытие","419":"/ru/book/Chapter_9__Testing_and_Source_Control.html#интерфеис-vitest","420":"/ru/book/Chapter_9__Testing_and_Source_Control.html#что-такое-source-control-и-зачем-он-нужен","421":"/ru/book/Chapter_9__Testing_and_Source_Control.html#управление-исходными-текстами-с-помощью-git","422":"/ru/book/Chapter_9__Testing_and_Source_Control.html#установка-в-системах-windows","423":"/ru/book/Chapter_9__Testing_and_Source_Control.html#установка-в-системах-linux","424":"/ru/book/Chapter_9__Testing_and_Source_Control.html#установка-в-системах-macos","425":"/ru/book/Chapter_9__Testing_and_Source_Control.html#использование-git","426":"/ru/book/Chapter_9__Testing_and_Source_Control.html#chapter-10-gitignore","427":"/ru/book/Chapter_9__Testing_and_Source_Control.html#управление-ветвями-и-слияниями","428":"/ru/book/Chapter_9__Testing_and_Source_Control.html#конфликты-при-слиянии","429":"/ru/book/Chapter_9__Testing_and_Source_Control.html#работа-с-удаленными-репозиториями","430":"/ru/book/Chapter_9__Testing_and_Source_Control.html#непрерывная-интеграция-и-доставка","431":"/ru/book/Chapter_9__Testing_and_Source_Control.html#подведение-итогов","432":"/ru/book/Chapter_9__Testing_and_Source_Control.html#вопросы-для-проверки","433":"/ru/deployment/ci-cd.html#ci-cd","434":"/ru/deployment/docker.html#docker","435":"/ru/deployment/github-actions.html#github-actions","436":"/ru/development/architectural-patterns.html#архитектурные-решения","437":"/ru/development/architectural-patterns.html#use-cases","438":"/ru/development/architectural-patterns.html#лучшие-практики-и-соображения","439":"/ru/deployment/hosting.html#хостинг","440":"/ru/development/assets.html#ресурсы-приложения","441":"/ru/development/assets.html#baseicon","442":"/ru/development/assets.html#icons-js","443":"/ru/development/building.html#создание-и-сборка-приложения","444":"/ru/development/ide.html#настроика-ide","445":"/ru/development/libraries.html#подскажите-удобную-библиотеку","446":"/ru/development/misc.html#полезные-советы","447":"/ru/development/misc.html#карусель-или-слаидер","448":"/ru/development/misc.html#дата-и-время","449":"/ru/development/stores.html#state-management-во-vue-3","450":"/ru/development/testing.html#тестирование","451":"/ru/frontend/about-frameworks.html#о-фронтенд-фреимворках","452":"/ru/frontend/architecture.html#архитектура-фронтэнд-приложении","453":"/ru/frontend/architecture.html#избегаите-зависимостеи","454":"/ru/frontend/architecture.html#используите-обертки-над-компонентами-ui-библиотек-и-сторонних-утилит","455":"/ru/frontend/architecture.html#регулярныи-рефакторинг","456":"/ru/frontend/architecture.html#используите-css3","457":"/ru/frontend/architecture.html#используите-современные-стандарты-и-возможности-языков","458":"/ru/frontend/architecture.html#документируите-проект","459":"/ru/frontend/css-ui-libs.html#css-и-ui-библиотеки","460":"/ru/frontend/learning.html#изучение-vue","461":"/ru/frontend/spa-pwa-ssr-ssg.html#spa-pwa-ssg-ssr-и-seo","462":"/ru/misc/CHANGELOG.html#история-изменении","463":"/ru/misc/CHANGELOG.html#v1-4-24-11-2023","464":"/ru/misc/CHANGELOG.html#новое","465":"/ru/misc/CHANGELOG.html#изменено","466":"/ru/misc/CHANGELOG.html#v1-3-10-10-2023","467":"/ru/misc/CHANGELOG.html#изменено-1","468":"/ru/misc/CHANGELOG.html#v1-2-27-09-2023","469":"/ru/misc/CHANGELOG.html#новое-1","470":"/ru/misc/CHANGELOG.html#изменено-2","471":"/ru/misc/CHANGELOG.html#v1-1-15-09-2023","472":"/ru/misc/CHANGELOG.html#новое-2","473":"/ru/misc/CHANGELOG.html#изменено-3","474":"/ru/misc/CHANGELOG.html#v1-0-11-09-2023","475":"/ru/misc/CHANGELOG.html#новое-3","476":"/ru/misc/cheat-sheets.html#шпаргалки-cheat-sheet","477":"/ru/misc/cheat-sheets.html#vue","478":"/ru/misc/cheat-sheets.html#javascript","479":"/ru/misc/cheat-sheets.html#html","480":"/ru/misc/cheat-sheets.html#css","481":"/ru/misc/cheat-sheets.html#typescript","482":"/ru/misc/cheat-sheets.html#markdown","483":"/ru/misc/contribute.html#внесите-лепту-в-развитие-данного-ресурса","484":"/ru/misc/glossary.html#глоссарии-и-сокращения","485":"/ru/misc/introduction.html#предисловие","486":"/ru/misc/introduction.html#у-нас-есть-телеграм-канал","487":"/ru/vue-webapp/contribution.html#участие-в-проекте","488":"/ru/vue-webapp/getting-started.html#установка","489":"/ru/vue-webapp/getting-started.html#установка-через-create-vue-webapp","490":"/ru/vue-webapp/getting-started.html#инициализация-и-запуск-веб-приложения","491":"/ru/vue-webapp/getting-started.html#установка-из-репозитория","492":"/ru/vue-webapp/guidelines.html#принципы","493":"/ru/vue-webapp/#vue-3-webapp-билдер","494":"/ru/vue-webapp/#краткое-описание","495":"/ru/vue-webapp/#обоснование","496":"/ru/vue-webapp/objectives.html#цели","497":"/ru/vue-webapp/options/adaptability.html#адаптивность","498":"/ru/vue-webapp/options/baseIcon.html#baseicon","499":"/ru/vue-webapp/options/api.html#api-модуль","500":"/ru/vue-webapp/options/api.html#api-rest","501":"/ru/vue-webapp/options/api.html#json-rpc","502":"/ru/vue-webapp/options/description.html#детали-реализации","503":"/ru/vue-webapp/options/description.html#инъекции-кода-в-index-html","504":"/ru/vue-webapp/options/description.html#css-tricks","505":"/ru/vue-webapp/options/drawer.html#navigation-drawers","506":"/ru/vue-webapp/options/drawer.html#simpledrawer","507":"/ru/vue-webapp/options/drawer.html#touchslideoutdrawer","508":"/ru/vue-webapp/options/footer.html#footers","509":"/ru/vue-webapp/options/footer.html#simplefooter","510":"/ru/vue-webapp/options/footer.html#richfooter","511":"/ru/vue-webapp/options/footer.html#mantinesimplefooter","512":"/ru/vue-webapp/options/footer.html#mantinerichfooter","513":"/ru/vue-webapp/options/footer.html#distributedfooter","514":"/ru/vue-webapp/options/ga-gp.html#github-actions-сценарии-для-развертывания-на-github-pages","515":"/ru/vue-webapp/options/ga-gp.html#deployment","516":"/ru/vue-webapp/options/ga-gp.html#настроика-base-в-vite-конфиге","517":"/ru/vue-webapp/options/google-analytics.html#google-analytics","518":"/ru/vue-webapp/options/header.html#headers","519":"/ru/vue-webapp/options/header.html#simpleheader","520":"/ru/vue-webapp/options/header.html#mantinesimpleheader","521":"/ru/vue-webapp/options/header.html#mantinelayeredheader","522":"/ru/vue-webapp/options/header.html#slidingheader","523":"/ru/vue-webapp/options/i18n.html#i18n","524":"/ru/vue-webapp/options/i18n.html#i18next","525":"/ru/vue-webapp/options/i18n.html#usei18nlight","526":"/ru/vue-webapp/options/i18n.html#использование","527":"/ru/vue-webapp/options/i18n.html#i18next-расширения","528":"/ru/vue-webapp/options/i18n.html#в-итоге","529":"/ru/vue-webapp/options/#опции-при-создании-приложения","530":"/ru/vue-webapp/options/#доступные-опции","531":"/ru/vue-webapp/options/#доступно-по-умолчанию","532":"/ru/vue-webapp/options/#в-разработке","533":"/ru/vue-webapp/options/#в-планах","534":"/ru/vue-webapp/options/layout-main.html#mainlayout","535":"/ru/vue-webapp/options/layout-main.html#routing","536":"/ru/vue-webapp/options/layout-one-column.html#onecolumnlayout","537":"/ru/vue-webapp/options/navbar.html#navbar","538":"/ru/vue-webapp/options/navbar.html#simplenavbar","539":"/ru/vue-webapp/options/navbar.html#mantinesimplenavbar","540":"/ru/vue-webapp/options/open-graph.html#google-analytics","541":"/ru/vue-webapp/options/pwa.html#pwa","542":"/ru/vue-webapp/options/pwa.html#manifest-json","543":"/ru/vue-webapp/options/pwa.html#service-worker","544":"/ru/vue-webapp/options/splash-screen.html#splash-screen","545":"/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,73],"49":[1,1,1],"50":[3,1,58],"51":[3,1,1],"52":[2,3,16],"53":[2,5,6],"54":[2,5,36],"55":[3,3,58],"56":[1,1,1],"57":[2,1,32],"58":[3,1,116],"59":[2,1,1],"60":[3,2,32],"61":[1,2,81],"62":[1,2,47],"63":[4,2,44],"64":[3,2,53],"65":[2,1,1],"66":[3,2,46],"67":[2,2,116],"68":[3,2,130],"69":[1,2,9],"70":[1,2,18],"71":[3,2,10],"72":[1,2,10],"73":[1,2,23],"74":[4,1,13],"75":[4,1,1],"76":[4,4,68],"77":[6,4,14],"78":[3,4,15],"79":[5,4,86],"80":[1,1,1],"81":[1,1,89],"82":[2,1,10],"83":[3,1,95],"84":[1,1,13],"85":[1,1,1],"86":[1,1,94],"87":[1,1,38],"88":[1,1,73],"89":[1,1,66],"90":[1,1,16],"91":[2,1,18],"92":[1,1,1],"93":[4,1,96],"94":[2,1,106],"95":[3,1,75],"96":[1,1,126],"97":[3,1,12],"98":[2,1,1],"99":[3,2,16],"100":[2,2,174],"101":[2,1,1],"102":[1,2,58],"103":[3,2,62],"104":[5,1,1],"105":[2,5,122],"106":[3,1,399],"107":[6,1,258],"108":[1,1,228],"109":[6,1,153],"110":[5,1,148],"111":[6,5,82],"112":[7,5,81],"113":[6,5,97],"114":[3,5,187],"115":[7,5,121],"116":[5,5,175],"117":[6,5,58],"118":[6,5,86],"119":[6,5,50],"120":[2,5,21],"121":[1,5,73],"122":[2,1,85],"123":[2,2,23],"124":[8,2,73],"125":[7,9,463],"126":[6,2,151],"127":[10,15,143],"128":[5,2,276],"129":[4,7,51],"130":[2,11,69],"131":[3,7,92],"132":[6,10,98],"133":[2,7,44],"134":[4,2,167],"135":[8,2,253],"136":[2,2,112],"137":[3,2,55],"138":[3,1,278],"139":[2,3,474],"140":[5,3,269],"141":[5,7,231],"142":[3,3,292],"143":[8,3,542],"144":[6,3,48],"145":[5,7,58],"146":[2,7,67],"147":[4,7,97],"148":[4,7,95],"149":[2,7,91],"150":[5,7,134],"151":[2,3,267],"152":[6,3,46],"153":[3,9,18],"154":[1,9,44],"155":[4,9,17],"156":[6,9,9],"157":[1,9,119],"158":[2,3,49],"159":[3,3,68],"160":[4,1,168],"161":[2,4,59],"162":[5,4,223],"163":[4,4,172],"164":[6,8,150],"165":[6,8,180],"166":[6,8,116],"167":[8,8,145],"168":[4,8,35],"169":[2,8,139],"170":[2,8,120],"171":[4,8,211],"172":[3,8,118],"173":[6,4,45],"174":[3,10,101],"175":[4,13,145],"176":[4,13,122],"177":[3,13,141],"178":[6,13,96],"179":[2,13,117],"180":[4,13,159],"181":[6,13,211],"182":[4,19,79],"183":[5,13,243],"184":[5,18,240],"185":[6,4,29],"186":[2,13,118],"187":[4,13,103],"188":[2,13,81],"189":[2,13,152],"190":[2,13,76],"191":[1,13,194],"192":[2,13,77],"193":[5,4,12],"194":[3,9,236],"195":[2,9,136],"196":[13,9,205],"197":[2,9,56],"198":[2,4,78],"199":[3,6,88],"200":[3,6,106],"201":[6,6,74],"202":[2,6,82],"203":[3,6,50],"204":[1,6,57],"205":[2,6,39],"206":[3,6,53],"207":[5,6,82],"208":[2,6,108],"209":[2,6,72],"210":[2,4,97],"211":[3,4,42],"212":[3,1,164],"213":[2,3,292],"214":[4,3,363],"215":[5,3,470],"216":[4,3,278],"217":[3,7,153],"218":[4,3,323],"219":[3,3,255],"220":[3,3,165],"221":[2,9,187],"222":[2,9,583],"223":[6,9,207],"224":[2,3,75],"225":[3,3,59],"226":[2,1,108],"227":[2,2,33],"228":[4,2,397],"229":[3,2,124],"230":[1,5,150],"231":[4,5,158],"232":[5,5,24],"233":[5,10,345],"234":[4,10,46],"235":[3,5,81],"236":[2,5,439],"237":[7,5,170],"238":[3,12,101],"239":[9,12,354],"240":[2,5,57],"241":[2,5,15],"242":[2,5,258],"243":[3,2,222],"244":[7,5,315],"245":[4,5,469],"246":[2,5,106],"247":[2,5,118],"248":[2,5,207],"249":[8,5,321],"250":[3,5,288],"251":[2,5,459],"252":[2,2,109],"253":[3,2,64],"254":[3,1,167],"255":[2,3,52],"256":[4,3,459],"257":[5,3,39],"258":[2,8,172],"259":[2,10,112],"260":[2,10,56],"261":[2,10,140],"262":[2,8,69],"263":[6,8,391],"264":[2,3,360],"265":[3,3,230],"266":[7,3,138],"267":[2,3,79],"268":[3,3,55],"269":[6,1,160],"270":[2,6,30],"271":[5,6,114],"272":[8,8,172],"273":[9,8,233],"274":[13,8,131],"275":[7,8,168],"276":[3,6,31],"277":[4,9,159],"278":[5,9,305],"279":[6,9,170],"280":[3,9,239],"281":[7,9,274],"282":[2,6,48],"283":[6,8,367],"284":[5,6,283],"285":[8,11,203],"286":[4,6,99],"287":[3,10,36],"288":[1,10,80],"289":[1,10,456],"290":[6,6,422],"291":[7,6,88],"292":[2,6,95],"293":[3,6,61],"294":[6,1,198],"295":[6,6,64],"296":[4,6,25],"297":[6,9,195],"298":[7,9,123],"299":[7,9,210],"300":[3,9,104],"301":[4,9,274],"302":[8,9,182],"303":[12,9,128],"304":[9,9,167],"305":[7,6,185],"306":[4,6,39],"307":[2,19,16],"308":[2,19,14],"309":[2,19,18],"310":[2,19,70],"311":[2,10,50],"312":[3,12,52],"313":[1,12,37],"314":[2,13,78],"315":[2,13,151],"316":[6,10,78],"317":[7,16,39],"318":[6,16,93],"319":[7,16,38],"320":[7,16,101],"321":[7,16,193],"322":[7,16,115],"323":[7,16,137],"324":[4,10,83],"325":[4,10,175],"326":[6,14,231],"327":[4,10,129],"328":[6,14,133],"329":[2,10,267],"330":[6,12,257],"331":[4,10,303],"332":[6,14,112],"333":[5,14,90],"334":[4,10,274],"335":[5,10,210],"336":[8,15,238],"337":[4,10,419],"338":[2,6,92],"339":[3,6,42],"340":[3,1,150],"341":[2,3,79],"342":[3,3,235],"343":[4,7,94],"344":[4,7,188],"345":[9,3,153],"346":[4,13,46],"347":[4,13,259],"348":[4,3,127],"349":[4,8,253],"350":[7,3,178],"351":[4,11,174],"352":[4,11,162],"353":[3,11,45],"354":[4,11,260],"355":[7,3,476],"356":[6,3,110],"357":[4,10,215],"358":[5,10,127],"359":[2,3,71],"360":[3,3,52],"361":[8,1,4],"362":[16,9,1],"363":[1,8,124],"364":[4,8,50],"365":[7,8,144],"366":[2,8,14],"367":[4,8,24],"368":[3,8,41],"369":[6,1,1],"370":[5,7,20],"371":[8,7,26],"372":[5,7,32],"373":[8,7,22],"374":[4,7,15],"375":[5,7,19],"376":[5,7,26],"377":[7,7,28],"378":[7,7,32],"379":[4,7,27],"380":[4,7,29],"381":[7,7,16],"382":[4,1,149],"383":[2,4,57],"384":[4,4,516],"385":[3,7,162],"386":[4,11,133],"387":[3,11,121],"388":[3,4,216],"389":[2,4,113],"390":[6,4,142],"391":[4,13,234],"392":[4,13,174],"393":[5,13,153],"394":[11,4,197],"395":[5,15,251],"396":[6,15,216],"397":[5,15,241],"398":[5,15,178],"399":[4,15,69],"400":[5,15,158],"401":[5,4,75],"402":[4,13,280],"403":[2,4,115],"404":[3,4,50],"405":[5,1,191],"406":[2,5,46],"407":[5,5,296],"408":[2,5,232],"409":[4,5,183],"410":[4,5,266],"411":[6,9,392],"412":[5,5,107],"413":[5,5,149],"414":[4,5,150],"415":[6,10,182],"416":[6,10,331],"417":[3,5,154],"418":[1,5,194],"419":[2,5,127],"420":[9,5,203],"421":[6,5,163],"422":[4,5,75],"423":[4,5,86],"424":[4,5,39],"425":[2,5,191],"426":[4,8,215],"427":[4,5,65],"428":[3,5,231],"429":[4,5,267],"430":[4,5,141],"431":[2,5,87],"432":[3,5,63],"433":[2,1,64],"434":[1,1,1],"435":[2,1,450],"436":[2,1,163],"437":[2,3,78],"438":[4,3,163],"439":[1,1,137],"440":[2,1,201],"441":[1,3,71],"442":[2,3,118],"443":[4,1,216],"444":[2,1,863],"445":[3,1,42],"446":[2,1,8],"447":[3,3,15],"448":[3,3,347],"449":[5,1,587],"450":[1,1,162],"451":[3,1,414],"452":[3,1,197],"453":[2,4,78],"454":[9,4,41],"455":[2,4,29],"456":[2,4,47],"457":[6,4,18],"458":[2,4,30],"459":[4,1,223],"460":[2,1,501],"461":[6,1,538],"462":[2,1,1],"463":[6,2,1],"464":[1,8,13],"465":[1,8,5],"466":[5,2,1],"467":[1,7,12],"468":[6,2,1],"469":[1,8,6],"470":[1,8,24],"471":[6,2,1],"472":[1,8,3],"473":[1,8,4],"474":[6,2,1],"475":[1,8,3],"476":[4,1,1],"477":[1,4,5],"478":[1,4,4],"479":[1,4,4],"480":[1,4,6],"481":[1,4,8],"482":[1,4,2],"483":[6,1,36],"484":[3,1,66],"485":[1,1,80],"486":[5,2,23],"487":[3,1,17],"488":[1,1,1],"489":[5,1,128],"490":[5,5,13],"491":[3,1,38],"492":[1,1,144],"493":[4,1,1],"494":[2,4,70],"495":[1,4,175],"496":[1,1,171],"497":[1,1,81],"498":[1,1,67],"499":[2,1,1],"500":[3,2,103],"501":[2,2,89],"502":[2,1,1],"503":[5,2,41],"504":[2,2,27],"505":[2,1,11],"506":[1,2,21],"507":[1,2,22],"508":[1,1,9],"509":[1,1,1],"510":[1,1,1],"511":[1,1,1],"512":[1,1,1],"513":[1,1,1],"514":[7,1,1],"515":[1,7,78],"516":[5,7,38],"517":[2,1,41],"518":[1,1,4],"519":[1,1,4],"520":[1,1,8],"521":[1,1,9],"522":[1,1,32],"523":[1,1,1],"524":[1,1,97],"525":[1,1,16],"526":[1,1,54],"527":[2,1,52],"528":[2,1,16],"529":[4,1,1],"530":[2,4,77],"531":[3,4,21],"532":[2,4,11],"533":[2,4,80],"534":[1,1,27],"535":[1,1,10],"536":[1,1,43],"537":[1,1,13],"538":[1,1,1],"539":[1,1,1],"540":[2,1,34],"541":[1,1,13],"542":[2,1,54],"543":[2,1,60],"544":[2,1,44],"545":[1,1,80]},"averageFieldLength":[3.4560439560439566,5.245421245421248,113.95970695970692],"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":"Category table","titles":["Модель данных в базе данных","Данные",null]},"46":{"title":"Product 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":"Supabase REST API","titles":[]},"52":{"title":"Supabase SDK","titles":["Supabase REST API"]},"53":{"title":"Установка:","titles":["Supabase REST API","Supabase SDK",null]},"54":{"title":"Использование:","titles":["Supabase REST API","Supabase SDK",null]},"55":{"title":"Supabase REST API","titles":["Supabase REST API"]},"56":{"title":"Supabase","titles":[]},"57":{"title":"Создание проекта","titles":["Supabase"]},"58":{"title":"Безопасность и доступ","titles":["Supabase"]},"59":{"title":"Онлайн маркетплейс","titles":[]},"60":{"title":"Проект Arty-Crafty","titles":["Онлайн маркетплейс"]},"61":{"title":"Причины","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":"Тестирование и QA","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":"Codeium","titles":[]},"81":{"title":"Автокомплит","titles":["Codeium"]},"82":{"title":"Чат-бот","titles":["Codeium"]},"83":{"title":"Explain, Refactor, JSDoc","titles":["Codeium"]},"84":{"title":"Вывод","titles":["Codeium"]},"85":{"title":"Кастомизация","titles":[]},"86":{"title":"Персонализация","titles":["Кастомизация"]},"87":{"title":"Views","titles":["Кастомизация"]},"88":{"title":"Routes","titles":["Кастомизация"]},"89":{"title":"Header","titles":["Кастомизация"]},"90":{"title":"Sidebar","titles":["Кастомизация"]},"91":{"title":"Небольшой рефакторинг","titles":["Кастомизация"]},"92":{"title":"Избранное","titles":[]},"93":{"title":"Иконка на карточке товара","titles":["Избранное"]},"94":{"title":"Композабл useFavourites","titles":["Избранное"]},"95":{"title":"Сохранение между сессиями","titles":["Избранное"]},"96":{"title":"Бэджик","titles":["Избранное"]},"97":{"title":"Tag и CMV","titles":["Избранное"]},"98":{"title":"Создание проекта","titles":[]},"99":{"title":"Репозиторий на GitHub","titles":["Создание проекта"]},"100":{"title":"vue-webapp","titles":["Создание проекта"]},"101":{"title":"Категория товаров","titles":[]},"102":{"title":"Layout","titles":["Категория товаров"]},"103":{"title":"Данные и API","titles":["Категория товаров"]},"104":{"title":"Абстракция канала связи с бэкендом","titles":[]},"105":{"title":"API сервис","titles":["Абстракция канала связи с бэкендом"]},"106":{"title":"Аутентификация и авторизация","titles":[]},"107":{"title":"Варианты задействовать свой бэкенд для фронтендера","titles":[]},"108":{"title":"CORS","titles":[]},"109":{"title":"Протоколы. To REST или не REST?","titles":[]},"110":{"title":"Приложение: Миграция с Vue 2","titles":[]},"111":{"title":"Другой способ загрузки и запуска приложения","titles":["Приложение: Миграция с Vue 2"]},"112":{"title":"Регистрация глобальных компонентов, плагинов и так далее","titles":["Приложение: Миграция с Vue 2"]},"113":{"title":"Свойство data теперь всегда является функцией","titles":["Приложение: Миграция с Vue 2"]},"114":{"title":"Больше реактивных возможностей","titles":["Приложение: Миграция с Vue 2"]},"115":{"title":"Изменения в v-model, props и events","titles":["Приложение: Миграция с Vue 2"]},"116":{"title":"Удалена совместимость со старыми браузерами","titles":["Приложение: Миграция с Vue 2"]},"117":{"title":"Изменения в организации каталогов и файлов","titles":["Приложение: Миграция с Vue 2"]},"118":{"title":"Изменения в роутере и state manager","titles":["Приложение: Миграция с Vue 2"]},"119":{"title":"Новые компоненты и другие изменения.","titles":["Приложение: Миграция с Vue 2"]},"120":{"title":"Другие изменения","titles":["Приложение: Миграция с Vue 2"]},"121":{"title":"Итог","titles":["Приложение: Миграция с Vue 2"]},"122":{"title":"Развертывание приложения","titles":[]},"123":{"title":"Технические требования","titles":["Развертывание приложения"]},"124":{"title":"Что включает в себя публикация веб-приложения?","titles":["Развертывание приложения"]},"125":{"title":"Домены, серверы доменных имен (DNS) и записи DNS","titles":["Развертывание приложения","Что включает в себя публикация веб-приложения?"]},"126":{"title":"Размышления о создании приложения для развертывания","titles":["Развертывание приложения"]},"127":{"title":"/chapter 5/to-do SPA/src/router/index.js","titles":["Развертывание приложения","Размышления о создании приложения для развертывания","Домены, серверы доменных имен (DNS) и записи DNS",null]},"128":{"title":"Опции и конфигурации веб-сервера","titles":["Развертывание приложения"]},"129":{"title":"Конфигурация HTTP-сервера Apache","titles":["Развертывание приложения","Опции и конфигурации веб-сервера"]},"130":{"title":"/.htaccess","titles":["Развертывание приложения","Опции и конфигурации веб-сервера","Конфигурация HTTP-сервера Apache",null]},"131":{"title":"Настройка сервера Nginx","titles":["Развертывание приложения","Опции и конфигурации веб-сервера"]},"132":{"title":"/etc/nginx/sites-available/default","titles":["Развертывание приложения","Опции и конфигурации веб-сервера","Настройка сервера Nginx",null]},"133":{"title":"Другие серверы","titles":["Развертывание приложения","Опции и конфигурации веб-сервера"]},"134":{"title":"Перенос файлов на сервер","titles":["Развертывание приложения"]},"135":{"title":"Защита веб-приложения с помощью Let\'s Encrypt","titles":["Развертывание приложения"]},"136":{"title":"Подведение итогов","titles":["Развертывание приложения"]},"137":{"title":"Вопросы для проверки","titles":["Развертывание приложения"]},"138":{"title":"Фреймворк Vue 3","titles":[]},"139":{"title":"Прогрессивный фреймворк","titles":["Фреймворк Vue 3"]},"140":{"title":"Использование Vue в веб-приложении","titles":["Фреймворк Vue 3"]},"141":{"title":"Путь сборщика, лучший путь...","titles":["Фреймворк Vue 3","Использование Vue в веб-приложении"]},"142":{"title":"Понимание однофайловых компонентов","titles":["Фреймворк Vue 3"]},"143":{"title":"Разные варианты - options, composition, и script setup API","titles":["Фреймворк Vue 3"]},"144":{"title":"Изучение встроенных директив в Vue 3","titles":["Фреймворк Vue 3"]},"145":{"title":"v-bind: (сокращение ":")","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"146":{"title":"v-show","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"147":{"title":"v-if, v-else и v-else-if","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"148":{"title":"v-for и :key","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"149":{"title":"v-model","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"150":{"title":"v-on: (и сокращение @)","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"151":{"title":"Встроенные компоненты","titles":["Фреймворк Vue 3"]},"152":{"title":"Кодовые соглашения (code conventions) в книге","titles":["Фреймворк Vue 3"]},"153":{"title":"Переменные и пропсы","titles":["Фреймворк Vue 3","Кодовые соглашения (code conventions) в книге"]},"154":{"title":"Константы","titles":["Фреймворк Vue 3","Кодовые соглашения (code conventions) в книге"]},"155":{"title":"Имена классов и компонентов","titles":["Фреймворк Vue 3","Кодовые соглашения (code conventions) в книге"]},"156":{"title":"Функции, методы, события и имена файлов","titles":["Фреймворк Vue 3","Кодовые соглашения (code conventions) в книге"]},"157":{"title":"Экземпляры","titles":["Фреймворк Vue 3","Кодовые соглашения (code conventions) в книге"]},"158":{"title":"Подведение итогов","titles":["Фреймворк Vue 3"]},"159":{"title":"Вопросы для проверки","titles":["Фреймворк Vue 3"]},"160":{"title":"Бонусная глава - Шаблоны UX","titles":[]},"161":{"title":"Технические требования","titles":["Бонусная глава - Шаблоны UX"]},"162":{"title":"UI-дизайн против UX-дизайна","titles":["Бонусная глава - Шаблоны UX"]},"163":{"title":"Принципы проектирования пользовательского интерфейса","titles":["Бонусная глава - Шаблоны UX"]},"164":{"title":"Достаточный контраст или различие между элементами","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"165":{"title":"Стимулировать повторение и быть последовательным.","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"166":{"title":"Внимательно следите за выравниванием и направлением","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"167":{"title":"Используйте близость и расстояние, чтобы показать естественные группы","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"168":{"title":"Законы проектирования пользовательского интерфейса","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"169":{"title":"Закон Фитта","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"170":{"title":"Закон Хика","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"171":{"title":"Восемь правил Бена Шнайдермана","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"172":{"title":"Принципы проектирования UX","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"173":{"title":"Общие шаблоны для работы с данными","titles":["Бонусная глава - Шаблоны UX"]},"174":{"title":"Элементы ввода HTML","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными"]},"175":{"title":"Чекбоксы, радиокнопки и тумблеры","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML"]},"176":{"title":"Чипы, таблетки или теги","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML"]},"177":{"title":"Подсказки (tooltips)","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML"]},"178":{"title":"Уведомляющие точки, пузырьки, метки или значки","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML"]},"179":{"title":"Тостовые уведомления","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML"]},"180":{"title":"Карусель или слайдеры изображений","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML"]},"181":{"title":"Панели прогресса (progress bars) и спиннеры","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML"]},"182":{"title":"./components/Spinner.vue","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML","Панели прогресса (progress bars) и спиннеры"]},"183":{"title":"Пагинация (пейджер) и бесконечный скроллер","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML"]},"184":{"title":"./src/components/InfiniteScroller.vue","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML","Пагинация (пейджер) и бесконечный скроллер"]},"185":{"title":"Общие шаблоны для взаимодействия и навигации","titles":["Бонусная глава - Шаблоны UX"]},"186":{"title":"Размещение меню","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для взаимодействия и навигации","Элементы ввода HTML"]},"187":{"title":"Хлебные крошки (breadcrumbs)","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для взаимодействия и навигации","Элементы ввода HTML"]},"188":{"title":"Модальные диалоги","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для взаимодействия и навигации","Элементы ввода HTML"]},"189":{"title":"Иконки меню","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для взаимодействия и навигации","Элементы ввода HTML"]},"190":{"title":"Аккордеонные меню","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для взаимодействия и навигации","Элементы ввода HTML"]},"191":{"title":"Мегаменю","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для взаимодействия и навигации","Элементы ввода HTML"]},"192":{"title":"Выпадающие меню","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для взаимодействия и навигации","Элементы ввода HTML"]},"193":{"title":"Общие шаблоны для организации контента","titles":["Бонусная глава - Шаблоны UX"]},"194":{"title":"Отзывчивые (responsive) приложения","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для организации контента"]},"195":{"title":"Домашняя ссылка","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для организации контента"]},"196":{"title":"Главная (hero) секция, призыв к действию (call to action) и иконки социальных сетей","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для организации контента"]},"197":{"title":"Другие шаблоны","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для организации контента"]},"198":{"title":"Темные шаблоны","titles":["Бонусная глава - Шаблоны UX"]},"199":{"title":"Вопросы с подвохом","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"200":{"title":"Проникновение в корзину","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"201":{"title":"Приманка для тараканов (Roach motels)","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"202":{"title":"Privacy Zuckering","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"203":{"title":"Предотвращение сравнения цен","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"204":{"title":"Ненаправленность","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"205":{"title":"Скрытые расходы","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"206":{"title":"Приманка и подмена","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"207":{"title":"Подтверждение позора (Confirm shaming)","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"208":{"title":"Замаскированная реклама","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"209":{"title":"Дружественный спам","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"210":{"title":"Подведение итогов","titles":["Бонусная глава - Шаблоны UX"]},"211":{"title":"Вопросы для проверки","titles":["Бонусная глава - Шаблоны UX"]},"212":{"title":"Установка рабочего проекта","titles":[]},"213":{"title":"Технические требования","titles":["Установка рабочего проекта"]},"214":{"title":"Настройка проекта и инструменты","titles":["Установка рабочего проекта"]},"215":{"title":"Структура папок и её модификации","titles":["Установка рабочего проекта"]},"216":{"title":"Интеграция с CSS-фреймворками","titles":["Установка рабочего проекта"]},"217":{"title":"Фреймворк w3.css","titles":["Установка рабочего проекта","Интеграция с CSS-фреймворками"]},"218":{"title":"FontAwesome - это просто замечательно","titles":["Установка рабочего проекта"]},"219":{"title":"Опции конфигурации Vite","titles":["Установка рабочего проекта"]},"220":{"title":"Приложение To-Do","titles":["Установка рабочего проекта"]},"221":{"title":"App.vue","titles":["Установка рабочего проекта","Приложение To-Do","Фреймворк w3.css"]},"222":{"title":"ToDos.vue","titles":["Установка рабочего проекта","Приложение To-Do","Фреймворк w3.css"]},"223":{"title":"Краткая критика нашего приложения To-Do","titles":["Установка рабочего проекта","Приложение To-Do","Фреймворк w3.css"]},"224":{"title":"Подведение итогов","titles":["Установка рабочего проекта"]},"225":{"title":"Вопросы для проверки","titles":["Установка рабочего проекта"]},"226":{"title":"Одностраничные приложения","titles":[]},"227":{"title":"Технические требования","titles":["Одностраничные приложения"]},"228":{"title":"Что такое SPA?","titles":["Одностраничные приложения"]},"229":{"title":"Vue 3 роутер","titles":["Одностраничные приложения"]},"230":{"title":"Установка","titles":["Одностраничные приложения","Vue 3 роутер"]},"231":{"title":"Новое приложение To-Do","titles":["Одностраничные приложения","Vue 3 роутер"]},"232":{"title":"Определение маршрутов и объект Router","titles":["Одностраничные приложения","Vue 3 роутер"]},"233":{"title":"/src/router/index.js","titles":["Одностраничные приложения","Vue 3 роутер","Определение маршрутов и объект Router"]},"234":{"title":"/src/main.js","titles":["Одностраничные приложения","Vue 3 роутер","Определение маршрутов и объект Router"]},"235":{"title":"Шаблонные компоненты маршрутизатора","titles":["Одностраничные приложения","Vue 3 роутер"]},"236":{"title":"App.vue","titles":["Одностраничные приложения","Vue 3 роутер"]},"237":{"title":"Вложенные маршруты, именованные представления и программная навигация","titles":["Одностраничные приложения","Vue 3 роутер"]},"238":{"title":"Определение вложенных маршрутов","titles":["Одностраничные приложения","Vue 3 роутер","Вложенные маршруты, именованные представления и программная навигация"]},"239":{"title":"/src/views/Directory.vue component, lines 13-18","titles":["Одностраничные приложения","Vue 3 роутер","Вложенные маршруты, именованные представления и программная навигация"]},"240":{"title":".push()","titles":["Одностраничные приложения","Vue 3 роутер"]},"241":{"title":".replace()","titles":["Одностраничные приложения","Vue 3 роутер"]},"242":{"title":".go()","titles":["Одностраничные приложения","Vue 3 роутер"]},"243":{"title":"Исследование шаблонов аутентификации","titles":["Одностраничные приложения"]},"244":{"title":"Простая аутентификация по имени пользователя и паролю","titles":["Одностраничные приложения","Исследование шаблонов аутентификации"]},"245":{"title":"OpenID и сторонняя аутентификация","titles":["Одностраничные приложения","Исследование шаблонов аутентификации"]},"246":{"title":"1.","titles":["Одностраничные приложения","Исследование шаблонов аутентификации"]},"247":{"title":"2.","titles":["Одностраничные приложения","Исследование шаблонов аутентификации"]},"248":{"title":"3.","titles":["Одностраничные приложения","Исследование шаблонов аутентификации"]},"249":{"title":"Беспарольная аутентификация или аутентификация по одноразовому паролю (OTP)","titles":["Одностраничные приложения","Исследование шаблонов аутентификации"]},"250":{"title":"2FA - двухфакторная аутентификация","titles":["Одностраничные приложения","Исследование шаблонов аутентификации"]},"251":{"title":"Web3-аутентификация","titles":["Одностраничные приложения","Исследование шаблонов аутентификации"]},"252":{"title":"Подведение итогов","titles":["Одностраничные приложения"]},"253":{"title":"Вопросы для проверки","titles":["Одностраничные приложения"]},"254":{"title":"Прогрессивные веб-приложения","titles":[]},"255":{"title":"Технические требования","titles":["Прогрессивные веб-приложения"]},"256":{"title":"PWA или устанавливаемые SPA","titles":["Прогрессивные веб-приложения"]},"257":{"title":"Увеличение SPA до уровня PWA","titles":["Прогрессивные веб-приложения"]},"258":{"title":"Файл манифеста","titles":["Прогрессивные веб-приложения","Увеличение SPA до уровня PWA"]},"259":{"title":"Необходимо:","titles":["Прогрессивные веб-приложения","Увеличение SPA до уровня PWA","Файл манифеста"]},"260":{"title":"Рекомендуется:","titles":["Прогрессивные веб-приложения","Увеличение SPA до уровня PWA","Файл манифеста"]},"261":{"title":"Описательные:","titles":["Прогрессивные веб-приложения","Увеличение SPA до уровня PWA","Файл манифеста"]},"262":{"title":"Тестирование манифеста","titles":["Прогрессивные веб-приложения","Увеличение SPA до уровня PWA"]},"263":{"title":"Подсказка к установке (Install prompt)","titles":["Прогрессивные веб-приложения","Увеличение SPA до уровня PWA"]},"264":{"title":"Service workers","titles":["Прогрессивные веб-приложения"]},"265":{"title":"Плагин Vite-PWA","titles":["Прогрессивные веб-приложения"]},"266":{"title":"Тестирование показателей PWA с помощью Google Lighthouse","titles":["Прогрессивные веб-приложения"]},"267":{"title":"Подведение итогов","titles":["Прогрессивные веб-приложения"]},"268":{"title":"Вопросы для проверки","titles":["Прогрессивные веб-приложения"]},"269":{"title":"Композиция пользовательского интерфейса с помощью компонентов","titles":[]},"270":{"title":"Технические требования","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"271":{"title":"Составление страницы с помощью компонентов","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"272":{"title":"Этап 1 - определение макетов и элементов пользовательского интерфейса","titles":["Композиция пользовательского интерфейса с помощью компонентов","Составление страницы с помощью компонентов"]},"273":{"title":"Шаг 2 - определение связей, потока данных, взаимодействий и событий","titles":["Композиция пользовательского интерфейса с помощью компонентов","Составление страницы с помощью компонентов"]},"274":{"title":"Шаг 3 - определение элементов пользовательской интерактивности (входов, диалогов, уведомлений и т.д.)","titles":["Композиция пользовательского интерфейса с помощью компонентов","Составление страницы с помощью компонентов"]},"275":{"title":"Шаг 4 - выявление шаблонов проектирования и компромиссов","titles":["Композиция пользовательского интерфейса с помощью компонентов","Составление страницы с помощью компонентов"]},"276":{"title":"Компоненты в деталях","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"277":{"title":"Локальные и глобальные компоненты","titles":["Композиция пользовательского интерфейса с помощью компонентов","Компоненты в деталях"]},"278":{"title":"Статический, асинхронный и динамический импорт","titles":["Композиция пользовательского интерфейса с помощью компонентов","Компоненты в деталях"]},"279":{"title":"Пропсы, события и директива v-model","titles":["Композиция пользовательского интерфейса с помощью компонентов","Компоненты в деталях"]},"280":{"title":"Настраиваемые контроллеры ввода","titles":["Композиция пользовательского интерфейса с помощью компонентов","Компоненты в деталях"]},"281":{"title":"Инъекция зависимости с помощью Provide и Inject","titles":["Композиция пользовательского интерфейса с помощью компонентов","Компоненты в деталях"]},"282":{"title":"Специальные компоненты","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"283":{"title":"Слоты, слоты и еще раз слоты...","titles":["Композиция пользовательского интерфейса с помощью компонентов","Специальные компоненты"]},"284":{"title":"Композабл функции (composables) и миксины","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"285":{"title":"Динамические компоненты с помощью "component :is"","titles":["Композиция пользовательского интерфейса с помощью компонентов","Композабл функции (composables) и миксины"]},"286":{"title":"Реальный пример - плагин модалов","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"287":{"title":"Настройка нашего проекта","titles":["Композиция пользовательского интерфейса с помощью компонентов","Реальный пример - плагин модалов"]},"288":{"title":"Конструкция","titles":["Композиция пользовательского интерфейса с помощью компонентов","Реальный пример - плагин модалов"]},"289":{"title":"Реализация","titles":["Композиция пользовательского интерфейса с помощью компонентов","Реальный пример - плагин модалов"]},"290":{"title":"Реализация нашего нового приложения To-Do","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"291":{"title":"Небольшая критика нашего нового приложения To-Do","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"292":{"title":"Подведение итогов","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"293":{"title":"Вопросы для проверки","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"294":{"title":"Принципы и шаблоны проектирования программного обеспечения","titles":[]},"295":{"title":"Каковы принципы проектирования программного обеспечения?","titles":["Принципы и шаблоны проектирования программного обеспечения"]},"296":{"title":"Неполный список принципов проектирования","titles":["Принципы и шаблоны проектирования программного обеспечения"]},"297":{"title":"Separation of concerns (Разделение ответственности)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"298":{"title":"Composition over inheritance (Композиция над наследованием)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"299":{"title":"Single responsibility principle (Принцип единой ответственности)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"300":{"title":"Encapsulation (Инкапсуляция)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"301":{"title":"KIC - keep it clean","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"302":{"title":"DRY – don’t repeat yourself (не повторяйся)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"303":{"title":"KISS - keep it simple and short (держи это простым и коротким)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"304":{"title":"Code for the next (Пиши код для следующего)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"305":{"title":"Что такое шаблон проектирования программного обеспечения?","titles":["Принципы и шаблоны проектирования программного обеспечения"]},"306":{"title":"Краткий справочный список шаблонов","titles":["Принципы и шаблоны проектирования программного обеспечения"]},"307":{"title":"Порождающие шаблоны","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Code for the next (Пиши код для следующего)"]},"308":{"title":"Поведенческие шаблоны","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Code for the next (Пиши код для следующего)"]},"309":{"title":"Структурные шаблоны","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Code for the next (Пиши код для следующего)"]},"310":{"title":"Асинхронные шаблоны","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Code for the next (Пиши код для следующего)"]},"311":{"title":"Шаблон Singleton","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"312":{"title":"Когда его использовать","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Singleton"]},"313":{"title":"Реализация","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Singleton"]},"314":{"title":"Метод 1","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Singleton","Реализация"]},"315":{"title":"Метод 2","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Singleton","Реализация"]},"316":{"title":"Шаблон Dependency injection (инъекция зависимостей)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"317":{"title":"./chapter 2/dependency-injection-1.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"318":{"title":"./chapter 2/dependency-injection-2.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"319":{"title":"./chapter 2/dependency-injection-3.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"320":{"title":"./chapter 2/dependency-injection-4.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"321":{"title":"./chapter 2/dependency-injection-5.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"322":{"title":"./chapter 2/dependency-injection-6.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"323":{"title":"./chapter 2/dependency-injection-7.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"324":{"title":"Шаблон factory (фабрика)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"325":{"title":"Шаблон Observer (наблюдатель)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"326":{"title":"./chapter 2/Observer-1.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Observer (наблюдатель)"]},"327":{"title":"Шаблон Command (команда)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"328":{"title":"./chapter 2/Command-1.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Command (команда)"]},"329":{"title":"Шаблон Proxy","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"330":{"title":"./chapter 2/proxy-1.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Proxy"]},"331":{"title":"Шаблон Decorator (декоратор)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"332":{"title":"./chapter 2/decorator-1.vue","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Decorator (декоратор)"]},"333":{"title":"./chapter 2/decorator-2.vue","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Decorator (декоратор)"]},"334":{"title":"Шаблон Façade (фасад)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"335":{"title":"Шаблон Callback (обратный вызов)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"336":{"title":"./chapter 2/callback-1.js - Синхронный Фибоначчи","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Callback (обратный вызов)"]},"337":{"title":"Шаблон Promise (обещаниe)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"338":{"title":"Подведение итогов","titles":["Принципы и шаблоны проектирования программного обеспечения"]},"339":{"title":"Вопросы для проверки","titles":["Принципы и шаблоны проектирования программного обеспечения"]},"340":{"title":"Управление потоками данных","titles":[]},"341":{"title":"Технические требования","titles":["Управление потоками данных"]},"342":{"title":"Основное взаимодействие компонентов","titles":["Управление потоками данных"]},"343":{"title":"/basic/ParentBasic.vue","titles":["Управление потоками данных","Основное взаимодействие компонентов",null,null,null]},"344":{"title":"/basic/Child.vue","titles":["Управление потоками данных","Основное взаимодействие компонентов",null,null,null]},"345":{"title":"Реализация шины событий с помощью шаблонов Singleton и Observer","titles":["Управление потоками данных"]},"346":{"title":"/services/MessageBus.js","titles":["Управление потоками данных","Реализация шины событий с помощью шаблонов Singleton и Observer",null,null]},"347":{"title":"/bus/Child.vue","titles":["Управление потоками данных","Реализация шины событий с помощью шаблонов Singleton и Observer",null,null]},"348":{"title":"Реализация базового реактивного состояния","titles":["Управление потоками данных"]},"349":{"title":"/service/SimpleState.js","titles":["Управление потоками данных","Реализация базового реактивного состояния",null,null]},"350":{"title":"Реализация мощного реактивного стора с помощью Pinia","titles":["Управление потоками данных"]},"351":{"title":"Options API basic store","titles":["Управление потоками данных","Реализация мощного реактивного стора с помощью Pinia",null,null]},"352":{"title":"/stores/counter.js","titles":["Управление потоками данных","Реализация мощного реактивного стора с помощью Pinia",null,null]},"353":{"title":"./main.js","titles":["Управление потоками данных","Реализация мощного реактивного стора с помощью Pinia",null,null]},"354":{"title":"/pinia/ChildPinia.vue","titles":["Управление потоками данных","Реализация мощного реактивного стора с помощью Pinia",null,null]},"355":{"title":"Хранилища данных браузера - сессионные, локальные и IndexedDB","titles":["Управление потоками данных"]},"356":{"title":"Экспериментируем с шаблонами reactivity и Proxies","titles":["Управление потоками данных"]},"357":{"title":"/services/sessionStorage.js","titles":["Управление потоками данных","Экспериментируем с шаблонами reactivity и Proxies",null,null]},"358":{"title":"/session_storage/ChildSession.vue","titles":["Управление потоками данных","Экспериментируем с шаблонами reactivity и Proxies",null,null]},"359":{"title":"Подведение итогов","titles":["Управление потоками данных"]},"360":{"title":"Вопросы для проверки","titles":["Управление потоками данных"]},"361":{"title":"Vue.js 3 - Шаблоны проектирования и лучшие практики","titles":[]},"362":{"title":"Здесь представлен перевод книги "Vue.js 3 - Design Patterns and Best Practices" на русский язык","titles":["Vue.js 3 - Шаблоны проектирования и лучшие практики",null,null]},"363":{"title":"Предисловие","titles":["Vue.js 3 - Шаблоны проектирования и лучшие практики"]},"364":{"title":"Для кого эта книга","titles":["Vue.js 3 - Шаблоны проектирования и лучшие практики"]},"365":{"title":"Чтобы получить максимальную пользу от этой книги","titles":["Vue.js 3 - Шаблоны проектирования и лучшие практики"]},"366":{"title":"Купить книгу","titles":["Vue.js 3 - Шаблоны проектирования и лучшие практики"]},"367":{"title":"Скачать файлы кода примеров","titles":["Vue.js 3 - Шаблоны проектирования и лучшие практики"]},"368":{"title":"Код в действии","titles":["Vue.js 3 - Шаблоны проектирования и лучшие практики"]},"369":{"title":"Что включает в себя эта книга","titles":[]},"370":{"title":"Глава 1, Фреймворк Vue 3","titles":["Что включает в себя эта книга",null]},"371":{"title":"Глава 2, Принципы и шаблоны проектирования программного обеспечения","titles":["Что включает в себя эта книга",null]},"372":{"title":"Глава 3, Создание рабочего проекта","titles":["Что включает в себя эта книга",null]},"373":{"title":"Глава 4, Композиция пользовательского интерфейса с помощью компонентов","titles":["Что включает в себя эта книга",null]},"374":{"title":"Глава 5, Одностраничные приложения","titles":["Что включает в себя эта книга",null]},"375":{"title":"Глава 6, Прогрессивные веб-приложения","titles":["Что включает в себя эта книга",null]},"376":{"title":"Глава 7, Управление потоками данных","titles":["Что включает в себя эта книга",null]},"377":{"title":"Глава 8, Многопоточность с помощью web-workers","titles":["Что включает в себя эта книга",null]},"378":{"title":"Глава 9, Тестирование и контроль исходных текстов","titles":["Что включает в себя эта книга",null]},"379":{"title":"Глава 10, Развертывание приложения","titles":["Что включает в себя эта книга",null]},"380":{"title":"Глава 11, UX Patterns","titles":["Что включает в себя эта книга",null]},"381":{"title":"Приложение: Миграция с Vue 2 на Vue 3","titles":["Что включает в себя эта книга",null]},"382":{"title":"Многопоточность с Web Workers","titles":[]},"383":{"title":"Технические требования","titles":["Многопоточность с Web Workers"]},"384":{"title":"Введение в Web workers","titles":["Многопоточность с Web Workers"]},"385":{"title":"Реализация web worker","titles":["Многопоточность с Web Workers","Введение в Web workers"]},"386":{"title":"./my_worker.js","titles":["Многопоточность с Web Workers","Введение в Web workers","Реализация web worker",null]},"387":{"title":"./main.js","titles":["Многопоточность с Web Workers","Введение в Web workers","Реализация web worker",null]},"388":{"title":"Шаблон Business delegate","titles":["Многопоточность с Web Workers"]},"389":{"title":"Шаблон Dispatcher","titles":["Многопоточность с Web Workers"]},"390":{"title":"Установка конвейера взаимодействия с веб-рабочим","titles":["Многопоточность с Web Workers"]},"391":{"title":"./services/WebWorker.js","titles":["Многопоточность с Web Workers","Установка конвейера взаимодействия с веб-рабочим","Реализация web worker",null]},"392":{"title":"./webworker/index.js","titles":["Многопоточность с Web Workers","Установка конвейера взаимодействия с веб-рабочим","Реализация web worker",null]},"393":{"title":"./webworker/services/test.js","titles":["Многопоточность с Web Workers","Установка конвейера взаимодействия с веб-рабочим","Реализация web worker",null]},"394":{"title":"Получение доступа к IndexedDB с помощью DexieJS в web worker.","titles":["Многопоточность с Web Workers"]},"395":{"title":"/src/components/DbNotes.vue","titles":["Многопоточность с Web Workers","Получение доступа к IndexedDB с помощью DexieJS в web worker.","Реализация web worker",null]},"396":{"title":"./src/webworker/services/dbService.js","titles":["Многопоточность с Web Workers","Получение доступа к IndexedDB с помощью DexieJS в web worker.","Реализация web worker",null]},"397":{"title":"./src/webworker/index.js","titles":["Многопоточность с Web Workers","Получение доступа к IndexedDB с помощью DexieJS в web worker.","Реализация web worker",null]},"398":{"title":"./webworker/services/network.js","titles":["Многопоточность с Web Workers","Получение доступа к IndexedDB с помощью DexieJS в web worker.","Реализация web worker",null]},"399":{"title":"./webworker/index.js","titles":["Многопоточность с Web Workers","Получение доступа к IndexedDB с помощью DexieJS в web worker.","Реализация web worker",null]},"400":{"title":"./src/components/NetworkCommunication.vue","titles":["Многопоточность с Web Workers","Получение доступа к IndexedDB с помощью DexieJS в web worker.","Реализация web worker",null]},"401":{"title":"Простой NodeJS-сервер для тестирования","titles":["Многопоточность с Web Workers"]},"402":{"title":"./server/index.js","titles":["Многопоточность с Web Workers","Простой NodeJS-сервер для тестирования","Реализация web worker",null]},"403":{"title":"Подведение итогов","titles":["Многопоточность с Web Workers"]},"404":{"title":"Вопросы для проверки","titles":["Многопоточность с Web Workers"]},"405":{"title":"Тестирование и системы контроля версий","titles":[]},"406":{"title":"Технические требования","titles":["Тестирование и системы контроля версий"]},"407":{"title":"Что такое тестирование и TDD","titles":["Тестирование и системы контроля версий"]},"408":{"title":"Что тестировать","titles":["Тестирование и системы контроля версий"]},"409":{"title":"Наш базовый пример приложения","titles":["Тестирование и системы контроля версий"]},"410":{"title":"Установка и использование Vitest","titles":["Тестирование и системы контроля версий"]},"411":{"title":"/src/tests/Fibonacci.test.js","titles":["Тестирование и системы контроля версий","Установка и использование Vitest",null,null]},"412":{"title":"Специальный случай утверждения - намеренная ошибка","titles":["Тестирование и системы контроля версий"]},"413":{"title":"Специальный случай утверждения - асинхронный код","titles":["Тестирование и системы контроля версий"]},"414":{"title":"Установка Vue Test Utils","titles":["Тестирование и системы контроля версий"]},"415":{"title":"/src/tests/FibonacciOutput.test.js","titles":["Тестирование и системы контроля версий","Установка Vue Test Utils",null,null]},"416":{"title":"/src/tests/FibonacciInput.test.js","titles":["Тестирование и системы контроля версий","Установка Vue Test Utils",null,null]},"417":{"title":"In-source тестирование","titles":["Тестирование и системы контроля версий"]},"418":{"title":"Покрытие","titles":["Тестирование и системы контроля версий"]},"419":{"title":"Интерфейс Vitest","titles":["Тестирование и системы контроля версий"]},"420":{"title":"Что такое source control и зачем он нужен?","titles":["Тестирование и системы контроля версий"]},"421":{"title":"Управление исходными текстами с помощью Git","titles":["Тестирование и системы контроля версий"]},"422":{"title":"Установка в системах Windows","titles":["Тестирование и системы контроля версий"]},"423":{"title":"Установка в системах Linux","titles":["Тестирование и системы контроля версий"]},"424":{"title":"Установка в системах macOS","titles":["Тестирование и системы контроля версий"]},"425":{"title":"Использование Git","titles":["Тестирование и системы контроля версий"]},"426":{"title":"/chapter 10/.gitignore","titles":["Тестирование и системы контроля версий","Использование Git",null,null]},"427":{"title":"Управление ветвями и слияниями","titles":["Тестирование и системы контроля версий"]},"428":{"title":"Конфликты при слиянии","titles":["Тестирование и системы контроля версий"]},"429":{"title":"Работа с удаленными репозиториями","titles":["Тестирование и системы контроля версий"]},"430":{"title":"Непрерывная интеграция и доставка","titles":["Тестирование и системы контроля версий"]},"431":{"title":"Подведение итогов","titles":["Тестирование и системы контроля версий"]},"432":{"title":"Вопросы для проверки","titles":["Тестирование и системы контроля версий"]},"433":{"title":"CI/CD","titles":[]},"434":{"title":"Docker","titles":[]},"435":{"title":"Github Actions","titles":[]},"436":{"title":"Архитектурные решения","titles":[]},"437":{"title":"Use cases","titles":["Архитектурные решения",null]},"438":{"title":"Лучшие практики и соображения","titles":["Архитектурные решения",null]},"439":{"title":"Хостинг","titles":[]},"440":{"title":"Ресурсы приложения","titles":[]},"441":{"title":"BaseIcon","titles":["Ресурсы приложения",null,null]},"442":{"title":"icons.js","titles":["Ресурсы приложения",null,null]},"443":{"title":"Создание и сборка приложения","titles":[]},"444":{"title":"Настройка IDE","titles":[]},"445":{"title":"Подскажите удобную библиотеку","titles":[]},"446":{"title":"Полезные советы","titles":[]},"447":{"title":"Карусель или слайдер","titles":["Полезные советы",null]},"448":{"title":"Дата и время","titles":["Полезные советы",null]},"449":{"title":"State management во Vue 3","titles":[]},"450":{"title":"Тестирование","titles":[]},"451":{"title":"О фронтенд фреймворках","titles":[]},"452":{"title":"Архитектура фронтэнд приложений","titles":[]},"453":{"title":"Избегайте зависимостей","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"454":{"title":"Используйте обертки над компонентами UI библиотек и сторонних утилит","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"455":{"title":"Регулярный рефакторинг","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"456":{"title":"Используйте CSS3","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"457":{"title":"Используйте современные стандарты и возможности языков","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"458":{"title":"Документируйте проект","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"459":{"title":"CSS и UI библиотеки","titles":[]},"460":{"title":"Изучение Vue","titles":[]},"461":{"title":"SPA, PWA, SSG, SSR и SEO","titles":[]},"462":{"title":"История изменений","titles":[]},"463":{"title":"v1.4 (24-11-2023)","titles":["История изменений"]},"464":{"title":"Новое","titles":["История изменений","v1.4 (24-11-2023)",null]},"465":{"title":"Изменено","titles":["История изменений","v1.4 (24-11-2023)",null]},"466":{"title":"v1.3 (10-10-2023)","titles":["История изменений"]},"467":{"title":"Изменено","titles":["История изменений","v1.3 (10-10-2023)",null]},"468":{"title":"v1.2 (27-09-2023)","titles":["История изменений"]},"469":{"title":"Новое","titles":["История изменений","v1.2 (27-09-2023)",null]},"470":{"title":"Изменено","titles":["История изменений","v1.2 (27-09-2023)",null]},"471":{"title":"v1.1 (15-09-2023)","titles":["История изменений"]},"472":{"title":"Новое","titles":["История изменений","v1.1 (15-09-2023)"]},"473":{"title":"Изменено","titles":["История изменений","v1.1 (15-09-2023)"]},"474":{"title":"v1.0 (11-09-2023)","titles":["История изменений"]},"475":{"title":"Новое","titles":["История изменений","v1.0 (11-09-2023)"]},"476":{"title":"Шпаргалки (Cheat Sheet)","titles":[]},"477":{"title":"Vue","titles":["Шпаргалки (Cheat Sheet)",null]},"478":{"title":"JavaScript","titles":["Шпаргалки (Cheat Sheet)",null]},"479":{"title":"HTML","titles":["Шпаргалки (Cheat Sheet)",null]},"480":{"title":"CSS","titles":["Шпаргалки (Cheat Sheet)",null]},"481":{"title":"Typescript","titles":["Шпаргалки (Cheat Sheet)",null]},"482":{"title":"Markdown","titles":["Шпаргалки (Cheat Sheet)",null]},"483":{"title":"Внесите лепту в развитие данного ресурса","titles":[]},"484":{"title":"Глоссарий и сокращения","titles":[]},"485":{"title":"Предисловие","titles":[]},"486":{"title":"У нас есть Телеграм канал","titles":["Предисловие",null]},"487":{"title":"Участие в проекте","titles":[]},"488":{"title":"Установка","titles":[]},"489":{"title":"Установка через create vue-webapp","titles":["Установка"]},"490":{"title":"Инициализация и запуск веб приложения","titles":["Установка","Установка через create vue-webapp"]},"491":{"title":"Установка из репозитория","titles":["Установка"]},"492":{"title":"Принципы","titles":[]},"493":{"title":"Vue 3 webapp билдер","titles":[]},"494":{"title":"Краткое описание","titles":["Vue 3 webapp билдер"]},"495":{"title":"Обоснование","titles":["Vue 3 webapp билдер"]},"496":{"title":"Цели","titles":[]},"497":{"title":"Адаптивность","titles":[]},"498":{"title":"BaseIcon","titles":[]},"499":{"title":"API модуль","titles":[]},"500":{"title":"API (REST)","titles":["API модуль"]},"501":{"title":"JSON-RPC","titles":["API модуль"]},"502":{"title":"Детали реализации","titles":[]},"503":{"title":"Инъекции кода в index.html","titles":["Детали реализации"]},"504":{"title":"CSS tricks","titles":["Детали реализации"]},"505":{"title":"Navigation drawers","titles":[]},"506":{"title":"SimpleDrawer","titles":["Navigation drawers"]},"507":{"title":"TouchSlideoutDrawer","titles":["Navigation drawers"]},"508":{"title":"Footers","titles":[]},"509":{"title":"SimpleFooter","titles":["Footers"]},"510":{"title":"RichFooter","titles":["Footers"]},"511":{"title":"MantineSimpleFooter","titles":["Footers"]},"512":{"title":"MantineRichFooter","titles":["Footers"]},"513":{"title":"DistributedFooter","titles":["Footers"]},"514":{"title":"Github Actions сценарий для развертывания на Github Pages","titles":[]},"515":{"title":"Deployment","titles":["Github Actions сценарий для развертывания на Github Pages"]},"516":{"title":"Настройка base в Vite конфиге","titles":["Github Actions сценарий для развертывания на Github Pages"]},"517":{"title":"Google analytics","titles":[]},"518":{"title":"Headers","titles":[]},"519":{"title":"SimpleHeader","titles":["Headers"]},"520":{"title":"MantineSimpleHeader","titles":["Headers"]},"521":{"title":"MantineLayeredHeader","titles":["Headers"]},"522":{"title":"SlidingHeader","titles":["Headers"]},"523":{"title":"i18n","titles":[]},"524":{"title":"i18next","titles":["i18n"]},"525":{"title":"useI18nLight","titles":["i18n"]},"526":{"title":"Использование","titles":["i18n"]},"527":{"title":"i18next расширения","titles":["i18n"]},"528":{"title":"В итоге","titles":["i18n"]},"529":{"title":"Опции при создании приложения","titles":[]},"530":{"title":"Доступные опции","titles":["Опции при создании приложения"]},"531":{"title":"Доступно по умолчанию","titles":["Опции при создании приложения"]},"532":{"title":"В разработке","titles":["Опции при создании приложения"]},"533":{"title":"В планах","titles":["Опции при создании приложения"]},"534":{"title":"MainLayout","titles":[]},"535":{"title":"Routing","titles":["MainLayout"]},"536":{"title":"OneColumnLayout","titles":[]},"537":{"title":"Navbar","titles":[]},"538":{"title":"SimpleNavbar","titles":["Navbar"]},"539":{"title":"MantineSimpleNavbar","titles":["Navbar"]},"540":{"title":"Google analytics","titles":[]},"541":{"title":"PWA","titles":[]},"542":{"title":"manifest.json","titles":["PWA"]},"543":{"title":"Service worker","titles":["PWA"]},"544":{"title":"Splash screen","titles":[]},"545":{"title":"Темы","titles":[]}},"dirtCount":0,"index":[["^",{"2":{"444":1}}],["^20",{"2":{"443":1}}],["^index",{"2":{"130":1}}],["||",{"2":{"517":1}}],["|",{"2":{"435":4,"444":1}}],["🚀",{"2":{"435":1}}],["🛎️",{"2":{"435":1}}],["`~",{"2":{"444":1}}],["`$",{"2":{"441":4}}],["`",{"2":{"347":1,"435":3,"440":1}}],["`sent",{"2":{"347":1}}],["ютюбе",{"2":{"460":1}}],["ютюба",{"2":{"460":1}}],["ю",{"2":{"451":1}}],["юнит",{"2":{"413":1,"415":1}}],["юридическую",{"2":{"244":1}}],["юзер",{"2":{"106":1}}],["└────",{"2":{"187":1}}],["└──",{"2":{"187":3}}],["86",{"2":{"545":1}}],["8",{"0":{"377":1},"2":{"177":1,"213":1,"243":1,"250":1,"254":1,"266":1,"302":1,"305":1,"328":1,"330":3,"334":2,"336":2,"355":2,"383":1,"384":3,"388":1,"390":1,"391":2,"393":1,"394":1,"399":2,"402":2,"425":1,"435":2}}],["800",{"2":{"171":1}}],["80",{"2":{"81":1,"132":1}}],["щелкает",{"2":{"261":1}}],["щелкать",{"2":{"220":1}}],["щелкнуть",{"2":{"220":1}}],["щелчку",{"2":{"249":1}}],["щелчке",{"2":{"231":1,"290":1}}],["щелчком",{"2":{"191":1,"192":1,"290":1}}],["щелчок",{"2":{"177":1,"290":1,"395":1}}],["щепоткой",{"2":{"139":1}}],["№",{"2":{"176":1}}],["zero",{"2":{"444":1}}],["zip",{"2":{"218":2}}],["zuckering",{"0":{"202":1}}],["z",{"2":{"171":1,"195":1}}],["56",{"2":{"545":1}}],["58",{"2":{"444":1}}],["55",{"2":{"411":3,"413":1,"415":2}}],["512x512",{"2":{"265":2}}],["5rem",{"2":{"221":1}}],["50кб",{"2":{"448":1}}],["50",{"2":{"182":1,"347":1,"355":1,"411":1,"528":1}}],["5",{"0":{"127":1,"321":1,"374":1},"2":{"118":1,"126":2,"148":2,"171":1,"175":1,"184":2,"188":1,"218":1,"222":4,"228":1,"231":3,"233":2,"237":1,"239":1,"242":1,"244":4,"245":1,"248":1,"249":2,"250":1,"263":1,"278":1,"283":1,"284":2,"285":2,"289":2,"322":1,"326":1,"327":1,"330":1,"337":1,"347":2,"350":1,"351":2,"352":2,"355":1,"357":2,"380":1,"390":1,"391":2,"392":2,"395":1,"396":2,"398":1,"402":2,"412":2,"416":2,"418":1,"429":1,"435":3}}],["67",{"2":{"384":1,"545":3}}],["64",{"2":{"213":1,"422":1}}],["60000",{"2":{"278":1}}],["600",{"2":{"194":1}}],["600px",{"2":{"194":1}}],["60",{"2":{"164":2,"249":1,"250":1,"303":1,"384":1,"545":6}}],["6",{"0":{"322":1,"375":1},"2":{"116":1,"125":1,"175":1,"220":1,"222":4,"228":1,"245":1,"261":2,"262":1,"263":4,"264":2,"265":4,"266":3,"284":2,"288":1,"322":1,"323":2,"329":1,"330":1,"347":2,"352":2,"357":2,"358":1,"391":2,"392":2,"393":1,"395":2,"396":2,"402":2,"416":2,"419":1,"545":1}}],["78",{"2":{"545":1}}],["78919d98ece0",{"2":{"256":1}}],["767",{"2":{"497":1}}],["70",{"2":{"460":2,"525":1}}],["77",{"2":{"330":1}}],["7",{"0":{"323":1,"376":1},"2":{"116":2,"118":1,"143":1,"176":1,"236":1,"249":1,"254":1,"263":1,"266":1,"273":1,"283":1,"290":1,"316":1,"322":1,"323":1,"330":2,"331":1,"342":2,"345":1,"347":1,"348":1,"350":1,"358":3,"391":2,"392":2,"394":1,"402":2,"422":1}}],["7542",{"2":{"88":1}}],["400",{"2":{"522":1}}],["401",{"2":{"106":2}}],["480",{"2":{"497":1}}],["4",{"0":{"275":1,"320":1,"373":1,"463":1},"1":{"464":1,"465":1},"2":{"115":1,"125":1,"132":2,"142":2,"148":1,"149":1,"167":2,"169":1,"171":1,"184":2,"217":1,"220":1,"222":6,"229":1,"230":1,"233":2,"239":1,"248":1,"263":1,"272":2,"273":1,"274":1,"281":2,"283":1,"284":2,"288":1,"289":6,"290":3,"298":1,"301":1,"322":1,"323":1,"325":1,"326":1,"330":1,"331":1,"332":1,"337":3,"343":2,"344":3,"347":2,"348":1,"351":2,"352":2,"354":2,"357":2,"364":1,"365":1,"388":1,"391":2,"392":2,"395":1,"396":2,"402":2,"415":2,"416":2,"418":1,"429":1,"442":2,"444":1,"460":1}}],["90",{"2":{"266":1}}],["9",{"0":{"378":1},"2":{"134":1,"177":1,"189":1,"213":1,"215":1,"330":1,"336":2,"337":1,"391":2,"402":2,"409":2,"418":3,"419":1,"422":1,"425":1,"426":3,"428":1}}],["99",{"2":{"109":1,"449":3}}],["95",{"2":{"106":1,"445":1,"448":1}}],["09",{"0":{"468":1,"471":1,"474":1},"1":{"469":1,"470":1,"472":1,"473":1,"475":1}}],["04",{"2":{"213":1,"444":1}}],["0deg",{"2":{"182":1}}],["06c9c9",{"2":{"182":1}}],["000",{"2":{"261":1}}],["0001",{"2":{"125":1}}],["000000",{"2":{"265":1}}],["0000",{"2":{"125":7}}],["0",{"0":{"474":1},"1":{"475":1},"2":{"109":1,"125":12,"182":1,"213":1,"222":4,"228":3,"233":1,"245":2,"249":1,"251":1,"285":1,"325":1,"326":1,"330":1,"335":2,"336":2,"337":1,"343":1,"349":1,"351":2,"352":2,"411":2,"416":6,"435":5,"461":2,"501":2,"545":5}}],["ждать",{"2":{"249":2,"250":1,"411":1}}],["жив",{"2":{"393":2}}],["живом",{"2":{"379":1}}],["живой",{"2":{"215":1,"417":1}}],["живого",{"2":{"214":1,"415":1,"419":1}}],["живущий",{"2":{"106":1}}],["жирным",{"2":{"199":1}}],["жирный",{"2":{"166":1}}],["жизненно",{"2":{"304":1}}],["жизненного",{"2":{"143":1,"236":1,"284":1,"301":2,"321":1,"347":1}}],["жизненный",{"2":{"264":1,"301":1}}],["жизнь",{"2":{"215":1,"435":1,"451":1}}],["жизни",{"2":{"106":4,"355":1}}],["жить",{"2":{"139":1}}],["железу",{"2":{"461":1}}],["железо",{"2":{"461":1}}],["желаемым",{"2":{"405":1}}],["желаемых",{"2":{"222":1}}],["желающих",{"2":{"487":1}}],["желаю",{"2":{"368":1}}],["желательно",{"2":{"95":1,"213":1,"347":1,"460":1}}],["желании",{"2":{"40":1,"492":1,"496":1,"500":1}}],["желание",{"2":{"25":1}}],["жесткие",{"2":{"443":1}}],["жестким",{"2":{"135":1}}],["жестко",{"2":{"323":1,"451":1}}],["жесткое",{"2":{"318":1,"355":1}}],["же",{"2":{"3":1,"11":1,"12":1,"16":1,"23":1,"26":2,"33":1,"35":1,"41":1,"44":1,"48":1,"55":1,"61":1,"88":1,"93":2,"94":1,"106":2,"114":1,"115":1,"116":2,"122":1,"125":3,"126":1,"127":1,"128":1,"139":4,"141":1,"143":3,"147":1,"149":1,"160":2,"162":1,"165":2,"166":1,"167":1,"169":2,"171":1,"173":1,"176":1,"180":1,"189":1,"192":1,"194":1,"199":1,"215":1,"218":1,"221":1,"222":3,"228":1,"229":1,"233":1,"241":1,"243":1,"244":1,"245":1,"251":3,"254":1,"256":2,"258":1,"263":1,"270":1,"281":1,"283":1,"286":1,"295":1,"297":2,"299":1,"302":2,"304":2,"314":1,"315":1,"317":1,"318":1,"320":1,"321":2,"324":1,"326":3,"329":5,"330":2,"331":4,"332":1,"333":1,"334":1,"336":1,"337":1,"342":1,"344":1,"345":2,"347":2,"348":1,"349":2,"351":1,"352":3,"355":5,"357":1,"358":1,"382":1,"384":2,"387":1,"402":2,"407":1,"408":1,"410":2,"411":1,"413":1,"414":1,"416":3,"418":1,"420":2,"421":1,"429":2,"435":1,"436":2,"439":1,"444":1,"448":1,"449":3,"450":2,"451":1,"452":1,"454":1,"460":1,"461":1,"495":1,"500":1,"501":1,"503":1,"515":1,"524":1}}],["yandex",{"2":{"461":1}}],["yamllint",{"2":{"444":2}}],["yaml",{"2":{"435":7,"444":7}}],["yarnrc",{"2":{"444":2}}],["yarn",{"2":{"426":2,"443":1,"444":4}}],["y=ref",{"2":{"284":1}}],["yellow",{"2":{"236":1}}],["yes",{"2":{"100":6,"489":8,"494":4}}],["y",{"2":{"214":1,"284":4,"435":1}}],["yougithubusername",{"2":{"515":1}}],["youtube",{"2":{"63":1,"228":1,"384":2}}],["yourname",{"2":{"516":1}}],["yourself",{"0":{"302":1},"2":{"284":1,"294":1,"444":1}}],["your",{"2":{"54":1,"222":1,"435":13,"449":2}}],["√",{"2":{"100":15,"489":13,"494":5}}],["$dirs",{"2":{"435":1}}],["$backup",{"2":{"435":6}}],["$env",{"2":{"435":1}}],["$emit=defineemits",{"2":{"344":1}}],["$emit",{"2":{"115":1,"279":1,"280":2,"344":1}}],["$project",{"2":{"435":3}}],["$props=defineprops",{"2":{"344":1,"347":1}}],["$props",{"2":{"115":1,"182":2,"236":1,"279":3,"280":2,"289":3,"332":2,"333":2,"344":2,"347":2}}],["$github",{"2":{"435":5}}],["$target",{"2":{"435":8}}],["$sessionstorage",{"2":{"358":3}}],["$service",{"2":{"281":2}}],["$store",{"2":{"354":5}}],["$store=usecounterstore",{"2":{"354":1}}],["$store=usestore",{"2":{"154":1}}],["$state",{"2":{"349":4}}],["$root",{"2":{"435":3}}],["$route",{"2":{"239":2,"242":3,"247":3}}],["$router",{"2":{"154":1,"239":3,"240":4,"242":4}}],["$received",{"2":{"281":1}}],["$notifications",{"2":{"154":1}}],["$modals",{"2":{"154":1,"289":11,"290":1}}],["$uri",{"2":{"132":2}}],["$",{"2":{"100":2,"154":1,"345":1,"347":1,"350":1,"423":2,"424":2,"427":6,"428":5,"435":15,"440":1,"444":96,"490":2,"491":3}}],[">save",{"2":{"395":1}}],[">send",{"2":{"347":1,"400":1}}],[">search",{"2":{"236":1}}],[">decrement",{"2":{"349":1,"354":1}}],[">increment",{"2":{"349":1}}],[">install",{"2":{"263":1}}],[">cancel",{"2":{"289":1}}],[">completed",{"2":{"222":1}}],[">accept",{"2":{"289":1}}],[">home",{"2":{"236":1}}],[">no",{"2":{"222":1}}],[">pending",{"2":{"222":1}}],[">print",{"2":{"150":2}}],[">edit",{"2":{"151":1}}],[">",{"2":{"94":2,"96":3,"140":2,"145":1,"146":1,"148":1,"149":1,"151":1,"182":1,"184":2,"187":4,"217":1,"218":4,"221":2,"222":20,"236":3,"239":4,"258":1,"263":2,"280":2,"283":12,"285":2,"289":3,"326":1,"333":2,"343":4,"344":2,"354":2,"395":5,"400":3,"435":1,"438":8,"440":4,"441":2,"444":1,"459":2,"483":2,"497":5,"498":3,"517":2,"522":3,"526":2,"540":15}}],[">>",{"2":{"94":1,"95":1,"435":5}}],["⌥",{"2":{"81":2}}],["+page",{"2":{"444":6}}],["+layout",{"2":{"444":7}}],["+$backups",{"2":{"435":1}}],["++id",{"2":{"396":1}}],["+f",{"2":{"335":1}}],["+=",{"2":{"184":1}}],["+",{"2":{"81":4,"139":1,"171":1,"214":1,"245":2,"246":2,"248":1,"266":1,"330":1,"336":2,"337":7,"365":1,"402":1,"435":1,"442":2}}],["qbutton",{"2":{"459":1}}],["qa",{"0":{"71":1},"2":{"66":1}}],["quasar",{"2":{"444":2,"445":1}}],["quality",{"0":{"77":1}}],["quiet",{"2":{"444":1}}],["quicktime",{"2":{"138":1}}],["questions",{"2":{"485":1}}],["queue",{"2":{"391":9}}],["queuebuilder",{"2":{"155":1}}],["queryselector",{"2":{"416":1}}],["query",{"2":{"23":1,"240":2,"242":2,"246":4,"247":2,"402":2,"457":1}}],["quot",{"0":{"145":2,"285":2,"362":2},"2":{"2":4,"4":2,"9":2,"11":2,"22":2,"41":6,"58":2,"63":2,"64":4,"86":2,"93":10,"94":2,"95":4,"96":4,"100":2,"106":2,"107":4,"115":6,"116":2,"125":6,"126":4,"128":4,"139":6,"140":6,"141":2,"142":4,"143":8,"151":4,"159":2,"160":2,"163":2,"164":6,"165":8,"167":6,"168":2,"169":2,"170":2,"171":4,"172":4,"175":6,"176":4,"177":2,"179":2,"180":2,"181":12,"183":2,"184":2,"186":4,"187":2,"191":2,"192":2,"194":4,"195":4,"196":4,"200":6,"201":2,"209":2,"210":2,"213":2,"215":2,"218":8,"220":4,"222":2,"223":6,"228":4,"233":8,"236":2,"237":6,"239":4,"242":2,"245":30,"249":4,"250":4,"251":8,"256":8,"264":2,"265":4,"266":2,"275":2,"278":2,"281":8,"283":2,"284":2,"289":4,"290":2,"294":2,"300":2,"304":2,"305":2,"317":2,"325":4,"327":4,"329":2,"330":2,"331":2,"334":2,"336":6,"337":2,"342":4,"363":2,"382":2,"384":14,"389":2,"391":4,"394":2,"402":2,"407":4,"408":4,"411":4,"412":4,"415":2,"417":2,"420":4,"425":2,"428":2,"448":6,"449":8,"451":4,"452":4,"456":2,"460":5,"461":6,"489":8,"492":2,"495":2,"506":2,"515":14,"524":8,"534":2,"536":2}}],["xshell",{"2":{"444":1}}],["xss",{"2":{"106":1}}],["xo",{"2":{"444":4}}],["xaml",{"2":{"444":2}}],["xdv",{"2":{"444":1}}],["xcode",{"2":{"424":1}}],["xyz",{"2":{"278":1}}],["x26",{"2":{"222":2,"249":2,"263":2,"395":2,"398":4,"435":4,"444":1,"497":2}}],["xmlhttprequest",{"2":{"243":1,"461":1}}],["xml",{"2":{"130":1,"243":1,"334":1,"444":4}}],["xhr",{"2":{"105":1,"500":1}}],["x3c",{"2":{"83":2,"94":8,"95":2,"96":4,"114":9,"130":4,"140":12,"142":8,"143":8,"145":1,"146":2,"148":2,"149":1,"150":4,"151":8,"182":10,"184":8,"217":1,"218":5,"221":9,"222":46,"236":20,"239":12,"249":1,"258":1,"263":6,"280":4,"283":54,"285":6,"289":22,"301":2,"326":1,"332":8,"333":7,"336":4,"337":3,"343":20,"344":10,"347":12,"349":15,"354":14,"358":6,"395":33,"398":2,"400":29,"438":20,"440":4,"441":8,"444":1,"459":4,"497":10,"498":7,"517":5,"522":8,"526":8,"540":15}}],["x",{"2":{"55":2,"121":1,"163":1,"169":1,"176":1,"206":1,"395":1,"448":2,"504":1}}],["=+",{"2":{"444":1}}],["==",{"2":{"222":3,"289":1,"435":3}}],["=>return",{"2":{"352":1}}],["=>",{"2":{"184":1,"222":4,"233":1,"236":3,"237":3,"239":3,"248":1,"249":1,"251":2,"263":1,"264":2,"278":5,"284":2,"289":6,"301":2,"326":1,"336":1,"337":16,"347":2,"351":3,"352":2,"357":1,"385":2,"386":2,"387":1,"391":2,"392":4,"393":4,"395":5,"396":3,"398":4,"400":1,"402":3,"411":2,"412":2,"413":1,"415":2,"416":2,"435":2,"441":2,"526":1}}],["=",{"2":{"54":4,"60":2,"88":1,"94":2,"95":2,"105":5,"111":2,"112":2,"114":6,"115":2,"127":1,"139":1,"140":1,"143":3,"151":2,"182":1,"184":3,"222":5,"233":2,"236":1,"239":2,"244":2,"246":2,"247":1,"248":1,"263":7,"264":4,"278":4,"279":4,"280":4,"281":4,"284":1,"285":1,"289":18,"314":1,"315":1,"317":1,"318":1,"319":1,"320":1,"321":3,"322":2,"323":1,"324":2,"326":6,"330":7,"332":1,"333":1,"335":3,"336":12,"337":14,"343":1,"346":1,"349":2,"351":1,"352":3,"353":1,"357":5,"358":1,"385":4,"386":1,"387":2,"391":7,"392":2,"393":1,"396":2,"397":1,"398":1,"399":1,"400":3,"402":6,"411":2,"415":1,"417":1,"435":1,"438":3,"441":3,"442":6,"448":6,"449":1,"451":1,"497":1,"498":2,"500":3,"501":2,"517":1,"526":3}}],["jl65gwrnqq",{"2":{"517":2}}],["j",{"2":{"443":1}}],["jpg",{"2":{"442":1}}],["jpeg",{"2":{"439":1}}],["jenkins",{"2":{"433":1,"444":2}}],["jest",{"2":{"411":1,"444":10,"450":1}}],["jetbrains",{"2":{"213":1}}],["justify",{"2":{"221":1}}],["jasmine",{"2":{"444":10}}],["jamesives",{"2":{"435":3,"515":1}}],["javascirpt",{"2":{"364":1}}],["javascript",{"0":{"478":1},"2":{"44":1,"107":1,"114":1,"116":1,"138":3,"139":2,"140":3,"141":4,"142":5,"143":4,"145":1,"147":1,"148":1,"149":2,"150":2,"157":1,"183":1,"184":1,"194":1,"212":1,"213":1,"214":2,"215":2,"216":4,"219":2,"222":1,"228":2,"230":1,"239":1,"243":1,"245":1,"251":2,"253":1,"264":1,"278":3,"283":1,"298":3,"299":1,"300":1,"301":2,"302":1,"311":1,"313":3,"314":2,"322":1,"325":1,"329":1,"331":1,"334":1,"335":2,"337":1,"338":1,"348":1,"349":1,"355":1,"357":3,"359":1,"365":1,"371":1,"378":1,"382":1,"384":9,"385":1,"391":1,"396":1,"397":1,"404":1,"410":1,"411":2,"412":1,"413":2,"414":1,"417":2,"440":1,"443":2,"444":2,"445":1,"448":4,"449":2,"451":1,"452":1,"459":3,"460":7,"461":4,"478":1,"492":1,"497":1,"528":1}}],["java",{"2":{"138":1,"143":1,"313":1,"444":1}}],["jane",{"2":{"114":1}}],["jobs",{"2":{"435":2}}],["jo",{"2":{"245":1}}],["john",{"2":{"114":1,"279":1,"524":1}}],["join",{"0":{"47":1},"2":{"48":1}}],["jwts",{"2":{"245":1}}],["jwt",{"2":{"106":4,"245":8,"484":2,"533":1}}],["jsscripts",{"2":{"419":1}}],["jsself",{"2":{"386":1}}],["jstest",{"2":{"412":1,"413":1,"418":1}}],["jsasync",{"2":{"337":1}}],["jsmyfunction",{"2":{"337":1}}],["jsfibonaccisync",{"2":{"336":1}}],["jsf",{"2":{"335":1}}],["jsfunction",{"2":{"324":1,"336":2,"337":1}}],["jslint",{"2":{"444":2}}],["jslocalstorage",{"2":{"355":1}}],["jslocation",{"2":{"246":1}}],["jslet",{"2":{"330":1,"337":3,"355":1,"385":1}}],["jsdom",{"2":{"414":3}}],["jsdoc",{"0":{"83":1},"2":{"83":2}}],["jsdescribe",{"2":{"411":1}}],["jsdispatcher",{"2":{"326":1}}],["jsx",{"2":{"283":1,"444":3}}],["jsif",{"2":{"264":1,"385":1,"417":1}}],["jsimport",{"2":{"54":1,"105":3,"111":2,"112":3,"127":1,"219":2,"222":1,"233":1,"234":1,"236":1,"239":1,"243":1,"244":1,"247":1,"248":1,"263":1,"265":1,"277":2,"278":1,"281":4,"284":2,"289":3,"315":1,"317":1,"320":1,"321":1,"323":2,"326":2,"346":1,"349":1,"351":1,"353":1,"357":1,"387":1,"391":1,"392":1,"393":1,"396":1,"397":1,"398":1,"399":1,"411":1,"415":1,"416":1,"440":1,"443":1,"500":1,"526":1}}],["js$modals",{"2":{"289":1}}],["js$emit",{"2":{"279":1}}],["js$",{"2":{"243":1}}],["js$props",{"2":{"236":1}}],["jsethereum",{"2":{"251":1}}],["jseventbus",{"2":{"236":1}}],["jsexport",{"2":{"113":1,"219":1,"414":1,"417":2,"438":1,"516":1}}],["jspending",{"2":{"222":1}}],["jsconfig",{"2":{"444":11}}],["jsconsole",{"2":{"331":1,"336":2,"337":1}}],["jsconst",{"2":{"88":1,"95":1,"115":1,"246":1,"249":1,"278":3,"279":4,"280":2,"281":1,"289":1,"314":1,"318":1,"319":1,"322":1,"393":1,"402":1,"435":1,"442":1,"448":2}}],["jsclass",{"2":{"315":1,"321":1,"326":1,"328":1}}],["jscreateapp",{"2":{"113":1}}],["js",{"0":{"127":1,"233":1,"234":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1,"326":1,"328":1,"330":1,"336":1,"346":1,"349":1,"352":1,"353":1,"357":1,"361":1,"362":1,"386":1,"387":1,"391":1,"392":1,"393":1,"396":1,"397":1,"398":1,"399":1,"402":1,"411":1,"415":1,"416":1,"442":1},"1":{"362":1,"363":1,"364":1,"365":1,"366":1,"367":1,"368":1},"2":{"12":1,"53":1,"54":1,"76":1,"83":1,"89":1,"94":1,"100":3,"105":4,"106":1,"107":3,"111":1,"113":1,"141":2,"143":1,"161":1,"213":5,"214":1,"215":4,"216":2,"219":5,"222":2,"227":1,"232":1,"233":2,"237":1,"239":1,"240":1,"242":1,"255":1,"264":3,"265":2,"269":1,"277":3,"284":3,"289":8,"290":6,"316":1,"318":1,"320":2,"321":5,"326":2,"341":1,"352":2,"355":1,"363":1,"365":1,"367":1,"382":2,"383":1,"385":4,"386":1,"387":1,"391":2,"393":1,"395":1,"400":2,"401":4,"406":1,"409":2,"410":5,"411":2,"413":2,"414":1,"417":2,"418":1,"437":1,"439":1,"440":4,"442":1,"443":3,"444":21,"445":2,"447":1,"448":3,"449":1,"451":3,"452":1,"460":4,"461":1,"464":1,"485":1,"486":1,"496":1,"497":1,"500":1,"501":2,"517":3,"543":3}}],["jsonrpc",{"2":{"489":1,"501":6}}],["json5",{"2":{"444":1}}],["jsonc",{"2":{"444":1}}],["jsonp",{"2":{"402":3}}],["jsonplaceholder",{"2":{"107":1,"500":1}}],["jsonmounted",{"2":{"236":1}}],["json",{"0":{"18":1,"19":1,"38":1,"48":1,"501":1,"542":1},"2":{"6":1,"11":1,"17":5,"18":2,"19":1,"38":1,"47":2,"48":1,"55":1,"76":1,"86":1,"95":2,"100":2,"103":2,"105":1,"107":1,"109":9,"215":3,"244":1,"245":2,"258":4,"261":2,"314":1,"315":1,"320":1,"355":2,"392":1,"395":4,"396":1,"397":1,"398":1,"401":1,"402":5,"410":3,"418":4,"419":1,"426":1,"435":4,"440":1,"442":4,"443":4,"444":50,"460":1,"461":2,"489":5,"492":1,"500":1,"501":6,"526":1,"527":1,"530":1,"542":2}}],["rgba",{"2":{"545":6}}],["richfooter",{"0":{"510":1}}],["right",{"2":{"504":1}}],["rip",{"2":{"449":1}}],["rspack",{"2":{"444":12}}],["rc",{"2":{"444":1}}],["r",{"2":{"435":2,"449":1,"485":2}}],["rf",{"2":{"435":4}}],["rm",{"2":{"435":3}}],["rxdb",{"2":{"394":1}}],["raw",{"2":{"440":2,"442":1,"443":1}}],["ram",{"2":{"365":1}}],["range=ref",{"2":{"352":1}}],["range",{"2":{"351":1,"354":3,"412":1}}],["randomuuid",{"2":{"391":1}}],["random",{"2":{"285":1}}],["radius",{"2":{"182":1}}],["radio",{"2":{"175":1,"400":2}}],["rush",{"2":{"444":1}}],["rust",{"2":{"444":1}}],["rustfmt",{"2":{"444":2}}],["ruby",{"2":{"444":1}}],["ru",{"2":{"444":3,"460":1,"485":2}}],["rules",{"2":{"444":2}}],["rule",{"2":{"164":1}}],["runs",{"2":{"435":2}}],["runcommand",{"2":{"328":1}}],["runlog",{"2":{"281":2}}],["run",{"2":{"127":1,"214":1,"215":4,"217":1,"222":1,"409":1,"410":3,"411":4,"418":1,"419":1,"435":9}}],["roboto",{"2":{"545":1}}],["robots",{"2":{"215":1}}],["rollupjs",{"2":{"219":1}}],["rollup",{"2":{"219":1,"443":2,"444":2}}],["role",{"2":{"106":1}}],["roach",{"0":{"201":1}}],["row",{"2":{"194":1,"497":1}}],["rotate",{"2":{"182":4}}],["root",{"2":{"132":1,"435":1,"442":1,"545":1}}],["route",{"2":{"240":6}}],["routeview",{"2":{"238":3,"239":1}}],["routes",{"0":{"88":1},"2":{"88":2,"127":1,"230":1,"233":3,"436":1,"438":1}}],["routerlink>",{"2":{"236":3,"239":1}}],["routerlink",{"2":{"235":1,"236":4,"238":1,"239":2,"240":1}}],["routerview>",{"2":{"239":4}}],["routerview",{"2":{"235":1,"239":3}}],["routerecordraw",{"2":{"88":1}}],["router",{"0":{"127":1,"232":1,"233":1},"1":{"233":1,"234":1},"2":{"3":1,"23":1,"34":1,"110":1,"126":2,"127":2,"128":1,"130":1,"133":1,"136":1,"137":1,"226":2,"229":1,"230":2,"232":1,"233":7,"234":3,"236":4,"239":2,"242":2,"247":1,"278":3,"285":1,"364":1,"365":1,"374":1,"388":1,"438":4,"492":1,"535":1}}],["routing",{"0":{"7":1,"535":1},"2":{"11":1}}],["rbac",{"2":{"106":1}}],["rtl",{"2":{"448":1,"524":1}}],["rt",{"2":{"106":4,"484":1}}],["rpc",{"0":{"501":1},"2":{"100":1,"105":1,"109":9,"460":1,"489":1,"500":1,"501":5,"530":1}}],["rehydration",{"2":{"461":1}}],["remix",{"2":{"444":2}}],["remote",{"2":{"429":1,"435":7,"444":5}}],["removed",{"2":{"435":1}}],["removed=`ls",{"2":{"435":1}}],["remove",{"2":{"435":2}}],["removeitem",{"2":{"355":1}}],["removeeventlistener",{"2":{"284":1,"301":1}}],["removeroute",{"2":{"242":1}}],["renovate",{"2":{"444":2}}],["rendering",{"2":{"461":1}}],["renderwhitespace",{"2":{"444":1}}],["render",{"2":{"439":1}}],["renderer",{"2":{"384":1}}],["recentchange",{"2":{"444":1}}],["received",{"2":{"400":5}}],["receiver",{"2":{"357":1}}],["recursive",{"2":{"435":1}}],["req",{"2":{"402":5}}],["requiresauth",{"2":{"438":1}}],["require",{"2":{"402":2}}],["required",{"2":{"247":1,"435":1}}],["requirements",{"2":{"68":1}}],["requestaccounts",{"2":{"251":1}}],["requestotp",{"2":{"249":1}}],["request",{"2":{"105":1,"130":2,"247":1,"251":1,"264":3,"391":2,"393":2,"395":3,"400":1,"402":2}}],["reilly",{"2":{"366":1}}],["reddit",{"2":{"449":1,"485":1}}],["redis",{"2":{"449":1}}],["redirect",{"2":{"246":1}}],["red",{"2":{"354":3}}],["re",{"2":{"295":1}}],["rejects",{"2":{"413":1}}],["reject",{"2":{"275":1,"278":1,"289":6,"337":7,"391":6,"393":1,"396":6,"398":6}}],["registertype",{"2":{"265":1}}],["register",{"2":{"264":1,"449":1}}],["readme",{"2":{"444":2}}],["read",{"2":{"274":1,"449":1}}],["ready",{"2":{"263":4}}],["reactivity",{"0":{"356":1},"1":{"357":1,"358":1},"2":{"449":1,"451":2}}],["reactive",{"2":{"114":7,"289":6,"329":1,"340":1,"348":1,"349":3,"357":3,"448":6,"449":6,"451":2}}],["react",{"2":{"139":1,"228":1,"451":6,"460":2}}],["representation",{"2":{"440":1}}],["representational",{"2":{"243":1,"397":1}}],["repo",{"2":{"444":1}}],["repository",{"2":{"423":1}}],["reporter",{"2":{"418":1}}],["replit",{"2":{"444":1}}],["reply=>",{"2":{"400":1}}],["replace",{"0":{"241":1}}],["replacement",{"2":{"214":1}}],["repeat",{"0":{"302":1},"2":{"294":1,"328":1}}],["release",{"2":{"444":4}}],["releaserc",{"2":{"444":2}}],["related",{"2":{"265":1}}],["relative",{"2":{"96":1}}],["rel",{"2":{"258":1}}],["rel=",{"2":{"217":1,"218":3,"258":1}}],["reload",{"2":{"215":1,"435":1}}],["rewritecond",{"2":{"130":2}}],["rewriterule",{"2":{"130":2}}],["rewritebase",{"2":{"130":2}}],["rewriteengine",{"2":{"130":1}}],["rewrite",{"2":{"130":1}}],["resx",{"2":{"444":2}}],["res",{"2":{"402":6}}],["resize",{"2":{"301":3}}],["respondwith",{"2":{"264":1}}],["responsibility",{"0":{"299":1},"2":{"294":1}}],["responsive",{"0":{"194":1},"2":{"256":1}}],["response",{"2":{"244":2,"246":1,"264":3,"435":2}}],["response=>",{"2":{"244":1}}],["results",{"2":{"411":2}}],["result=await",{"2":{"396":1}}],["result=>",{"2":{"248":1,"249":2,"398":2}}],["result",{"2":{"248":1,"249":2,"251":2,"337":8,"392":2,"396":3,"398":6,"411":2}}],["resolver",{"2":{"443":1,"444":1}}],["resolves",{"2":{"413":3}}],["resolve",{"2":{"219":2,"275":1,"278":3,"289":6,"337":9,"391":6,"393":2,"396":6,"398":4,"413":1,"443":2}}],["resource",{"2":{"108":1,"440":2}}],["restful",{"2":{"243":1,"397":2}}],["rest",{"0":{"51":1,"55":1,"109":2,"500":1},"1":{"52":1,"53":1,"54":1,"55":1},"2":{"40":1,"50":1,"55":3,"57":1,"58":2,"100":1,"103":1,"105":1,"109":2,"243":1,"489":1,"500":1,"501":2}}],["ref=",{"2":{"184":1}}],["refresh",{"2":{"106":1,"484":1}}],["ref",{"2":{"94":2,"95":1,"114":6,"143":7,"151":2,"184":3,"222":5,"244":3,"263":4,"284":1,"329":1,"343":2,"347":1,"352":2,"395":1,"400":4,"448":7,"449":5,"451":2,"500":1}}],["refactor",{"0":{"83":1},"2":{"83":1}}],["return",{"2":{"83":2,"94":3,"105":1,"113":2,"140":1,"143":2,"222":2,"233":1,"264":2,"278":1,"284":1,"285":1,"289":3,"290":3,"315":2,"317":1,"318":1,"319":1,"322":2,"324":2,"326":1,"330":3,"336":1,"337":7,"349":1,"351":3,"352":4,"357":5,"391":1,"393":1,"396":3,"398":2,"441":2,"442":2,"500":1,"501":1}}],["returns",{"2":{"83":4}}],["return=minimal",{"2":{"55":1}}],["rdbms",{"2":{"39":1}}],["fcp",{"2":{"461":1}}],["fetish",{"2":{"450":1}}],["fetch",{"2":{"41":1,"105":1,"243":1,"264":2,"435":1,"495":1,"500":1}}],["ferferga",{"2":{"449":1}}],["fdb",{"2":{"444":1}}],["fps",{"2":{"384":2}}],["ftcms",{"2":{"368":1}}],["ftp",{"2":{"134":2}}],["fnc",{"2":{"445":1,"448":1}}],["fn",{"2":{"266":1,"326":4}}],["f12",{"2":{"266":2}}],["frequently",{"2":{"485":1}}],["freezed",{"2":{"444":1}}],["free",{"2":{"164":1}}],["framework",{"2":{"329":1,"365":1}}],["frontier",{"2":{"135":1}}],["from",{"2":{"54":4,"83":2,"94":3,"105":9,"111":2,"112":6,"114":1,"127":1,"143":2,"151":3,"184":1,"219":2,"221":1,"222":1,"233":3,"234":5,"236":2,"239":1,"243":1,"244":2,"247":1,"248":1,"263":1,"265":3,"277":4,"278":4,"281":4,"284":2,"285":2,"289":8,"301":1,"315":2,"317":1,"320":2,"321":4,"323":5,"326":2,"333":1,"343":2,"346":1,"347":2,"349":2,"351":1,"352":2,"353":3,"354":1,"357":1,"358":1,"387":2,"391":1,"392":1,"393":1,"395":2,"396":1,"397":1,"398":1,"399":1,"400":2,"411":3,"415":3,"416":3,"440":3,"441":2,"442":2,"443":2,"497":1,"498":2,"500":2,"501":5,"515":1,"526":2}}],["flow",{"2":{"481":1}}],["flowconfig",{"2":{"444":2}}],["flake",{"2":{"444":2}}],["flash",{"2":{"138":1}}],["fls",{"2":{"444":1}}],["flipcoin",{"2":{"285":3}}],["flex",{"2":{"102":1,"194":4,"221":2,"222":3,"497":3}}],["flexbox",{"2":{"35":1,"102":1,"194":1,"457":1,"480":2}}],["f",{"2":{"130":1,"335":3}}],["family",{"2":{"545":1}}],["fallback",{"2":{"442":1}}],["false",{"2":{"105":1,"175":2,"222":2,"249":1,"263":2,"265":1,"289":2,"351":1,"392":1,"435":2,"444":27,"449":1,"489":4}}],["fail",{"2":{"412":1}}],["fahrenheit",{"2":{"330":7}}],["factory",{"0":{"324":1},"2":{"307":1}}],["facebook",{"2":{"139":1,"248":1,"540":1}}],["façade",{"0":{"334":1},"2":{"294":1,"309":1,"334":1,"337":1,"355":1}}],["fa",{"2":{"218":2,"222":6}}],["favicon",{"2":{"215":1}}],["favourites",{"2":{"83":2,"88":3,"94":7,"95":3,"96":1}}],["favorite",{"2":{"83":3}}],["faq",{"2":{"190":1,"435":1,"485":1}}],["fix",{"2":{"444":1}}],["fixall",{"2":{"444":2}}],["field",{"2":{"442":2}}],["finance",{"2":{"524":1}}],["finally",{"2":{"337":2,"395":2}}],["find",{"2":{"416":4,"444":1,"526":1}}],["fingerprint",{"2":{"106":1}}],["fibonaccioutput",{"0":{"415":1},"2":{"409":2,"414":1,"415":3}}],["fibonacciinput",{"0":{"416":1},"2":{"409":2,"416":3}}],["fibonacci",{"0":{"411":1},"2":{"409":2,"410":3,"411":12,"412":2}}],["fibonaccipromise",{"2":{"337":2,"411":2,"413":2}}],["fibonacciasync",{"2":{"336":2}}],["fibonaccisync",{"2":{"336":3}}],["fill",{"2":{"441":1}}],["filter",{"2":{"222":2,"290":1}}],["filenesting",{"2":{"444":3}}],["filename2",{"2":{"425":1}}],["filename1",{"2":{"425":1}}],["filename",{"2":{"130":2,"278":1,"385":1,"442":10}}],["filelistlayout",{"2":{"444":1}}],["file=",{"2":{"435":1}}],["filehippo",{"2":{"208":2}}],["filezilla",{"2":{"134":1}}],["file",{"2":{"134":1,"165":1,"425":1,"435":2,"444":2}}],["files",{"2":{"100":1,"132":1,"215":1,"435":1,"444":3}}],["fi",{"2":{"191":1,"435":2}}],["fitts",{"2":{"169":1}}],["fira",{"2":{"444":1}}],["first",{"2":{"154":1,"194":1,"444":1,"522":1,"543":1}}],["firstname",{"2":{"47":1}}],["firesbase",{"2":{"533":1}}],["firestore",{"2":{"460":1}}],["firefox",{"2":{"116":1,"213":1,"365":1,"384":1}}],["firebase",{"2":{"39":2,"41":1,"107":2,"439":2,"444":4,"533":1}}],["font",{"2":{"545":1}}],["fontweight",{"2":{"444":1}}],["fontligatures",{"2":{"444":1}}],["fontfamily",{"2":{"444":1}}],["fontaliasing",{"2":{"444":1}}],["fontawesome",{"0":{"218":1},"2":{"218":6}}],["fonts",{"2":{"265":1,"543":1}}],["found",{"2":{"264":3}}],["foundation",{"2":{"135":1}}],["foot",{"2":{"256":1}}],["footers",{"0":{"508":1},"1":{"509":1,"510":1,"511":1,"512":1,"513":1}}],["footer>",{"2":{"289":2}}],["footer",{"0":{"32":1},"2":{"28":1,"100":1,"489":2,"496":2,"530":1,"533":1}}],["folder",{"2":{"435":1}}],["fold",{"2":{"196":1}}],["fork",{"2":{"483":1}}],["foreign",{"2":{"449":1}}],["foreach",{"2":{"392":1}}],["formulate",{"2":{"444":10}}],["formkit",{"2":{"444":10}}],["formatters",{"2":{"448":2}}],["formatter",{"2":{"444":1}}],["formatting",{"2":{"444":1,"448":1}}],["formatonsave",{"2":{"444":1}}],["format",{"2":{"435":3,"444":2}}],["forward",{"2":{"242":1}}],["for=",{"2":{"148":1,"184":1,"222":2,"236":1,"239":1,"395":1}}],["for",{"0":{"148":1,"304":1},"1":{"307":1,"308":1,"309":1,"310":1},"2":{"54":1,"100":1,"125":1,"148":1,"151":1,"164":1,"171":1,"184":1,"194":2,"222":2,"294":1,"326":1,"336":2,"337":1,"435":1,"442":2,"444":1,"461":1,"489":1}}],["fullscreen",{"2":{"259":2}}],["fullpath",{"2":{"242":1}}],["function",{"2":{"83":4,"94":4,"184":1,"222":2,"244":1,"248":1,"249":3,"263":3,"281":1,"284":2,"285":1,"289":1,"290":1,"301":1,"330":2,"337":1,"343":1,"344":1,"347":2,"349":1,"352":2,"357":2,"392":1,"395":4,"400":1,"411":2,"442":3,"517":1,"526":1}}],["functions",{"2":{"40":1,"107":2,"449":1}}],["fu",{"2":{"23":1,"444":1,"492":1}}],["l",{"2":{"130":2,"195":1,"326":2,"526":2}}],["learn",{"2":{"460":1}}],["learning",{"2":{"164":1}}],["leex",{"2":{"444":1}}],["less",{"2":{"444":1}}],["lerna",{"2":{"426":1,"444":2}}],["left",{"2":{"222":2}}],["level",{"2":{"187":6}}],["let",{"0":{"135":1},"2":{"122":1,"135":3,"136":1,"249":1,"257":1,"324":1,"326":2,"336":4,"337":3,"357":2,"379":1,"385":1,"391":2,"396":2,"411":1,"416":2,"442":1}}],["length==0",{"2":{"222":1}}],["length",{"2":{"94":1,"96":1,"222":6,"326":1,"442":2}}],["lts",{"2":{"213":1,"365":1}}],["lt",{"2":{"83":1,"113":1,"215":1,"221":1,"236":3,"285":1,"352":1,"428":4,"444":1}}],["license",{"2":{"444":1}}],["limit",{"2":{"444":3}}],["lib",{"2":{"444":1}}],["live",{"2":{"417":1}}],["lintstagedrc",{"2":{"444":2}}],["lint",{"2":{"444":4}}],["line",{"2":{"444":1}}],["linenumbers",{"2":{"444":1}}],["lineno",{"2":{"385":1}}],["lines",{"0":{"239":1}}],["linear",{"2":{"182":1}}],["link",{"2":{"217":2,"218":3,"258":1,"368":1}}],["linux",{"0":{"423":1},"2":{"128":2,"131":3,"134":1,"177":1,"213":2,"256":1,"266":1,"365":5,"384":1,"421":2,"423":1,"444":1}}],["life",{"2":{"143":1}}],["lifecycle",{"2":{"66":1}}],["lighthouserc",{"2":{"444":20}}],["lighthouse",{"0":{"266":1},"2":{"254":1,"266":3,"267":1}}],["light",{"2":{"100":1,"222":1,"283":1}}],["like",{"2":{"83":1,"449":2}}],["listening",{"2":{"402":1}}],["listen",{"2":{"132":1,"402":1}}],["list",{"2":{"83":3,"220":1,"222":8,"443":1,"444":1}}],["listfavourites",{"2":{"83":3,"94":5,"95":1,"96":1}}],["latexmk",{"2":{"444":1}}],["latest",{"2":{"214":1,"435":2}}],["lastindexof",{"2":{"442":2}}],["last",{"2":{"279":2,"444":1}}],["lastname",{"2":{"47":1}}],["landing",{"2":{"233":5,"236":1}}],["lang",{"2":{"260":1}}],["language",{"2":{"154":1,"273":1,"444":1}}],["lang=",{"2":{"94":1,"142":1,"441":1,"497":1,"498":1,"526":1}}],["label+",{"2":{"333":1}}],["label",{"2":{"222":3,"332":4,"333":1}}],["label>",{"2":{"222":4,"400":4}}],["law",{"2":{"169":1}}],["lamda",{"2":{"107":1}}],["lambda",{"2":{"107":1}}],["layer",{"2":{"100":1,"244":1,"489":1}}],["layouts",{"2":{"436":1}}],["layout",{"0":{"102":1},"2":{"27":1,"36":1,"100":1,"239":1,"283":1,"489":2,"530":1,"533":1,"536":1,"545":1}}],["lot",{"2":{"444":1}}],["lof",{"2":{"444":1}}],["loadicons",{"2":{"442":2}}],["loadingerror",{"2":{"278":2}}],["loadingcomponent",{"2":{"278":3}}],["loading",{"2":{"105":2,"146":3}}],["loadnotes",{"2":{"395":4}}],["loader",{"2":{"278":2}}],["loadproject",{"2":{"236":2}}],["lock",{"2":{"215":1,"444":13}}],["location",{"2":{"132":2,"246":1,"435":1}}],["locale",{"2":{"526":3}}],["locales",{"2":{"526":3}}],["local",{"2":{"426":1}}],["localstore",{"2":{"355":1}}],["localstoragename",{"2":{"435":3}}],["localstorage",{"2":{"95":4,"106":2,"231":1,"236":1,"263":1,"355":4,"360":2,"435":3,"545":1}}],["localhost",{"2":{"125":1,"214":1,"264":1,"398":1,"402":2}}],["lookup",{"2":{"388":1}}],["loopback",{"2":{"125":3}}],["loosely",{"2":{"2":1}}],["logic",{"2":{"449":2}}],["login",{"2":{"88":1,"449":1}}],["logs",{"2":{"435":1,"444":1}}],["logmessage",{"2":{"281":2}}],["log",{"2":{"244":2,"251":2,"281":1,"315":1,"330":1,"331":1,"336":7,"337":8,"385":1,"386":1,"402":1,"426":6,"435":1,"444":1,"448":1}}],["logout",{"2":{"105":1,"449":1}}],["low",{"2":{"39":1}}],["шпаргалки",{"0":{"476":1},"1":{"477":1,"478":1,"479":1,"480":1,"481":1,"482":1}}],["шкалы",{"2":{"384":1}}],["шкале",{"2":{"331":1}}],["шлюз",{"2":{"312":1}}],["шлюза",{"2":{"311":1}}],["шнайдермане",{"2":{"171":1}}],["шнайдерман",{"2":{"171":1}}],["шнайдермана",{"0":{"171":1}}],["шестнадцатеричных",{"2":{"125":1}}],["шифрующая",{"2":{"245":1}}],["шифрованного",{"2":{"244":1}}],["шифрования",{"2":{"135":2,"245":1}}],["шину",{"2":{"344":1,"345":1}}],["шины",{"0":{"345":1},"1":{"346":1,"347":1},"2":{"340":1,"345":1,"346":1,"348":1}}],["шиной",{"2":{"236":1,"345":1}}],["шина",{"2":{"109":1,"345":1,"360":1}}],["широкие",{"2":{"243":1}}],["широкий",{"2":{"162":2,"316":1}}],["широком",{"2":{"328":1,"388":1}}],["широкое",{"2":{"160":1,"218":1}}],["широко",{"2":{"128":1,"129":1,"190":1,"195":1,"206":1,"244":1,"310":1,"337":1}}],["широкого",{"2":{"41":1,"189":1,"495":1}}],["ширина",{"2":{"536":1}}],["ширине",{"2":{"194":1}}],["ширину",{"2":{"102":1,"186":1,"222":1}}],["ширины",{"2":{"102":1}}],["шторки",{"2":{"530":1}}],["шторка",{"2":{"530":1}}],["шторок",{"2":{"505":1}}],["штраф",{"2":{"397":1}}],["штабелируемыми",{"2":{"331":1}}],["штатном",{"2":{"444":1}}],["штатную",{"2":{"86":1}}],["штата",{"2":{"237":1}}],["штатов",{"2":{"237":1}}],["штат",{"2":{"237":1}}],["штука",{"2":{"109":1}}],["штукатурки",{"2":{"26":1}}],["шагу",{"2":{"272":1}}],["шаге",{"2":{"245":1,"247":1,"248":1,"274":1,"331":1}}],["шагом",{"2":{"214":1,"217":1,"221":1,"246":1,"249":1,"254":1,"271":1,"274":1,"372":1,"391":1,"394":1,"425":1}}],["шагов",{"2":{"66":1,"122":1,"135":1,"181":1,"213":1,"244":1,"248":1,"251":1,"429":1}}],["шаги",{"2":{"212":1,"213":2,"214":1,"217":1,"225":1,"245":1,"289":1,"428":1,"429":2}}],["шаг",{"0":{"273":1,"274":1,"275":1},"2":{"125":1,"160":1,"195":1,"214":1,"223":1,"248":1,"250":2,"271":1,"272":1,"273":1,"274":1,"275":1,"290":1,"331":1,"353":1,"372":1,"384":1,"428":1,"461":1}}],["шагах",{"2":{"171":1}}],["шагами",{"2":{"135":1}}],["шага",{"2":{"66":1}}],["шаблонная",{"2":{"410":1}}],["шаблонные",{"0":{"235":1}}],["шаблонным",{"2":{"196":1}}],["шаблону",{"2":{"195":1,"263":1,"288":1,"290":1,"334":1,"389":1,"390":1,"449":1}}],["шаблоном",{"2":{"180":1,"239":1,"289":1,"325":1,"329":1,"339":1,"359":1}}],["шаблонов",{"0":{"243":1,"275":1,"306":1,"345":1},"1":{"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":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,"334":1,"335":1,"336":1,"337":1,"346":1,"347":1},"2":{"160":3,"163":1,"176":2,"185":1,"191":2,"196":1,"197":1,"209":1,"210":1,"211":2,"212":1,"228":1,"250":1,"254":1,"263":1,"269":1,"272":1,"274":1,"275":1,"281":1,"282":1,"294":3,"304":1,"305":2,"306":2,"310":2,"315":1,"323":1,"340":1,"355":1,"356":1,"363":1,"388":1}}],["шаблоне",{"2":{"143":5,"184":1,"209":1,"223":1,"235":1,"242":1,"263":1,"284":1,"289":1,"290":1,"331":3,"334":1,"344":1,"347":1,"349":1,"389":1,"390":1,"400":1,"440":1,"492":1}}],["шаблонам",{"2":{"163":1,"173":1,"267":1,"342":1,"461":1}}],["шаблонами",{"0":{"356":1},"1":{"357":1,"358":1},"2":{"160":1,"172":1,"198":1,"207":1,"310":1,"312":1,"324":1,"330":1,"337":1,"340":1,"382":1,"403":1}}],["шаблонах",{"2":{"163":1,"217":1,"221":1,"269":1,"334":1,"363":1}}],["шаблона",{"2":{"143":1,"177":1,"178":1,"181":1,"183":3,"184":1,"195":2,"212":1,"216":1,"222":1,"236":1,"249":1,"281":2,"283":5,"285":2,"289":1,"305":1,"313":2,"325":1,"327":2,"328":1,"329":2,"331":2,"333":1,"334":2,"336":2,"343":1,"345":1,"347":1,"348":1,"355":1,"356":1,"382":1,"387":1,"388":2,"389":1,"404":1,"426":1,"494":1,"496":1,"533":1}}],["шаблоны",{"0":{"160":1,"173":1,"185":1,"193":1,"197":1,"198":1,"294":1,"307":1,"308":1,"309":1,"310":1,"361":1,"371":1},"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":2,"175":2,"176":2,"177":2,"178":2,"179":2,"180":2,"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":1,"194":2,"195":2,"196":2,"197":2,"198":1,"199":2,"200":2,"201":2,"202":2,"203":2,"204":2,"205":2,"206":2,"207":2,"208":2,"209":2,"210":1,"211":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"306":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,"334":1,"335":1,"336":1,"337":1,"338":1,"339":1,"362":1,"363":1,"364":1,"365":1,"366":1,"367":1,"368":1},"2":{"119":1,"138":1,"151":1,"160":1,"163":1,"167":1,"172":2,"176":2,"181":1,"185":1,"193":1,"197":4,"198":1,"211":2,"230":1,"242":1,"243":1,"253":1,"269":1,"271":1,"275":4,"277":1,"283":1,"284":1,"290":1,"292":2,"293":1,"294":1,"305":2,"306":1,"309":1,"330":1,"338":4,"339":2,"340":1,"341":1,"345":1,"354":1,"356":1,"363":1,"371":1,"380":1,"387":1,"388":1,"389":1,"390":1,"391":1}}],["шаблон",{"0":{"305":1,"311":1,"316":1,"324":1,"325":1,"327":1,"329":1,"331":1,"334":1,"335":1,"337":1,"388":1,"389":1},"1":{"312":1,"313":1,"314":1,"315":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1,"326":1,"328":1,"330":1,"332":1,"333":1,"336":1},"2":{"41":1,"94":1,"143":1,"174":1,"176":1,"177":3,"178":1,"179":1,"180":2,"186":1,"190":2,"191":5,"194":1,"195":4,"199":1,"200":1,"201":1,"204":2,"207":1,"212":1,"218":1,"221":1,"222":2,"249":3,"275":2,"280":3,"282":1,"286":1,"305":2,"307":3,"308":2,"309":3,"310":2,"311":1,"312":1,"315":2,"316":1,"321":1,"323":1,"324":1,"325":2,"326":1,"327":1,"328":2,"329":3,"330":2,"331":3,"333":2,"334":4,"335":3,"336":1,"337":2,"339":1,"344":2,"345":2,"347":2,"348":1,"350":1,"358":1,"382":1,"388":7,"389":1,"400":1,"415":1,"436":1,"449":1,"451":2,"459":1}}],["шрифта",{"2":{"217":1}}],["шрифтами",{"2":{"166":1,"218":1}}],["шрифты",{"2":{"215":1,"218":5,"224":1}}],["шрифтом",{"2":{"199":1,"222":1}}],["шрифтовых",{"2":{"218":1}}],["шрифтов",{"2":{"166":1,"216":3,"218":3,"220":1}}],["шрифт",{"2":{"26":1,"166":1}}],["цукерберг",{"2":{"451":1}}],["цветом",{"2":{"266":1,"411":1}}],["цветовой",{"2":{"164":1}}],["цветов",{"2":{"162":1,"164":1,"174":1,"256":1}}],["цветовые",{"2":{"26":1,"533":1}}],["цвет",{"2":{"164":2,"175":1,"182":1,"218":1,"221":1,"260":2}}],["цветами",{"2":{"218":1,"263":1}}],["цветах",{"2":{"175":1}}],["цвета",{"2":{"164":2,"165":1,"174":1,"256":1,"411":1}}],["цитата",{"2":{"459":1}}],["цифровыми",{"2":{"251":1}}],["цифрой",{"2":{"178":1,"183":1}}],["цифра",{"2":{"178":1}}],["цифры",{"2":{"125":1}}],["цикле",{"2":{"384":1}}],["цикл",{"2":{"148":1,"264":1,"301":1}}],["циклу",{"2":{"148":1}}],["цикла",{"2":{"143":1,"148":1,"236":1,"239":1,"284":1,"301":2,"321":1,"347":1}}],["царька",{"2":{"93":1}}],["цепляемыми",{"2":{"331":1}}],["цепочечный",{"2":{"411":1}}],["цепочечными",{"2":{"112":1,"411":1}}],["цепочку",{"2":{"322":1,"336":1,"337":2}}],["цепочке",{"2":{"140":1,"337":1}}],["ценность",{"2":{"431":1,"432":1}}],["цене",{"2":{"251":1}}],["ценовые",{"2":{"204":1}}],["цена",{"2":{"203":1}}],["цен",{"0":{"203":1}}],["центов",{"2":{"125":1}}],["централизованным",{"2":{"349":1}}],["централизованное",{"2":{"360":1}}],["централизованного",{"2":{"340":1,"349":2}}],["централизованному",{"2":{"236":1,"283":1}}],["центральный",{"2":{"350":1,"356":1,"430":1}}],["центральном",{"2":{"430":1}}],["центрального",{"2":{"354":1,"359":1}}],["центральное",{"2":{"269":1,"350":2,"354":1}}],["центральной",{"2":{"31":1,"535":1}}],["центральную",{"2":{"164":1}}],["центральная",{"2":{"28":1}}],["центрирования",{"2":{"221":1}}],["центре",{"2":{"214":1}}],["центру",{"2":{"179":1,"221":1}}],["центр",{"2":{"106":1}}],["цены",{"2":{"125":1,"203":1,"204":1}}],["целях",{"2":{"397":1}}],["целями",{"2":{"68":1,"169":1}}],["целям",{"2":{"67":1,"214":1}}],["целая",{"2":{"310":1}}],["целые",{"2":{"305":1,"407":1}}],["целый",{"2":{"256":1,"429":1,"430":1}}],["целостного",{"2":{"420":1}}],["целого",{"2":{"184":1}}],["целое",{"2":{"141":1,"242":1,"300":1,"407":1,"409":1}}],["целом",{"2":{"67":1,"135":1,"223":1,"250":1,"256":1,"272":1,"289":1,"304":1,"334":1,"388":1,"444":1,"459":1,"460":1,"461":2}}],["целесообразность",{"2":{"450":1}}],["целесообразно",{"2":{"404":1,"436":1}}],["целесообразным",{"2":{"401":1}}],["целевым",{"2":{"329":1}}],["целевые",{"2":{"261":1}}],["целевых",{"2":{"194":1,"256":1}}],["целевую",{"2":{"236":1}}],["целевая",{"2":{"231":2,"329":1}}],["целевого",{"2":{"331":1,"332":2,"333":1}}],["целевому",{"2":{"177":1,"251":1,"329":1,"331":1,"333":1}}],["целевом",{"2":{"177":1}}],["целевое",{"2":{"127":1}}],["целевой",{"2":{"125":1,"251":1,"329":4,"330":2,"331":1,"428":1}}],["целей",{"2":{"138":1,"162":2,"163":1,"218":2,"243":1,"251":1,"305":1,"354":1,"355":1,"387":1,"388":1}}],["цели",{"0":{"75":1,"76":1,"496":1},"1":{"76":1,"77":1,"78":1,"79":1},"2":{"169":5,"172":1,"297":1,"435":1,"449":1}}],["целиком",{"2":{"26":1}}],["цельсия",{"2":{"329":1}}],["целью",{"2":{"73":1,"198":1,"200":1,"204":1,"208":1,"209":1,"239":1,"330":1,"347":1,"407":1,"409":1}}],["цель",{"0":{"62":1},"2":{"64":1,"67":1,"122":1,"140":1,"162":2,"172":1,"181":1,"191":1,"220":1,"236":1,"329":2,"331":3,"416":1}}],["bzl",{"2":{"444":1}}],["bbl",{"2":{"444":1}}],["bit",{"2":{"449":1}}],["bitkeeper",{"2":{"420":1,"421":1}}],["binance",{"2":{"251":1}}],["bind",{"0":{"145":1},"2":{"145":1}}],["by",{"2":{"347":1,"411":2,"435":1}}],["blg",{"2":{"444":1}}],["blame",{"2":{"444":3}}],["black",{"2":{"222":1}}],["blue",{"2":{"221":1,"222":4}}],["bloc",{"2":{"444":1}}],["blockchain",{"2":{"251":1}}],["block",{"2":{"182":1}}],["blog",{"2":{"116":1}}],["b",{"2":{"139":3,"337":7,"427":1,"428":1,"448":2}}],["built",{"2":{"150":1,"151":2,"285":1}}],["builddata",{"2":{"435":4}}],["build",{"2":{"116":1,"127":1,"215":1,"410":2,"435":10,"443":1,"444":4,"515":2}}],["button>вариант",{"2":{"283":2}}],["button>option",{"2":{"283":2}}],["button>",{"2":{"150":2,"151":1,"222":2,"263":1,"283":4,"289":2,"343":1,"344":1,"347":1,"349":2,"354":2,"395":1,"400":1,"526":1}}],["button",{"2":{"150":2,"151":1,"175":1,"222":4,"263":1,"289":2,"343":1,"344":1,"347":1,"349":2,"354":2,"395":1,"400":1,"416":2,"459":1,"526":2}}],["bundleconfig",{"2":{"444":2}}],["bundle",{"2":{"141":1,"443":3}}],["bundler",{"2":{"141":1}}],["business",{"0":{"388":1},"2":{"382":1,"387":1,"388":5,"390":1,"404":1,"449":2}}],["bus",{"0":{"347":1},"2":{"109":1,"344":2}}],["brew",{"2":{"424":1}}],["break",{"2":{"328":3,"330":2}}],["breaking",{"2":{"120":1}}],["breadcrumbs",{"0":{"187":1},"2":{"102":1}}],["bracketpairs",{"2":{"444":1}}],["branches",{"2":{"435":2}}],["branching",{"2":{"426":1}}],["branch",{"2":{"421":1,"426":1,"427":8,"428":1,"435":1,"515":2}}],["brands",{"2":{"218":3}}],["brave",{"2":{"213":1}}],["br>",{"2":{"114":1,"349":1}}],["browserslist",{"2":{"444":2}}],["browser",{"2":{"106":1,"259":1,"365":1,"444":1}}],["box",{"2":{"497":4}}],["boilerplate",{"2":{"496":1}}],["bound",{"2":{"449":2}}],["boundary",{"2":{"444":1}}],["bower",{"2":{"444":3}}],["bottombar",{"2":{"222":1}}],["bootstrap",{"2":{"216":1}}],["boolean",{"2":{"94":1,"222":1,"391":1}}],["border",{"2":{"182":3,"222":2,"283":1,"497":1,"545":1}}],["body>",{"2":{"140":2}}],["body",{"2":{"23":1,"140":2,"215":1,"216":1,"402":1,"497":1,"544":1}}],["be",{"2":{"435":2,"444":1,"497":1}}],["before",{"2":{"336":4,"337":2}}],["beforeinstallprompt",{"2":{"263":3}}],["below",{"2":{"196":1}}],["bento",{"2":{"189":1}}],["bearer",{"2":{"55":3,"248":2}}],["best",{"0":{"362":1},"2":{"22":1,"161":1,"227":1,"255":1,"269":1,"289":1,"290":1,"341":1,"367":1,"383":1,"406":1,"460":2,"464":1,"485":1}}],["babel",{"2":{"444":10}}],["babelrc",{"2":{"444":10}}],["bazelproject",{"2":{"444":1}}],["bazelignore",{"2":{"444":1}}],["bazelrc",{"2":{"444":1}}],["bazel",{"2":{"444":3}}],["banner",{"2":{"440":1}}],["band",{"2":{"167":1}}],["bash$",{"2":{"489":1}}],["bashpnpm",{"2":{"489":1}}],["basic",{"0":{"343":1,"344":1,"351":1}}],["basetoggle",{"2":{"531":1}}],["baseurl",{"2":{"501":1}}],["baseurl=",{"2":{"398":1}}],["baseinput",{"2":{"454":1}}],["baseicon",{"0":{"441":1,"498":1},"2":{"89":1,"96":3,"440":2,"443":2,"498":5,"531":1}}],["basebutton",{"2":{"436":1,"454":1,"459":2}}],["base64urlencode",{"2":{"245":2}}],["base64",{"2":{"245":3,"440":1}}],["based",{"2":{"106":3,"394":1}}],["base",{"0":{"516":1},"2":{"100":1,"441":1,"516":2,"545":1}}],["bar",{"2":{"283":1}}],["bars",{"0":{"181":1},"1":{"182":1},"2":{"186":2}}],["backers",{"2":{"444":1}}],["backend",{"2":{"39":1,"107":1,"245":1}}],["backroute",{"2":{"438":1}}],["backups",{"2":{"435":1}}],["backup",{"2":{"435":8}}],["background",{"2":{"260":1,"261":1,"265":1}}],["back",{"2":{"187":1,"242":1}}],["badge",{"2":{"94":1,"178":1,"344":1}}],["baas",{"0":{"37":1},"1":{"38":1,"39":1,"40":1,"41":1},"2":{"39":1,"107":5}}],["two",{"2":{"461":1}}],["twitter",{"2":{"248":1,"540":8}}],["turbo",{"2":{"444":2}}],["tmp",{"2":{"444":1}}],["tdd",{"0":{"407":1},"2":{"405":1,"407":2,"409":1}}],["ttf",{"2":{"265":1}}],["t",{"0":{"302":1},"2":{"195":1,"294":1,"443":3,"449":2,"486":1,"492":1,"524":2,"526":2}}],["trevis",{"2":{"433":1}}],["tree",{"2":{"161":1,"227":1,"255":1,"341":1,"383":1,"406":1,"442":1,"444":3,"449":2,"453":1}}],["tr",{"2":{"258":1}}],["travis",{"2":{"444":2}}],["traffic",{"2":{"256":1}}],["transactions",{"2":{"524":1}}],["transport",{"2":{"500":1}}],["translate",{"2":{"460":1}}],["transformer",{"2":{"444":1}}],["transform",{"2":{"182":2,"451":1}}],["transfer",{"2":{"134":1,"135":1,"243":1,"397":1,"435":1}}],["transitiongroup",{"2":{"151":1}}],["transition",{"2":{"151":1}}],["tricks",{"0":{"504":1}}],["triggerexpansionontab",{"2":{"444":1}}],["triggerevent",{"2":{"184":4}}],["trigger",{"2":{"416":1}}],["trivago",{"2":{"256":1}}],["try",{"2":{"132":1,"164":1,"321":1,"337":2,"396":3,"412":1}}],["true",{"2":{"105":1,"146":2,"175":1,"222":1,"233":2,"237":2,"263":2,"265":1,"278":1,"289":1,"352":1,"357":1,"392":1,"435":1,"438":1,"442":2,"444":61,"489":4}}],["txtlogs",{"2":{"426":1}}],["txthome",{"2":{"187":2}}],["txtserver",{"2":{"132":1}}],["txt",{"2":{"125":1,"215":1,"444":1}}],["typ",{"2":{"245":1}}],["typicode",{"2":{"107":1,"500":1}}],["types",{"2":{"443":1,"481":1}}],["typescript",{"0":{"481":1},"2":{"23":2,"109":1,"142":1,"214":1,"354":1,"443":3,"444":6,"449":2,"481":4,"492":1}}],["type=",{"2":{"149":1,"222":3,"395":1,"400":3,"526":1}}],["typedoc",{"2":{"444":2}}],["typed",{"2":{"83":1}}],["type",{"2":{"55":1,"83":1,"174":1,"222":1,"246":1,"261":1,"265":3,"279":2,"289":2,"324":2,"435":1,"441":7,"501":1,"540":1}}],["tazerc",{"2":{"444":2}}],["target",{"2":{"330":6,"357":7,"435":15,"443":1}}],["tail",{"2":{"435":1}}],["tails",{"2":{"285":4}}],["tailwind",{"2":{"216":2,"444":10,"459":2}}],["tauri",{"2":{"233":1}}],["tasks",{"2":{"222":2,"444":2}}],["task",{"2":{"155":1,"222":1}}],["tags",{"2":{"100":1,"489":1,"494":1,"540":2}}],["tag",{"0":{"97":1},"2":{"517":2}}],["tabs",{"2":{"444":1}}],["tabsize",{"2":{"444":1}}],["tab",{"2":{"81":1}}],["table",{"0":{"45":1,"46":1,"47":1}}],["tablet",{"2":{"23":1,"86":1,"497":4,"534":2,"536":1}}],["terserrc",{"2":{"444":10}}],["terminal",{"2":{"213":1,"444":5}}],["tex",{"2":{"444":1}}],["textlint",{"2":{"444":2}}],["text=abc",{"2":{"236":1}}],["text",{"2":{"149":1,"213":1,"222":12,"236":1,"283":2,"395":5,"400":1,"415":1,"418":2,"545":6}}],["textarea>",{"2":{"395":1}}],["textarea",{"2":{"149":1,"174":1,"395":1}}],["testnet",{"2":{"501":1}}],["testjsonrpc",{"2":{"501":1}}],["testrest",{"2":{"500":2}}],["tests",{"0":{"411":1,"415":1,"416":1},"2":{"410":4}}],["testservice",{"2":{"392":4,"397":1,"399":1}}],["test",{"0":{"393":1,"411":1,"414":1,"415":1,"416":1},"1":{"415":1,"416":1},"2":{"392":1,"393":2,"400":1,"402":2,"405":1,"408":1,"410":7,"411":10,"413":2,"414":5,"415":5,"416":3,"417":2,"418":1,"419":2,"444":1,"450":1,"526":1}}],["testing",{"2":{"365":1,"405":1,"407":2,"409":1}}],["temperature",{"2":{"330":5}}],["template",{"2":{"96":1,"142":1,"283":8,"522":3}}],["template>",{"2":{"94":2,"114":2,"142":2,"151":2,"182":2,"184":2,"221":2,"236":2,"283":9,"285":2,"289":2,"332":2,"333":2,"343":2,"344":2,"347":2,"349":2,"354":2,"358":2,"395":2,"400":2,"438":6,"441":2,"459":2,"498":2,"522":2,"526":2}}],["team",{"2":{"167":1}}],["teleport",{"2":{"119":1,"151":1}}],["telegram",{"2":{"63":1,"228":1}}],["tsup",{"2":{"444":2}}],["tslint",{"2":{"444":2}}],["tsdoc",{"2":{"444":11}}],["tsdk",{"2":{"444":1}}],["tsx",{"2":{"444":3}}],["tsconfig",{"2":{"443":2,"444":11}}],["tsc",{"2":{"443":1}}],["ts",{"2":{"94":2,"95":1,"100":1,"142":1,"417":1,"444":33,"449":1,"497":1,"498":3,"500":1,"501":2,"503":1,"516":1,"526":2}}],["threshold",{"2":{"522":2}}],["throw",{"2":{"321":1,"411":1,"412":1,"435":1}}],["that",{"2":{"83":2,"449":4}}],["there",{"2":{"387":1,"449":1}}],["themetoggle",{"2":{"545":1}}],["themes",{"2":{"496":1,"533":1}}],["theme",{"2":{"260":1,"261":1,"265":1,"531":1}}],["thenable",{"2":{"337":1}}],["then",{"2":{"244":1,"248":1,"249":2,"251":1,"289":1,"337":13,"392":1,"393":1,"395":2,"398":2,"400":1,"435":4}}],["the",{"0":{"304":1},"1":{"307":1,"308":1,"309":1,"310":1},"2":{"83":5,"171":1,"196":1,"294":1,"329":1,"411":4,"435":2,"440":2,"442":1,"444":1,"461":1}}],["this",{"2":{"83":2,"142":1,"143":6,"242":2,"315":2,"319":1,"321":1,"322":3,"326":9,"351":4,"357":3,"444":3}}],["tip",{"2":{"448":1,"451":1}}],["tidy",{"2":{"444":1}}],["tinder",{"2":{"256":2}}],["timeout",{"2":{"278":3}}],["time",{"2":{"245":1,"249":1}}],["times",{"2":{"222":1}}],["timestamp",{"2":{"47":1}}],["titlebarstyle",{"2":{"444":1}}],["title=",{"2":{"280":1,"289":1,"333":1,"343":3}}],["title",{"2":{"0":1,"17":1,"18":1,"19":1,"280":2,"289":4,"344":2,"347":3,"395":5,"396":2,"540":4}}],["toml",{"2":{"444":10}}],["toc",{"2":{"444":1}}],["tocontain",{"2":{"415":1}}],["tothrow",{"2":{"412":1}}],["total",{"2":{"153":1,"154":1}}],["toequal",{"2":{"411":1,"416":1}}],["tobegreaterthan",{"2":{"411":1}}],["tobe",{"2":{"411":8,"413":1,"416":2}}],["toarray",{"2":{"396":2}}],["tool",{"2":{"444":3}}],["toolchain",{"2":{"444":1}}],["tools",{"2":{"365":1}}],["tooltips",{"0":{"177":1}}],["tostring",{"2":{"246":1}}],["to=",{"2":{"236":3,"239":1}}],["todolist",{"2":{"273":1,"274":1}}],["todofilter",{"2":{"273":1}}],["todoproject",{"2":{"231":1,"233":1,"236":3,"272":1,"273":2,"274":2,"290":3}}],["todo",{"2":{"222":26,"290":3}}],["todoservice",{"2":{"290":1}}],["todosummary",{"2":{"273":1,"290":1}}],["todos",{"0":{"222":1},"2":{"221":7,"500":1}}],["top",{"2":{"182":1,"233":1}}],["togglestatus",{"2":{"290":2}}],["toggle",{"2":{"175":2,"498":1}}],["togglefavourite",{"2":{"94":3}}],["tokens",{"2":{"245":1,"398":1}}],["token",{"2":{"105":1,"106":5,"247":2,"248":3,"484":2}}],["touchslideoutdrawer",{"0":{"507":1},"2":{"100":1,"507":1}}],["to",{"0":{"109":1,"127":1,"196":1,"220":1,"223":1,"231":1,"290":1,"291":1},"1":{"221":1,"222":1,"223":1},"2":{"43":1,"83":1,"100":1,"105":1,"196":1,"212":1,"214":1,"219":1,"220":2,"221":1,"222":2,"223":1,"224":1,"226":2,"231":1,"233":1,"236":2,"240":4,"272":1,"285":1,"289":1,"290":3,"291":1,"293":1,"400":3,"407":1,"408":1,"411":1,"435":2,"440":1,"444":2,"449":3,"450":1}}],["agnostic",{"2":{"500":1}}],["age",{"2":{"279":1}}],["azure",{"2":{"444":2}}],["ava",{"2":{"444":10}}],["available",{"0":{"132":1},"2":{"131":1}}],["aux",{"2":{"444":1}}],["automation",{"2":{"515":1}}],["autocompleterefs",{"2":{"444":1}}],["autodetection",{"2":{"444":1}}],["autodetectcolorscheme",{"2":{"444":1}}],["autofetch",{"2":{"444":1}}],["autofocus",{"2":{"222":1}}],["auto",{"2":{"265":1,"441":1,"444":1,"542":1}}],["autoupdate",{"2":{"265":1,"444":1}}],["authors",{"2":{"444":3}}],["authorization",{"2":{"55":3,"106":2,"248":2}}],["authenticator",{"2":{"250":1}}],["auth0",{"2":{"248":1}}],["authinterceptor",{"2":{"105":2}}],["auth",{"2":{"105":3,"246":1,"494":1,"496":1,"533":2}}],["a>",{"2":{"395":2}}],["after",{"2":{"284":1,"336":5,"337":2,"435":1}}],["abc",{"2":{"236":1}}],["ajax",{"2":{"228":1,"243":2,"334":1}}],["aaaa",{"2":{"125":2}}],["awesome",{"2":{"219":1}}],["aws",{"2":{"107":1}}],["await",{"2":{"54":3,"105":2,"264":3,"337":8,"396":1,"413":3,"500":1}}],["amd",{"2":{"365":1}}],["amazon",{"2":{"107":2,"180":5,"256":1,"439":2}}],["amplify",{"2":{"39":1}}],["at",{"2":{"106":6,"245":1,"444":1,"484":1}}],["attributes",{"0":{"77":1}}],["ad",{"2":{"184":1}}],["admin",{"2":{"125":1,"281":1}}],["adapter",{"2":{"100":1,"489":1}}],["addextraspaceontop",{"2":{"444":1}}],["added",{"2":{"428":1}}],["addeventlistener",{"2":{"263":2,"264":1,"284":1,"301":1}}],["addnote",{"2":{"395":1,"396":2}}],["addcommand",{"2":{"328":1}}],["addyosmani",{"2":{"256":1}}],["addroute",{"2":{"242":1}}],["addresponseinterceptor",{"2":{"105":2,"501":1}}],["addtodo",{"2":{"222":6}}],["adds",{"2":{"100":1,"489":1,"494":1}}],["add",{"2":{"53":1,"94":1,"100":7,"396":1,"423":1,"425":2,"428":1,"429":1,"489":6,"494":3}}],["acme",{"2":{"542":3}}],["acr",{"2":{"444":1}}],["acn",{"2":{"444":1}}],["activitybar",{"2":{"444":1}}],["active",{"2":{"236":1,"239":1,"289":3,"444":1}}],["actions",{"0":{"435":1,"514":1},"1":{"515":1,"516":1},"2":{"100":1,"350":1,"351":4,"352":1,"433":1,"435":12,"444":1,"460":1,"469":1,"496":1,"515":1,"530":1,"533":1}}],["action",{"0":{"196":1},"2":{"100":1,"151":4,"196":1,"328":2,"416":1,"435":9,"444":1,"489":1,"515":2}}],["accordian",{"2":{"437":1}}],["accordianpanel",{"2":{"437":1}}],["according",{"2":{"411":1}}],["accountroutes",{"2":{"438":2}}],["account",{"2":{"105":1,"438":2,"440":1,"442":1}}],["accept",{"2":{"289":5}}],["accessibility",{"2":{"459":1}}],["accessibilitysupport",{"2":{"444":1}}],["access",{"2":{"106":5,"108":4,"484":1}}],["ac",{"2":{"95":2}}],["arguments",{"2":{"517":1}}],["args",{"2":{"357":2}}],["article",{"2":{"457":1}}],["artisan",{"2":{"444":1}}],["arty",{"0":{"60":1},"2":{"74":2,"86":1,"99":1,"100":5}}],["array",{"2":{"83":8,"94":1,"279":1}}],["always",{"2":{"449":1}}],["ally",{"2":{"444":3,"527":2}}],["all",{"2":{"337":1,"444":1}}],["allowcompoundwords",{"2":{"444":1}}],["allows",{"2":{"444":1}}],["allow",{"2":{"108":4}}],["alert",{"2":{"336":1}}],["alexa",{"2":{"162":1}}],["alg",{"2":{"245":1,"444":1}}],["alias",{"2":{"219":1,"443":1}}],["align",{"2":{"182":1}}],["alibris",{"2":{"22":1}}],["alt",{"2":{"81":2}}],["air",{"2":{"444":1}}],["ai",{"2":{"81":1}}],["analysis",{"2":{"444":1,"481":1}}],["analytics",{"0":{"517":1,"540":1},"2":{"100":1,"489":1,"494":1,"503":1,"530":1}}],["antfu",{"2":{"444":3}}],["antialiased",{"2":{"444":1}}],["antony",{"2":{"23":1,"444":1,"492":1}}],["any",{"2":{"365":1,"542":1}}],["anothercomponent",{"2":{"278":3}}],["anon",{"2":{"54":1,"55":6}}],["angular",{"2":{"228":1,"451":2}}],["animation",{"2":{"182":1}}],["android",{"2":{"256":2,"263":1}}],["and",{"0":{"303":1,"362":1},"2":{"100":2,"125":1,"161":1,"194":1,"227":1,"243":1,"255":1,"269":1,"289":1,"290":1,"341":1,"367":1,"383":1,"406":1,"412":1,"415":2,"416":2,"435":4,"449":4,"460":2,"464":1,"485":1,"489":1,"494":1,"515":3}}],["an",{"2":{"83":1,"240":1,"412":1,"449":2}}],["annotations",{"2":{"444":1}}],["annotation",{"2":{"83":1}}],["axios",{"2":{"41":1,"105":1,"243":4,"244":4,"248":5,"249":3,"334":1,"397":4,"398":5,"402":2,"495":1,"500":1}}],["apollo",{"2":{"444":2}}],["apt",{"2":{"423":4}}],["apache",{"0":{"129":1},"1":{"130":1},"2":{"128":1,"129":1,"131":1,"365":1,"394":1,"439":1}}],["appveyor",{"2":{"444":2}}],["appsettings",{"2":{"444":2}}],["appsearchbar",{"2":{"89":1}}],["appsidebar",{"2":{"438":1,"534":1}}],["appfooter",{"2":{"438":2}}],["appinstalled",{"2":{"263":2}}],["appmanifest",{"2":{"258":1}}],["appleboy",{"2":{"435":3}}],["apple",{"2":{"256":2}}],["applications",{"2":{"265":1}}],["application",{"2":{"55":1,"100":1,"258":1,"262":1,"363":1,"461":2,"489":1,"501":1}}],["approach",{"2":{"194":1}}],["appheader>",{"2":{"522":1}}],["appheadersecond",{"2":{"522":1}}],["appheaderfirst",{"2":{"522":1}}],["appheader",{"2":{"91":1,"93":1,"96":1,"438":2,"522":1}}],["app",{"0":{"221":1,"236":1},"2":{"86":2,"89":1,"96":1,"111":5,"112":5,"125":1,"126":1,"127":3,"132":2,"140":6,"141":1,"142":2,"215":2,"220":1,"221":3,"234":4,"235":1,"236":2,"256":2,"258":1,"263":5,"266":1,"272":2,"277":6,"281":2,"289":8,"290":1,"353":7,"393":1,"402":6,"409":2,"436":1,"438":1,"441":2,"461":1,"497":1,"544":1}}],["appwrite",{"2":{"39":1}}],["apidata",{"2":{"500":2}}],["apikey",{"2":{"55":3}}],["api",{"0":{"50":1,"51":1,"55":1,"103":1,"105":1,"143":1,"351":1,"499":1,"500":1},"1":{"52":1,"53":1,"54":1,"55":1,"500":1,"501":1},"2":{"23":1,"40":2,"41":9,"50":1,"57":2,"58":1,"93":1,"100":1,"103":2,"105":10,"107":5,"109":2,"110":3,"112":2,"113":1,"114":1,"116":4,"121":1,"143":16,"150":1,"151":2,"242":4,"243":2,"244":4,"246":1,"254":1,"256":2,"264":1,"281":1,"284":2,"285":1,"288":1,"289":9,"290":1,"300":2,"302":2,"312":1,"316":2,"318":1,"329":8,"330":1,"331":5,"332":2,"334":7,"337":1,"348":1,"350":3,"351":2,"352":3,"354":3,"355":2,"356":1,"357":1,"382":3,"384":2,"385":1,"386":1,"394":2,"397":5,"400":1,"402":2,"415":1,"436":2,"439":2,"444":14,"448":4,"449":3,"451":1,"460":3,"461":1,"470":1,"489":2,"492":1,"494":1,"496":2,"500":4,"501":7,"530":3}}],["a",{"2":{"39":1,"54":1,"83":5,"100":1,"107":1,"125":2,"139":2,"236":2,"240":4,"256":1,"326":2,"337":10,"395":2,"411":1,"428":1,"442":1,"444":1,"448":2,"449":3,"452":1,"460":1,"461":1,"489":1,"494":1,"515":1}}],["asked",{"2":{"485":1}}],["aside",{"2":{"457":1}}],["astro",{"2":{"444":1,"495":1}}],["ashx",{"2":{"444":1}}],["ascx",{"2":{"444":1}}],["asax",{"2":{"444":1}}],["aspx",{"2":{"444":1}}],["asp",{"2":{"217":1}}],["assign",{"2":{"246":1}}],["assigned",{"2":{"125":1}}],["assets",{"2":{"215":2,"234":1,"436":1,"440":5,"442":2,"498":1,"543":1}}],["asynchronous",{"2":{"243":1}}],["async",{"2":{"105":1,"264":1,"275":1,"288":1,"337":3,"396":3,"413":3,"500":1,"501":1,"517":1}}],["as",{"2":{"39":1,"107":1,"411":1,"442":3}}],["38",{"2":{"545":1}}],["39",{"2":{"425":1}}],["34",{"2":{"336":3,"337":1}}],["32",{"2":{"330":3,"422":1}}],["333333",{"2":{"265":1}}],["365",{"2":{"228":1}}],["360deg",{"2":{"182":1}}],["3x3",{"2":{"189":1}}],["3000",{"2":{"386":1,"393":1,"398":1,"402":3}}],["300",{"2":{"249":1,"398":2,"444":1}}],["30rem",{"2":{"222":1}}],["30",{"2":{"164":2,"184":1,"208":1,"444":1}}],["3",{"0":{"138":1,"144":1,"229":1,"248":1,"274":1,"319":1,"361":1,"362":1,"370":1,"372":1,"381":1,"449":1,"466":1,"493":1},"1":{"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":2,"146":2,"147":2,"148":2,"149":2,"150":2,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"242":1,"362":1,"363":1,"364":1,"365":1,"366":1,"367":1,"368":1,"467":1,"494":1,"495":1},"2":{"23":1,"89":1,"93":1,"94":1,"97":1,"103":1,"108":1,"109":1,"110":3,"111":4,"112":2,"113":1,"115":2,"116":2,"117":2,"118":1,"119":2,"121":5,"124":1,"128":3,"132":2,"135":2,"136":1,"138":3,"139":1,"140":2,"141":3,"142":2,"143":4,"148":1,"150":1,"151":2,"152":1,"158":1,"161":2,"166":1,"184":2,"187":2,"188":1,"211":1,"212":2,"213":2,"214":4,"215":5,"217":1,"218":1,"219":1,"220":1,"222":4,"225":2,"226":2,"227":1,"228":2,"229":1,"233":3,"237":1,"244":1,"245":3,"248":1,"251":1,"255":1,"263":2,"269":2,"270":1,"271":1,"274":1,"276":1,"277":1,"278":3,"280":1,"283":1,"284":3,"285":1,"286":1,"287":1,"289":8,"290":1,"294":1,"298":1,"299":1,"300":1,"301":2,"305":2,"322":1,"323":2,"325":1,"326":2,"328":2,"329":2,"330":2,"331":1,"333":3,"334":1,"337":4,"338":1,"340":1,"341":2,"343":3,"344":2,"347":3,"348":1,"349":4,"351":2,"352":2,"354":3,"357":3,"359":1,"363":2,"365":2,"367":1,"370":1,"371":1,"376":1,"378":1,"379":1,"383":1,"384":2,"386":1,"391":2,"392":2,"393":2,"395":2,"396":1,"402":2,"406":1,"411":1,"415":3,"416":4,"418":1,"428":1,"429":1,"436":2,"443":1,"444":2,"448":3,"449":9,"451":3,"459":1,"460":6,"464":1,"477":1,"485":2,"492":2,"494":1,"496":1,"501":1,"545":2}}],["huskyrc",{"2":{"444":2}}],["human",{"2":{"171":1}}],["hxx",{"2":{"444":3}}],["hpp",{"2":{"444":3}}],["h4>данные",{"2":{"400":1}}],["h4>текст",{"2":{"400":1}}],["h4>child",{"2":{"354":1}}],["h4>",{"2":{"347":2,"354":1,"400":2}}],["h3>selected",{"2":{"395":1}}],["h3>notes",{"2":{"395":1}}],["h3>new",{"2":{"395":1}}],["h3>",{"2":{"344":2,"395":3}}],["hide=",{"2":{"522":1}}],["hidden",{"2":{"504":1}}],["histoire",{"2":{"444":10}}],["history",{"2":{"126":1,"127":1,"233":7,"444":5}}],["highlightmodifiedtabs",{"2":{"444":1}}],["hi",{"2":{"281":1,"387":1}}],["hamburger",{"2":{"498":1}}],["handler",{"2":{"330":3,"357":3}}],["handleappinstalled",{"2":{"263":2}}],["hasroute",{"2":{"242":1}}],["hash",{"2":{"132":1,"233":2,"242":1}}],["has",{"2":{"83":1,"94":2}}],["hmacsha256",{"2":{"245":1}}],["hmr",{"2":{"214":1,"443":1}}],["hs256",{"2":{"245":3}}],["href",{"2":{"236":1}}],["href=",{"2":{"217":1,"218":3,"258":1}}],["hyvinkaa",{"2":{"191":1}}],["hypertext",{"2":{"135":1}}],["h1",{"2":{"142":1,"331":1,"332":1}}],["h1>",{"2":{"142":1,"222":2,"332":2}}],["h1>hello",{"2":{"142":1}}],["holding",{"2":{"449":2}}],["houdini",{"2":{"444":1}}],["hover",{"2":{"444":1}}],["hot",{"2":{"214":1,"215":1}}],["hooks",{"2":{"143":1,"444":4}}],["homebrew",{"2":{"424":1}}],["home",{"2":{"132":1,"167":1,"231":1,"489":1}}],["homeview",{"2":{"87":1}}],["hosts",{"2":{"449":1}}],["host",{"2":{"108":1,"435":7}}],["how",{"2":{"100":1}}],["hopscotch",{"2":{"50":1}}],["hoppscotch",{"0":{"49":1},"1":{"50":1},"2":{"444":1}}],["h",{"2":{"55":8,"435":1,"444":4}}],["htaccess",{"0":{"130":1},"2":{"131":1}}],["httponly",{"2":{"106":3}}],["http",{"0":{"129":1},"1":{"130":1},"2":{"55":2,"105":11,"107":1,"108":3,"128":1,"129":1,"135":1,"243":2,"382":1,"397":2,"398":3,"399":1,"402":2,"440":1,"500":5,"501":4}}],["https",{"2":{"54":1,"55":3,"74":2,"99":1,"100":1,"108":6,"116":3,"120":1,"135":3,"136":1,"140":1,"150":1,"151":2,"161":1,"169":1,"190":1,"213":2,"217":2,"218":1,"219":5,"227":1,"242":1,"244":1,"245":3,"246":2,"249":2,"255":1,"256":2,"258":1,"269":1,"283":1,"284":1,"285":1,"289":1,"290":1,"303":1,"326":1,"341":1,"345":1,"354":1,"355":1,"367":1,"368":1,"383":1,"406":1,"439":1,"444":2,"461":1,"486":1,"491":1,"500":1,"501":1,"515":1,"517":1}}],["htmlnanorc",{"2":{"444":20}}],["html=",{"2":{"441":1}}],["html>",{"2":{"140":2}}],["html5",{"2":{"136":1,"138":1,"233":1,"457":1,"479":1,"492":1}}],["html$",{"2":{"130":1}}],["html",{"0":{"174":1,"479":1,"503":1},"1":{"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1},"2":{"22":1,"100":1,"108":1,"111":1,"116":2,"117":1,"126":2,"127":2,"128":1,"130":2,"132":3,"138":5,"139":1,"140":3,"141":2,"142":6,"143":1,"144":2,"145":4,"149":2,"150":4,"151":4,"163":1,"173":1,"174":1,"175":2,"176":2,"181":1,"184":1,"192":1,"215":3,"216":3,"217":2,"218":3,"221":3,"222":5,"242":1,"245":1,"258":2,"262":1,"265":1,"277":2,"280":1,"283":5,"285":1,"292":1,"300":1,"330":1,"365":1,"380":1,"408":2,"413":1,"415":3,"418":3,"428":5,"435":2,"439":1,"440":2,"444":6,"451":3,"460":1,"461":10,"497":1,"503":2,"517":2,"540":2,"544":1}}],["heidisql",{"2":{"444":1}}],["height",{"2":{"18":1,"182":1,"221":1,"441":7}}],["heex",{"2":{"444":1}}],["hexcolorlength",{"2":{"444":1}}],["helps",{"2":{"442":1}}],["helloworld",{"2":{"215":1}}],["hello=",{"2":{"143":1}}],["hello",{"2":{"140":1,"143":10,"212":1,"223":1,"524":1}}],["heavycomponent",{"2":{"278":2}}],["heads",{"2":{"285":4}}],["head",{"2":{"140":1,"216":1,"258":1}}],["head>",{"2":{"140":2}}],["headerh1",{"2":{"333":2}}],["header=",{"2":{"283":1}}],["header>",{"2":{"283":3,"289":2,"498":1,"522":2}}],["headers",{"0":{"518":1},"1":{"519":1,"520":1,"521":1,"522":1},"2":{"248":1,"501":1}}],["header",{"0":{"29":1,"89":1},"2":{"28":1,"100":1,"239":2,"245":4,"283":3,"289":1,"457":1,"489":2,"496":2,"498":2,"519":1,"520":1,"521":1,"522":1,"530":1,"533":1}}],["headless",{"2":{"6":1,"12":2,"61":1,"76":1,"79":1,"450":1,"459":1,"496":1}}],["heroku",{"2":{"439":1,"533":1}}],["hero",{"0":{"196":1},"2":{"196":2}}],["here",{"2":{"142":1,"222":1}}],["white",{"2":{"222":1}}],["w3css",{"2":{"217":3}}],["w3schools",{"2":{"217":3}}],["w3",{"0":{"217":1},"1":{"221":1,"222":1,"223":1},"2":{"217":4,"221":2,"222":28,"228":1,"236":2,"258":1,"283":4}}],["way",{"2":{"483":1}}],["wait",{"2":{"249":5}}],["watchman",{"2":{"444":2}}],["watch",{"2":{"236":4,"451":1}}],["watcher",{"2":{"184":6}}],["walmart",{"2":{"22":1}}],["write",{"2":{"142":1,"435":1,"449":1}}],["wrap",{"2":{"102":1}}],["wrapper=mount",{"2":{"416":1}}],["wrapper",{"2":{"96":1,"283":1,"289":2,"415":2,"416":2}}],["will",{"2":{"448":1}}],["wild",{"2":{"135":1}}],["windi",{"2":{"444":10}}],["window",{"2":{"216":1,"251":1,"263":2,"284":1,"301":2,"355":3,"357":2,"384":1,"385":3,"435":1,"444":4,"448":3,"517":2}}],["windows",{"0":{"422":1},"2":{"128":1,"131":1,"134":1,"177":1,"213":3,"251":1,"256":1,"259":1,"266":1,"365":5,"413":1,"422":2}}],["width",{"2":{"182":1,"194":1,"221":1,"222":2,"441":7,"536":1,"545":1}}],["wide",{"2":{"125":1,"138":1,"228":1}}],["wiki",{"2":{"169":1,"303":1,"355":1}}],["wikipedia",{"2":{"169":1,"303":1,"355":1}}],["without",{"2":{"448":1}}],["with",{"2":{"54":1,"240":2,"402":1,"435":8,"442":1,"444":1}}],["words",{"2":{"449":1}}],["wordseparators",{"2":{"444":1}}],["world",{"2":{"125":1,"138":1,"140":1,"142":1,"143":4,"212":1,"223":1,"228":1}}],["workspace",{"2":{"444":3}}],["workingissueformatscm",{"2":{"444":1}}],["workbench",{"2":{"444":11}}],["workbox",{"2":{"264":1,"265":4,"461":2,"543":1}}],["work",{"2":{"435":1,"444":2}}],["workflows",{"2":{"435":3}}],["workflow",{"2":{"100":2,"435":2,"489":1,"530":1}}],["workerу",{"2":{"391":1}}],["workers",{"0":{"264":1,"377":1,"382":1,"384":1},"1":{"383":1,"384":1,"385":2,"386":2,"387":2,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1,"398":1,"399":1,"400":1,"401":1,"402":1,"403":1,"404":1},"2":{"243":1,"254":3,"263":1,"264":1,"302":1,"305":1,"312":1,"328":1,"334":2,"355":2,"359":1,"364":1,"377":1,"382":2,"383":1,"384":10,"386":2,"387":3,"388":1,"389":1,"390":1,"391":1,"403":4,"404":4}}],["worker",{"0":{"385":1,"386":1,"394":1,"543":1},"1":{"386":1,"387":1,"391":1,"392":1,"393":1,"395":2,"396":2,"397":2,"398":2,"399":2,"400":2,"402":1},"2":{"100":2,"256":1,"264":4,"265":1,"268":1,"382":1,"384":2,"385":21,"386":4,"387":5,"388":2,"390":2,"391":11,"392":1,"393":4,"394":1,"395":5,"396":2,"397":3,"398":1,"399":1,"461":3,"484":1,"489":1,"494":1,"503":1,"530":1,"541":1,"543":2}}],["www",{"2":{"108":1,"116":1,"125":1,"132":2,"180":1,"190":1,"191":1,"217":2,"219":1,"228":1,"258":1,"326":1,"368":1,"435":6,"517":1}}],["we",{"2":{"142":1}}],["webdriverio",{"2":{"450":1}}],["webp",{"2":{"442":1}}],["webpack",{"2":{"110":1,"117":1,"118":1,"443":4,"444":13}}],["webhooks",{"2":{"429":1}}],["webworker",{"0":{"391":1,"392":1,"393":1,"396":1,"397":1,"398":1,"399":1},"2":{"391":4,"393":3,"395":5,"400":4}}],["webmanifest",{"2":{"258":2}}],["web3js",{"2":{"251":1}}],["web3",{"0":{"251":1},"2":{"250":1,"251":2,"252":1}}],["webfonts",{"2":{"218":2}}],["website",{"2":{"435":1,"439":5,"540":1}}],["webstorm",{"2":{"213":1,"444":2}}],["websocket",{"2":{"109":1}}],["websockets",{"2":{"105":1,"109":3,"460":1,"500":1}}],["web",{"0":{"377":1,"382":1,"384":1,"385":1,"394":1},"1":{"383":1,"384":1,"385":2,"386":3,"387":3,"388":1,"389":1,"390":1,"391":2,"392":2,"393":2,"394":1,"395":3,"396":3,"397":3,"398":3,"399":3,"400":3,"401":1,"402":2,"403":1,"404":1},"2":{"109":1,"125":1,"126":1,"132":1,"138":1,"218":1,"228":5,"233":4,"243":1,"245":1,"246":1,"254":2,"256":1,"266":1,"302":1,"305":1,"312":1,"328":1,"334":2,"355":2,"358":1,"359":1,"363":1,"364":1,"365":1,"377":1,"382":3,"383":1,"384":12,"385":8,"386":6,"387":5,"388":3,"389":1,"390":3,"391":8,"392":1,"393":4,"394":1,"395":5,"396":2,"397":3,"398":2,"399":1,"403":4,"404":4,"417":1,"461":4,"501":1,"542":1}}],["webapi",{"2":{"103":1}}],["webapp",{"0":{"100":1,"489":1,"493":1},"1":{"490":1,"494":1,"495":1},"2":{"100":5,"464":1,"487":2,"489":7,"491":2,"494":1,"515":2,"516":1,"542":1}}],["weight",{"2":{"18":1}}],["msg",{"2":{"526":1}}],["mjs",{"2":{"444":4}}],["mdsvex",{"2":{"444":1}}],["md",{"2":{"435":1,"444":3}}],["mdn",{"2":{"357":1}}],["mkdir",{"2":{"435":2}}],["mvp",{"2":{"450":1}}],["mvc",{"2":{"449":1,"451":1}}],["mv",{"2":{"435":1}}],["m",{"2":{"426":1,"428":1,"435":2}}],["mpr551xpscgmizp8ezuscoy7t7iqnpp",{"2":{"245":1}}],["mpa",{"2":{"228":5,"229":2,"253":1,"256":1}}],["myworker",{"2":{"387":5}}],["myprocessfunction",{"2":{"337":3}}],["myfuncc",{"2":{"337":3}}],["myfuncb",{"2":{"337":3}}],["myfunca",{"2":{"337":5}}],["myfunction",{"2":{"301":3,"315":3,"326":2}}],["myfile2",{"2":{"323":1}}],["myfile1",{"2":{"323":1}}],["mydata",{"2":{"355":2}}],["mydependency2",{"2":{"323":2}}],["mydependency1",{"2":{"323":2}}],["mydomain",{"2":{"125":1,"126":2,"127":2,"132":3}}],["mymodal",{"2":{"289":2}}],["mymenubar>",{"2":{"283":2}}],["mymenubar",{"2":{"283":3}}],["mymethod",{"2":{"143":1}}],["mylayout>",{"2":{"283":2}}],["mylayout",{"2":{"283":2}}],["myclass",{"2":{"315":5}}],["mycache",{"2":{"264":1}}],["mycomponent>",{"2":{"280":1}}],["mycomponent",{"2":{"112":12,"219":2,"277":7,"278":4,"280":3}}],["my",{"0":{"386":1},"2":{"145":3,"240":2,"244":1,"314":2,"315":4,"385":9,"387":1,"489":3,"490":1,"494":1,"515":2,"516":1}}],["mysql",{"2":{"40":1,"48":1,"444":1,"460":1}}],["moment",{"2":{"445":1,"448":1}}],["mocha",{"2":{"444":10}}],["monospace",{"2":{"444":1}}],["mono",{"2":{"444":1}}],["motels",{"0":{"201":1}}],["modal>",{"2":{"289":1}}],["modal",{"2":{"289":14}}],["modals",{"2":{"234":3,"287":1,"289":6,"290":3}}],["modern",{"2":{"444":1}}],["mode",{"2":{"233":1,"444":1}}],["modeling",{"2":{"273":1}}],["model=",{"2":{"149":1,"222":3,"280":2,"395":2,"400":3}}],["modelperson",{"2":{"115":4}}],["modelvalue",{"2":{"115":4,"280":9}}],["model",{"0":{"115":1,"149":1,"279":1},"2":{"110":1,"115":3,"146":1,"157":1,"222":2,"280":6,"285":1,"301":1,"449":1,"451":1}}],["module",{"2":{"214":1,"444":1}}],["modules",{"2":{"214":1,"215":2,"230":1,"426":1,"442":6,"443":1,"444":2}}],["mod",{"2":{"130":2,"444":1}}],["mozilla",{"2":{"116":1,"213":1,"246":1,"264":1,"355":1,"365":1,"387":1}}],["mount",{"2":{"111":1,"112":2,"140":2,"234":1,"277":1,"289":1,"353":1,"415":4,"416":1}}],["mobile",{"2":{"23":1,"194":2,"266":1,"497":4,"534":2,"536":1}}],["mit",{"2":{"487":1}}],["mitt",{"2":{"109":1,"326":2,"334":1,"345":4,"346":3}}],["mix",{"2":{"444":3}}],["mixin",{"2":{"284":1}}],["might",{"2":{"444":1}}],["migration",{"2":{"116":2,"120":1}}],["missing",{"2":{"321":1}}],["mime",{"2":{"258":1,"261":1}}],["minheight",{"2":{"441":1}}],["minwidth",{"2":{"441":1}}],["minimal",{"2":{"259":1}}],["min",{"2":{"218":3,"221":1,"222":1}}],["middleware",{"2":{"331":1}}],["middle",{"2":{"182":1}}],["mil",{"2":{"125":1}}],["microsoft",{"2":{"107":1,"167":1,"213":3,"248":1,"256":1,"365":1,"439":1,"444":1}}],["must",{"2":{"412":1}}],["music",{"2":{"63":1,"97":1}}],["multicursormodifier",{"2":{"444":1}}],["multipurpose",{"2":{"258":1}}],["multiviews",{"2":{"130":1}}],["muzhskaya",{"2":{"88":1}}],["map",{"2":{"442":2,"444":7}}],["mastery",{"2":{"460":1}}],["master",{"2":{"426":3,"428":4,"429":5,"435":3,"444":1}}],["math",{"2":{"285":1}}],["match",{"2":{"264":1}}],["material",{"2":{"18":1,"189":1,"216":3,"217":1}}],["max",{"2":{"184":3,"194":1,"222":1,"536":1,"545":1}}],["macports",{"2":{"424":1}}],["mac",{"2":{"266":1}}],["macromedia",{"2":{"138":1}}],["macos",{"0":{"424":1},"2":{"134":1,"213":3,"256":1,"365":4,"424":1,"444":1}}],["mailmap",{"2":{"444":1}}],["mail",{"2":{"125":1,"258":1}}],["maintainers",{"2":{"444":1}}],["maintainability",{"2":{"295":1}}],["maintenanceview",{"2":{"438":1}}],["maintenance",{"2":{"438":2}}],["mainheader",{"2":{"290":1}}],["main>",{"2":{"236":2,"283":2,"289":2}}],["mainlayout",{"0":{"534":1},"1":{"535":1},"2":{"36":1,"100":1,"438":2,"489":2,"536":1}}],["main",{"0":{"31":1,"234":1,"353":1,"387":1},"2":{"111":1,"113":1,"141":1,"161":1,"215":3,"216":2,"227":1,"233":1,"239":1,"255":1,"264":1,"277":3,"289":2,"290":1,"341":1,"352":1,"383":1,"386":1,"406":1,"435":6,"526":1}}],["markdownlint",{"2":{"444":2}}],["markdown",{"0":{"482":1},"2":{"444":1,"482":1}}],["marketplace",{"2":{"22":1}}],["margin",{"2":{"222":3,"504":1}}],["mary",{"2":{"114":1}}],["mantinelayeredheader",{"0":{"521":1}}],["mantine",{"2":{"520":1,"521":1}}],["mantinerichfooter",{"0":{"512":1},"2":{"489":2}}],["mantinesimplefooter",{"0":{"511":1},"2":{"100":1}}],["mantinesimplenavbar",{"0":{"539":1},"2":{"100":1,"489":2}}],["mantinesimpleheader",{"0":{"520":1},"2":{"91":1,"100":1,"489":2}}],["manually",{"2":{"444":1}}],["management",{"0":{"449":1},"2":{"420":1,"449":2}}],["manager",{"0":{"118":1},"2":{"93":1,"110":1,"213":1,"356":1}}],["man",{"2":{"167":1}}],["manifest+json",{"2":{"258":1}}],["manifest",{"0":{"542":1},"2":{"100":2,"215":1,"258":5,"261":1,"265":1,"489":1,"494":1,"541":1,"542":1}}],["many",{"2":{"43":2}}],["make",{"2":{"83":1,"100":1,"489":1,"494":1}}],["magento",{"2":{"41":1,"47":1,"103":1}}],["me",{"2":{"486":1}}],["merge",{"2":{"421":1,"427":1,"428":2}}],["mercurial",{"2":{"420":1}}],["merchants",{"2":{"12":1}}],["memory",{"2":{"233":2}}],["meatball",{"2":{"189":1}}],["menus",{"2":{"444":1}}],["menu",{"2":{"186":1}}],["message=ref",{"2":{"347":1}}],["messagebus",{"0":{"346":1},"2":{"346":2,"347":6}}],["message",{"2":{"140":4,"344":1,"347":8,"385":2,"391":3,"524":1}}],["metadata",{"2":{"444":1}}],["metamask",{"2":{"251":5}}],["meta",{"2":{"100":1,"105":1,"417":3,"438":1,"441":1,"442":2,"489":1,"494":1,"498":1,"501":1,"540":13}}],["method2",{"2":{"315":2}}],["method1",{"2":{"315":2}}],["methods",{"2":{"143":1}}],["method",{"2":{"83":1,"251":1,"400":9,"501":1}}],["medium",{"2":{"256":1}}],["media",{"2":{"23":1,"194":1,"208":1}}],["medusajs",{"2":{"61":1}}],["medusa",{"2":{"12":1}}],["gql",{"2":{"444":2}}],["gz",{"2":{"444":1}}],["gls",{"2":{"444":1}}],["glo",{"2":{"444":1}}],["global",{"2":{"449":1}}],["glob",{"2":{"441":1,"442":2,"498":1}}],["globpatterns",{"2":{"265":1}}],["glg",{"2":{"444":1}}],["g",{"2":{"444":1,"517":1}}],["gb",{"2":{"365":2}}],["gutter",{"2":{"545":1}}],["gui",{"2":{"451":1}}],["guides",{"2":{"444":1}}],["guide",{"2":{"68":1,"283":1,"460":2}}],["gulp",{"2":{"444":2}}],["guards",{"2":{"233":3,"244":1}}],["go",{"0":{"242":1},"2":{"242":4,"444":6}}],["governance",{"2":{"444":1}}],["gov",{"2":{"125":1}}],["googletagmanager",{"2":{"517":1}}],["googleanalytics",{"2":{"489":1}}],["google",{"0":{"266":1,"517":1,"540":1},"2":{"17":1,"100":1,"106":8,"107":2,"189":1,"195":4,"213":1,"216":1,"217":1,"228":1,"248":1,"250":1,"254":1,"262":2,"264":1,"439":1,"448":1,"460":1,"461":4,"489":1,"494":1,"503":1,"517":2,"530":1}}],["gatsby",{"2":{"444":5}}],["gateway",{"2":{"107":1}}],["garaguso",{"2":{"245":1,"361":1}}],["garfield",{"2":{"18":2}}],["gmail",{"2":{"106":1,"243":1}}],["grpc",{"2":{"500":1}}],["grunt",{"2":{"444":2}}],["great",{"2":{"444":1}}],["grey",{"2":{"283":1}}],["gray",{"2":{"221":1,"222":2,"497":1}}],["graphql",{"2":{"500":1}}],["graphgl",{"2":{"109":1}}],["graph",{"2":{"100":1,"489":1,"494":1,"503":1,"530":1,"540":1}}],["grid",{"2":{"102":1,"457":1,"480":2}}],["ghz",{"2":{"365":1}}],["gh",{"2":{"100":1,"435":2,"515":3}}],["gitpod",{"2":{"444":2}}],["gitmessage",{"2":{"444":1}}],["gitmodules",{"2":{"444":1}}],["gitattributes",{"2":{"444":1}}],["gitlens",{"2":{"444":4}}],["gitlab",{"2":{"134":1,"405":1,"426":1,"429":2,"430":1,"432":1,"433":1,"444":2}}],["gitignore",{"0":{"426":1},"2":{"215":1,"425":1,"435":1,"444":1}}],["git",{"0":{"421":1,"425":1},"1":{"426":1},"2":{"99":2,"134":2,"213":3,"215":2,"378":1,"405":1,"419":1,"420":3,"421":4,"422":3,"423":6,"424":4,"425":9,"426":7,"427":7,"428":9,"429":12,"430":1,"431":1,"432":2,"433":1,"435":3,"436":1,"444":10,"491":2}}],["githubactionsgithubpagesworkflow",{"2":{"489":1}}],["githubpullrequests",{"2":{"444":1}}],["githubissues",{"2":{"444":1}}],["github",{"0":{"99":1,"435":1,"514":2},"1":{"515":2,"516":2},"2":{"74":2,"86":1,"99":2,"100":6,"116":1,"134":1,"161":1,"213":1,"219":2,"227":2,"236":1,"242":1,"248":1,"255":1,"263":1,"269":2,"270":1,"289":2,"290":2,"341":1,"345":1,"358":1,"367":2,"383":2,"390":1,"405":1,"406":1,"426":1,"429":6,"430":1,"432":1,"433":2,"435":23,"439":3,"444":7,"460":2,"469":1,"483":1,"489":2,"491":1,"494":1,"496":1,"515":5,"530":3,"533":1}}],["gemfile",{"2":{"444":2}}],["generation",{"2":{"461":1}}],["generate",{"2":{"83":1}}],["generalroutes",{"2":{"438":2}}],["getbestblockhash",{"2":{"501":1}}],["getsvgicon",{"2":{"441":3,"442":2}}],["gets",{"2":{"440":2}}],["getnotes",{"2":{"395":1,"396":2}}],["gettimestamp",{"2":{"331":2}}],["getters",{"2":{"350":1,"351":4}}],["getter",{"2":{"330":1}}],["gettoken",{"2":{"105":1}}],["getall",{"2":{"317":1,"318":1,"319":1}}],["getallprojects",{"2":{"317":1,"318":1,"319":1,"320":1}}],["getimageurl",{"2":{"441":2,"442":2}}],["getinstance",{"2":{"313":1}}],["getitem",{"2":{"95":1,"355":2,"357":1,"435":1}}],["getroutes",{"2":{"242":1}}],["getelementbyid",{"2":{"184":1}}],["get",{"2":{"105":1,"108":1,"243":2,"330":2,"357":2,"397":3,"398":2,"399":1,"400":3,"402":3,"442":2,"500":1}}],["getuserdata",{"2":{"105":2}}],["gtag",{"2":{"517":5}}],["gt",{"2":{"60":2,"83":2,"113":1,"187":1,"191":2,"215":1,"221":1,"236":3,"285":1,"352":1,"428":4,"435":1,"444":1,"461":2}}],["1px",{"2":{"497":1}}],["192x192",{"2":{"265":2}}],["19",{"2":{"189":1}}],["1986",{"2":{"171":1}}],["18",{"0":{"239":1},"2":{"188":1}}],["17",{"2":{"183":1,"184":1}}],["16гб",{"2":{"444":1}}],["16",{"2":{"183":1,"213":2,"355":2,"384":1}}],["1516239022",{"2":{"245":1}}],["15",{"0":{"471":1},"1":{"472":1,"473":1},"2":{"183":1,"453":1}}],["1s",{"2":{"182":1}}],["1rem",{"2":{"182":2}}],["1443",{"2":{"501":1}}],["14",{"2":{"181":1}}],["13",{"0":{"239":1},"2":{"181":1}}],["1280px",{"2":{"545":1}}],["1234567890",{"2":{"245":1}}],["12",{"2":{"180":1,"460":1}}],["127",{"2":{"125":2}}],["1199",{"2":{"497":1}}],["11",{"0":{"380":1,"463":1,"474":1},"1":{"464":1,"465":1,"475":1},"2":{"164":1,"165":1,"166":1,"167":1,"169":1,"175":2,"176":1,"177":2,"179":1,"180":3,"181":2,"183":3,"184":1,"188":1,"189":1,"190":1,"191":2,"194":1,"195":4,"196":1,"199":1,"200":1,"207":1,"208":1,"428":3}}],["10000",{"2":{"497":1}}],["1000",{"2":{"249":1,"347":1,"449":1}}],["100vh",{"2":{"221":1}}],["100vw",{"2":{"221":1,"504":1}}],["100",{"2":{"182":1,"222":1,"347":1,"408":1,"418":1,"441":2,"461":1,"504":1}}],["10",{"0":{"379":1,"426":1,"466":2},"1":{"467":2},"2":{"125":2,"128":1,"135":1,"164":2,"179":1,"219":1,"233":1,"257":1,"365":1,"391":2,"402":2,"411":3,"413":1,"415":2,"416":6,"426":1,"444":1,"448":1,"459":1,"460":2}}],["1",{"0":{"18":1,"19":1,"246":1,"272":1,"314":1,"317":1,"326":1,"328":1,"330":1,"332":1,"336":1,"370":1,"471":1},"1":{"472":1,"473":1},"2":{"18":2,"19":1,"86":1,"108":6,"109":1,"114":1,"125":6,"130":2,"132":2,"141":2,"148":1,"164":1,"184":2,"187":2,"214":1,"215":1,"222":4,"228":2,"231":2,"233":2,"242":2,"244":1,"245":2,"258":2,"261":1,"262":1,"272":1,"274":1,"276":1,"278":1,"283":2,"284":2,"289":6,"290":1,"297":1,"315":1,"322":1,"325":1,"326":3,"328":1,"329":1,"330":3,"332":2,"333":3,"335":3,"336":10,"337":9,"342":2,"343":3,"344":2,"347":2,"349":4,"351":2,"352":2,"354":2,"357":2,"365":1,"384":4,"391":2,"392":2,"395":2,"396":3,"400":2,"402":2,"409":1,"411":3,"415":2,"416":2,"429":1,"442":2,"443":1,"448":2,"449":1,"460":2,"461":1,"500":1,"501":1,"504":1,"545":2}}],["х",{"2":{"303":1}}],["хак",{"2":{"504":1}}],["хау",{"2":{"420":1}}],["ханту",{"2":{"302":1}}],["характеристик",{"2":{"203":1}}],["характеристики",{"2":{"203":1,"226":1}}],["характер",{"2":{"123":1,"161":1,"207":1,"210":1,"431":1}}],["хватает",{"2":{"259":1,"420":1,"445":1}}],["хвастовство",{"2":{"214":1}}],["хювинкяя",{"2":{"191":1}}],["хювинкяа",{"2":{"191":1}}],["художественных",{"2":{"187":1}}],["хуже",{"2":{"171":1}}],["хлебным",{"2":{"187":1}}],["хлебные",{"0":{"187":1},"2":{"187":2}}],["хика",{"0":{"170":1},"2":{"171":1}}],["хеша",{"2":{"127":1}}],["хеш",{"2":{"127":1}}],["хеши",{"2":{"127":1}}],["хеширования",{"2":{"127":2}}],["хедеры",{"2":{"518":1}}],["хедере",{"2":{"86":1,"94":1}}],["хедером",{"2":{"35":1,"436":1,"534":1}}],["хедера",{"2":{"29":2}}],["хедер",{"2":{"29":2,"89":1,"536":1}}],["хэш",{"2":{"127":1,"233":1,"440":1}}],["хэша",{"2":{"118":1,"127":1,"242":1}}],["хранение",{"2":{"425":1}}],["хранением",{"2":{"359":1}}],["хранению",{"2":{"355":2}}],["хранения",{"2":{"228":1,"321":1,"322":1,"340":1,"355":4,"391":1,"394":1,"395":1,"400":1,"426":1}}],["хранящиеся",{"2":{"355":1}}],["хранящей",{"2":{"348":1}}],["хранящуюся",{"2":{"244":1}}],["хранят",{"2":{"251":1}}],["хранятся",{"2":{"17":1,"244":1,"355":3,"460":1}}],["храним",{"2":{"357":1}}],["хранилищу",{"2":{"358":1,"394":1}}],["хранилищ",{"2":{"355":3}}],["хранилищами",{"2":{"359":1}}],["хранилищах",{"2":{"355":1}}],["хранилища",{"0":{"355":1},"2":{"128":1,"132":1,"251":1,"263":1,"340":2,"354":3,"355":6,"358":1}}],["хранилищем",{"2":{"349":1,"357":1}}],["хранилище",{"2":{"126":1,"131":1,"254":1,"355":1,"356":1,"358":2,"425":1}}],["храните",{"2":{"437":1}}],["хранится",{"2":{"289":1,"360":1}}],["хранить",{"2":{"106":1,"222":1,"256":1,"273":1,"435":1,"449":1}}],["храниться",{"2":{"47":1,"342":1,"391":1}}],["хранит",{"2":{"43":1,"347":1,"355":1,"448":1}}],["хочу",{"2":{"452":2,"460":1}}],["хочется",{"2":{"304":1}}],["хочет",{"2":{"67":1,"107":2,"181":1,"199":1}}],["холсте",{"2":{"324":1}}],["ходе",{"2":{"181":2,"420":1}}],["ходу",{"2":{"17":1}}],["хостите",{"2":{"439":1}}],["хостингом",{"2":{"135":1}}],["хостинговым",{"2":{"128":1}}],["хостинг",{"0":{"439":1},"2":{"128":1,"129":2,"135":2,"200":1,"439":1}}],["хостинги",{"2":{"125":1,"496":1}}],["хостинга",{"2":{"122":2,"124":1,"128":3,"134":1,"136":1}}],["хостинге",{"2":{"100":1,"128":1,"137":1}}],["хост",{"2":{"435":2}}],["хостеры",{"2":{"439":1}}],["хосте",{"2":{"125":1,"435":1}}],["хотим",{"2":{"223":1,"230":1,"237":3,"245":1,"246":1,"247":1,"263":1,"275":2,"283":1,"331":1,"347":1,"353":1,"356":1,"388":1,"390":1,"393":1,"402":1,"411":1,"418":1,"425":1}}],["хотите",{"2":{"134":2,"139":1,"142":2,"199":1,"214":2,"387":1,"411":1,"425":1,"437":1,"448":1}}],["хотел",{"2":{"207":1}}],["хотя",{"2":{"110":1,"122":1,"125":1,"135":1,"136":1,"166":1,"181":1,"194":1,"207":1,"210":1,"213":2,"214":1,"219":1,"222":1,"228":1,"242":1,"243":1,"244":1,"258":1,"263":2,"269":1,"285":1,"298":1,"315":1,"335":1,"384":2,"411":1,"431":1,"438":1,"460":1}}],["хоть",{"2":{"96":1,"451":2}}],["хорош",{"2":{"453":1}}],["хороша",{"2":{"256":1}}],["хорошая",{"2":{"68":1,"142":1,"219":1,"450":1,"452":2}}],["хорошего",{"2":{"301":1,"384":1,"408":1}}],["хорошее",{"2":{"172":1,"330":1,"354":1}}],["хорошему",{"2":{"163":1,"172":1}}],["хорошей",{"2":{"152":1,"225":1,"236":1,"238":1,"269":1,"281":1,"342":1,"371":1,"417":1,"449":1}}],["хороших",{"2":{"218":1,"291":1}}],["хорошими",{"2":{"228":1}}],["хорошим",{"2":{"180":1,"195":2,"249":1,"460":2}}],["хорошие",{"2":{"133":1,"172":1,"446":1,"451":1,"459":2,"460":1}}],["хороший",{"2":{"25":1,"139":1,"210":1,"289":1,"298":1,"301":1,"347":1,"351":1,"427":1,"444":1}}],["хорошую",{"2":{"26":1,"213":1,"218":1}}],["хорошо",{"2":{"3":1,"39":2,"44":1,"62":1,"64":1,"128":1,"138":1,"143":1,"166":1,"172":1,"173":1,"183":1,"190":1,"191":1,"194":1,"245":1,"248":1,"251":1,"290":1,"334":2,"347":1,"388":1,"391":1,"394":2,"403":1,"444":1,"447":1,"459":1}}],["nls",{"2":{"444":2}}],["nx",{"2":{"444":2}}],["nvmrc",{"2":{"444":2}}],["nix",{"2":{"444":3}}],["npx",{"2":{"443":2}}],["npmjs",{"2":{"326":1}}],["npm",{"2":{"127":1,"213":1,"214":4,"215":6,"216":1,"217":1,"222":1,"230":1,"243":1,"265":1,"345":1,"350":1,"394":2,"397":1,"401":2,"409":2,"410":3,"411":3,"414":2,"418":1,"419":3,"426":1,"436":1,"443":1,"444":4,"448":1,"453":1,"496":1,"524":1}}],["njsproj",{"2":{"426":1}}],["ntvs",{"2":{"426":1}}],["n>=2",{"2":{"335":1}}],["n",{"2":{"325":1,"335":3,"336":9,"337":5,"395":5,"435":1,"444":1}}],["nw",{"2":{"233":1,"355":1}}],["nginx",{"0":{"131":1,"132":1},"1":{"132":1},"2":{"107":1,"128":1,"131":2,"132":1,"135":1,"365":1,"439":1}}],["nest",{"2":{"444":2}}],["nesting",{"2":{"444":2}}],["never",{"2":{"444":1}}],["next",{"0":{"304":1},"1":{"307":1,"308":1,"309":1,"310":1},"2":{"294":1,"444":2}}],["negotiation",{"2":{"130":1}}],["netlify",{"2":{"439":1,"444":2}}],["netservice",{"2":{"399":2}}],["netflix",{"2":{"228":1}}],["netbeans",{"2":{"213":1}}],["net",{"2":{"125":1,"245":1}}],["networks",{"2":{"501":1}}],["networkcommunication",{"0":{"400":1}}],["network",{"0":{"398":1},"2":{"107":1,"264":1,"355":1,"387":1,"399":1}}],["newitem",{"2":{"451":3}}],["new",{"2":{"94":1,"95":1,"111":1,"112":1,"184":1,"222":1,"246":1,"278":1,"289":1,"315":1,"321":1,"324":2,"330":1,"337":6,"357":1,"385":2,"387":1,"391":2,"393":1,"396":4,"398":2,"435":2,"442":2,"497":1,"517":1}}],["nativetabs",{"2":{"444":1}}],["naruto",{"2":{"116":1}}],["navigator",{"2":{"264":2}}],["navigate",{"2":{"240":4}}],["navigationdrawer",{"2":{"489":1,"537":1}}],["navigation",{"0":{"505":1},"1":{"506":1,"507":1},"2":{"100":1,"186":1,"233":2,"489":1,"496":1}}],["navbar",{"0":{"537":1},"1":{"538":1,"539":1},"2":{"100":1,"489":2,"530":1,"537":1}}],["named",{"2":{"442":1}}],["names",{"2":{"125":1}}],["name=",{"2":{"96":1,"239":2,"283":3,"289":1,"400":2,"440":1,"498":1,"540":4}}],["name",{"2":{"88":3,"100":1,"114":6,"132":1,"143":3,"149":2,"233":3,"236":4,"237":3,"239":4,"240":4,"242":2,"245":1,"259":2,"261":2,"264":2,"265":2,"279":5,"280":1,"281":5,"283":1,"289":10,"322":4,"326":13,"355":5,"427":5,"435":12,"438":2,"440":2,"441":4,"442":8,"489":1,"494":1,"542":2}}],["null",{"2":{"184":3,"263":2,"289":2,"321":1,"322":2,"355":1,"444":1}}],["num=",{"2":{"96":1}}],["numbers",{"2":{"83":1,"125":1}}],["number",{"2":{"83":1,"94":3,"95":1,"279":1,"415":2}}],["number>",{"2":{"83":2}}],["nuxt",{"2":{"10":1,"139":1,"444":2,"495":1}}],["nodе",{"2":{"444":1}}],["nodemon",{"2":{"444":4}}],["nodes",{"2":{"251":1}}],["nodejs",{"0":{"401":1},"1":{"402":1},"2":{"213":1}}],["node",{"2":{"107":2,"213":6,"214":2,"215":2,"219":2,"230":1,"365":1,"382":2,"400":2,"401":2,"413":2,"426":1,"435":2,"443":3,"444":6,"460":1,"461":1}}],["now",{"2":{"164":1}}],["note=",{"2":{"396":1}}],["note=ref",{"2":{"395":1}}],["notes",{"2":{"395":4,"396":8}}],["notes=ref",{"2":{"395":1}}],["note",{"2":{"395":13,"396":1}}],["notebook",{"2":{"23":1,"497":3,"506":1,"534":2,"536":1}}],["notation",{"2":{"314":1}}],["notificationinterceptor",{"2":{"105":2,"501":2}}],["not",{"2":{"100":1,"290":2,"411":1,"444":1,"448":1}}],["no",{"2":{"100":2,"222":1,"489":8,"494":4}}],["nosql",{"2":{"17":2,"39":1,"107":1,"394":1,"449":1}}],["u",{"2":{"438":1}}],["up",{"2":{"435":1,"444":1}}],["updating",{"2":{"435":1}}],["updateprojects",{"2":{"236":5}}],["update",{"2":{"115":5,"274":1,"280":6,"284":4,"423":1,"435":1,"444":1}}],["upstream",{"2":{"429":1}}],["upwardprop",{"2":{"283":5}}],["unlighthouse",{"2":{"444":2}}],["unocss",{"2":{"444":10}}],["uno",{"2":{"444":10}}],["untrackedchanges",{"2":{"444":1}}],["undefined",{"2":{"417":1}}],["unique",{"2":{"449":1}}],["unicodehighlight",{"2":{"444":1}}],["unit",{"2":{"405":1,"407":1,"450":6}}],["universal",{"2":{"273":1}}],["unpkg",{"2":{"140":1}}],["usage",{"2":{"345":1}}],["usability",{"2":{"295":1}}],["usb",{"2":{"250":1,"256":1}}],["us",{"2":{"246":1,"444":1}}],["using",{"2":{"240":1}}],["usetouchswipe",{"2":{"507":1}}],["usenewswidget",{"2":{"451":1}}],["usei18nlight",{"0":{"525":1},"2":{"526":2}}],["usei18n",{"2":{"436":1,"451":1,"526":4}}],["usecounterstore=definestore",{"2":{"352":1}}],["usecounterstore",{"2":{"351":2,"354":1}}],["usedocumentscroll",{"2":{"284":5}}],["usewindowsevents",{"2":{"284":1}}],["useappconfig",{"2":{"498":3}}],["useadmin",{"2":{"284":1}}],["useauthservice",{"2":{"449":1}}],["useauthstore",{"2":{"449":1}}],["useauth",{"2":{"105":4,"449":1}}],["userloggedin",{"2":{"449":1}}],["useraccountview",{"2":{"438":1}}],["username",{"2":{"244":3,"435":2,"449":1}}],["userouter",{"2":{"239":3,"242":1}}],["useroute",{"2":{"239":3,"242":1,"247":2}}],["user",{"2":{"105":2,"132":1,"162":2,"171":1,"249":2,"273":1,"281":1,"435":6,"444":3,"484":2}}],["userid",{"2":{"105":1}}],["users",{"2":{"105":7,"281":1}}],["userdata",{"2":{"105":1}}],["usescreenwidth",{"2":{"497":6}}],["usescreensize",{"2":{"451":1}}],["useshoppingcart",{"2":{"451":1}}],["usesessionstorage",{"2":{"357":3,"358":2}}],["usestate",{"2":{"349":6}}],["usestore",{"2":{"284":1}}],["uses",{"2":{"83":1,"435":10}}],["usefavourites",{"0":{"94":1},"2":{"81":1,"94":6,"95":1}}],["use",{"0":{"14":1,"437":1},"2":{"14":4,"112":1,"154":1,"234":2,"273":1,"284":1,"289":2,"290":1,"353":1,"402":2,"444":1,"458":1}}],["uri",{"2":{"236":1,"246":1,"247":1,"398":1,"501":1}}],["urlsearchparams",{"2":{"246":3}}],["urls",{"2":{"233":1}}],["url",{"2":{"0":1,"105":1,"174":1,"196":1,"215":1,"229":1,"231":1,"233":5,"236":3,"237":2,"238":1,"239":1,"240":4,"241":1,"242":4,"244":1,"245":1,"246":1,"248":1,"249":2,"259":2,"261":3,"263":1,"264":1,"265":1,"398":2,"400":1,"402":2,"429":2,"440":2,"442":1,"501":1,"540":2,"542":1}}],["utf",{"2":{"213":1,"355":2}}],["utils",{"0":{"414":1},"1":{"415":1,"416":1},"2":{"105":3,"405":1,"408":1,"409":1,"413":1,"414":3,"415":2,"416":1,"436":1,"441":2,"498":2,"500":3,"501":5,"503":1,"526":1}}],["ubuntu",{"2":{"135":1,"213":1,"358":1,"423":1,"435":3,"489":1}}],["ux",{"0":{"160":1,"162":1,"172":1,"380":1},"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,"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},"2":{"77":1,"79":1,"88":1,"160":6,"162":2,"163":2,"172":2,"184":1,"211":2,"461":2,"484":1,"492":1,"507":1,"530":1,"544":1}}],["ui",{"0":{"24":1,"27":1,"162":1,"454":1,"459":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,"67":1,"79":1,"96":1,"160":3,"162":2,"211":1,"259":1,"295":1,"300":1,"384":1,"417":1,"419":4,"443":1,"445":2,"450":1,"451":3,"452":2,"454":1,"456":1,"459":10,"484":1,"492":1,"496":1,"498":1,"520":1,"521":1}}],["uml",{"2":{"14":1,"273":2}}],["og",{"2":{"540":6}}],["old",{"2":{"448":2}}],["ok",{"2":{"448":2}}],["okta",{"2":{"248":1}}],["o",{"2":{"366":1}}],["overflow",{"2":{"504":1}}],["overwrite",{"2":{"489":2}}],["overrides",{"2":{"444":1}}],["over",{"0":{"298":1},"2":{"294":1}}],["otp",{"0":{"249":1},"2":{"249":5,"250":2,"252":1}}],["othervalue",{"2":{"54":1,"55":1}}],["other",{"2":{"54":1,"55":1,"449":1}}],["output",{"2":{"415":1,"444":1}}],["out",{"2":{"412":1,"444":2,"448":1}}],["outlook",{"2":{"243":1}}],["our",{"2":{"142":1}}],["obj",{"2":{"448":1}}],["object",{"2":{"83":1,"146":1,"240":1,"279":1,"301":1,"314":1,"442":1}}],["observe",{"2":{"184":1}}],["observerclass",{"2":{"326":3}}],["observerpattern",{"2":{"326":1}}],["observer",{"0":{"325":1,"326":1,"345":1},"1":{"326":1,"346":1,"347":1},"2":{"183":1,"184":2,"294":1,"308":1,"330":2,"334":1,"340":1,"345":1,"347":1,"448":1}}],["opera",{"2":{"213":1}}],["open=",{"2":{"522":1}}],["opengraph",{"2":{"489":1}}],["openclose",{"2":{"444":1}}],["opencart",{"2":{"16":2,"61":1}}],["opennote",{"2":{"395":2}}],["openid",{"0":{"245":1},"2":{"245":6,"246":2,"250":1}}],["open",{"2":{"12":1,"39":1,"61":1,"100":1,"264":1,"334":1,"487":1,"489":1,"494":1,"503":1,"530":1,"540":1}}],["option",{"2":{"154":1}}],["options",{"0":{"143":1,"351":1},"2":{"110":1,"112":1,"113":1,"130":1,"143":6,"233":1,"242":1,"243":1,"289":1,"350":2,"351":1,"354":1,"435":1,"444":1,"448":1}}],["ontaskerrors",{"2":{"444":1}}],["once",{"2":{"410":1,"411":1}}],["onmesssage",{"2":{"386":1}}],["onmessage=",{"2":{"392":1}}],["onmessage",{"2":{"385":2,"386":2,"387":1,"389":1,"391":1,"392":1}}],["onmounted",{"2":{"184":2,"263":2,"284":2,"301":3,"347":3,"544":1}}],["onunmounted",{"2":{"284":2}}],["onbeforeunmount",{"2":{"236":1,"263":1,"301":3,"347":3}}],["onboarding",{"2":{"197":1}}],["onlyenabledextensions",{"2":{"444":1}}],["only",{"2":{"194":1,"444":2}}],["online",{"2":{"14":1,"228":1}}],["onecolumnlayout",{"0":{"536":1}}],["onecomponent",{"2":{"278":3}}],["onerror",{"2":{"385":2}}],["one",{"2":{"167":1,"242":2,"461":1}}],["on",{"0":{"150":1},"2":{"100":1,"106":1,"130":1,"150":2,"236":1,"326":3,"347":1,"402":1,"416":1,"435":5,"444":2,"489":1}}],["oreilly",{"2":{"460":1}}],["or",{"2":{"281":1,"365":5,"489":1,"497":1}}],["orientation",{"2":{"260":1,"261":1,"265":1,"542":1}}],["origins",{"2":{"402":1}}],["origin",{"2":{"108":7,"355":2,"402":2,"429":5}}],["oracle",{"2":{"107":1,"439":1}}],["organizeimports",{"2":{"444":1}}],["org",{"2":{"89":1,"116":2,"120":1,"125":1,"150":1,"151":2,"169":1,"213":1,"219":1,"242":1,"246":1,"258":1,"283":1,"284":1,"285":1,"303":1,"354":1,"355":1,"501":1}}],["orders",{"2":{"12":1}}],["odezhda",{"2":{"88":1}}],["official",{"2":{"365":1}}],["office",{"2":{"167":1,"228":1}}],["off",{"2":{"236":1,"326":4,"347":1,"444":1,"449":1}}],["of",{"0":{"297":1},"2":{"83":5,"100":1,"280":1,"294":1,"411":1,"412":1,"440":1,"444":1,"461":1}}],["oauth",{"2":{"40":1,"106":2,"245":1,"252":1}}],["ozon",{"2":{"22":1}}],["eex",{"2":{"444":1}}],["eol",{"2":{"444":1}}],["e88a22df",{"2":{"440":1}}],["echo",{"2":{"435":8}}],["ecosystem",{"2":{"365":1}}],["ecommerce",{"2":{"41":1}}],["eager",{"2":{"442":2}}],["easingthemes",{"2":{"435":2}}],["eat",{"2":{"328":1}}],["eyjzdwiioiixmjm0nty3odkwiiwibmftzsi6ilbhymxviequiedhcmfndxnviiwiawf0ijoxnte2mjm5mdiyfq",{"2":{"245":1}}],["eyjhbgcioijiuzi1niisinr5cci6ikpxvcj9",{"2":{"245":1}}],["err",{"2":{"251":2,"337":1,"385":1,"392":2,"393":1,"396":1}}],["err=>",{"2":{"244":1,"249":2,"395":1}}],["errorcomponent",{"2":{"278":3}}],["error",{"2":{"54":3,"247":2,"337":1,"400":1,"411":1,"412":1,"426":1,"435":1}}],["esbenp",{"2":{"444":4}}],["esbuild",{"2":{"219":2,"443":1}}],["esnext",{"2":{"443":1}}],["es6",{"2":{"314":1,"448":1,"451":1}}],["eslint",{"2":{"23":1,"443":3,"444":17,"460":1,"492":2}}],["education",{"2":{"542":1}}],["editorconfig",{"2":{"444":2}}],["editortab",{"2":{"444":1}}],["editorgroup",{"2":{"444":1}}],["editor",{"2":{"444":29}}],["edit",{"2":{"151":1,"274":1,"483":1}}],["edititem",{"2":{"151":4}}],["edge",{"2":{"40":1,"107":2,"213":1,"365":1}}],["effective",{"2":{"171":1}}],["eff",{"2":{"135":2}}],["eth",{"2":{"251":1}}],["ethjs",{"2":{"251":1}}],["ethereum",{"2":{"251":4}}],["etc",{"0":{"132":1},"2":{"131":1,"545":1}}],["etsy",{"2":{"22":1}}],["engine",{"2":{"448":1}}],["enablesmartcommit",{"2":{"444":1}}],["enable",{"2":{"444":3,"448":1}}],["enabled",{"2":{"265":1,"444":9}}],["end",{"2":{"407":2,"408":2,"450":2}}],["endpoints",{"2":{"245":1}}],["endpoint",{"2":{"244":1,"246":1}}],["encapsulation",{"0":{"300":1},"2":{"294":1}}],["encryption",{"2":{"245":1}}],["encrypt",{"0":{"135":1},"2":{"122":1,"135":3,"136":1,"257":1,"379":1}}],["entity",{"2":{"449":2}}],["entire",{"2":{"442":1}}],["entry",{"2":{"242":2}}],["enter=",{"2":{"222":2}}],["enter",{"2":{"214":2,"220":1,"222":1,"416":1}}],["en",{"2":{"169":1,"246":1,"303":1,"355":1,"444":3}}],["envrc",{"2":{"444":12}}],["envs",{"2":{"435":2}}],["environments",{"2":{"439":1}}],["environment",{"2":{"414":1,"435":1}}],["env",{"2":{"105":1,"435":26,"444":38,"501":1}}],["eventname",{"2":{"279":2}}],["event",{"2":{"263":3,"264":5,"326":13,"344":1,"385":4,"386":2,"387":1,"391":2,"392":2,"416":2,"444":1}}],["eventbus",{"2":{"236":3}}],["events",{"0":{"115":1},"2":{"279":1,"326":9,"408":2}}],["everybody",{"2":{"449":1}}],["every",{"2":{"105":1}}],["electron",{"2":{"233":1}}],["electronic",{"2":{"135":1}}],["element",{"2":{"184":1}}],["elements",{"2":{"151":1,"285":1}}],["elem",{"2":{"184":3}}],["el",{"2":{"111":1}}],["else",{"0":{"147":2},"2":{"94":1,"247":1,"249":2,"264":1,"278":1,"321":1,"336":2,"337":2,"351":1,"352":1,"357":1,"391":1,"398":2,"441":1}}],["embla",{"2":{"447":1}}],["emmet",{"2":{"444":2}}],["emma",{"2":{"114":1}}],["email",{"2":{"249":3}}],["email=ref",{"2":{"249":1}}],["emitted",{"2":{"416":1}}],["emit",{"2":{"115":1,"236":1,"326":3,"347":1,"416":1}}],["emits",{"2":{"110":1,"115":1,"143":1,"280":1,"342":2}}],["empty",{"2":{"100":1}}],["e2e2e3",{"2":{"545":2}}],["e2e",{"2":{"71":1,"407":1,"450":5}}],["eq",{"2":{"54":1}}],["exs",{"2":{"444":5}}],["ex",{"2":{"444":1}}],["exclude",{"2":{"435":1,"444":1}}],["exiting",{"2":{"435":1}}],["extractor",{"2":{"444":11}}],["extractdomain",{"2":{"0":1}}],["extension",{"2":{"444":1}}],["extensions",{"2":{"258":1,"426":1,"444":3}}],["expand",{"2":{"444":1}}],["expandmode",{"2":{"444":1}}],["expected",{"2":{"411":1}}],["expect",{"2":{"411":12,"412":1,"413":3,"415":2,"416":4,"417":1}}],["experience",{"2":{"162":1,"408":1,"484":2}}],["express",{"2":{"401":2,"402":7,"461":1}}],["explorer",{"2":{"215":1,"425":1,"444":6}}],["explain",{"0":{"83":1},"2":{"83":1}}],["exports",{"2":{"442":1}}],["export",{"2":{"94":1,"105":2,"143":2,"233":1,"265":1,"284":1,"289":2,"314":1,"315":1,"317":1,"318":1,"319":1,"322":1,"346":1,"349":1,"351":1,"357":1,"391":1,"393":1,"396":1,"398":1,"438":1,"442":1,"443":1,"449":1,"501":2}}],["examplecomponent",{"2":{"278":1}}],["example",{"2":{"14":1,"442":2}}],["e",{"2":{"12":2,"16":1,"61":1,"62":1,"76":1,"79":1}}],["2fa",{"0":{"250":1},"2":{"249":1,"250":4}}],["2979ff",{"2":{"261":1}}],["299",{"2":{"244":1}}],["29",{"2":{"207":1,"444":1}}],["28",{"2":{"200":1}}],["27",{"0":{"468":1},"1":{"469":1,"470":1},"2":{"199":1}}],["26",{"2":{"196":1,"440":1}}],["25",{"2":{"195":1,"330":2}}],["255",{"2":{"125":1,"545":2}}],["245",{"2":{"545":3}}],["24",{"0":{"463":1},"1":{"464":1,"465":1},"2":{"195":1,"441":2}}],["235",{"2":{"545":4}}],["23",{"2":{"194":1}}],["22+",{"2":{"444":1}}],["22",{"2":{"191":1,"195":1,"213":1}}],["21",{"2":{"191":1,"195":1,"336":2}}],["2px",{"2":{"182":1}}],["2022",{"2":{"485":1}}],["2023",{"0":{"463":1,"466":1,"468":1,"471":1,"474":1},"1":{"464":1,"465":1,"467":1,"469":1,"470":1,"472":1,"473":1,"475":1},"2":{"444":1,"460":1,"485":1}}],["2016",{"2":{"460":1}}],["20~30",{"2":{"443":1}}],["20",{"2":{"96":1,"135":1,"184":1,"190":1,"435":1,"449":1,"460":1}}],["200",{"2":{"47":1,"244":1,"278":1,"439":1,"444":1,"461":1,"522":1}}],["2",{"0":{"110":1,"247":1,"273":1,"315":1,"317":1,"318":2,"319":1,"320":1,"321":1,"322":1,"323":1,"326":1,"328":1,"330":1,"332":1,"333":2,"336":1,"371":1,"381":1,"468":1},"1":{"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"469":1,"470":1},"2":{"10":1,"89":1,"91":1,"108":1,"109":1,"110":2,"111":2,"112":1,"113":1,"115":2,"116":6,"117":1,"119":1,"121":2,"128":1,"132":2,"135":1,"138":1,"143":4,"148":1,"165":1,"184":1,"187":2,"214":1,"216":1,"220":1,"222":4,"228":1,"231":1,"233":3,"245":2,"258":1,"263":1,"269":1,"272":1,"273":1,"277":1,"283":2,"284":4,"289":6,"290":1,"297":1,"299":2,"322":1,"325":2,"326":1,"327":1,"328":1,"329":1,"330":1,"331":1,"332":2,"333":2,"334":1,"335":1,"336":10,"337":10,"343":3,"344":2,"345":2,"347":1,"349":4,"351":3,"352":3,"354":3,"355":1,"356":1,"357":2,"381":1,"384":2,"388":1,"389":1,"391":2,"392":2,"395":2,"396":2,"402":2,"409":2,"411":4,"415":2,"416":4,"425":2,"444":3,"448":5,"449":2,"451":1,"459":1,"460":3,"461":1,"480":2,"501":1,"545":2}}],["c2c2c4",{"2":{"545":1}}],["czrc",{"2":{"444":2}}],["cz",{"2":{"444":2}}],["cxx",{"2":{"444":1}}],["cjs",{"2":{"444":4}}],["cc",{"2":{"444":1}}],["csproj",{"2":{"444":1}}],["cspell",{"2":{"444":2}}],["cshtml",{"2":{"444":2}}],["cs",{"2":{"444":12}}],["csshtml",{"2":{"504":1}}],["cssnano",{"2":{"444":10}}],["cssnanorc",{"2":{"444":10}}],["css",{"0":{"216":1,"217":1,"459":1,"480":1,"504":1},"1":{"217":1,"221":1,"222":1,"223":1},"2":{"23":2,"35":3,"138":4,"140":1,"141":1,"142":4,"146":1,"151":1,"174":1,"175":1,"176":1,"181":1,"194":3,"212":1,"215":4,"216":5,"217":9,"218":9,"221":2,"222":4,"224":1,"225":1,"234":1,"256":1,"260":1,"265":3,"283":1,"300":1,"365":1,"395":1,"439":1,"444":5,"445":1,"451":1,"456":1,"459":9,"460":1,"461":1,"492":1,"496":1,"533":1,"536":1,"543":1,"544":1,"545":4}}],["css3",{"0":{"456":1},"2":{"23":1,"456":1,"457":1,"459":1,"492":1}}],["cpp",{"2":{"444":1}}],["cp",{"2":{"435":1}}],["cpu",{"2":{"365":1}}],["cypress",{"2":{"416":1,"444":10,"450":1}}],["cycle",{"2":{"143":1}}],["c++",{"2":{"301":1}}],["certification",{"2":{"460":1}}],["certbot",{"2":{"135":6,"137":1,"439":1}}],["central",{"2":{"356":1}}],["center",{"2":{"221":1}}],["celsius",{"2":{"330":9}}],["ctrlcmd",{"2":{"444":1}}],["ctrl",{"2":{"171":1}}],["c>",{"2":{"130":2}}],["cname",{"2":{"125":1}}],["cheat",{"0":{"476":1},"1":{"477":1,"478":1,"479":1,"480":1,"481":1,"482":1},"2":{"477":1,"478":1,"479":1,"480":4}}],["checkout",{"2":{"427":2,"428":2,"435":4}}],["checkotp",{"2":{"249":3}}],["check",{"2":{"415":1,"416":1,"444":1}}],["checkbox",{"2":{"222":2}}],["checked",{"2":{"222":6}}],["chgrp",{"2":{"435":2}}],["choice",{"2":{"435":1}}],["choose",{"2":{"100":1}}],["chia",{"2":{"411":1}}],["childsession",{"0":{"358":1}}],["childsimple",{"2":{"349":1}}],["childpinia",{"0":{"354":1}}],["child",{"0":{"344":1,"347":1},"2":{"280":1,"343":4}}],["childcomponent>",{"2":{"280":1,"343":3}}],["childcomponent",{"2":{"280":1,"343":4}}],["children",{"2":{"237":2,"238":1,"438":2}}],["chrome",{"2":{"213":1,"262":2,"266":1,"355":1,"358":1,"365":2,"448":2,"461":1}}],["chromium",{"2":{"116":1,"213":1,"365":1,"448":1}}],["changelocale",{"2":{"526":2}}],["changelog",{"2":{"444":1}}],["changes",{"2":{"120":1}}],["chainable",{"2":{"331":1}}],["chain",{"2":{"251":1}}],["chapter09",{"2":{"406":1}}],["chapter08",{"2":{"383":1}}],["chapter07",{"2":{"341":1}}],["chapter06",{"2":{"255":1}}],["chapter05",{"2":{"227":1}}],["chapter11",{"2":{"161":1}}],["chapter",{"0":{"127":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1,"326":1,"328":1,"330":1,"332":1,"333":1,"336":1,"426":1},"2":{"214":1,"265":3}}],["clangd",{"2":{"444":1}}],["clang",{"2":{"444":2}}],["classes",{"2":{"481":1}}],["classpath",{"2":{"444":1}}],["class",{"2":{"315":1,"444":1}}],["class=",{"2":{"94":1,"96":2,"182":1,"218":1,"221":1,"222":17,"236":3,"239":1,"283":3,"289":2,"344":1,"354":1,"441":1,"497":4,"498":2}}],["clean",{"0":{"301":1},"2":{"284":1,"294":1,"301":1,"326":1,"435":1}}],["clearcase",{"2":{"420":1}}],["clear",{"2":{"355":1}}],["clearinterval",{"2":{"249":1}}],["cleartodo",{"2":{"222":3}}],["clippy",{"2":{"444":2}}],["clipboard",{"2":{"222":1,"444":4}}],["click=",{"2":{"150":2,"151":1,"222":3,"263":1,"289":2,"343":1,"344":1,"347":1,"349":2,"354":2,"395":3,"400":1,"498":1,"526":1}}],["click",{"2":{"150":2,"289":1,"343":1,"416":3}}],["cli",{"2":{"117":1,"443":1,"444":2}}],["client",{"2":{"54":2,"55":9,"108":6,"245":1,"246":1,"500":1}}],["closeonfiledelete",{"2":{"444":1}}],["closemodal",{"2":{"289":3}}],["cloud",{"2":{"107":2,"460":1}}],["clone",{"2":{"99":1,"264":1,"491":1}}],["custom",{"2":{"444":2,"448":3,"545":1}}],["customer",{"2":{"79":1}}],["cursorstyle",{"2":{"444":1}}],["cursorsmoothcaretanimation",{"2":{"444":1}}],["cursorblinking",{"2":{"444":1}}],["cursor",{"2":{"222":1}}],["currentcolor",{"2":{"441":2}}],["current",{"2":{"100":1,"187":2,"289":11}}],["curl",{"2":{"55":2}}],["cdn",{"2":{"140":1}}],["cd",{"0":{"433":1},"2":{"70":1,"100":1,"430":2,"431":1,"432":1,"433":5,"435":4,"450":1,"460":1,"470":1,"490":1,"491":1,"533":1}}],["circleci",{"2":{"444":2}}],["circle",{"2":{"324":4}}],["citation",{"2":{"444":1}}],["city",{"2":{"237":1,"239":1}}],["cities",{"2":{"237":1}}],["ci",{"0":{"433":1},"2":{"70":1,"430":3,"431":1,"432":1,"433":5,"435":1,"450":1,"460":1,"470":1,"533":1}}],["cmakepresets",{"2":{"444":1}}],["cmake",{"2":{"444":3}}],["cmakelists",{"2":{"444":1}}],["cmv",{"0":{"97":1},"2":{"63":1}}],["cms",{"0":{"37":1,"39":1},"1":{"38":1,"39":1,"40":1,"41":1},"2":{"6":1,"12":2,"39":1,"62":1}}],["crm",{"2":{"496":1}}],["crowdin",{"2":{"444":2}}],["cross",{"2":{"108":1,"402":1,"444":1}}],["credits",{"2":{"444":1}}],["credo",{"2":{"444":1}}],["creator",{"2":{"126":1}}],["created",{"2":{"428":1}}],["createpinia",{"2":{"353":2}}],["createshape",{"2":{"324":3}}],["createrouter",{"2":{"127":1,"233":3}}],["creatememoryhistory",{"2":{"118":1}}],["createwebhistory",{"2":{"118":1,"127":3}}],["createwebhashhistory",{"2":{"118":1,"127":1,"233":3}}],["createapp",{"2":{"111":2,"112":4,"140":4,"234":2,"277":2,"281":1,"289":2,"353":2}}],["create",{"0":{"489":1},"1":{"490":1},"2":{"54":1,"100":1,"214":1,"274":1,"443":1,"483":1,"487":1,"489":4,"494":1,"495":1}}],["createclient",{"2":{"54":2}}],["crypto",{"2":{"391":1}}],["crafty",{"0":{"60":1},"2":{"74":2,"86":1,"99":1,"100":5}}],["crud",{"2":{"58":1,"107":1,"274":2,"301":1,"316":1,"394":2,"395":1,"397":2}}],["c",{"2":{"17":1,"139":3,"143":1,"239":4,"301":1,"337":7,"444":1,"489":1,"496":1,"545":9}}],["calc",{"2":{"504":1}}],["calculation",{"2":{"411":1}}],["calculatecelsius",{"2":{"330":2}}],["calculatefahrenheit",{"2":{"330":2}}],["callback",{"0":{"335":1,"336":1},"1":{"336":1},"2":{"335":1,"336":7,"337":1,"385":2}}],["callbacks",{"2":{"294":1,"310":1}}],["call",{"0":{"196":1},"2":{"196":1}}],["called",{"2":{"83":1}}],["can",{"2":{"449":1,"497":1}}],["cancel",{"2":{"289":3}}],["caniuse",{"2":{"116":1}}],["caches",{"2":{"264":2}}],["cache",{"2":{"264":4,"444":1,"543":1}}],["categories",{"2":{"542":1}}],["category",{"0":{"45":1,"47":1},"2":{"18":1,"43":1,"88":4,"103":1}}],["categoryid",{"2":{"18":1,"88":2}}],["catch",{"2":{"244":1,"248":1,"249":2,"321":1,"337":5,"396":3,"398":2,"412":1}}],["capture",{"2":{"444":95}}],["caption",{"2":{"182":2}}],["capacitor",{"2":{"233":1}}],["carousel",{"2":{"447":1}}],["cargo",{"2":{"444":2}}],["card",{"2":{"222":1,"540":1}}],["cart",{"2":{"12":1,"88":1}}],["camelcase",{"2":{"156":1,"284":1}}],["cases",{"0":{"437":1}}],["case",{"0":{"14":1},"2":{"14":4,"44":1,"154":1,"256":1,"273":1,"290":3,"324":2,"328":3,"330":2,"458":1}}],["coolcosmos",{"2":{"449":1}}],["cookies",{"2":{"355":2}}],["cookie",{"2":{"106":3,"263":1}}],["copying",{"2":{"444":1}}],["copilot",{"2":{"81":1}}],["coverage",{"2":{"410":2,"418":4}}],["coinflip",{"2":{"285":1}}],["couchdb",{"2":{"394":2}}],["count`",{"2":{"435":1}}],["count=5",{"2":{"435":1}}],["count++",{"2":{"351":1}}],["count>=0",{"2":{"351":2}}],["counter++",{"2":{"349":1}}],["counter=",{"2":{"343":3}}],["counter",{"0":{"352":1},"2":{"343":8,"344":3,"349":2,"351":1,"352":1,"354":1,"358":2}}],["countries",{"2":{"239":1}}],["country",{"2":{"237":1,"239":3}}],["count",{"2":{"153":1,"351":3,"352":7}}],["coupled",{"2":{"2":1}}],["colortheme",{"2":{"444":1}}],["color",{"2":{"142":1,"164":1,"182":1,"260":2,"261":2,"265":2,"333":2,"354":1,"441":3}}],["column=eq",{"2":{"55":1}}],["column",{"2":{"54":3,"55":2,"194":1,"497":1}}],["core",{"2":{"245":1,"423":1}}],["cordova",{"2":{"233":1}}],["corporation",{"2":{"125":1,"542":1}}],["cors",{"0":{"108":1},"2":{"108":10,"401":1,"402":5,"467":1}}],["coding",{"2":{"63":1,"97":1}}],["codesandbox",{"2":{"444":1}}],["codeowners",{"2":{"444":1}}],["codecov",{"2":{"444":10}}],["codelens",{"2":{"444":4}}],["codeaction",{"2":{"444":1}}],["codeactions",{"2":{"444":1}}],["codeactionsonsave",{"2":{"444":2}}],["code>",{"2":{"354":1}}],["code=ref",{"2":{"249":2}}],["codeium",{"0":{"80":1},"1":{"81":1,"82":1,"83":1,"84":1},"2":{"81":3,"82":1,"83":1,"84":1,"444":1}}],["code",{"0":{"152":1,"304":1},"1":{"153":1,"154":1,"155":1,"156":1,"157":1,"307":1,"308":1,"309":1,"310":1},"2":{"39":1,"81":1,"83":2,"100":1,"143":1,"154":1,"213":2,"215":1,"239":2,"247":3,"248":2,"249":3,"294":1,"328":1,"354":1,"365":1,"422":1,"429":1,"436":1,"444":9,"451":1,"489":1,"494":1,"515":1,"526":4,"527":1}}],["conduct",{"2":{"444":1}}],["conf",{"2":{"444":1}}],["confirmsync",{"2":{"444":1}}],["confirmdraganddrop",{"2":{"444":1}}],["confirmdelete",{"2":{"444":1}}],["confirm",{"0":{"207":1}}],["configs",{"2":{"444":1}}],["config",{"2":{"100":1,"215":1,"219":3,"265":1,"414":1,"417":1,"418":1,"443":2,"444":225,"489":4,"492":1,"503":1,"516":1,"517":1}}],["concerns",{"0":{"297":1},"2":{"294":1}}],["connection",{"2":{"444":1}}],["connect",{"2":{"245":1}}],["console",{"2":{"244":2,"251":2,"281":1,"315":1,"330":1,"336":5,"337":7,"385":1,"386":1,"402":1,"435":1,"448":2}}],["constructor",{"2":{"315":1,"321":1,"326":1}}],["constant",{"2":{"143":2}}],["const",{"2":{"54":4,"94":2,"95":1,"105":3,"111":2,"112":2,"114":1,"140":1,"143":2,"151":1,"154":1,"157":1,"182":1,"184":1,"222":1,"233":1,"239":1,"244":1,"247":1,"263":1,"264":4,"278":1,"281":3,"284":2,"289":3,"317":1,"321":1,"323":1,"332":1,"333":1,"343":1,"344":1,"346":1,"347":1,"349":2,"351":1,"352":2,"353":1,"354":1,"357":1,"358":1,"387":1,"391":2,"392":2,"395":1,"396":2,"397":1,"398":1,"399":1,"400":1,"402":5,"415":1,"417":1,"438":2,"441":3,"442":5,"448":1,"449":1,"497":1,"498":1,"500":2,"501":2,"526":2}}],["conventions",{"0":{"152":1},"1":{"153":1,"154":1,"155":1,"156":1,"157":1}}],["convention",{"2":{"143":1}}],["convert",{"2":{"83":1}}],["contributors",{"2":{"444":1}}],["contributing",{"2":{"444":1}}],["controller",{"2":{"444":1,"449":3,"451":2}}],["control",{"0":{"420":1},"2":{"106":1,"108":4,"420":3,"432":1,"481":1}}],["continuous",{"2":{"430":3,"433":2}}],["continue",{"2":{"100":1}}],["container",{"2":{"222":6,"457":1,"497":2}}],["content=",{"2":{"540":11}}],["contentlayer",{"2":{"444":10}}],["contents",{"2":{"435":1}}],["content>",{"2":{"283":1}}],["content",{"2":{"55":1,"221":1,"283":2,"501":1}}],["co",{"2":{"54":1,"55":3}}],["commitlint",{"2":{"444":4}}],["commit",{"2":{"425":1,"426":3,"428":1,"433":1}}],["common",{"2":{"248":1}}],["commands",{"2":{"444":1}}],["commandinvoker",{"2":{"328":1}}],["command",{"0":{"327":1,"328":1},"1":{"328":1},"2":{"213":1,"294":1,"308":1,"328":4,"388":1,"389":1,"391":4,"392":2,"393":1}}],["commerce",{"2":{"12":2,"16":1,"61":1,"62":1,"76":1,"79":1}}],["compile",{"2":{"444":1}}],["compileroptions",{"2":{"443":1}}],["compare",{"2":{"444":6}}],["completed",{"2":{"290":2}}],["completion",{"2":{"213":1,"444":1}}],["computer",{"2":{"171":1}}],["computed",{"2":{"143":1,"222":7,"289":4,"349":1,"352":3,"441":3}}],["component>",{"2":{"151":1,"285":1}}],["components",{"0":{"182":1,"184":1,"395":1,"400":1},"2":{"96":1,"143":1,"151":1,"215":1,"219":5,"221":3,"236":2,"239":2,"283":1,"410":1,"415":1,"416":1,"436":1,"443":1,"444":1,"498":1}}],["component",{"0":{"239":1,"285":1},"2":{"88":3,"112":4,"151":2,"233":3,"237":3,"239":1,"277":3,"285":3,"289":1,"343":3,"354":1,"358":1,"415":1,"416":1,"438":4,"444":7,"449":3}}],["compose",{"2":{"444":1}}],["composer",{"2":{"444":2}}],["composables",{"0":{"284":1},"1":{"285":1},"2":{"94":2,"105":1,"143":1,"284":1,"436":1,"449":1,"497":1,"498":1,"526":2}}],["composable",{"2":{"34":1,"449":9,"451":2,"492":1,"497":1,"507":1,"524":1}}],["composition",{"0":{"143":1,"298":1},"2":{"23":1,"93":1,"110":2,"112":1,"114":1,"116":2,"121":1,"143":10,"242":2,"284":2,"294":1,"348":1,"350":1,"351":1,"352":2,"354":1,"448":3,"449":2,"460":1,"470":1,"492":1}}],["com",{"2":{"22":3,"74":1,"99":1,"107":1,"108":9,"116":2,"125":1,"126":2,"127":2,"132":3,"140":1,"161":1,"190":1,"208":2,"213":1,"217":3,"218":1,"219":1,"227":1,"245":1,"255":1,"256":1,"269":1,"289":1,"290":1,"326":1,"341":1,"345":1,"367":1,"368":1,"383":1,"406":1,"435":10,"439":5,"444":2,"491":1,"500":1,"516":1,"517":1}}],["dprint",{"2":{"444":4}}],["dlint",{"2":{"444":4}}],["dynamic",{"2":{"440":1}}],["dt",{"2":{"435":1}}],["ds",{"2":{"426":1}}],["dx",{"2":{"408":1,"416":1,"459":1,"484":1}}],["db",{"2":{"396":5}}],["dbservice",{"0":{"396":1},"2":{"395":1,"397":3,"399":1}}],["dbnotes",{"0":{"395":1}}],["dbmanager",{"2":{"316":1,"317":3,"318":3,"319":2,"320":4,"321":10,"323":6}}],["dash",{"2":{"501":1}}],["day",{"2":{"445":2,"448":2}}],["dangerfile",{"2":{"444":2}}],["dart",{"2":{"444":6}}],["dark",{"2":{"444":1,"531":1,"545":1}}],["dapp",{"2":{"251":2}}],["dapps",{"2":{"251":1,"252":1}}],["datalayer",{"2":{"517":3}}],["data>",{"2":{"283":1}}],["data=json",{"2":{"355":1}}],["data=localstorage",{"2":{"355":1}}],["data=",{"2":{"283":1}}],["database",{"2":{"54":1}}],["data",{"0":{"113":1},"2":{"17":1,"18":2,"19":1,"47":3,"48":1,"54":2,"110":1,"113":6,"114":5,"140":2,"143":6,"244":1,"246":2,"248":1,"249":1,"281":6,"283":3,"326":3,"328":4,"350":1,"355":4,"385":2,"386":1,"391":6,"392":7,"393":1,"395":1,"398":6,"400":9,"402":4,"435":2,"443":1,"448":1}}],["date=`date",{"2":{"435":1}}],["date",{"2":{"0":1,"222":1,"435":7,"444":1,"517":1}}],["döner",{"2":{"189":1}}],["dns",{"0":{"125":2},"1":{"127":2},"2":{"125":6,"136":1,"137":2}}],["doublecount",{"2":{"351":1,"352":2}}],["don",{"0":{"302":1},"2":{"294":1}}],["done",{"2":{"222":5,"223":1}}],["dosignin",{"2":{"244":1}}],["dos",{"2":{"221":1}}],["dosubscribe",{"2":{"156":1}}],["download",{"2":{"218":1}}],["downloads",{"2":{"217":1}}],["docs",{"2":{"228":1,"246":1,"435":1,"439":1}}],["documentscroll",{"2":{"284":2}}],["document",{"2":{"146":1,"184":1,"284":2,"301":1,"394":1,"460":1}}],["dockerignore",{"2":{"444":1}}],["dockerfile",{"2":{"444":2}}],["docker",{"0":{"434":1},"2":{"40":1,"444":2}}],["do",{"0":{"127":1,"220":1,"223":1,"231":1,"290":1,"291":1},"1":{"221":1,"222":1,"223":1},"2":{"212":1,"214":1,"219":1,"220":2,"222":2,"223":1,"224":1,"226":2,"231":1,"236":2,"272":1,"285":1,"289":1,"290":3,"291":1,"293":1}}],["domain",{"2":{"540":1}}],["dom",{"2":{"119":1,"146":1,"147":2,"149":1,"184":2,"301":1,"384":1,"413":2}}],["doe",{"2":{"114":2,"279":1}}],["dropdown",{"2":{"459":1}}],["draw",{"2":{"324":3}}],["drawers",{"0":{"505":1},"1":{"506":1,"507":1}}],["drawer",{"2":{"100":1,"489":1,"496":1,"498":1,"530":1}}],["drilling",{"2":{"281":1,"438":2}}],["drive",{"2":{"106":3}}],["dry",{"0":{"302":1},"2":{"277":1,"284":1,"294":1}}],["diffeditor",{"2":{"444":1}}],["diffdecorationsgutterwidth",{"2":{"444":1}}],["di",{"2":{"344":1}}],["dialyzer",{"2":{"444":1}}],["dialogstyle",{"2":{"444":1}}],["dialog",{"2":{"289":1}}],["diagram",{"0":{"5":1}}],["dirs",{"2":{"435":1}}],["dir=`echo",{"2":{"435":2}}],["dir=your",{"2":{"435":1}}],["dir=dev",{"2":{"435":1}}],["dir=",{"2":{"435":2}}],["dir",{"2":{"435":24,"542":1}}],["dirname",{"2":{"219":1,"443":1}}],["direction",{"2":{"194":2,"497":2}}],["directives",{"2":{"150":1}}],["directive",{"2":{"112":1}}],["directory",{"0":{"239":1},"2":{"100":1,"237":3,"238":1}}],["disabled=",{"2":{"354":1}}],["dispatch",{"2":{"435":2}}],["dispatcher",{"0":{"389":1},"2":{"326":4,"387":1,"388":1,"389":1,"390":1}}],["displaylanguage",{"2":{"444":1}}],["display",{"2":{"146":1,"182":1,"194":2,"221":1,"222":1,"259":1,"261":1,"265":1,"497":1,"542":1}}],["discord",{"2":{"228":1}}],["distributedfooter",{"0":{"513":1}}],["dist",{"2":{"127":1,"134":1,"426":2,"435":2,"440":1,"444":1}}],["divider",{"2":{"545":1}}],["div>",{"2":{"96":1,"140":1,"143":2,"146":1,"182":2,"184":2,"221":1,"222":10,"236":2,"239":3,"283":5,"289":2,"333":1,"343":2,"347":2,"349":2,"395":3,"400":4,"438":6,"497":4,"526":2}}],["div",{"2":{"96":2,"140":3,"146":2,"183":1,"184":4,"221":3,"222":12,"236":2,"239":1,"283":4,"289":2,"333":1,"395":1,"428":5,"441":1,"497":4}}],["d",{"2":{"55":1,"130":1,"245":1,"410":1,"414":2,"419":1,"427":1,"435":1,"444":16}}],["details",{"2":{"457":1}}],["deno",{"2":{"444":2}}],["deep",{"2":{"441":1}}],["deposit",{"2":{"524":1}}],["deprecated",{"2":{"449":1}}],["deploy",{"2":{"435":16,"515":2,"530":1}}],["deployment",{"0":{"515":1},"2":{"430":1,"515":2}}],["dependencies",{"2":{"322":3,"435":2,"527":1}}],["dependency2",{"2":{"323":1}}],["dependency1",{"2":{"323":1}}],["dependencyservice",{"2":{"322":2,"323":6}}],["dependency",{"0":{"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1},"1":{"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1},"2":{"294":1,"307":1,"321":1,"322":2,"323":2}}],["debounce",{"2":{"453":1}}],["debuganyway",{"2":{"444":1}}],["debug",{"2":{"426":4,"444":1}}],["debian",{"2":{"423":1}}],["dexie",{"2":{"394":2,"396":5}}],["dexiejs",{"0":{"394":1},"1":{"395":1,"396":1,"397":1,"398":1,"399":1,"400":1},"2":{"394":2}}],["dexiedb",{"2":{"334":1}}],["decrement",{"2":{"351":1,"352":2,"354":1}}],["decorator=",{"2":{"357":1}}],["decorator",{"0":{"331":1,"332":1,"333":1},"1":{"332":1,"333":1},"2":{"294":1,"309":1,"333":1,"337":1,"356":1,"357":2,"359":1,"388":1}}],["decoder",{"2":{"245":1}}],["degrees",{"2":{"330":6}}],["delivery",{"2":{"430":1,"433":1}}],["delegate",{"0":{"388":1},"2":{"382":1,"387":1,"388":3,"390":1,"404":1}}],["deletenote",{"2":{"395":3,"396":2}}],["delete",{"2":{"54":1,"55":1,"94":1,"243":1,"274":1,"391":1,"396":1,"397":1,"448":1}}],["delay",{"2":{"278":2}}],["de",{"2":{"180":1}}],["definition",{"2":{"411":1}}],["define",{"2":{"417":1}}],["defined",{"2":{"411":2}}],["defineasynccomponent",{"2":{"278":7}}],["defineconfig",{"2":{"219":1,"265":2,"414":1,"417":2,"443":1,"516":1}}],["defineemits",{"2":{"115":1,"279":3,"280":2}}],["defineprops",{"2":{"115":1,"182":1,"236":1,"279":4,"280":2,"289":1,"332":1,"333":1,"441":1}}],["definestore",{"2":{"351":3,"352":2}}],["defines",{"2":{"83":1}}],["defaultformatter",{"2":{"444":4}}],["defaults",{"2":{"248":1,"398":1}}],["default",{"0":{"132":1},"2":{"105":1,"113":1,"143":2,"219":1,"233":1,"239":2,"265":1,"279":3,"283":1,"289":4,"314":1,"315":1,"317":1,"318":1,"319":1,"322":1,"346":1,"349":1,"391":1,"393":1,"396":1,"398":1,"414":1,"417":2,"435":2,"441":6,"443":1,"444":2,"501":1,"516":1}}],["devdependencies",{"2":{"443":1,"444":1}}],["devoptions",{"2":{"265":1}}],["developit",{"2":{"345":1}}],["developer",{"2":{"246":1,"264":1,"355":1,"387":1,"408":1,"484":1}}],["development",{"2":{"66":1,"542":1}}],["dev",{"2":{"74":1,"100":1,"108":1,"214":1,"215":1,"217":1,"219":2,"222":1,"265":1,"428":5,"435":10,"439":2,"443":1,"461":1,"490":1,"491":1,"542":1}}],["devtoolsformatters",{"2":{"448":3}}],["devtools",{"2":{"22":1,"107":1,"448":2,"449":4,"527":1}}],["designer",{"2":{"444":2}}],["designing",{"2":{"171":1}}],["design",{"0":{"362":1},"2":{"161":1,"189":1,"216":2,"217":1,"227":1,"255":1,"269":1,"289":1,"290":1,"341":1,"363":1,"367":1,"383":1,"406":1,"442":1,"460":2,"464":1,"485":1}}],["describe",{"2":{"411":3,"415":2,"416":2,"417":1}}],["description",{"2":{"18":1,"19":1,"127":3,"261":1,"435":1,"540":3,"542":1}}],["desc",{"2":{"47":2}}],["desktop",{"2":{"23":1,"86":1,"169":1,"194":2,"266":1,"497":3,"506":1,"534":2,"536":1}}],["python",{"2":{"460":1,"461":1}}],["pyproject",{"2":{"444":2}}],["pyrightconfig",{"2":{"444":2}}],["psalm",{"2":{"444":1}}],["pm2",{"2":{"444":4}}],["pm",{"2":{"444":1}}],["px`",{"2":{"441":4}}],["pdm",{"2":{"444":2}}],["pdf",{"2":{"440":1,"444":1}}],["pdgaraguso",{"2":{"368":1}}],["pwd",{"2":{"435":1}}],["pwas",{"2":{"252":1}}],["pwa",{"0":{"256":1,"257":1,"265":1,"266":1,"461":1,"541":1},"1":{"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"542":1,"543":1},"2":{"50":1,"78":1,"100":1,"122":2,"135":1,"138":1,"254":5,"256":15,"258":1,"261":2,"263":8,"264":5,"265":5,"266":3,"267":3,"268":4,"363":1,"375":1,"461":12,"484":1,"489":2,"494":2,"496":1,"530":1}}],["ppa",{"2":{"423":3}}],["pnp",{"2":{"444":2}}],["pnpm",{"2":{"53":1,"100":3,"426":1,"435":12,"443":2,"444":6,"489":3,"490":2,"491":2,"494":1}}],["png`",{"2":{"440":1}}],["png",{"2":{"265":8,"440":3,"442":3,"498":1}}],["p>",{"2":{"263":2,"395":2}}],["p",{"2":{"236":4,"263":2,"428":2,"435":1}}],["pending",{"2":{"222":10,"223":1}}],["persistentsessionreviveprocess",{"2":{"444":1}}],["person=",{"2":{"115":1}}],["person",{"2":{"114":5,"115":1,"153":1,"155":1}}],["pereditorgroup",{"2":{"444":1}}],["performance",{"2":{"256":1}}],["permissions",{"2":{"435":1}}],["permission",{"2":{"106":1}}],["pipelines",{"2":{"444":2}}],["picture",{"2":{"145":3}}],["pinia",{"0":{"350":1,"354":1},"1":{"351":1,"352":1,"353":1,"354":1},"2":{"23":1,"95":1,"110":1,"118":2,"340":1,"349":1,"350":6,"351":3,"352":2,"353":2,"354":12,"358":1,"364":1,"365":1,"376":1,"449":14,"470":1}}],["pug",{"2":{"448":1}}],["pugtools",{"2":{"444":1}}],["puppeteer",{"2":{"444":10}}],["put",{"2":{"243":2,"264":1,"397":1}}],["pubspec",{"2":{"444":3}}],["pubxml",{"2":{"444":2}}],["pub",{"2":{"236":2,"325":1,"329":1}}],["publishing",{"2":{"100":1,"165":1,"489":1}}],["public",{"2":{"54":1,"57":2,"103":1,"107":1,"117":1,"215":1,"216":1,"217":1,"218":1,"440":4}}],["push",{"0":{"240":1},"2":{"222":1,"240":4,"241":1,"256":3,"326":1,"421":1,"429":2,"430":1,"433":1,"435":3,"451":1,"517":1}}],["purple",{"2":{"142":1,"333":1}}],["pure",{"2":{"142":1}}],["pullapprove",{"2":{"444":2}}],["pull",{"2":{"134":1,"421":1,"429":1}}],["plugin",{"2":{"265":3,"289":4,"443":2,"444":1,"461":2,"503":1}}],["plugins",{"2":{"219":3,"234":1,"265":1,"287":2,"289":5,"290":1,"414":1,"443":1}}],["plus",{"2":{"222":1}}],["playground",{"2":{"444":1}}],["playwright",{"2":{"444":10}}],["player",{"2":{"208":1}}],["placeholder=",{"2":{"222":1,"395":2}}],["placeholder",{"2":{"107":1}}],["please",{"2":{"100":1,"444":1}}],["pba",{"2":{"106":1}}],["phantom",{"2":{"251":1}}],["photoshop",{"2":{"228":1}}],["photo",{"2":{"106":1}}],["phpcs",{"2":{"444":2}}],["phpunit",{"2":{"444":1}}],["php",{"2":{"61":1,"107":1,"444":2,"460":1,"461":2}}],["port",{"2":{"402":4,"424":1}}],["portrait",{"2":{"261":1}}],["pouchdb",{"2":{"394":1}}],["polygon",{"2":{"251":1}}],["policy",{"2":{"106":1}}],["policies",{"2":{"58":1}}],["pointer",{"2":{"222":1}}],["position",{"2":{"96":1}}],["postcss",{"2":{"444":10}}],["postcssrc",{"2":{"444":10}}],["postmessage",{"2":{"385":2,"386":1,"387":1,"391":1,"392":1}}],["postman",{"2":{"50":2,"108":1,"444":1}}],["posts",{"2":{"116":1}}],["postwoman",{"2":{"50":1}}],["postgresql",{"2":{"107":1}}],["postgres",{"2":{"40":2,"48":1}}],["post",{"2":{"0":3,"55":1,"243":2,"244":1,"248":1,"249":2,"397":3,"398":2,"399":1,"400":2,"402":3}}],["pablo",{"2":{"245":1,"361":1}}],["payload=",{"2":{"392":1,"398":2}}],["payload",{"2":{"245":4,"391":7,"392":3,"398":4}}],["pascal",{"2":{"444":1}}],["pascalcase",{"2":{"155":1,"221":2}}],["passingpropsupward>",{"2":{"283":1}}],["passingpropsupward",{"2":{"283":2}}],["password",{"2":{"244":3}}],["padding",{"2":{"221":1,"222":7,"236":1,"402":1}}],["patterns",{"0":{"362":1,"380":1},"2":{"161":1,"227":1,"255":1,"269":1,"289":1,"290":1,"341":1,"363":1,"367":1,"383":1,"406":1,"444":1,"460":2,"464":1,"485":1}}],["paths",{"2":{"443":1}}],["path",{"2":{"88":3,"219":4,"233":3,"237":3,"239":1,"240":1,"438":4,"441":1,"443":3}}],["packtpub",{"2":{"190":1}}],["packtpublishing",{"2":{"161":1,"227":1,"255":1,"269":1,"289":1,"290":1,"341":1,"367":1,"383":1,"406":1}}],["packt",{"2":{"164":2,"165":1,"166":1,"190":1,"191":2,"368":1}}],["packages",{"2":{"444":1}}],["package",{"0":{"5":1},"2":{"86":1,"213":1,"215":2,"326":1,"401":1,"410":2,"418":1,"419":1,"443":1,"444":7,"492":1,"527":1}}],["parentbasic",{"0":{"343":1}}],["parent",{"2":{"280":1,"384":1}}],["parameters",{"2":{"240":1}}],["params",{"2":{"105":2,"236":4,"239":1,"240":1,"242":2,"398":1,"501":1}}],["parse",{"2":{"95":1,"355":1,"395":1,"396":1}}],["pagespeed",{"2":{"461":2}}],["pages",{"0":{"514":1},"1":{"515":1,"516":1},"2":{"100":3,"433":1,"435":11,"439":3,"460":1,"489":1,"515":6,"530":2}}],["page",{"2":{"87":2,"108":1,"187":2,"461":1}}],["panel",{"0":{"31":1}}],["pr",{"2":{"483":1}}],["practices",{"0":{"362":1},"2":{"161":1,"227":1,"255":1,"269":1,"289":1,"290":1,"341":1,"367":1,"383":1,"406":1,"460":2,"464":1,"485":1}}],["primevue",{"2":{"445":1}}],["print",{"2":{"448":1}}],["printwidth",{"2":{"444":1}}],["printf",{"2":{"435":1}}],["printpage",{"2":{"150":3}}],["principle",{"0":{"299":1},"2":{"303":1}}],["privacy",{"0":{"202":1}}],["private",{"2":{"128":1,"435":5,"436":1,"449":1}}],["price",{"2":{"18":1,"461":1}}],["problem",{"2":{"461":1}}],["procfile",{"2":{"444":2}}],["processmessage",{"2":{"391":4}}],["process",{"2":{"384":1}}],["processqueue",{"2":{"156":1}}],["proceed",{"2":{"100":1}}],["proj",{"2":{"444":2}}],["projectname",{"2":{"489":1}}],["projects",{"2":{"236":1,"316":2,"317":3,"318":4,"319":3,"320":4,"321":9}}],["projectservice",{"2":{"157":1}}],["projectservice=new",{"2":{"157":1}}],["project",{"2":{"100":2,"233":4,"236":1,"435":5,"444":1,"489":5,"490":1,"494":2}}],["prod",{"2":{"435":5}}],["producs",{"2":{"94":1}}],["production",{"2":{"443":1}}],["productid",{"2":{"88":1,"94":6}}],["productcard",{"2":{"102":1}}],["productcategoryview",{"2":{"87":2,"88":2}}],["productview",{"2":{"87":2,"88":1}}],["products",{"2":{"41":2,"83":1,"86":1,"87":1,"94":1,"103":1,"105":3}}],["product",{"0":{"46":1,"47":1},"2":{"16":1,"17":1,"43":1,"47":1,"48":1,"54":4,"55":3,"58":1,"83":2,"88":3,"126":1}}],["proxies",{"0":{"356":1},"1":{"357":1,"358":1}}],["proxy",{"0":{"329":1,"330":1},"1":{"330":1},"2":{"108":1,"114":1,"116":1,"294":1,"309":1,"329":1,"330":3,"331":2,"356":1,"357":3,"388":1,"448":2,"451":1}}],["provision",{"2":{"281":5}}],["provide",{"0":{"281":1},"2":{"280":1,"281":8,"289":1,"322":3,"323":4,"344":2,"436":1,"438":3,"449":2}}],["provider",{"2":{"245":1}}],["promised",{"2":{"339":1}}],["promises",{"2":{"294":1,"310":1,"336":1}}],["promise",{"0":{"337":1},"2":{"275":1,"278":1,"289":1,"337":9,"391":3,"392":2,"393":2,"396":3,"398":2,"413":2,"500":1}}],["prompt",{"0":{"263":1},"2":{"213":1,"262":1,"263":6}}],["progressive",{"2":{"256":1,"266":1,"363":1,"461":1}}],["progress",{"0":{"181":1},"1":{"182":1},"2":{"181":1,"290":2}}],["profile",{"2":{"145":3,"281":1}}],["protocol",{"2":{"125":1,"134":2,"135":1}}],["prop",{"2":{"115":2,"236":2,"280":1,"289":1,"343":1,"357":12,"438":2}}],["props",{"0":{"115":1},"2":{"110":1,"115":3,"143":1,"233":2,"236":1,"237":2,"239":1,"279":1,"280":2,"281":2,"283":1,"289":1,"342":2,"357":6,"408":2,"409":1,"415":3,"441":11}}],["property=",{"2":{"540":7}}],["properties",{"2":{"242":1}}],["proper",{"2":{"83":1}}],["prerenderer",{"2":{"461":1}}],["prettier",{"2":{"444":14}}],["pretty",{"2":{"233":1}}],["pre>",{"2":{"349":2}}],["pre",{"2":{"336":14,"337":7}}],["preventdefault",{"2":{"263":1}}],["preview",{"2":{"215":1,"410":2,"444":1}}],["press",{"2":{"196":2}}],["prestashop",{"2":{"41":1}}],["preferredtagnamecase",{"2":{"444":1}}],["prefer",{"2":{"55":1,"265":1}}],["ящики",{"2":{"300":1}}],["ячеек",{"2":{"297":1}}],["яркий",{"2":{"300":1}}],["ярким",{"2":{"243":1,"355":1}}],["ярких",{"2":{"175":1}}],["ярлыков",{"2":{"191":1}}],["ярлыка",{"2":{"177":1,"261":1}}],["ядра",{"2":{"116":1,"421":2}}],["языком",{"2":{"298":1,"384":1}}],["языков",{"0":{"457":1},"2":{"139":1,"216":1,"313":1,"315":1,"448":1,"452":1,"524":1}}],["языке",{"2":{"107":2,"143":1,"162":1,"169":1,"176":1,"217":1,"294":1,"366":1,"460":1}}],["языках",{"2":{"299":2,"437":1,"451":1,"452":1}}],["языками",{"2":{"142":1,"301":1}}],["языка",{"2":{"67":1,"108":1,"162":1,"216":1,"298":1,"306":1,"411":1,"448":1,"460":1,"524":1}}],["язык",{"0":{"362":1},"2":{"67":2,"109":1,"138":2,"157":1,"160":1,"260":1,"298":1,"380":1,"449":1,"460":2}}],["явная",{"2":{"302":1}}],["явным",{"2":{"105":1}}],["явные",{"2":{"55":1}}],["явного",{"2":{"320":1}}],["явное",{"2":{"291":1}}],["явном",{"2":{"142":1}}],["явно",{"2":{"96":1,"143":1,"151":1,"201":1,"215":1,"492":1}}],["явен",{"2":{"96":1}}],["являющееся",{"2":{"178":2}}],["являются",{"2":{"14":1,"107":1,"112":1,"115":1,"152":1,"157":1,"165":1,"169":2,"171":1,"183":1,"195":1,"200":1,"213":1,"216":1,"228":2,"242":1,"243":1,"244":3,"248":1,"251":3,"256":1,"264":1,"277":1,"296":1,"301":1,"304":1,"312":1,"314":1,"330":1,"336":1,"342":1,"351":2,"355":2,"371":1,"384":1,"405":1,"411":1,"438":1,"448":1,"487":1}}],["является",{"0":{"113":1},"2":{"41":1,"50":1,"107":1,"110":1,"113":1,"114":1,"116":1,"125":1,"128":1,"134":1,"135":2,"139":1,"140":1,"142":3,"143":4,"145":1,"159":1,"163":1,"169":1,"170":1,"177":1,"180":1,"183":2,"184":1,"187":1,"191":1,"194":1,"195":3,"199":1,"207":2,"210":1,"212":1,"214":1,"215":3,"218":2,"219":2,"223":1,"225":2,"228":1,"231":1,"233":1,"236":1,"238":1,"239":1,"243":2,"244":1,"245":3,"249":4,"251":3,"254":1,"258":1,"261":1,"263":1,"264":2,"266":1,"269":1,"272":1,"274":1,"275":1,"278":1,"279":1,"280":3,"281":3,"290":3,"294":1,"298":1,"299":1,"300":1,"302":1,"303":1,"310":1,"314":1,"318":1,"325":1,"326":1,"329":2,"330":2,"334":3,"335":2,"336":1,"337":1,"342":2,"348":2,"349":2,"350":1,"354":2,"355":4,"357":4,"384":3,"389":1,"391":1,"393":1,"395":1,"397":2,"398":1,"405":1,"408":2,"409":1,"411":3,"413":1,"414":1,"420":2,"421":2,"422":1,"425":2,"426":2,"438":1,"449":2,"451":2,"452":1,"461":1,"501":1}}],["являться",{"2":{"6":1,"398":1}}],["я",{"2":{"4":1,"61":2,"110":1,"140":1,"143":2,"151":1,"197":1,"213":4,"236":1,"261":1,"273":1,"283":1,"289":1,"299":1,"301":1,"326":2,"329":1,"330":1,"336":1,"337":2,"344":1,"354":1,"357":1,"368":1,"398":1,"449":2,"452":2,"460":2}}],["едят",{"2":{"527":1}}],["единицы",{"2":{"407":1}}],["единиц",{"2":{"334":1}}],["единицей",{"2":{"272":1}}],["единую",{"2":{"315":1,"327":1,"388":1}}],["единый",{"2":{"302":1,"349":1,"350":1,"459":1}}],["единая",{"2":{"256":1,"294":1,"297":1,"325":1}}],["единственному",{"2":{"411":1}}],["единственной",{"2":{"198":1}}],["единственное",{"2":{"61":1,"337":1,"411":1}}],["единственная",{"2":{"183":1,"492":1}}],["единственным",{"2":{"318":1,"402":1}}],["единственные",{"2":{"167":1,"354":1,"355":1}}],["единственный",{"2":{"143":2,"236":1,"354":1}}],["единой",{"0":{"299":1},"2":{"299":1,"348":1,"388":1,"390":1}}],["единое",{"2":{"141":1,"300":1,"407":1}}],["единовременно",{"2":{"135":1}}],["ежедневно",{"2":{"359":1}}],["ею",{"2":{"342":2}}],["е",{"2":{"124":1,"196":1}}],["еvent",{"2":{"109":1}}],["ему",{"2":{"106":1,"165":1,"177":1,"236":1,"249":1,"273":1,"274":1,"326":1,"337":1,"393":1,"433":1,"449":1,"461":1}}],["ей",{"2":{"61":1,"305":1,"459":1}}],["ее",{"2":{"23":1,"68":1,"131":1,"139":1,"140":1,"142":2,"143":2,"162":1,"172":1,"176":2,"184":1,"206":1,"213":2,"216":2,"220":1,"222":1,"223":1,"228":1,"237":1,"247":1,"251":1,"263":1,"274":1,"278":1,"280":1,"284":3,"285":2,"291":1,"297":1,"301":2,"303":1,"318":1,"320":1,"321":2,"326":1,"335":1,"342":1,"343":1,"345":1,"349":1,"351":1,"355":3,"384":2,"385":1,"392":1,"394":1,"396":2,"403":1,"412":1,"415":1,"416":1,"418":1,"420":1,"428":1,"452":1}}],["её",{"0":{"215":1},"2":{"23":1,"41":1,"81":1,"88":1,"89":2,"102":1,"106":2,"145":1,"436":1,"440":1,"448":1,"451":2,"453":2}}],["еще",{"0":{"283":1},"2":{"10":1,"27":1,"41":1,"125":1,"134":1,"139":1,"141":1,"150":1,"151":1,"158":1,"160":1,"162":1,"165":1,"167":1,"180":1,"204":1,"213":1,"214":2,"215":1,"218":2,"219":1,"228":2,"248":1,"250":3,"262":1,"273":1,"277":1,"280":1,"281":1,"283":1,"289":1,"290":3,"291":1,"292":1,"297":2,"303":1,"304":1,"323":1,"333":1,"384":1,"387":2,"388":1,"392":1,"402":1,"403":1,"407":1,"410":2,"411":2,"413":1,"417":1,"418":1,"419":1,"426":1,"428":1,"429":1,"444":4,"448":1,"451":1,"460":1,"461":3,"524":1}}],["ещё",{"2":{"4":1,"228":1}}],["естественный",{"2":{"229":1}}],["естественным",{"2":{"167":1,"280":1}}],["естественные",{"0":{"167":1}}],["естественных",{"2":{"166":1,"411":1}}],["естественной",{"2":{"166":1}}],["естественном",{"2":{"162":1}}],["естественно",{"2":{"100":1,"121":1,"299":1,"435":1,"449":1}}],["есть",{"0":{"486":1},"2":{"9":1,"10":1,"12":1,"13":1,"16":3,"17":2,"22":2,"43":1,"47":1,"48":1,"58":1,"76":1,"81":1,"82":1,"88":1,"93":3,"96":1,"100":1,"106":3,"107":4,"110":1,"113":1,"114":1,"116":1,"125":2,"127":1,"133":1,"135":1,"138":1,"139":4,"142":2,"143":3,"151":1,"159":1,"171":1,"178":1,"180":1,"181":3,"184":1,"186":1,"195":1,"197":2,"200":1,"214":2,"218":1,"222":4,"223":3,"228":1,"230":1,"233":1,"234":1,"236":2,"237":1,"239":3,"245":3,"249":1,"251":1,"256":2,"262":1,"263":2,"264":3,"265":1,"272":1,"277":1,"278":1,"280":1,"282":1,"283":1,"285":1,"289":1,"290":1,"292":1,"293":1,"298":2,"301":1,"303":1,"326":1,"327":1,"329":2,"331":3,"333":1,"336":1,"337":4,"342":3,"344":2,"346":1,"347":1,"349":3,"350":1,"352":1,"354":1,"355":1,"384":4,"386":1,"390":1,"410":3,"411":1,"414":2,"416":1,"417":1,"418":1,"420":1,"426":1,"429":1,"435":3,"436":2,"442":1,"444":1,"445":2,"446":1,"449":4,"451":3,"452":1,"453":1,"459":1,"460":6,"461":3,"495":1,"527":2,"528":1}}],["если",{"2":{"3":1,"9":1,"12":2,"23":1,"26":1,"34":1,"36":1,"40":1,"41":1,"58":2,"67":1,"83":1,"84":2,"96":2,"103":1,"106":5,"107":2,"108":5,"112":1,"116":4,"122":1,"125":1,"126":4,"127":2,"128":1,"130":1,"132":2,"134":1,"135":4,"136":1,"138":1,"139":1,"141":1,"142":4,"143":2,"145":2,"147":2,"148":1,"151":1,"157":1,"159":2,"160":1,"163":1,"165":3,"167":2,"169":1,"170":1,"171":1,"172":1,"178":1,"181":1,"183":1,"186":1,"191":1,"197":1,"199":2,"204":1,"208":1,"209":1,"213":1,"214":8,"215":2,"216":3,"217":1,"218":2,"222":2,"223":1,"226":1,"228":1,"230":1,"233":1,"236":3,"238":1,"239":1,"242":2,"244":1,"245":1,"250":3,"251":1,"256":3,"258":1,"263":2,"264":3,"265":1,"266":1,"267":1,"272":1,"273":1,"277":2,"278":2,"280":1,"281":1,"283":6,"284":1,"289":1,"297":2,"299":1,"301":3,"302":2,"304":2,"311":1,"314":2,"315":1,"318":1,"320":2,"321":2,"322":1,"326":2,"327":1,"328":1,"329":1,"330":1,"331":1,"335":1,"341":1,"344":2,"347":5,"349":3,"350":1,"351":1,"353":1,"354":1,"355":2,"357":2,"358":2,"365":1,"384":8,"385":2,"387":1,"389":1,"393":1,"395":1,"396":1,"397":1,"410":1,"411":3,"413":2,"414":1,"417":1,"418":2,"420":1,"422":1,"423":1,"424":3,"425":4,"429":1,"435":1,"436":1,"439":1,"440":2,"442":1,"443":3,"444":1,"448":1,"449":5,"453":2,"454":1,"456":1,"459":1,"460":4,"461":2,"492":1,"515":1,"516":2,"527":1,"536":1}}],["его",{"0":{"312":1},"2":{"3":1,"4":1,"16":1,"22":2,"23":1,"25":1,"41":1,"48":1,"58":1,"63":1,"64":1,"67":1,"68":1,"81":2,"95":1,"96":2,"100":1,"102":1,"106":10,"107":2,"108":1,"112":3,"114":2,"116":1,"125":1,"126":1,"128":1,"131":1,"132":1,"135":2,"139":2,"140":2,"142":1,"143":5,"146":2,"150":1,"151":1,"152":1,"160":1,"162":3,"165":2,"170":1,"175":2,"178":1,"179":1,"181":4,"183":1,"184":1,"186":1,"188":1,"190":1,"191":1,"194":1,"196":1,"198":2,"199":1,"200":1,"204":1,"207":1,"209":2,"212":1,"213":2,"214":2,"215":6,"217":1,"218":1,"220":2,"221":2,"222":3,"223":3,"224":1,"229":1,"230":1,"231":1,"233":1,"235":1,"236":3,"237":1,"239":1,"243":1,"244":2,"245":4,"246":1,"249":2,"250":1,"251":6,"254":1,"256":2,"260":1,"262":1,"263":2,"264":6,"265":1,"267":1,"268":1,"277":2,"278":2,"279":1,"280":1,"281":1,"289":4,"290":2,"292":1,"293":1,"299":1,"301":1,"302":4,"304":1,"315":1,"319":1,"322":1,"323":2,"326":2,"327":1,"329":4,"330":1,"331":4,"332":1,"334":3,"336":2,"337":1,"342":2,"344":1,"345":1,"348":2,"350":4,"351":3,"352":1,"354":2,"355":2,"356":3,"357":5,"358":2,"360":1,"379":1,"385":1,"387":1,"388":2,"389":1,"391":1,"392":2,"393":1,"394":2,"395":1,"396":1,"398":2,"402":1,"403":1,"405":1,"407":1,"408":2,"409":1,"410":1,"414":1,"416":2,"419":1,"420":1,"421":2,"425":3,"428":3,"429":1,"430":1,"435":1,"436":1,"443":1,"444":2,"449":1,"451":1,"452":3,"458":1,"459":1,"460":1,"461":7,"484":2,"496":2,"527":1,"542":1}}],["ie6",{"2":{"459":1}}],["iex",{"2":{"444":1}}],["ie11",{"2":{"442":1}}],["ie",{"2":{"442":1}}],["i++",{"2":{"326":1,"336":2,"337":1}}],["igzir14e",{"2":{"245":1}}],["ignoredlocales",{"2":{"444":1}}],["ignoretrimwhitespace",{"2":{"444":1}}],["ignorerecommendations",{"2":{"444":1}}],["ignore",{"2":{"100":1,"444":2,"489":1}}],["iat",{"2":{"245":2}}],["i>",{"2":{"218":1,"222":3}}],["ico",{"2":{"215":1,"265":1}}],["iconify",{"2":{"442":1,"444":2}}],["icons",{"0":{"442":1},"2":{"259":1,"265":1,"441":2,"442":1,"542":1}}],["iconwithbadge",{"2":{"96":3}}],["iconbadge",{"2":{"96":3}}],["iconbuddy",{"2":{"89":1}}],["icones",{"2":{"89":1}}],["icon",{"2":{"19":1,"96":2,"217":1,"265":3,"441":1}}],["icann",{"2":{"125":2}}],["ipc",{"2":{"337":1,"385":1}}],["ipv6",{"2":{"125":4}}],["ipv4",{"2":{"125":3}}],["ip",{"2":{"106":1,"125":7}}],["iphone",{"2":{"106":1,"175":1}}],["ipo",{"2":{"62":1}}],["i",{"2":{"100":1,"148":4,"218":2,"222":3,"326":6,"336":4,"337":2,"444":1,"490":1,"491":1}}],["isdraweropen",{"2":{"498":3}}],["isn",{"2":{"449":2}}],["isauthenticated",{"2":{"449":1}}],["ist",{"2":{"444":1}}],["issuenumberlabel",{"2":{"444":1}}],["issued",{"2":{"245":1}}],["is=",{"2":{"151":1}}],["is",{"0":{"285":1},"2":{"100":1,"142":1,"151":1,"278":1,"285":2,"444":1,"448":2,"449":2}}],["isinfavourites",{"2":{"94":3}}],["if=",{"2":{"289":1,"441":1}}],["ifmodule>",{"2":{"130":2}}],["ifmodule",{"2":{"130":2}}],["if",{"0":{"147":2},"2":{"94":1,"147":1,"151":1,"222":1,"247":1,"249":2,"263":1,"264":1,"278":1,"285":1,"315":1,"321":1,"326":3,"336":2,"337":2,"351":1,"352":1,"355":1,"357":3,"391":1,"392":1,"395":1,"398":2,"411":1,"435":3}}],["imageresources",{"2":{"442":3}}],["imageraw",{"2":{"440":1}}],["imagenameinvariable",{"2":{"440":1}}],["imageurl",{"2":{"440":1}}],["image",{"2":{"265":3,"440":4,"540":4}}],["images",{"2":{"18":1,"265":4,"435":1,"440":3,"442":2,"498":1,"540":1,"543":1}}],["imgurl",{"2":{"440":2}}],["img",{"2":{"145":1,"440":6,"441":1}}],["importscript",{"2":{"386":2,"387":1}}],["important",{"2":{"333":1}}],["import",{"2":{"94":2,"105":7,"112":3,"114":1,"143":2,"151":3,"184":1,"221":1,"233":2,"234":4,"236":1,"237":3,"239":3,"244":1,"265":2,"277":2,"278":7,"285":2,"289":5,"301":1,"315":1,"320":1,"321":3,"323":3,"333":1,"343":2,"347":2,"349":1,"352":2,"353":2,"354":1,"358":1,"386":1,"387":1,"395":2,"400":2,"411":1,"415":2,"416":2,"417":3,"440":3,"441":3,"442":6,"443":3,"444":2,"497":1,"498":3,"500":1,"501":6,"526":1}}],["i18next",{"0":{"524":1,"527":1},"2":{"448":1,"524":1,"527":3,"528":1}}],["i18n",{"0":{"523":1},"1":{"524":1,"525":1,"526":1,"527":1,"528":1},"2":{"78":1,"87":1,"100":1,"437":1,"444":3,"448":3,"492":1,"494":1,"496":1,"524":2,"526":1,"527":1,"532":2}}],["ios",{"2":{"256":1}}],["io",{"2":{"74":1,"100":1,"219":1,"245":1,"515":1}}],["inplace",{"2":{"444":1}}],["inputs",{"2":{"435":5}}],["inputevents",{"2":{"416":4}}],["inputevents=wrapper",{"2":{"416":1}}],["input",{"2":{"89":1,"149":2,"154":1,"174":2,"222":6,"249":2,"278":1,"395":1,"400":3,"415":2,"416":6,"444":1,"451":1}}],["inrange",{"2":{"351":1,"352":2}}],["inc",{"2":{"542":1}}],["includesource",{"2":{"417":1}}],["includeassets",{"2":{"265":1}}],["increment=",{"2":{"343":3}}],["increment",{"2":{"343":1,"344":4,"351":1,"352":2,"354":3}}],["incrementcounter",{"2":{"343":7,"344":2}}],["invisiblecharacters",{"2":{"444":1}}],["invoker",{"2":{"327":1,"328":2}}],["invalid",{"2":{"247":1}}],["inheritance",{"0":{"298":1},"2":{"294":1}}],["injections",{"2":{"503":1}}],["injection",{"0":{"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1},"1":{"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1},"2":{"294":1,"307":1,"323":2,"503":2}}],["inject",{"0":{"281":1},"2":{"280":1,"281":7,"289":4,"322":2,"323":2,"344":2,"436":1,"438":3,"449":2}}],["injectregister",{"2":{"265":1}}],["instanceof",{"2":{"357":1}}],["instance",{"2":{"315":5}}],["installpwa",{"2":{"263":3}}],["installed",{"2":{"263":5}}],["install",{"0":{"263":1},"2":{"214":1,"230":1,"243":1,"262":1,"263":10,"264":1,"265":1,"286":1,"289":2,"345":1,"350":1,"394":1,"397":1,"401":1,"409":1,"410":1,"414":2,"419":1,"423":2,"424":2,"435":10}}],["insertfinalnewline",{"2":{"444":1}}],["insert",{"2":{"54":1}}],["infinitum",{"2":{"184":1}}],["infinitescroller",{"0":{"184":1}}],["infinite",{"2":{"182":1,"183":1}}],["info",{"2":{"108":3}}],["inlinesuggest",{"2":{"444":1}}],["inline",{"2":{"182":1}}],["ind",{"2":{"444":1}}],["indent",{"2":{"444":1}}],["indexof",{"2":{"326":1}}],["indexeddb",{"0":{"355":1,"394":1},"1":{"395":1,"396":1,"397":1,"398":1,"399":1,"400":1},"2":{"316":2,"334":2,"355":5,"382":2,"384":1,"388":1,"394":2,"403":1}}],["indexedb",{"2":{"263":1}}],["index",{"0":{"127":1,"233":1,"392":1,"397":1,"399":1,"402":1,"503":1},"2":{"111":1,"117":1,"126":1,"127":1,"128":1,"130":2,"132":4,"141":1,"215":3,"216":2,"217":1,"218":1,"232":1,"258":1,"262":1,"289":5,"391":2,"401":1,"428":5,"435":2,"461":2,"501":1,"503":1,"517":1,"540":1,"544":1}}],["individual",{"2":{"281":1}}],["indicating",{"2":{"83":1}}],["initi18n",{"2":{"526":2}}],["initialset",{"2":{"95":2}}],["init",{"2":{"105":1,"401":1,"425":1,"435":2,"501":1}}],["in",{"0":{"417":1},"2":{"100":1,"148":1,"150":1,"151":2,"184":1,"222":2,"236":1,"239":1,"285":1,"290":2,"351":1,"352":1,"354":3,"395":1,"410":1,"428":2,"442":2,"444":1,"449":1,"489":1}}],["intl",{"2":{"445":1,"448":1}}],["integrated",{"2":{"444":5}}],["integration",{"2":{"430":1,"433":1}}],["intel",{"2":{"365":1}}],["intellisense",{"2":{"213":1}}],["inteface",{"2":{"162":1}}],["interval",{"2":{"249":2,"444":1}}],["intersectionobserver",{"2":{"184":3}}],["intersection",{"2":{"183":1,"448":1}}],["interaction",{"2":{"171":1,"247":1}}],["interacting",{"2":{"54":1}}],["interfaces",{"2":{"242":1,"481":1}}],["interface",{"2":{"171":1,"484":1}}],["internet",{"2":{"125":2,"258":1}}],["interceptors",{"2":{"105":1,"500":1,"501":1}}],["into",{"2":{"83":1,"105":1}}],["idx",{"2":{"444":1}}],["idb",{"2":{"394":1}}],["id=g",{"2":{"517":1}}],["id=await",{"2":{"396":1}}],["id=setinterval",{"2":{"249":1}}],["id=",{"2":{"140":3}}],["ids",{"2":{"83":2}}],["idea",{"2":{"426":1}}],["identity",{"2":{"247":1,"248":2}}],["ide",{"0":{"444":1},"2":{"81":1,"212":1,"213":6,"215":2,"224":1,"301":1,"354":1,"429":1,"444":1,"484":1}}],["id",{"2":{"3":2,"18":1,"19":1,"54":1,"55":3,"88":1,"140":1,"148":1,"153":1,"222":4,"233":2,"236":5,"245":1,"246":1,"249":1,"391":9,"392":5,"395":5,"396":6,"435":2,"517":1}}],["items",{"2":{"290":1}}],["item",{"2":{"222":5,"290":1,"355":7}}],["it",{"0":{"301":1,"303":1},"2":{"2":1,"67":1,"83":1,"100":2,"294":2,"301":1,"326":1,"449":2,"489":2,"494":1,"542":1}}],["лёгкое",{"2":{"492":1}}],["лэндинг",{"2":{"231":2,"236":1}}],["лэйаута",{"2":{"496":1,"536":1}}],["лэйаутами",{"2":{"438":1}}],["лэйауте",{"2":{"438":1}}],["лэйаутов",{"2":{"438":1}}],["лэйаут",{"2":{"26":1,"28":1,"221":1,"438":1,"459":1}}],["лайфхак",{"2":{"449":1}}],["лаконичен",{"2":{"278":1,"411":1}}],["ландшафтная",{"2":{"260":1}}],["ландшафте",{"2":{"138":1}}],["лазить",{"2":{"106":1}}],["лепту",{"0":{"483":1}}],["лечь",{"2":{"461":1}}],["лень",{"2":{"461":1}}],["ленивую",{"2":{"278":1}}],["ленивой",{"2":{"265":1}}],["ленточная",{"2":{"167":1}}],["лет",{"2":{"180":1,"218":1,"448":1}}],["лету",{"2":{"162":1,"228":1}}],["левой",{"2":{"165":1,"195":1}}],["левом",{"2":{"163":1,"169":1,"195":1}}],["легкий",{"2":{"460":1}}],["легким",{"2":{"408":1}}],["легкая",{"2":{"139":1,"394":1}}],["легкого",{"2":{"207":1}}],["легкой",{"2":{"143":1,"451":1}}],["легко",{"2":{"35":1,"62":1,"105":1,"139":1,"171":2,"175":1,"183":1,"186":1,"201":1,"216":1,"218":1,"236":1,"245":1,"302":1,"303":1,"336":1,"337":1,"397":1,"398":1,"410":1,"411":2,"414":1,"416":1,"438":1,"460":1,"492":1,"500":1}}],["легче",{"2":{"116":1,"266":1,"460":1}}],["лежащего",{"2":{"433":1}}],["лежащую",{"2":{"228":1}}],["лежат",{"2":{"411":1}}],["лежать",{"2":{"103":1}}],["лежит",{"2":{"107":1,"163":1,"167":1}}],["лучшем",{"2":{"384":1,"408":1}}],["лучшее",{"2":{"162":1,"256":1,"444":1}}],["лучшего",{"2":{"140":1,"341":1}}],["лучшей",{"2":{"58":1,"230":1,"299":1,"301":1,"495":1}}],["лучше",{"2":{"23":1,"35":1,"58":1,"116":1,"117":1,"143":1,"151":1,"194":1,"214":1,"223":1,"224":1,"228":1,"235":1,"243":1,"245":1,"253":1,"264":1,"272":1,"278":1,"297":1,"299":1,"301":2,"303":1,"320":1,"321":1,"338":1,"340":1,"347":1,"365":1,"409":1,"438":1,"442":1,"444":1,"451":1,"456":1,"460":2,"461":1,"527":1}}],["лучшими",{"2":{"460":1}}],["лучшим",{"2":{"243":1,"438":1}}],["лучших",{"2":{"77":1,"212":1,"218":1,"299":1,"304":1,"321":1,"438":1,"460":1,"484":1,"495":2,"496":1}}],["лучший",{"0":{"141":1},"2":{"17":1,"344":1}}],["лучшие",{"0":{"361":1,"438":1},"1":{"362":1,"363":1,"364":1,"365":1,"366":1,"367":1,"368":1},"2":{"9":1,"76":1,"106":1,"138":1,"223":1,"305":1,"416":1,"460":1,"496":1}}],["литерал",{"2":{"314":1,"322":1}}],["литературах",{"2":{"310":1}}],["листов",{"2":{"218":1}}],["лицензией",{"2":{"487":1}}],["лицензии",{"2":{"217":1}}],["лица",{"2":{"250":1}}],["лицом",{"2":{"125":1}}],["линтинга",{"2":{"492":1}}],["линтингом",{"2":{"450":1}}],["линтер",{"2":{"157":1,"444":1}}],["линус",{"2":{"421":1}}],["линусом",{"2":{"421":1}}],["линии",{"2":{"189":2}}],["лишен",{"2":{"250":1}}],["лишающие",{"2":{"210":1}}],["лишь",{"2":{"106":1,"138":1,"141":1,"171":1,"195":1,"218":1,"256":1,"281":1,"289":1,"384":1,"407":1,"415":1}}],["лишние",{"2":{"106":1,"428":1}}],["лимиты",{"2":{"40":1}}],["личное",{"2":{"236":1}}],["личность",{"2":{"201":1,"251":1}}],["личного",{"2":{"36":1,"436":1}}],["личным",{"2":{"58":1}}],["личный",{"2":{"29":1,"33":1,"79":1,"106":1}}],["ли",{"2":{"10":1,"26":1,"106":3,"107":1,"125":1,"126":1,"128":1,"137":1,"177":1,"211":1,"225":3,"262":1,"264":1,"272":2,"283":1,"293":1,"315":1,"335":1,"339":3,"344":1,"347":1,"357":2,"405":1,"418":1,"432":3,"438":1,"449":1,"450":1,"460":4,"461":1}}],["либо",{"2":{"3":1,"31":1,"40":1,"47":3,"52":1,"55":1,"58":1,"81":1,"107":1,"165":2,"176":2,"177":1,"179":2,"181":2,"195":2,"203":2,"205":2,"209":1,"213":1,"215":4,"219":1,"240":2,"250":1,"251":2,"263":4,"278":1,"285":4,"290":1,"327":1,"336":1,"349":1,"384":1,"388":2,"391":2,"398":2,"410":2,"418":1,"440":3,"443":1,"453":1,"459":2,"460":1,"461":1,"492":1,"495":1,"525":1}}],["ложное",{"2":{"411":1}}],["ложится",{"2":{"39":1}}],["ломают",{"2":{"408":1}}],["ловушки",{"2":{"357":1}}],["ловушку",{"2":{"201":1}}],["лотком",{"2":{"179":1}}],["локали",{"2":{"448":1}}],["локализации",{"2":{"448":3,"524":3}}],["локалей",{"2":{"448":1,"492":1,"524":1,"526":1}}],["локальную",{"2":{"421":1}}],["локальных",{"2":{"444":1,"449":1}}],["локальные",{"0":{"277":1,"355":1},"2":{"421":2}}],["локальными",{"2":{"256":2}}],["локальным",{"2":{"215":1,"256":1,"388":1,"429":1,"452":1}}],["локальный",{"2":{"214":1,"425":2,"429":3,"449":1}}],["локальное",{"2":{"228":1,"283":1}}],["локального",{"2":{"132":1,"135":1,"228":1,"277":1,"355":1}}],["локальной",{"2":{"126":1,"175":1,"179":1,"256":3,"334":1,"355":1,"393":1,"403":1,"429":1}}],["локальному",{"2":{"358":1,"394":1}}],["локальном",{"2":{"126":1,"131":1,"134":1}}],["локально",{"2":{"99":1,"138":1,"215":2,"277":1,"355":1,"429":2,"461":1}}],["локация",{"2":{"4":1}}],["логарифмической",{"2":{"170":1}}],["лого",{"2":{"89":1}}],["логотипа",{"2":{"86":1,"195":1}}],["логотип",{"2":{"29":1,"195":2}}],["логирования",{"2":{"331":1}}],["логическому",{"2":{"461":1}}],["логическом",{"2":{"388":1}}],["логической",{"2":{"301":1}}],["логические",{"2":{"408":1,"436":1}}],["логический",{"2":{"304":1}}],["логически",{"2":{"251":1,"455":1}}],["логических",{"2":{"67":1}}],["логично",{"2":{"449":1}}],["логичный",{"2":{"229":1,"448":1}}],["логичней",{"2":{"96":1}}],["логикe",{"2":{"284":1}}],["логикой",{"2":{"151":1,"249":1,"290":2,"299":1,"301":1,"327":1,"328":1}}],["логике",{"2":{"81":1,"222":1,"263":1,"302":1,"337":1}}],["логику",{"2":{"40":1,"107":2,"143":1,"222":2,"264":1,"278":1,"289":1,"290":2,"302":2,"304":1,"328":1,"329":1,"330":1,"331":1,"336":1,"350":1,"411":2,"416":1,"449":2,"451":3,"459":2}}],["логика",{"2":{"34":1,"107":1,"223":1,"251":1,"283":1,"449":4,"451":1}}],["логики",{"2":{"6":1,"244":3,"284":4,"289":1,"290":3,"302":1,"408":1,"411":1,"449":3,"500":1}}],["логине",{"2":{"106":1}}],["логинится",{"2":{"106":1}}],["логина",{"2":{"89":1,"106":1,"450":1,"533":1}}],["логин",{"2":{"33":1,"106":4}}],["люксовый",{"2":{"461":1}}],["людей",{"2":{"209":1}}],["люди",{"2":{"2":1,"165":1,"429":1}}],["любезно",{"2":{"410":1}}],["любую",{"2":{"216":1,"245":1,"278":1,"297":1,"349":1}}],["любимую",{"2":{"105":1}}],["любая",{"2":{"93":1,"260":1,"416":1,"449":1,"459":1}}],["любые",{"2":{"246":1,"247":1,"388":1,"396":1}}],["любым",{"2":{"125":1,"183":1,"349":1,"355":2,"357":1,"384":1,"387":1,"435":1}}],["любыми",{"2":{"62":1}}],["любых",{"2":{"2":1,"197":1,"321":1}}],["любого",{"2":{"23":1,"108":1,"124":1,"230":1,"238":1,"250":1,"251":1,"275":1,"279":1,"289":2,"330":1,"390":1,"402":2,"425":1,"483":1}}],["любом",{"2":{"12":1,"106":1,"169":1,"177":1,"216":1,"218":1,"236":1,"254":1,"258":1,"331":2,"337":1,"344":1,"449":1,"456":1,"461":1}}],["любому",{"2":{"2":1,"114":1,"125":1,"180":1,"344":1,"355":1}}],["любой",{"2":{"2":1,"108":1,"115":1,"128":1,"139":1,"141":1,"181":2,"220":1,"228":1,"238":1,"243":1,"251":1,"281":2,"286":1,"319":1,"345":1,"348":1,"385":1,"389":1,"429":1,"437":1,"440":1,"449":1,"459":1}}],["любое",{"2":{"2":1,"106":1,"195":1,"214":1,"348":1,"354":1,"412":1}}],["vwa",{"2":{"536":1,"545":11}}],["vetur",{"2":{"444":2}}],["vercel",{"2":{"439":1,"444":2,"533":1}}],["vertical",{"2":{"182":1}}],["versionrc",{"2":{"444":2}}],["versions",{"2":{"444":3}}],["version",{"2":{"100":1,"365":1,"396":1,"425":1,"435":5,"444":3,"543":1}}],["vbproj",{"2":{"444":1}}],["vb",{"2":{"444":6}}],["v4значительно",{"2":{"435":1}}],["v4",{"2":{"435":4}}],["v2",{"2":{"435":3}}],["volar",{"2":{"213":1,"444":4}}],["vlc",{"2":{"208":1}}],["vars",{"2":{"545":1}}],["var",{"2":{"435":4}}],["varb",{"2":{"280":1}}],["vara",{"2":{"280":1}}],["variable",{"2":{"143":1,"280":1}}],["variablename",{"2":{"143":1}}],["validate",{"2":{"444":1}}],["validateotp",{"2":{"249":1}}],["values",{"2":{"411":1}}],["value>=0",{"2":{"352":2}}],["value>0",{"2":{"249":1}}],["value++",{"2":{"343":1,"352":1}}],["value=reply",{"2":{"400":1}}],["value=result",{"2":{"249":1}}],["value=data",{"2":{"395":1}}],["value=note",{"2":{"395":1}}],["value=",{"2":{"395":2,"400":3}}],["value=value",{"2":{"347":1}}],["value=window",{"2":{"284":1}}],["value=true",{"2":{"249":1}}],["valueof",{"2":{"222":1}}],["value",{"2":{"83":2,"94":5,"105":2,"114":3,"143":2,"184":5,"222":9,"240":2,"244":2,"245":1,"249":3,"263":6,"278":1,"279":2,"281":1,"330":4,"336":8,"337":6,"347":1,"352":2,"357":8,"395":5,"400":2,"411":2,"416":1,"444":1,"448":1,"449":1,"451":2,"500":1,"526":1}}],["vps",{"2":{"128":4,"131":2,"134":1,"137":1}}],["v3",{"2":{"116":1,"120":1,"435":4}}],["v",{"0":{"115":1,"145":1,"146":1,"147":3,"148":1,"149":1,"150":1,"279":1},"2":{"110":1,"115":5,"144":1,"145":1,"146":2,"147":4,"148":1,"149":1,"150":2,"151":3,"175":1,"184":2,"222":11,"236":1,"239":1,"263":2,"280":9,"283":8,"285":3,"289":1,"395":3,"400":3,"441":3}}],["v0",{"2":{"86":1,"91":1,"97":1}}],["vscode",{"2":{"215":1,"426":2,"435":1,"444":9}}],["vs",{"2":{"81":1,"436":1,"444":7,"451":1,"527":1}}],["v16",{"2":{"365":1}}],["v1",{"0":{"463":1,"466":1,"468":1,"471":1,"474":1},"1":{"464":1,"465":1,"467":1,"469":1,"470":1,"472":1,"473":1,"475":1},"2":{"55":3}}],["visible",{"2":{"444":1}}],["visuals",{"2":{"444":1}}],["visualizer",{"2":{"443":4}}],["visual",{"2":{"213":1,"215":1,"365":1,"422":1,"429":1}}],["vivaldi",{"2":{"213":1}}],["virtual",{"2":{"128":1,"448":1}}],["video",{"2":{"63":1,"97":1}}],["vitepress",{"2":{"435":1,"458":1,"460":1,"495":1}}],["vitepwa",{"2":{"265":3}}],["vitest",{"0":{"410":1,"419":1},"1":{"411":1},"2":{"365":1,"405":1,"408":1,"409":1,"410":12,"411":6,"413":1,"414":3,"415":1,"416":3,"417":6,"418":5,"419":4,"444":10,"450":1}}],["vitejs",{"2":{"219":3,"265":1}}],["vite",{"0":{"219":1,"265":1,"516":1},"2":{"23":1,"100":1,"105":1,"108":1,"110":1,"117":1,"127":1,"141":1,"142":1,"143":1,"212":2,"213":1,"214":8,"215":6,"218":1,"219":10,"222":2,"225":1,"254":1,"264":2,"265":9,"267":1,"278":1,"364":1,"365":1,"384":1,"386":1,"387":2,"391":1,"410":5,"414":2,"417":1,"418":1,"419":1,"440":1,"441":1,"443":13,"444":3,"461":3,"485":1,"492":1,"501":1,"503":2,"516":1}}],["viewport",{"2":{"289":1}}],["view>",{"2":{"236":2}}],["viewitem",{"2":{"151":3}}],["view",{"2":{"11":1,"87":4,"236":1,"237":2,"239":1,"438":4,"449":2,"451":1}}],["views",{"0":{"87":1,"239":1},"2":{"3":1,"87":1,"230":1,"233":2,"237":3,"436":1}}],["vuefaq",{"2":{"486":1}}],["vuetify",{"2":{"459":1}}],["vuejs",{"2":{"116":3,"120":1,"150":1,"151":2,"218":1,"242":1,"283":1,"285":1,"354":1,"449":1,"485":4}}],["vuex",{"2":{"110":1,"118":1,"354":4,"449":6,"470":1}}],["vuesence",{"2":{"74":2,"99":1,"100":2,"491":1}}],["vuestorefront",{"2":{"61":1}}],["vueuse",{"2":{"23":1,"95":1,"284":1}}],["vue",{"0":{"100":1,"110":1,"138":1,"140":1,"144":1,"182":1,"184":1,"221":1,"222":1,"229":1,"236":1,"239":1,"332":1,"333":1,"343":1,"344":1,"347":1,"354":1,"358":1,"361":1,"362":1,"370":1,"381":2,"395":1,"400":1,"414":1,"449":1,"460":1,"477":1,"489":1,"493":1},"1":{"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"139":1,"140":1,"141":2,"142":1,"143":1,"144":1,"145":2,"146":2,"147":2,"148":2,"149":2,"150":2,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"242":1,"362":1,"363":1,"364":1,"365":1,"366":1,"367":1,"368":1,"415":1,"416":1,"490":1,"494":1,"495":1},"2":{"3":2,"10":2,"11":1,"23":2,"41":1,"50":1,"76":2,"93":1,"94":3,"100":2,"110":6,"111":11,"112":13,"113":2,"114":2,"115":4,"116":9,"117":3,"118":1,"119":4,"121":7,"124":1,"126":2,"127":2,"128":5,"130":1,"133":1,"136":3,"137":1,"138":4,"139":9,"140":11,"141":7,"142":8,"143":16,"144":3,"146":1,"148":1,"149":1,"150":3,"151":6,"152":1,"158":1,"159":2,"161":2,"167":1,"181":1,"182":1,"184":6,"188":1,"196":3,"211":1,"212":2,"213":3,"214":4,"215":9,"216":2,"218":3,"219":5,"220":1,"221":5,"222":4,"225":3,"226":4,"227":1,"228":1,"229":4,"230":2,"231":1,"233":4,"234":2,"235":1,"236":12,"237":3,"238":1,"239":7,"244":2,"245":2,"247":1,"248":1,"251":1,"252":1,"255":1,"256":1,"263":3,"265":3,"269":2,"271":1,"272":2,"273":6,"274":2,"275":1,"276":1,"277":7,"278":11,"280":6,"281":6,"283":9,"284":4,"285":5,"286":2,"289":16,"290":4,"294":1,"298":1,"299":1,"300":1,"301":4,"305":2,"306":1,"323":2,"328":1,"329":3,"330":1,"331":1,"332":1,"333":3,"334":1,"338":1,"340":1,"341":1,"342":2,"343":3,"344":1,"347":3,"348":2,"349":6,"350":2,"352":2,"353":2,"354":5,"357":3,"358":1,"359":1,"363":3,"364":3,"365":4,"367":1,"370":1,"371":1,"374":1,"376":1,"378":2,"379":1,"381":1,"383":1,"384":1,"386":1,"388":1,"390":2,"393":1,"395":4,"400":2,"401":1,"404":1,"405":2,"406":1,"407":2,"408":3,"409":7,"410":2,"413":2,"414":6,"415":4,"416":2,"432":1,"435":1,"436":2,"437":1,"438":2,"440":1,"441":2,"443":4,"444":15,"447":1,"448":7,"449":12,"450":1,"451":16,"459":3,"460":22,"461":1,"464":2,"465":1,"467":1,"477":1,"483":1,"485":2,"486":1,"487":2,"489":7,"490":1,"491":2,"492":3,"494":3,"495":4,"496":2,"497":2,"498":2,"515":2,"516":1,"526":1,"527":2,"535":1,"544":1}}],["эстетики",{"2":{"484":1}}],["эскиза",{"2":{"292":1}}],["эван",{"2":{"451":1}}],["эволюция",{"2":{"459":1}}],["эволюции",{"2":{"254":1}}],["эволюцией",{"2":{"251":1}}],["эра",{"2":{"228":1}}],["эмпирическое",{"2":{"312":1}}],["эмиттера",{"2":{"346":1}}],["эмитент",{"2":{"245":1}}],["эмиты",{"2":{"115":1}}],["эмулятор",{"2":{"213":1}}],["эфемерны",{"2":{"179":1,"291":1}}],["эффектам",{"2":{"342":1}}],["эффектом",{"2":{"233":1}}],["эффектов",{"2":{"89":1,"284":1,"302":1}}],["эффективен",{"2":{"163":1,"347":1,"416":1}}],["эффективней",{"2":{"448":1,"451":2,"461":1}}],["эффективна",{"2":{"391":1}}],["эффективная",{"2":{"228":1,"421":1}}],["эффективные",{"2":{"313":1,"344":1}}],["эффективным",{"2":{"303":1}}],["эффективный",{"2":{"184":1,"384":1}}],["эффективны",{"2":{"162":1,"237":1}}],["эффективной",{"2":{"384":1}}],["эффективности",{"2":{"267":1,"382":1,"448":1}}],["эффективное",{"2":{"228":1,"292":1,"354":1,"492":1}}],["эффективного",{"2":{"148":1,"492":1}}],["эффективно",{"2":{"47":1,"128":1,"254":1,"294":1,"452":1,"495":1,"496":1}}],["эффекты",{"2":{"26":1,"160":1,"180":1}}],["элегантен",{"2":{"411":1}}],["элегантно",{"2":{"304":1}}],["электронных",{"2":{"249":1}}],["электронные",{"2":{"228":1}}],["электронная",{"2":{"249":1}}],["электронной",{"2":{"125":1,"178":1,"249":2,"250":1,"251":1}}],["элементе",{"2":{"176":2,"177":1,"218":1,"222":3}}],["элементом",{"2":{"149":1,"183":1,"184":1,"189":1,"195":1,"289":1,"358":1}}],["элементов",{"0":{"272":1,"274":1},"2":{"68":2,"106":1,"128":1,"138":1,"147":2,"148":2,"151":5,"164":1,"165":1,"166":1,"171":2,"173":1,"176":2,"181":1,"182":1,"183":2,"184":2,"191":1,"222":3,"223":1,"228":1,"259":1,"266":1,"271":1,"272":1,"273":1,"280":1,"290":4,"297":1,"302":1,"326":1,"344":1,"391":1,"395":1,"448":4,"450":1,"494":1}}],["элементу",{"2":{"149":1,"184":1,"212":1,"277":1,"283":1}}],["элементарное",{"2":{"460":1}}],["элементарно",{"2":{"440":1}}],["элементах",{"2":{"285":1}}],["элементам",{"2":{"166":1}}],["элементами",{"0":{"164":1},"2":{"68":1,"114":1,"147":1,"150":1,"180":1,"183":1,"220":1,"222":1,"308":1,"340":1,"395":1}}],["элемента",{"2":{"119":2,"142":1,"144":2,"148":2,"176":1,"177":1,"183":2,"184":1,"189":2,"221":1,"222":5,"263":1,"273":3,"274":2,"290":4,"292":1,"297":1,"355":1,"416":2,"451":1,"461":1}}],["элементы",{"0":{"174":1},"1":{"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1},"2":{"29":1,"68":1,"124":1,"138":1,"142":1,"151":1,"162":1,"164":1,"166":1,"167":1,"173":1,"174":2,"183":5,"184":1,"200":1,"222":1,"223":1,"256":1,"259":1,"263":1,"271":1,"273":1,"274":1,"280":1,"283":1,"291":1,"297":1,"350":1,"380":1,"384":1,"396":1,"408":1,"416":2,"433":1,"451":1,"457":1,"461":1}}],["элемент",{"2":{"9":1,"140":3,"146":2,"147":4,"151":1,"174":1,"177":1,"181":4,"183":1,"184":1,"192":1,"220":1,"221":1,"222":7,"235":1,"238":1,"263":2,"274":1,"283":1,"288":1,"332":1,"350":1,"357":1,"358":1,"405":1,"416":1,"484":1}}],["эндрю",{"2":{"302":1}}],["эндпойнтам",{"2":{"107":1}}],["эндпойнтов",{"2":{"107":1}}],["эндпойнты",{"2":{"52":1}}],["эндпойнту",{"2":{"41":1,"107":2}}],["энергосбережения",{"2":{"106":1}}],["экстремального",{"2":{"460":1}}],["экстраполированного",{"2":{"333":1}}],["экспериментов",{"2":{"461":1}}],["экспериментировал",{"2":{"451":1}}],["экспериментируя",{"2":{"359":1}}],["экспериментируем",{"0":{"356":1},"1":{"357":1,"358":1}}],["экспериментального",{"2":{"356":1}}],["экспериментальной",{"2":{"151":1}}],["эксперименты",{"2":{"340":1}}],["экспозиции",{"2":{"256":1}}],["экспортом",{"2":{"349":1}}],["экспортируем",{"2":{"315":1,"391":1}}],["экспортируете",{"2":{"449":1}}],["экспортирует",{"2":{"142":1,"219":1,"284":1,"316":1}}],["экспортирующий",{"2":{"286":1,"314":1}}],["экспортировать",{"2":{"284":1,"357":1}}],["экспорта",{"2":{"219":1}}],["экспорт",{"2":{"143":1,"418":1}}],["эксплуатационным",{"2":{"68":1}}],["эквивалент",{"2":{"212":1,"221":1,"240":1}}],["эквивалентны",{"2":{"411":1}}],["эквивалентный",{"2":{"125":1}}],["эквивалентно",{"2":{"412":1}}],["эквивалентности",{"2":{"337":1}}],["эквивалентное",{"2":{"239":1}}],["эквивалентная",{"2":{"416":1}}],["эквивалентна",{"2":{"146":1}}],["экземпляром",{"2":{"321":1}}],["экземпляров",{"2":{"279":1,"449":1}}],["экземпляре",{"2":{"289":1}}],["экземпляры",{"0":{"157":1},"2":{"151":1,"157":1,"236":1}}],["экземпляр",{"2":{"140":1,"289":1,"311":1,"315":2,"391":1}}],["экземпляру",{"2":{"112":1,"143":1,"184":1,"286":1}}],["экосистемой",{"2":{"496":1}}],["экосистеме",{"2":{"265":1,"444":1,"448":1}}],["экосистему",{"2":{"110":1}}],["экосистемы",{"2":{"76":1,"212":1,"229":1}}],["экономии",{"2":{"218":1}}],["экономичным",{"2":{"107":1}}],["экономит",{"2":{"84":1}}],["экранов",{"2":{"194":2}}],["экран",{"2":{"163":1,"195":1,"196":1,"290":1,"299":1,"461":1,"530":1,"542":1}}],["экранах",{"2":{"507":1}}],["экрана",{"2":{"9":1,"23":1,"102":1,"163":1,"164":1,"165":1,"169":4,"179":1,"186":4,"194":3,"196":1,"214":1,"221":1,"239":1,"348":1,"426":1,"504":1,"506":1,"544":1}}],["экране",{"2":{"3":1,"151":1,"171":1,"263":1,"384":5,"399":1,"400":1}}],["эталонный",{"2":{"382":1}}],["эта",{"0":{"364":1,"369":1},"1":{"370":1,"371":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"381":1},"2":{"113":1,"123":1,"128":1,"139":1,"143":1,"146":1,"149":1,"150":1,"161":1,"166":1,"184":1,"194":1,"202":1,"206":1,"210":1,"212":1,"213":1,"214":2,"215":2,"216":1,"218":1,"228":1,"229":1,"250":1,"258":1,"272":1,"278":1,"281":1,"285":1,"289":1,"290":2,"294":1,"299":1,"300":1,"301":1,"328":1,"329":1,"330":1,"335":1,"338":1,"347":1,"349":1,"363":1,"364":1,"365":1,"373":1,"376":1,"377":1,"380":1,"383":1,"385":1,"391":1,"393":1,"396":1,"406":1,"410":2,"411":1,"430":1,"444":1}}],["этап",{"0":{"272":1},"2":{"272":1}}],["этапов",{"2":{"63":1}}],["этапах",{"2":{"407":1}}],["этапами",{"2":{"271":1}}],["этапам",{"2":{"14":1,"79":1}}],["этапа",{"2":{"11":1,"17":1,"79":1}}],["этапы",{"0":{"79":1},"2":{"10":1,"136":1,"407":1,"425":2}}],["этапе",{"2":{"6":1,"7":1,"11":2,"12":1,"17":1,"22":1,"39":1,"71":1,"181":1,"184":1,"236":1,"249":1,"273":1,"275":1,"285":1,"294":1,"410":1,"452":1}}],["эту",{"2":{"109":1,"125":1,"126":1,"134":1,"143":1,"160":1,"167":1,"181":1,"184":1,"186":1,"192":1,"196":1,"199":1,"215":1,"216":1,"218":1,"221":1,"228":1,"230":1,"245":1,"251":1,"272":1,"274":1,"281":1,"283":2,"284":2,"290":2,"302":2,"325":1,"331":1,"336":1,"343":1,"345":1,"349":1,"384":1,"390":1,"400":1,"401":1,"407":3,"418":2,"428":1,"440":1,"449":1,"450":1,"460":1}}],["этическая",{"2":{"209":1}}],["этичный",{"2":{"197":1}}],["этим",{"2":{"110":1,"132":1,"135":1,"139":1,"142":1,"162":1,"164":1,"173":1,"180":1,"218":1,"219":1,"226":1,"228":1,"231":1,"244":1,"272":1,"274":1,"280":1,"281":1,"289":2,"290":2,"302":1,"332":1,"384":1,"387":1,"399":1,"407":1,"420":1,"495":1}}],["этими",{"2":{"68":1,"162":1,"289":1,"329":1,"414":1,"429":1}}],["этих",{"2":{"68":2,"108":1,"110":1,"113":1,"138":1,"139":4,"149":1,"164":1,"169":1,"171":1,"185":1,"191":1,"197":1,"198":1,"216":1,"219":1,"222":1,"230":1,"236":1,"243":1,"245":3,"251":3,"254":1,"256":2,"264":1,"294":2,"295":1,"297":1,"304":1,"325":1,"326":1,"334":1,"336":1,"355":4,"384":1,"402":1,"405":1,"410":1,"414":1,"416":2,"417":1,"423":1,"425":1,"426":1,"429":1,"450":1,"460":1,"461":2}}],["эти",{"2":{"3":1,"68":1,"117":1,"125":3,"126":2,"132":1,"141":2,"142":1,"143":2,"147":1,"148":1,"157":1,"158":1,"159":1,"162":1,"163":1,"166":1,"167":1,"169":2,"171":2,"174":2,"175":1,"176":1,"179":2,"180":2,"185":1,"186":1,"202":1,"213":1,"216":2,"218":3,"228":1,"231":1,"235":1,"239":2,"242":1,"243":1,"244":1,"245":2,"251":2,"252":1,"256":1,"271":2,"273":2,"275":2,"278":1,"285":1,"325":1,"333":1,"336":1,"338":2,"342":1,"345":1,"349":1,"355":2,"359":1,"360":1,"384":2,"387":1,"389":2,"391":1,"393":1,"394":1,"396":1,"397":1,"402":1,"405":2,"408":1,"410":1,"411":1,"413":1,"417":1,"426":1,"429":1,"430":1,"431":1,"449":2}}],["этой",{"0":{"365":1},"2":{"22":1,"48":1,"106":1,"115":1,"122":2,"124":1,"133":1,"135":1,"136":2,"138":4,"139":1,"143":3,"150":2,"151":1,"152":2,"158":1,"159":1,"160":2,"164":1,"172":1,"175":1,"184":1,"186":1,"196":2,"198":1,"209":2,"210":1,"211":1,"213":4,"214":1,"215":2,"218":2,"224":1,"226":2,"227":1,"228":1,"230":1,"236":1,"239":1,"242":1,"245":1,"251":2,"252":1,"253":1,"254":2,"255":1,"267":2,"268":1,"269":4,"270":2,"273":2,"274":1,"278":1,"280":1,"281":3,"283":3,"284":2,"289":1,"290":3,"292":1,"293":1,"294":1,"297":3,"299":1,"300":1,"305":1,"306":1,"322":1,"324":1,"326":3,"330":3,"331":2,"336":1,"338":1,"340":3,"341":3,"352":1,"355":1,"356":1,"358":1,"359":1,"360":1,"365":3,"367":1,"368":3,"370":1,"371":1,"372":1,"375":1,"378":1,"379":1,"382":4,"384":1,"385":1,"388":1,"398":1,"403":1,"405":4,"406":1,"407":2,"409":1,"410":2,"415":1,"419":1,"420":2,"421":1,"425":1,"426":1,"428":1,"429":1,"431":1,"435":1,"445":1,"448":1,"449":1,"459":1,"492":1}}],["этого",{"2":{"12":1,"27":1,"41":1,"58":1,"61":1,"86":1,"93":1,"112":1,"115":1,"125":3,"131":1,"141":1,"142":3,"143":1,"144":1,"147":1,"169":2,"170":2,"177":2,"178":1,"181":1,"183":3,"186":2,"194":2,"195":2,"196":1,"213":1,"220":1,"221":1,"222":3,"231":1,"233":1,"236":2,"239":1,"243":2,"245":2,"248":2,"249":1,"250":2,"251":1,"256":1,"263":2,"264":1,"266":1,"273":1,"274":1,"275":1,"277":2,"283":3,"284":1,"285":2,"289":1,"290":2,"297":1,"299":2,"301":2,"302":1,"304":1,"313":2,"314":1,"322":1,"325":1,"326":1,"327":1,"328":1,"329":1,"331":2,"332":1,"334":1,"335":1,"342":1,"343":1,"344":2,"348":1,"349":2,"352":1,"354":1,"355":3,"356":1,"384":1,"387":1,"389":2,"393":1,"398":1,"401":1,"402":1,"408":1,"409":1,"410":1,"411":1,"415":1,"416":1,"417":1,"418":1,"420":1,"424":1,"425":1,"426":1,"430":1,"439":1,"443":1,"448":1,"449":1,"451":1,"452":1,"460":2,"461":1}}],["этом",{"2":{"12":1,"39":1,"41":1,"61":1,"68":1,"125":2,"127":1,"128":1,"134":1,"139":2,"140":2,"141":1,"143":2,"149":1,"151":1,"169":1,"170":1,"176":1,"178":1,"180":1,"181":1,"182":1,"183":1,"184":1,"187":1,"208":1,"209":1,"215":1,"218":2,"220":1,"222":1,"236":3,"237":1,"239":1,"243":1,"244":2,"245":1,"248":1,"254":1,"255":1,"258":1,"263":1,"265":1,"273":1,"276":1,"280":1,"285":1,"286":1,"289":1,"300":1,"301":1,"304":1,"319":2,"325":1,"329":1,"330":1,"331":1,"332":1,"333":1,"334":2,"335":1,"337":2,"341":1,"342":1,"343":1,"347":1,"350":1,"351":2,"352":1,"357":1,"358":1,"381":1,"391":1,"397":1,"400":1,"402":1,"407":2,"409":1,"410":1,"413":1,"417":1,"423":1,"425":1,"428":2,"438":1,"439":1,"440":1,"443":1,"449":2,"450":2,"451":3,"460":2,"495":1}}],["этому",{"2":{"2":1,"16":1,"171":1,"195":1,"212":1,"231":1,"233":1,"242":1,"266":1,"271":1,"278":2,"300":1,"301":1,"310":1,"316":1,"350":1,"396":2,"402":1,"411":1,"460":1}}],["этот",{"2":{"9":1,"13":1,"94":1,"100":2,"106":1,"110":1,"114":1,"125":3,"128":2,"135":1,"139":2,"140":3,"141":1,"143":3,"146":1,"164":1,"165":1,"166":1,"167":1,"169":1,"170":1,"171":1,"176":1,"177":2,"178":2,"179":1,"180":1,"181":1,"184":2,"189":2,"190":1,"191":3,"194":3,"195":2,"199":2,"200":2,"201":1,"204":1,"207":1,"213":1,"214":2,"215":4,"219":1,"220":1,"221":1,"222":1,"233":1,"235":1,"236":1,"238":1,"239":3,"242":1,"244":1,"245":4,"249":1,"250":4,"254":1,"258":1,"265":1,"272":2,"273":2,"274":2,"275":1,"277":1,"278":2,"281":1,"283":1,"284":1,"285":1,"289":1,"290":1,"297":2,"298":2,"299":2,"300":2,"301":1,"302":1,"303":2,"304":2,"310":1,"311":1,"312":1,"314":2,"315":3,"316":1,"317":1,"320":1,"321":1,"323":2,"324":1,"325":1,"327":2,"328":1,"329":2,"331":1,"334":3,"337":3,"344":1,"345":1,"347":3,"348":1,"349":4,"351":2,"352":1,"353":2,"355":1,"357":2,"358":2,"386":1,"387":1,"388":3,"389":1,"391":1,"392":2,"393":1,"398":2,"400":2,"407":1,"409":1,"410":1,"415":1,"416":2,"417":1,"418":3,"425":1,"426":1,"430":1,"435":1,"436":1,"444":1,"452":1,"460":2,"516":1}}],["это",{"0":{"218":1,"303":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,"58":2,"67":1,"81":1,"88":1,"93":1,"94":1,"95":1,"96":1,"106":3,"107":3,"108":3,"113":1,"115":2,"116":1,"118":1,"121":2,"122":1,"125":6,"126":2,"127":1,"128":1,"129":1,"132":1,"134":1,"136":2,"138":1,"139":9,"140":4,"141":1,"142":7,"143":16,"147":1,"148":1,"149":1,"150":1,"151":4,"157":2,"160":1,"162":1,"163":1,"164":2,"165":2,"167":3,"172":3,"175":1,"176":1,"180":1,"181":4,"183":3,"184":1,"185":1,"186":1,"187":1,"188":1,"190":1,"191":4,"192":1,"196":1,"198":2,"200":1,"204":1,"208":1,"210":1,"213":4,"214":6,"215":9,"216":5,"218":2,"219":4,"221":2,"222":7,"223":2,"225":2,"228":4,"229":2,"233":5,"236":4,"237":2,"239":3,"240":1,"242":1,"244":2,"245":4,"247":2,"248":1,"249":2,"250":1,"251":3,"252":1,"254":1,"256":4,"257":3,"258":2,"260":1,"261":1,"263":5,"264":2,"265":1,"266":1,"269":1,"272":2,"273":1,"275":1,"276":1,"277":1,"278":2,"279":2,"280":2,"283":2,"284":3,"286":1,"287":1,"288":1,"289":4,"290":7,"291":1,"292":1,"294":4,"295":2,"297":1,"298":2,"299":3,"300":2,"301":2,"302":3,"305":3,"311":1,"314":1,"315":1,"316":1,"318":3,"319":1,"320":3,"321":5,"322":1,"323":4,"325":2,"326":2,"327":1,"328":1,"329":5,"330":6,"331":6,"332":1,"334":2,"335":6,"336":4,"337":7,"338":2,"342":6,"344":2,"345":2,"346":1,"347":5,"348":2,"349":5,"350":3,"351":5,"352":2,"354":3,"355":8,"357":4,"358":2,"363":2,"374":1,"384":15,"385":3,"386":2,"387":1,"388":1,"392":2,"394":3,"395":2,"396":2,"397":1,"398":2,"400":1,"402":5,"403":1,"404":1,"407":4,"408":1,"409":1,"410":2,"411":4,"412":2,"413":2,"416":1,"418":1,"419":1,"420":2,"421":3,"425":4,"426":5,"428":6,"429":6,"430":2,"432":1,"433":1,"436":1,"438":1,"439":1,"440":2,"443":1,"448":1,"449":8,"450":1,"451":10,"452":5,"453":2,"454":1,"455":1,"456":1,"458":1,"459":1,"460":4,"461":4,"495":1,"543":1}}],["ухудшает",{"2":{"459":1}}],["уязвимость",{"2":{"453":1}}],["уязвимости",{"2":{"449":1}}],["ушли",{"2":{"421":1}}],["ушло",{"2":{"171":1}}],["укрепить",{"2":{"544":1}}],["украдут",{"2":{"250":1}}],["укоряет",{"2":{"459":1}}],["укоренилась",{"2":{"228":1}}],["укажет",{"2":{"416":1}}],["укажу",{"2":{"213":1}}],["указателя",{"2":{"169":1}}],["указателями",{"2":{"143":1}}],["указателей",{"2":{"143":1}}],["указать",{"2":{"126":2,"355":1,"411":1,"417":1,"429":1,"451":1}}],["указано",{"2":{"266":1,"283":2}}],["указанные",{"2":{"426":1}}],["указанных",{"2":{"279":1}}],["указанный",{"2":{"247":1,"279":1,"402":1}}],["указанными",{"2":{"242":1,"246":1,"263":1}}],["указанным",{"2":{"217":1}}],["указанную",{"2":{"108":1,"246":1}}],["указаны",{"2":{"214":1}}],["указаниям",{"2":{"289":1}}],["указания",{"2":{"222":1,"413":1,"531":1}}],["указанием",{"2":{"249":1,"407":1,"411":1,"489":1}}],["указание",{"2":{"134":1}}],["указании",{"2":{"127":1}}],["указана",{"2":{"108":1}}],["указывали",{"2":{"196":1}}],["указывают",{"2":{"258":1}}],["указываются",{"2":{"135":1}}],["указывающие",{"2":{"428":1}}],["указывающих",{"2":{"411":1}}],["указывающий",{"2":{"181":1}}],["указывающей",{"2":{"184":1}}],["указывающее",{"2":{"178":1,"222":1}}],["указывающая",{"2":{"125":1,"178":1}}],["указываем",{"2":{"131":1,"132":1,"219":1}}],["указывает",{"2":{"125":1,"127":1,"134":1,"140":1,"143":2,"165":1,"177":1,"181":1,"189":3,"230":1,"233":3,"236":1,"425":1,"426":1}}],["указывать",{"2":{"125":2,"233":1}}],["узлов",{"2":{"251":1}}],["узлами",{"2":{"251":1}}],["узких",{"2":{"194":1}}],["узнаваемость",{"2":{"162":1,"172":1,"544":1}}],["узнает",{"2":{"184":1,"262":1}}],["узнаете",{"2":{"143":1,"364":1,"372":1}}],["узнаем",{"2":{"160":1,"226":1,"254":1,"269":1,"278":1,"316":1,"382":1}}],["узнали",{"2":{"136":1,"165":1,"211":1,"224":1,"292":2,"356":1,"360":1,"431":1}}],["узнать",{"2":{"126":1,"140":1,"231":1,"251":1,"387":2}}],["угрозой",{"2":{"355":1}}],["уголкам",{"2":{"198":1}}],["угодно",{"2":{"125":1}}],["угла",{"2":{"169":1}}],["углов",{"2":{"169":1}}],["углубление",{"2":{"418":1}}],["углубляться",{"2":{"297":1}}],["углубляясь",{"2":{"187":1}}],["углубиться",{"2":{"215":1}}],["углу",{"2":{"163":2,"165":1,"169":2,"195":1,"266":2}}],["унаследован",{"2":{"143":1}}],["универсальный",{"2":{"440":2}}],["уникален",{"2":{"251":1,"449":1}}],["уникальным",{"2":{"351":1,"355":1,"391":1}}],["уникальный",{"2":{"125":1,"148":1,"222":1,"233":1,"236":1,"245":1}}],["уникального",{"2":{"251":1,"391":1,"411":1}}],["уникальному",{"2":{"251":1}}],["уникальная",{"2":{"245":1}}],["унификации",{"2":{"109":1}}],["утвердить",{"2":{"416":1}}],["утверждаем",{"2":{"411":1}}],["утверждает",{"2":{"202":1,"316":1}}],["утверждениях",{"2":{"416":1}}],["утверждения",{"0":{"412":1,"413":1},"2":{"411":3,"412":1}}],["утверждений",{"2":{"411":4,"415":1}}],["утверждение",{"2":{"316":1,"411":1,"412":2,"413":1,"416":2}}],["уточняет",{"2":{"258":1}}],["утечек",{"2":{"301":1}}],["утечку",{"2":{"142":1}}],["утерянных",{"2":{"251":1}}],["утеряны",{"2":{"245":1}}],["утилит",{"0":{"454":1}}],["утилитами",{"2":{"454":1}}],["утилита",{"2":{"266":3}}],["утилитарных",{"2":{"216":1}}],["утилиту",{"2":{"95":1}}],["утилиты",{"2":{"86":1,"392":1,"409":1,"436":2,"449":1,"498":1}}],["уж",{"2":{"140":1,"157":1,"192":1,"289":1,"302":1,"397":1}}],["уже",{"2":{"3":1,"16":1,"27":1,"36":1,"38":1,"39":1,"47":1,"100":1,"107":1,"109":1,"125":1,"134":2,"142":1,"143":2,"157":1,"163":1,"166":1,"181":1,"184":1,"188":1,"196":1,"214":1,"215":1,"216":1,"218":1,"221":1,"222":1,"236":1,"237":1,"242":1,"251":2,"256":1,"257":1,"265":2,"271":1,"274":1,"281":1,"290":2,"321":1,"322":1,"326":1,"331":2,"334":2,"340":2,"348":1,"349":1,"363":1,"382":1,"407":1,"410":1,"418":1,"426":1,"429":1,"435":1,"448":1,"450":1,"451":1,"452":1,"460":1,"461":3,"489":1,"524":1}}],["уважает",{"2":{"410":1}}],["уверенным",{"2":{"460":1}}],["уверенный",{"2":{"409":1}}],["уверенную",{"2":{"171":1}}],["уверены",{"2":{"337":1,"402":1}}],["увеличили",{"2":{"384":1}}],["увеличивая",{"2":{"340":1}}],["увеличивает",{"2":{"278":1,"440":1,"453":1}}],["увеличивается",{"2":{"214":1,"396":1,"440":1}}],["увеличиваем",{"2":{"184":1}}],["увеличивать",{"2":{"184":1}}],["увеличения",{"2":{"138":1}}],["увеличение",{"0":{"257":1},"1":{"258":1,"259":1,"260":1,"261":1,"262":1,"263":1},"2":{"116":1,"228":3}}],["уведомить",{"2":{"181":1,"263":1,"344":1}}],["уведомлять",{"2":{"278":1}}],["уведомляется",{"2":{"325":1}}],["уведомляет",{"2":{"274":1}}],["уведомляющие",{"0":{"178":1}}],["уведомлений",{"0":{"274":1}}],["уведомление",{"2":{"179":3,"263":1}}],["уведомления",{"0":{"179":1},"2":{"179":2,"256":3}}],["уведомлении",{"2":{"178":1}}],["увесистыми",{"2":{"160":1}}],["увидели",{"2":{"403":1,"461":1}}],["увидеть",{"2":{"125":2,"161":1,"180":1,"188":1,"196":1,"213":1,"214":1,"215":1,"222":2,"227":1,"236":1,"255":1,"270":1,"305":1,"330":1,"341":1,"343":1,"349":1,"352":1,"358":1,"360":1,"383":2,"390":1,"392":1,"393":1,"406":1}}],["увидит",{"2":{"384":1}}],["увидите",{"2":{"139":1,"214":3,"239":1,"297":1,"300":1,"340":1,"358":1}}],["увидим",{"2":{"141":1,"143":1,"150":2,"217":1,"222":1,"228":1,"231":1,"233":1,"244":1,"250":1,"264":1,"273":1,"285":1,"298":1,"324":1,"328":1,"347":1,"351":1,"383":1,"395":1,"426":1}}],["упаковывает",{"2":{"402":1}}],["упакованные",{"2":{"326":1}}],["упакованных",{"2":{"248":1}}],["упакован",{"2":{"141":1}}],["упакует",{"2":{"141":1}}],["упала",{"2":{"116":1}}],["упорядоченной",{"2":{"410":1}}],["упорядочиваете",{"2":{"301":1}}],["упоминалось",{"2":{"222":1,"281":1,"348":1}}],["упоминали",{"2":{"134":1,"215":1,"265":1,"331":1,"334":1,"398":1}}],["упомянутую",{"2":{"390":1}}],["упомянуть",{"2":{"171":1,"290":1,"304":1}}],["упомянутый",{"2":{"142":1}}],["упомянутых",{"2":{"120":1,"179":1,"365":1,"430":1}}],["упомянутого",{"2":{"135":1,"320":1}}],["уполномоченной",{"2":{"125":1}}],["упражнение",{"2":{"321":1}}],["упражнением",{"2":{"249":1}}],["упражнения",{"2":{"220":2,"223":1,"237":1,"397":1,"409":1}}],["управлению",{"2":{"139":1,"236":1,"283":1,"303":1,"340":1,"347":1}}],["управления",{"2":{"118":1,"127":1,"128":3,"185":1,"215":1,"221":1,"259":2,"263":1,"278":1,"280":1,"286":1,"290":1,"318":1,"326":1,"341":1,"348":1,"349":1,"350":1,"354":2,"359":1,"364":1,"376":2,"393":1,"427":2,"432":1,"449":3}}],["управлении",{"2":{"110":1,"128":1}}],["управлением",{"2":{"213":1}}],["управление",{"0":{"340":1,"376":1,"421":1,"427":1},"1":{"341":1,"342":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},"2":{"79":1,"110":1,"118":2,"139":1,"143":1,"162":1,"236":1,"254":1,"263":1,"264":1,"273":3,"280":1,"283":1,"285":1,"292":1,"299":1,"316":1,"323":1,"350":2,"360":1,"405":1,"420":1,"429":1}}],["управляло",{"2":{"291":1}}],["управляемое",{"2":{"461":1}}],["управляемым",{"2":{"543":1}}],["управляемые",{"2":{"297":2}}],["управляемый",{"2":{"128":1}}],["управляет",{"2":{"128":1,"215":1,"263":1,"274":1,"284":1,"289":1,"290":1,"299":1,"421":1}}],["управляется",{"2":{"2":1,"125":1,"507":1}}],["управляются",{"2":{"545":1}}],["управляют",{"2":{"125":1,"185":1}}],["управляющему",{"2":{"2":1}}],["управляться",{"2":{"425":1}}],["управлять",{"2":{"2":1,"140":1,"142":1,"170":1,"194":1,"223":1,"229":2,"233":1,"256":1,"339":1,"342":1,"404":1,"431":1,"451":2}}],["упростит",{"2":{"454":1}}],["упростить",{"2":{"125":1,"251":1,"283":1,"312":1,"334":1}}],["упрощения",{"2":{"263":1,"303":1,"305":1,"334":2}}],["упрощение",{"0":{"2":1}}],["упрощенную",{"2":{"461":1}}],["упрощенным",{"2":{"263":1}}],["упрощенный",{"2":{"250":1,"334":1,"337":1,"345":1}}],["упрощенно",{"2":{"451":1}}],["упрощенного",{"2":{"250":1}}],["упрощенное",{"2":{"141":1,"245":1,"334":1}}],["упрощать",{"2":{"334":1}}],["упрощающий",{"2":{"334":1}}],["упрощают",{"2":{"47":1}}],["упрощает",{"2":{"79":1,"109":1,"252":1,"435":1}}],["умирает",{"2":{"449":1}}],["умны",{"2":{"314":1}}],["умные",{"2":{"304":1}}],["умными",{"2":{"251":1}}],["умных",{"2":{"228":1}}],["умён",{"2":{"222":1}}],["ума",{"2":{"220":1}}],["ум",{"2":{"183":1}}],["умолчанию",{"0":{"531":1},"2":{"114":1,"115":3,"116":1,"127":1,"132":1,"135":1,"184":1,"214":1,"236":1,"239":3,"248":1,"259":1,"279":2,"280":1,"283":6,"289":1,"321":1,"354":1,"398":1,"402":1,"426":1,"526":1}}],["умеет",{"2":{"461":1}}],["умеешь",{"2":{"84":2}}],["умел",{"2":{"460":1}}],["умело",{"2":{"138":1}}],["уместен",{"2":{"347":1}}],["уместно",{"2":{"338":1}}],["умеют",{"2":{"334":1}}],["умеющий",{"2":{"50":1}}],["умение",{"2":{"460":1}}],["умении",{"2":{"459":1}}],["умения",{"2":{"294":1}}],["уменьшить",{"2":{"229":1,"233":1}}],["уменьшение",{"2":{"116":1,"121":1}}],["уме",{"2":{"22":1,"125":1,"159":1}}],["уровень",{"2":{"106":2,"135":2,"218":1,"237":1,"250":1,"452":1,"458":1,"485":1}}],["уровни",{"2":{"334":1}}],["уровней",{"2":{"187":1,"191":1}}],["уровне",{"2":{"127":1,"194":1,"256":1,"280":1,"281":1,"286":1,"289":1,"329":1,"386":1,"437":2,"448":1,"450":1,"460":2}}],["уровнем",{"2":{"105":1}}],["уровнях",{"2":{"294":1,"329":1,"388":1}}],["уровнями",{"2":{"237":1,"521":1}}],["уровня",{"0":{"257":1},"1":{"258":1,"259":1,"260":1,"261":1,"262":1,"263":1},"2":{"64":1,"106":1,"111":1,"116":1,"125":3,"137":1,"230":1,"231":1,"252":1,"295":1,"408":1,"409":1,"451":1,"460":1}}],["удивительная",{"2":{"403":1}}],["удивительных",{"2":{"334":1}}],["удивительные",{"2":{"126":1}}],["уделяя",{"2":{"365":1}}],["уделять",{"2":{"267":1}}],["уделите",{"2":{"411":1}}],["уделить",{"2":{"256":1,"275":1}}],["уделили",{"2":{"252":1,"359":2}}],["удерживать",{"2":{"171":1}}],["удержание",{"2":{"163":1}}],["удачные",{"2":{"337":1}}],["удастся",{"2":{"278":1,"428":1}}],["удается",{"2":{"132":1}}],["удалась",{"2":{"247":1}}],["удалить",{"2":{"200":1,"216":1,"218":1,"221":1,"428":1}}],["удалось",{"2":{"181":1,"411":1}}],["удаляет",{"2":{"355":2}}],["удаляем",{"2":{"236":1,"284":1,"391":1}}],["удаляют",{"2":{"147":1,"397":1}}],["удаляя",{"2":{"125":1,"146":1}}],["удалять",{"2":{"116":1,"394":1,"427":1}}],["удалением",{"2":{"171":1,"301":1}}],["удаление",{"2":{"171":1,"242":1,"273":2,"427":1,"448":1}}],["удалении",{"2":{"151":1,"207":1}}],["удаления",{"2":{"106":1,"116":1,"176":1,"223":1,"301":1,"394":2}}],["удаленном",{"2":{"430":1,"435":1}}],["удаленно",{"2":{"429":1}}],["удаленного",{"2":{"134":1,"421":1,"429":1}}],["удаленные",{"2":{"429":1}}],["удаленных",{"2":{"421":1}}],["удаленный",{"2":{"134":1,"135":1,"397":1,"421":1,"428":1,"429":3,"435":4}}],["удаленными",{"0":{"429":1},"2":{"394":1}}],["удаленным",{"2":{"128":1,"302":1,"388":1,"397":1,"429":5}}],["удалена",{"0":{"116":1},"2":{"116":1}}],["удовлетворения",{"2":{"405":1}}],["удовлетворение",{"2":{"163":1}}],["удовлетворить",{"2":{"271":1,"275":1}}],["удовлетворительный",{"2":{"210":1}}],["удовлетворяющее",{"2":{"68":1,"263":1}}],["удостоверяющим",{"2":{"201":1}}],["удостоверяется",{"2":{"106":2}}],["удостовериться",{"2":{"106":1}}],["удобен",{"2":{"109":1,"163":1,"333":1,"337":1,"418":1,"501":1}}],["удобство",{"2":{"168":1,"172":1,"429":1,"484":2}}],["удобством",{"2":{"17":1}}],["удобства",{"2":{"106":1,"125":1,"151":1,"189":1,"210":1,"213":1,"218":1,"222":2,"322":1,"394":1,"410":1,"419":1,"484":1}}],["удобную",{"0":{"445":1},"2":{"183":1,"444":1,"459":1}}],["удобнее",{"2":{"109":1,"264":1}}],["удобней",{"2":{"23":1,"449":1,"459":1}}],["удобная",{"2":{"218":1,"416":1,"436":1}}],["удобна",{"2":{"76":1,"444":1}}],["удобны",{"2":{"290":1,"439":1}}],["удобным",{"2":{"157":1,"318":1}}],["удобные",{"2":{"61":1,"397":1}}],["удобных",{"2":{"50":1,"150":1,"235":1,"239":1,"334":1}}],["удобный",{"2":{"17":1,"22":1,"251":1,"435":1,"444":1,"448":1,"458":1,"460":1}}],["удобное",{"2":{"387":1,"436":1}}],["удобного",{"2":{"243":1}}],["удобной",{"2":{"213":1,"243":1,"377":1}}],["удобно",{"2":{"44":1,"68":1,"81":1,"94":1,"105":2,"114":1,"129":1,"143":1,"148":1,"164":1,"214":1,"320":2,"323":1,"335":1,"397":1,"438":1,"444":1,"449":2,"459":1,"491":1,"495":1}}],["убить",{"2":{"460":1}}],["убирать",{"2":{"301":1}}],["убирается",{"2":{"93":1,"544":1}}],["убираем",{"2":{"87":2}}],["убывающей",{"2":{"418":1}}],["убедимся",{"2":{"384":1}}],["убедились",{"2":{"251":1}}],["убедитесь",{"2":{"216":1,"266":1,"334":1,"426":1}}],["убедиться",{"2":{"159":1,"222":1,"233":1,"248":1,"312":1,"337":1,"395":1,"412":1}}],["убрать",{"2":{"100":1}}],["улицам",{"2":{"460":1}}],["улице",{"2":{"26":1}}],["уложенные",{"2":{"194":1}}],["улучшайте",{"2":{"460":1}}],["улучшая",{"2":{"455":1}}],["улучшать",{"2":{"64":1}}],["улучшена",{"2":{"354":2}}],["улучшению",{"2":{"411":1}}],["улучшение",{"2":{"291":1,"448":1}}],["улучшения",{"2":{"73":1,"139":1,"394":1,"530":1}}],["улучшила",{"2":{"407":1}}],["улучшили",{"2":{"252":1}}],["улучшить",{"2":{"223":1,"224":1,"233":1,"347":1,"403":1,"407":1,"461":1,"543":1}}],["улучшит",{"2":{"147":1}}],["учит",{"2":{"460":2}}],["учителем",{"2":{"460":1}}],["учите",{"2":{"304":2}}],["учиться",{"2":{"452":1}}],["учить",{"2":{"304":1}}],["учитывают",{"2":{"461":1}}],["учитывая",{"2":{"249":2,"257":1,"271":1,"272":1,"275":1,"283":1,"290":1,"351":1}}],["учитывать",{"2":{"163":1,"215":1,"244":1,"256":1,"264":1,"443":1}}],["учреждения",{"2":{"196":1}}],["участию",{"2":{"487":1}}],["участие",{"0":{"487":1}}],["участника",{"2":{"245":2}}],["участниками",{"2":{"245":2}}],["участки",{"2":{"126":1,"222":1,"272":1,"301":1}}],["учатся",{"2":{"165":1}}],["ученика",{"2":{"460":1}}],["учебники",{"2":{"460":1}}],["учебник",{"2":{"460":3}}],["учебного",{"2":{"237":1,"397":1,"409":1}}],["учетной",{"2":{"251":1}}],["учетным",{"2":{"250":1}}],["учетными",{"2":{"245":1}}],["учетные",{"2":{"244":2,"245":1,"251":1}}],["учетных",{"2":{"244":3,"245":1,"249":1}}],["учетом",{"2":{"43":1,"110":1,"212":1,"274":1,"275":1,"408":1}}],["учесть",{"2":{"124":1,"385":1}}],["учтем",{"2":{"40":1}}],["усваивать",{"2":{"304":1}}],["усвоить",{"2":{"172":1}}],["усовершенствовать",{"2":{"291":1}}],["усовершенствование",{"2":{"256":1}}],["усмотрению",{"2":{"215":1,"384":1,"428":1}}],["ускоряет",{"2":{"459":1}}],["ускорение",{"2":{"256":1}}],["ускорению",{"2":{"143":1}}],["ускорить",{"2":{"170":1,"294":1,"452":1,"459":1}}],["усилий",{"2":{"256":1,"261":1,"265":1,"403":1,"407":1}}],["усиливает",{"2":{"162":1}}],["усилия",{"2":{"139":1,"384":1,"397":1,"418":1}}],["услышать",{"2":{"162":1}}],["услуг",{"2":{"201":2,"202":1,"243":1,"452":1}}],["услугу",{"2":{"135":1}}],["услуги",{"2":{"125":1,"203":1,"205":1,"207":2,"209":1,"430":1}}],["услугам",{"2":{"297":1}}],["услуга",{"2":{"124":1,"162":1}}],["усложнению",{"2":{"299":1}}],["усложнение",{"2":{"201":1}}],["усложняться",{"2":{"461":1}}],["усложнять",{"2":{"96":1}}],["условию",{"2":{"410":1,"411":1}}],["условие",{"2":{"337":1}}],["условием",{"2":{"201":1,"210":1,"354":1}}],["условии",{"2":{"244":1,"245":1,"283":1,"315":1,"331":1,"411":1}}],["условий",{"2":{"179":1,"256":2,"290":1,"337":1,"440":1}}],["условиям",{"2":{"305":1}}],["условиями",{"2":{"122":1}}],["условия",{"2":{"162":1,"275":1,"333":1}}],["условиях",{"2":{"139":1,"202":1,"407":1}}],["условные",{"2":{"147":1,"289":1}}],["условна",{"2":{"14":1}}],["устраняет",{"2":{"432":1}}],["устраняя",{"2":{"305":1}}],["устранения",{"2":{"428":1}}],["устранению",{"2":{"407":1}}],["устранить",{"2":{"428":1}}],["устройстве",{"2":{"258":1}}],["устройств",{"2":{"186":1,"254":1,"506":1}}],["устройством",{"2":{"300":1}}],["устройство",{"2":{"163":1,"250":2}}],["устройствами",{"2":{"256":1}}],["устройствам",{"2":{"256":2}}],["устройствах",{"2":{"228":1,"256":3,"259":1,"260":1,"263":1,"384":1}}],["устройства",{"2":{"102":1,"162":1,"250":1,"254":1,"256":2,"460":1}}],["устроена",{"2":{"103":1}}],["устойчивым",{"2":{"223":1}}],["устоявшихся",{"2":{"160":1,"495":1}}],["уступают",{"2":{"174":1}}],["устареть",{"2":{"459":1}}],["устареет",{"2":{"453":1}}],["устаревающих",{"2":{"495":1}}],["устаревает",{"2":{"449":1}}],["устаревший",{"2":{"443":1}}],["устаревшими",{"2":{"228":1}}],["устаревшие",{"2":{"121":1,"444":1}}],["устаревшем",{"2":{"116":1,"256":1}}],["устарели",{"2":{"460":1}}],["устарел",{"2":{"445":1,"448":1,"449":1}}],["устанавливающихся",{"2":{"497":1}}],["устанавливаются",{"2":{"214":1,"264":1,"497":1}}],["устанавливать",{"2":{"267":1,"288":1,"326":1,"431":1,"542":1}}],["устанавливаться",{"2":{"138":1,"228":1,"256":1}}],["устанавливается",{"2":{"443":1,"536":1}}],["устанавливает",{"2":{"194":1,"263":1,"393":1,"501":1}}],["устанавливаемые",{"0":{"256":1}}],["устанавливаем",{"2":{"23":1,"248":2,"264":1,"265":1}}],["установят",{"2":{"423":1}}],["установливаем",{"2":{"236":1}}],["установленную",{"2":{"435":1}}],["установленный",{"2":{"263":1}}],["установленным",{"2":{"213":1}}],["установлены",{"2":{"422":1,"489":1}}],["установлена",{"2":{"397":1,"461":1}}],["установлено",{"2":{"258":1,"262":1,"263":7,"491":1}}],["установлен",{"2":{"184":1,"214":1,"345":1,"424":2,"425":1}}],["установим",{"2":{"409":1,"410":1}}],["установив",{"2":{"213":1,"257":1}}],["установили",{"2":{"215":1,"418":1,"424":1}}],["установил",{"2":{"164":1,"264":1}}],["установит",{"2":{"214":1,"230":1}}],["установите",{"2":{"135":1,"230":1,"263":1,"410":1,"460":1}}],["установить",{"2":{"107":1,"135":3,"213":3,"214":1,"219":1,"230":1,"243":1,"256":2,"263":1,"264":1,"409":1,"413":1,"414":3,"416":1,"418":2,"419":1,"439":1}}],["установкой",{"2":{"136":1,"143":1,"262":1}}],["установке",{"0":{"263":1},"2":{"135":1,"213":1,"214":1,"222":1,"263":6,"264":2,"461":2}}],["установку",{"2":{"124":1,"135":1,"214":1,"215":1,"263":8,"423":1,"425":1}}],["установки",{"2":{"108":1,"114":1,"135":2,"170":1,"214":1,"217":1,"221":1,"230":1,"256":2,"263":10,"265":1,"289":1,"350":1,"357":1,"365":1,"397":1,"401":1,"409":1,"414":1,"416":1,"421":1,"422":4,"423":1,"424":1,"425":1,"435":1,"444":1,"448":1,"524":1}}],["установка",{"0":{"53":1,"212":1,"230":1,"390":1,"410":1,"414":1,"422":1,"423":1,"424":1,"488":1,"489":1,"491":1},"1":{"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"223":1,"224":1,"225":1,"391":1,"392":1,"393":1,"411":1,"415":1,"416":1,"489":1,"490":2,"491":1},"2":{"111":1,"117":1,"131":1,"141":1,"142":1,"143":1,"214":1,"230":1,"256":1,"269":1,"270":1,"287":1,"326":1,"341":1,"405":2,"414":1,"423":1,"489":2}}],["успевает",{"2":{"444":1}}],["успешным",{"2":{"335":1}}],["успешными",{"2":{"256":1}}],["успешный",{"2":{"162":1,"247":1}}],["успешности",{"2":{"436":1}}],["успешностью",{"2":{"22":1}}],["успешном",{"2":{"337":1}}],["успешного",{"2":{"337":1,"413":1}}],["успешной",{"2":{"246":1,"247":1}}],["успешно",{"2":{"217":1,"247":1,"266":1}}],["успехов",{"2":{"368":1}}],["успехом",{"2":{"244":1}}],["успех",{"2":{"68":1,"179":1,"335":1,"405":1}}],["успеха",{"2":{"41":1,"244":1,"249":1,"337":3,"408":1}}],["у",{"0":{"486":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,"58":1,"81":1,"86":1,"88":1,"93":2,"100":1,"106":3,"107":4,"109":1,"114":1,"125":2,"128":1,"135":2,"142":2,"143":1,"157":1,"159":1,"160":1,"162":1,"165":1,"169":1,"171":3,"179":1,"184":1,"197":1,"199":1,"206":1,"214":1,"222":4,"236":1,"237":1,"239":3,"245":2,"249":1,"251":3,"263":1,"264":1,"273":1,"277":1,"278":1,"280":1,"283":1,"285":1,"287":1,"291":1,"298":1,"301":1,"325":1,"333":1,"335":1,"336":1,"337":2,"342":1,"344":2,"347":1,"352":1,"354":1,"355":2,"386":1,"390":1,"391":2,"410":2,"413":1,"414":1,"421":2,"424":2,"425":1,"426":1,"429":1,"435":1,"438":1,"448":1,"449":5,"452":1,"459":1,"460":1,"461":2,"495":1,"516":2,"527":1}}],["флексбокса",{"2":{"456":1}}],["флагманом",{"2":{"451":1}}],["флаг",{"2":{"263":1,"355":2}}],["флажок",{"2":{"175":1,"199":1}}],["флажка",{"2":{"175":1,"199":1,"222":2}}],["форсирует",{"2":{"435":1}}],["форумах",{"2":{"187":1}}],["форм",{"2":{"533":1}}],["формочки",{"2":{"461":1}}],["формой",{"2":{"385":1}}],["формы",{"2":{"170":1,"355":1,"449":1}}],["формируя",{"2":{"141":1}}],["формируется",{"2":{"196":1}}],["формирует",{"2":{"107":1,"214":1,"461":1}}],["формирование",{"2":{"105":1}}],["формуле",{"2":{"245":1}}],["формулы",{"2":{"194":1}}],["формулу",{"2":{"124":1,"139":1,"335":2}}],["формулировки",{"2":{"207":1}}],["формулировок",{"2":{"207":1}}],["формулировать",{"2":{"4":1}}],["формулируется",{"2":{"2":1}}],["форму",{"2":{"106":1,"199":1,"244":1,"249":1,"483":1}}],["форме",{"2":{"76":1,"176":1}}],["формальная",{"2":{"273":1}}],["формальный",{"2":{"143":1}}],["формах",{"2":{"174":1}}],["форма",{"2":{"48":1,"183":1}}],["форматирует",{"2":{"444":1}}],["форматируете",{"2":{"301":1}}],["форматировании",{"2":{"461":1}}],["форматирование",{"2":{"444":1}}],["форматирования",{"2":{"397":1,"492":1}}],["форматированию",{"2":{"174":1}}],["форматов",{"2":{"279":1}}],["форматом",{"2":{"175":1,"418":1}}],["формата",{"2":{"109":1,"461":1}}],["формате",{"2":{"107":1,"143":1,"213":1,"244":1,"273":1,"284":1,"355":1,"402":1,"417":1,"442":2,"461":1}}],["формат",{"2":{"17":1,"143":1,"165":1,"245":1,"337":1,"397":1,"442":1,"489":1}}],["фоне",{"2":{"451":1}}],["фон",{"2":{"442":1}}],["фонт",{"2":{"264":1}}],["фоновые",{"2":{"397":1}}],["фоновыми",{"2":{"384":1}}],["фоновый",{"2":{"264":1}}],["фоновом",{"2":{"181":1}}],["фона",{"2":{"221":1,"260":1,"263":1}}],["фонд",{"2":{"135":1}}],["фондом",{"2":{"135":1}}],["фокус",{"2":{"188":1}}],["фокусироваться",{"2":{"175":1,"188":1}}],["фокусировки",{"2":{"164":1}}],["фокусной",{"2":{"164":1}}],["ферме",{"2":{"128":1}}],["фибоначчи",{"0":{"336":1},"2":{"335":1,"337":1,"409":3,"412":1}}],["фигура",{"2":{"347":1}}],["фигуру",{"2":{"324":1}}],["фигурных",{"2":{"222":1}}],["фигурные",{"2":{"140":1}}],["финальном",{"2":{"452":1}}],["финальную",{"2":{"277":1}}],["финансы",{"2":{"251":1}}],["финляндия",{"2":{"191":1}}],["философию",{"2":{"194":1}}],["фильтрасобытия",{"2":{"273":1}}],["фильтрасостояние",{"2":{"273":1}}],["фильтрации",{"2":{"191":1,"222":1,"273":1,"290":1,"330":1}}],["фильтрация",{"2":{"16":1,"22":1}}],["фильтрами",{"2":{"30":1,"35":1}}],["фильтры",{"2":{"4":1,"33":1}}],["фиксит",{"2":{"452":1}}],["фиксируют",{"2":{"430":1}}],["фиксируются",{"2":{"416":1}}],["фиксируем",{"2":{"222":1}}],["фиксированного",{"2":{"183":1}}],["фиксация",{"2":{"426":1}}],["фиксации",{"2":{"157":1,"425":2,"426":2}}],["фишек",{"2":{"176":1}}],["фитта",{"0":{"169":1}}],["физических",{"2":{"128":1}}],["фидбеки",{"2":{"63":1}}],["фулстек",{"2":{"109":1,"444":1}}],["фулстеков",{"2":{"109":1}}],["футеров",{"2":{"508":1}}],["футером",{"2":{"436":1,"534":1}}],["футер",{"2":{"32":1}}],["функций",{"2":{"139":2,"143":1,"166":1,"175":1,"280":1,"281":1,"284":1,"289":1,"301":2,"305":1,"311":1,"319":1,"323":1,"325":1,"331":1,"332":1,"334":1,"337":1,"339":1,"351":1,"388":1,"409":1,"413":1,"414":1,"416":1,"449":3}}],["функциях",{"2":{"337":1,"342":1,"416":1,"451":1}}],["функциям",{"2":{"283":1,"297":1}}],["функциями",{"2":{"215":1,"281":1,"342":1,"348":1,"449":1}}],["функция",{"2":{"115":1,"135":1,"143":1,"150":1,"164":1,"170":1,"218":1,"222":3,"245":1,"249":1,"273":1,"278":2,"284":4,"289":1,"290":2,"299":1,"301":1,"322":2,"324":1,"330":1,"331":1,"335":3,"336":1,"347":3,"349":3,"351":1,"357":3,"384":1,"388":1,"396":1,"411":4,"412":2,"415":1,"448":1,"449":1,"452":1,"453":1}}],["функцию",{"2":{"113":1,"116":1,"126":1,"140":1,"150":1,"164":1,"184":2,"186":1,"222":1,"236":2,"243":1,"275":1,"278":3,"279":1,"281":2,"284":5,"286":1,"289":1,"290":1,"299":2,"301":3,"315":1,"320":1,"321":2,"324":1,"325":1,"326":3,"327":1,"330":1,"336":3,"337":3,"343":3,"344":2,"349":1,"352":2,"354":1,"357":2,"384":1,"391":1,"392":2,"402":1,"407":1,"411":3,"412":1,"413":1,"415":2,"416":1,"425":1,"441":1,"449":1,"453":1,"500":1}}],["функцией",{"0":{"113":1},"2":{"83":1,"113":1,"143":1,"150":1,"170":1,"183":1,"214":1,"222":1,"279":1,"297":1,"331":1,"336":1,"357":1,"405":1,"411":1,"524":1}}],["функции",{"0":{"156":1,"284":1},"1":{"285":1},"2":{"40":1,"41":1,"81":2,"83":2,"94":2,"95":1,"107":2,"116":1,"131":1,"139":1,"140":1,"143":6,"154":1,"157":1,"162":1,"163":1,"168":1,"169":1,"175":1,"184":1,"216":1,"248":1,"249":2,"263":1,"278":2,"284":4,"285":1,"289":1,"290":1,"297":1,"299":2,"301":2,"306":1,"316":1,"318":1,"320":1,"322":1,"323":1,"326":1,"330":2,"335":5,"336":3,"337":8,"342":1,"349":1,"351":1,"352":3,"357":1,"384":2,"386":1,"388":1,"389":1,"393":1,"394":1,"395":2,"396":1,"408":3,"410":1,"411":6,"412":1,"413":3,"417":1,"436":1,"449":6,"451":1,"492":1,"497":1,"507":1}}],["функционируют",{"2":{"21":1}}],["функционалом",{"2":{"25":1,"388":1,"489":1,"495":1}}],["функциональную",{"2":{"297":1}}],["функциональным",{"2":{"298":1,"331":1}}],["функциональный",{"2":{"219":1}}],["функциональные",{"0":{"78":1},"2":{"243":1,"297":1,"303":1,"496":1}}],["функциональных",{"2":{"3":1,"167":1,"496":1}}],["функциональной",{"2":{"449":1}}],["функциональном",{"2":{"299":1}}],["функциональному",{"2":{"290":1}}],["функциональности",{"2":{"139":3,"157":1,"216":1,"228":1,"269":1,"272":1,"273":1,"275":1,"286":1,"290":1,"298":1,"329":1,"331":3,"431":1,"492":2}}],["функциональностью",{"2":{"143":1,"174":1,"286":1,"299":2,"331":1}}],["функциональность",{"2":{"11":1,"77":1,"139":1,"143":1,"144":1,"221":1,"224":1,"256":1,"265":1,"277":1,"281":1,"292":1,"298":2,"302":1,"325":3,"331":2,"332":1,"344":1,"345":1,"354":1,"394":1,"491":1,"507":1}}],["функционально",{"2":{"22":1}}],["функционал",{"2":{"9":1,"13":1,"26":1,"50":1,"344":1,"452":1,"458":1,"492":1,"496":1,"524":1,"528":1}}],["функционала",{"2":{"9":1,"32":1,"79":1,"96":1,"448":2,"459":1,"491":1,"492":1,"494":1,"496":1,"524":1,"525":1,"533":1}}],["фундаментальное",{"2":{"419":1,"451":1}}],["фундаментальной",{"2":{"139":1}}],["фундаментальный",{"2":{"336":1}}],["фундаментальными",{"2":{"226":1}}],["фундаментальную",{"2":{"294":1}}],["фундаментальная",{"2":{"283":1}}],["фундамента",{"2":{"26":1}}],["фракционирование",{"2":{"252":1}}],["фрагментов",{"2":{"503":1}}],["фрагментом",{"2":{"183":1,"295":1}}],["фрагменты",{"2":{"283":1,"496":1,"503":1}}],["фрагменте",{"2":{"238":1,"305":1}}],["фрагмент",{"2":{"167":1,"179":1,"183":1,"237":1,"284":1,"290":1,"301":1,"392":1}}],["фрагментам",{"2":{"382":1}}],["фрагментах",{"2":{"290":1}}],["фрагмента",{"2":{"140":1,"239":1,"336":1,"411":1}}],["фреймворку",{"2":{"147":1,"256":1}}],["фреймворке",{"2":{"139":1,"448":1,"451":1}}],["фреймворков",{"2":{"138":1,"139":2,"158":1,"212":1,"216":1,"219":1,"355":1,"363":1,"451":1,"492":1,"495":1}}],["фреймворком",{"2":{"115":1,"136":1,"138":1,"142":1,"144":1,"157":1,"159":2,"216":1,"222":1,"448":1,"524":1}}],["фреймворки",{"2":{"138":1,"139":2,"141":1,"151":1,"215":2,"216":2,"225":1,"256":1,"451":2}}],["фреймворк",{"0":{"138":1,"139":1,"217":1,"370":1},"1":{"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":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,"221":1,"222":1,"223":1},"2":{"110":2,"138":1,"139":6,"140":1,"141":1,"150":2,"151":1,"214":1,"215":1,"216":2,"217":1,"229":1,"251":1,"264":1,"276":1,"285":1,"294":1,"300":1,"363":1,"370":1,"376":1,"382":1,"394":1,"401":1,"410":1,"449":1,"495":1}}],["фреймворках",{"0":{"451":1},"2":{"233":1,"350":1,"355":1,"470":1}}],["фреймворками",{"0":{"216":1},"1":{"217":1},"2":{"215":1,"407":1}}],["фреймворка",{"2":{"23":1,"108":1,"110":1,"138":1,"139":3,"140":1,"212":1,"216":1,"222":2,"230":1,"276":1,"292":2,"301":1,"325":1,"340":1,"363":2,"364":1,"370":1,"408":1,"448":2,"495":1}}],["фронте",{"2":{"106":3,"109":2,"450":2,"451":1,"452":2,"460":1}}],["фронтендом",{"2":{"108":1}}],["фронтенды",{"2":{"61":1}}],["фронтенда",{"2":{"10":1,"11":1,"22":1,"41":2,"58":1,"449":3,"460":1,"496":2}}],["фронтенд",{"0":{"451":1},"2":{"4":1,"6":1,"23":1,"41":1,"47":1,"107":1,"250":1,"251":1,"382":1,"439":1,"444":1,"450":1,"451":1,"452":1,"461":1,"465":1,"467":1,"470":2,"495":1}}],["фронтендеру",{"2":{"433":1}}],["фронтендера",{"0":{"107":1}}],["фронтенде",{"2":{"3":1,"6":1,"13":1,"44":1,"93":1,"249":1,"449":2,"450":1,"451":2,"452":1,"460":1}}],["фронту",{"2":{"106":1,"107":1}}],["фронт",{"2":{"106":3,"107":2,"444":1}}],["фронта",{"2":{"106":1,"107":1,"451":1}}],["фронтэнде",{"2":{"451":1}}],["фронтэндер",{"2":{"107":1}}],["фронтэнд",{"0":{"452":1},"1":{"453":1,"454":1,"455":1,"456":1,"457":1,"458":1},"2":{"106":1,"107":1,"109":1,"485":1}}],["фабричной",{"2":{"349":1}}],["фабрики",{"2":{"324":2}}],["фабрика",{"0":{"324":1}}],["фаренгейта",{"2":{"329":1,"330":2}}],["фасадов",{"2":{"334":1}}],["фасадный",{"2":{"334":1}}],["фасада",{"2":{"333":1,"334":1}}],["фасад",{"0":{"334":1},"2":{"294":1,"330":1,"334":1}}],["фантазийный",{"2":{"271":1}}],["фактического",{"2":{"407":1,"435":1,"461":1}}],["фактические",{"2":{"342":1}}],["фактически",{"2":{"281":1,"394":1}}],["факт",{"2":{"177":1,"449":1}}],["факто",{"2":{"109":1,"230":1,"501":1}}],["фактора",{"2":{"252":1}}],["фактор",{"2":{"250":1,"331":1,"451":1}}],["фактором",{"2":{"244":1,"290":1,"329":1,"389":1}}],["факторов",{"2":{"41":1,"335":1,"405":1,"408":2}}],["факторизация",{"2":{"13":1}}],["файлом",{"2":{"130":1,"215":1,"262":1}}],["файловой",{"2":{"256":1}}],["файловый",{"2":{"128":1}}],["файлов",{"0":{"117":1,"134":1,"156":1},"2":{"11":2,"38":1,"76":1,"103":1,"110":1,"123":1,"126":2,"132":1,"136":2,"141":1,"208":1,"214":1,"216":1,"220":1,"239":1,"265":1,"278":2,"290":1,"410":2,"417":1,"425":3,"435":1,"439":1,"441":1,"443":1}}],["файлу",{"2":{"126":1,"219":1,"301":1,"385":1}}],["файле",{"2":{"100":1,"142":1,"217":1,"236":2,"239":1,"258":1,"264":1,"277":2,"290":1,"350":1,"385":1,"391":1,"397":1,"417":1,"418":1,"428":1,"542":1,"545":2}}],["файл",{"0":{"258":1},"1":{"259":1,"260":1,"261":1},"2":{"100":1,"126":1,"127":1,"128":1,"130":1,"131":2,"132":2,"141":3,"142":3,"165":2,"171":1,"208":2,"215":12,"216":2,"217":3,"218":2,"219":5,"221":1,"228":1,"232":1,"233":4,"236":1,"254":1,"256":1,"258":4,"262":3,"264":2,"265":2,"278":2,"289":2,"290":2,"316":1,"318":1,"349":1,"352":1,"353":1,"391":1,"395":1,"396":1,"401":1,"409":1,"410":5,"414":5,"415":1,"417":1,"418":2,"419":1,"425":4,"426":2,"428":6,"432":1,"435":4,"441":1,"444":1,"461":2,"503":1}}],["файлам",{"2":{"126":1,"215":1}}],["файлами",{"2":{"11":1,"38":1,"131":1,"289":1,"425":1}}],["файлах",{"2":{"103":1,"410":2,"411":1,"416":2,"417":3,"444":1}}],["файла",{"2":{"17":1,"108":1,"111":1,"127":1,"129":1,"131":1,"215":1,"217":1,"218":1,"256":1,"258":2,"261":2,"278":1,"289":2,"317":1,"385":1,"386":1,"398":2,"401":1,"411":2,"417":1,"425":1,"435":3,"461":1,"489":2}}],["файлы",{"0":{"38":1,"367":1},"2":{"6":1,"11":1,"17":1,"117":1,"127":2,"128":1,"133":1,"134":2,"135":1,"141":1,"213":1,"214":2,"215":4,"218":2,"228":1,"230":1,"256":1,"264":1,"265":1,"270":1,"289":1,"367":1,"397":1,"410":1,"420":2,"421":1,"425":5,"426":3,"427":1,"428":1,"435":1,"440":1,"443":1,"461":1,"498":1,"526":1}}],["зря",{"2":{"459":1}}],["зрения",{"2":{"11":1,"22":1,"94":1,"114":1,"162":1,"236":1,"335":1,"388":2,"403":1,"449":3,"484":1}}],["зерна",{"2":{"460":1}}],["зеркально",{"2":{"399":2,"400":1}}],["зеркальное",{"2":{"126":1}}],["зеленого",{"2":{"411":1}}],["звездочка",{"2":{"426":1}}],["звеном",{"2":{"398":1}}],["звучало",{"2":{"409":1}}],["звучит",{"2":{"141":1}}],["звуков",{"2":{"162":1}}],["зону",{"2":{"297":1}}],["зона",{"2":{"139":1}}],["злоупотреблять",{"2":{"384":1,"438":1}}],["злоупотребление",{"2":{"180":1}}],["злой",{"2":{"160":1}}],["змеином",{"2":{"154":1}}],["знал",{"2":{"460":1}}],["знатоков",{"2":{"444":1}}],["знать",{"2":{"110":1,"121":1,"126":1,"139":1,"141":1,"143":1,"210":1,"214":1,"226":1,"242":1,"254":1,"263":1,"285":1,"319":1,"329":1,"443":1,"460":2}}],["знающих",{"2":{"460":1}}],["знают",{"2":{"342":1,"459":1}}],["знаю",{"2":{"337":1}}],["знанию",{"2":{"460":1}}],["знаний",{"2":{"359":1,"460":1}}],["знание",{"2":{"294":1,"364":1}}],["знаниями",{"2":{"226":1}}],["знания",{"2":{"138":1,"210":1,"226":1,"253":1,"269":1,"285":1,"293":1,"294":1,"364":1,"382":1,"460":2}}],["знаменитая",{"2":{"167":1}}],["знаем",{"2":{"143":1,"242":1,"285":1,"335":1,"384":1,"416":1,"418":1}}],["знает",{"2":{"141":1,"143":2,"329":1,"397":1}}],["знаете",{"2":{"107":1,"250":1}}],["знаки",{"2":{"426":1}}],["знаку",{"2":{"233":1}}],["знаке",{"2":{"220":1}}],["знаками",{"2":{"251":1}}],["знака",{"2":{"154":1,"333":1}}],["знак",{"2":{"140":1,"233":1,"396":1,"426":1}}],["знакомимся",{"2":{"378":1}}],["знакомиться",{"2":{"409":1}}],["знакомит",{"2":{"373":1,"376":1}}],["знакомясь",{"2":{"226":1}}],["знакома",{"2":{"213":1,"290":1}}],["знакомы",{"2":{"166":1,"300":1,"365":1}}],["знакомым",{"2":{"142":1}}],["знакомой",{"2":{"301":1}}],["знакомо",{"2":{"163":1}}],["знакомого",{"2":{"76":1}}],["знаком",{"2":{"153":1,"242":1,"283":1}}],["знакомстве",{"2":{"338":1}}],["знакомство",{"2":{"122":1}}],["знакомства",{"2":{"122":2,"136":1,"310":1}}],["значимых",{"2":{"218":1}}],["значимое",{"2":{"215":1}}],["значителен",{"2":{"397":1}}],["значительную",{"2":{"139":1,"228":1}}],["значительный",{"2":{"139":1,"393":1,"461":1}}],["значительные",{"2":{"138":1,"331":1,"384":1}}],["значительными",{"2":{"323":1}}],["значительным",{"2":{"116":1}}],["значительных",{"2":{"61":1}}],["значительной",{"2":{"138":1,"163":1,"167":1,"228":1,"335":1,"420":1}}],["значительно",{"2":{"125":1,"139":1,"140":1,"252":1,"256":1,"337":1,"382":1,"403":1,"436":1,"444":1,"459":1,"461":1,"495":1}}],["значительного",{"2":{"116":1,"292":1}}],["значительное",{"2":{"68":1,"407":1,"448":1}}],["значит",{"2":{"12":1,"249":1}}],["значков",{"2":{"196":1,"218":2}}],["значком",{"2":{"176":1,"178":1,"186":1}}],["значке",{"2":{"178":1,"261":1}}],["значками",{"2":{"218":2}}],["значка",{"2":{"178":2,"259":1}}],["значки",{"0":{"178":1},"2":{"167":1,"216":1,"218":5,"248":1,"256":1}}],["значок",{"2":{"163":1,"165":1,"178":1,"186":1,"189":2,"218":2}}],["значению",{"2":{"143":2,"222":1,"279":1,"354":1,"411":2,"416":2}}],["значений",{"2":{"143":1,"279":1,"348":1,"350":1,"354":1,"355":1,"384":1,"395":1,"416":1}}],["значением",{"2":{"145":1,"222":1,"279":1,"280":1,"284":1,"321":1,"330":1,"342":1,"343":1,"411":1,"415":1,"416":1,"451":1}}],["значение",{"2":{"115":1,"125":2,"139":4,"140":1,"143":6,"145":2,"146":2,"148":1,"149":2,"151":1,"184":1,"204":1,"222":2,"236":2,"245":1,"260":1,"279":3,"280":3,"284":1,"285":1,"289":1,"315":1,"330":5,"332":1,"335":1,"336":1,"337":2,"342":1,"347":1,"349":2,"357":2,"358":1,"394":1,"395":1,"400":2,"411":1,"412":1,"415":1,"416":4,"435":1,"517":1,"543":1}}],["значения",{"2":{"114":1,"115":1,"127":1,"128":1,"139":1,"140":1,"143":1,"145":1,"147":1,"149":1,"151":1,"154":1,"184":1,"222":3,"242":1,"244":1,"258":1,"263":1,"278":1,"279":2,"281":1,"335":1,"337":4,"350":1,"354":1,"355":2,"356":1,"358":1,"396":1,"408":1,"413":1,"416":1,"451":1,"489":1,"540":1}}],["значениями",{"2":{"246":1,"279":1,"289":1,"357":1}}],["значениям",{"2":{"114":1}}],["значении",{"2":{"107":1,"223":1}}],["зная",{"2":{"58":1,"220":1,"256":1}}],["здравом",{"2":{"303":1}}],["здравым",{"2":{"16":1}}],["здесь",{"0":{"63":1,"362":1},"2":{"3":1,"5":1,"12":1,"60":1,"63":1,"109":1,"110":2,"116":1,"120":1,"123":1,"125":2,"126":1,"128":2,"130":1,"131":1,"133":1,"135":2,"138":1,"141":1,"142":2,"143":2,"150":1,"151":2,"164":2,"166":1,"169":1,"171":1,"174":1,"192":1,"196":1,"201":1,"212":1,"213":1,"214":3,"215":5,"216":1,"219":1,"230":1,"236":1,"239":1,"242":2,"245":1,"249":1,"250":1,"251":1,"256":2,"262":1,"263":1,"270":1,"283":3,"289":1,"290":1,"299":1,"301":4,"314":1,"321":1,"322":2,"323":1,"326":2,"328":4,"330":3,"331":1,"335":1,"342":1,"344":1,"349":1,"350":1,"354":1,"355":2,"385":2,"390":1,"391":2,"394":1,"408":1,"413":1,"416":1,"417":2,"428":1,"431":1,"449":2}}],["зазываниях",{"2":{"453":1}}],["зажимает",{"2":{"451":1}}],["зафиксирован",{"2":{"428":1}}],["зафиксированное",{"2":{"33":1}}],["заинтересованные",{"2":{"365":1}}],["заимствован",{"2":{"298":1}}],["займет",{"2":{"336":1}}],["застывший",{"2":{"384":1}}],["застыть",{"2":{"384":1}}],["заставки",{"2":{"544":1}}],["заставка",{"2":{"263":1,"530":1,"544":2}}],["заставим",{"2":{"329":1}}],["заставив",{"2":{"207":1}}],["заставить",{"2":{"198":1,"199":1,"204":1,"208":1,"342":1,"356":1}}],["заставили",{"2":{"22":1,"354":1}}],["заставляя",{"2":{"184":1}}],["заставляет",{"2":{"170":1,"384":1}}],["заставлять",{"2":{"106":1}}],["заслуживает",{"2":{"321":1}}],["заумной",{"2":{"304":1}}],["зашифрованных",{"2":{"245":1}}],["зашифрованном",{"2":{"244":1}}],["заодно",{"2":{"224":1}}],["заложим",{"2":{"338":1}}],["заложили",{"2":{"212":1}}],["залог",{"2":{"172":1}}],["залогинился",{"2":{"106":1,"449":1}}],["заняв",{"2":{"215":1}}],["занят",{"2":{"384":1}}],["занятость",{"2":{"181":1}}],["занято",{"2":{"181":1}}],["занять",{"2":{"181":1,"450":1}}],["занята",{"2":{"181":2}}],["заново",{"2":{"165":1}}],["занимающие",{"2":{"448":1,"524":1}}],["занимающиеся",{"2":{"407":1}}],["занимаются",{"2":{"450":1}}],["занимают",{"2":{"116":1,"186":1,"269":1,"443":1}}],["занимать",{"2":{"355":2}}],["заниматься",{"2":{"64":1}}],["занимается",{"2":{"162":1,"218":1}}],["занимает",{"2":{"117":1,"138":1,"329":1,"384":2}}],["заботу",{"2":{"451":1}}],["заботитесь",{"2":{"442":1}}],["заботы",{"2":{"431":1}}],["забот",{"2":{"325":1}}],["заботятся",{"2":{"128":1,"364":1}}],["забыл",{"2":{"456":1}}],["забыть",{"2":{"302":1,"321":1,"448":1}}],["забывает",{"2":{"191":1}}],["забывать",{"2":{"135":1}}],["заблокировать",{"2":{"289":1}}],["забудьте",{"2":{"217":1}}],["забрасывается",{"2":{"209":1}}],["защищенное",{"2":{"256":1}}],["защищенному",{"2":{"249":1,"257":1}}],["защищенную",{"2":{"249":1}}],["защищать",{"2":{"135":1}}],["защитить",{"2":{"379":1}}],["защит",{"2":{"233":1,"244":1}}],["защите",{"2":{"136":1}}],["защита",{"0":{"135":1},"2":{"122":1,"244":1}}],["защиты",{"2":{"108":1,"122":1,"245":1}}],["зачем",{"0":{"420":1},"2":{"116":1,"236":1,"268":1,"329":1,"449":1}}],["зачастую",{"2":{"44":1,"202":1,"209":1,"210":1,"274":1,"408":1,"450":1}}],["замаскированная",{"0":{"208":1}}],["замаскирована",{"2":{"203":1}}],["замаскировать",{"2":{"175":1}}],["заманить",{"2":{"201":1}}],["заморозить",{"2":{"336":1}}],["заморожено",{"2":{"335":1}}],["заморочки",{"2":{"106":1}}],["заморачиваться",{"2":{"107":1}}],["замедление",{"2":{"228":1}}],["заметка",{"2":{"460":1}}],["заметку",{"2":{"395":1}}],["заметки",{"2":{"273":1,"394":1,"395":1,"461":1}}],["заметок",{"2":{"394":1,"395":2}}],["заметите",{"2":{"395":1}}],["заметить",{"2":{"143":1,"230":1,"239":2,"331":1,"337":1,"397":1,"411":1,"425":1}}],["заметили",{"2":{"321":1,"411":1}}],["заметим",{"2":{"258":1}}],["заметьте",{"2":{"207":1,"272":1,"322":1,"336":1,"358":1,"428":1}}],["заметным",{"2":{"182":1}}],["заметное",{"2":{"117":1}}],["замечаем",{"2":{"330":1}}],["замечаниями",{"2":{"283":1}}],["замечание",{"2":{"4":1,"64":1,"87":1,"355":1,"396":1}}],["замечательную",{"2":{"243":1}}],["замечательно",{"0":{"218":1}}],["замечательным",{"2":{"140":1}}],["замену",{"2":{"448":2,"451":1,"454":1}}],["замены",{"2":{"298":1,"448":1}}],["заменяет",{"2":{"241":1}}],["заменяются",{"2":{"153":1}}],["заменяющий",{"2":{"110":1}}],["заменяя",{"2":{"125":1}}],["замена",{"2":{"110":2,"337":1,"448":1}}],["заменив",{"2":{"336":1,"354":1}}],["заменится",{"2":{"151":1}}],["замените",{"2":{"150":1}}],["заменить",{"2":{"105":1,"114":1,"452":1,"459":2,"517":1}}],["заменим",{"2":{"86":2}}],["заменой",{"2":{"86":1}}],["заменено",{"2":{"140":1}}],["заменен",{"2":{"114":2,"283":1}}],["замене",{"2":{"41":1}}],["загуглите",{"2":{"453":1}}],["заглянуть",{"2":{"353":1,"444":1}}],["заглавными",{"2":{"154":1,"157":1}}],["загрязнять",{"2":{"236":1}}],["загромождает",{"2":{"143":1}}],["загрузчик",{"2":{"278":1}}],["загрузился",{"2":{"262":2}}],["загрузит",{"2":{"141":2,"230":1}}],["загрузить",{"2":{"127":1,"134":1,"208":1,"228":1,"278":2,"367":1,"414":1,"418":1}}],["загрузку",{"2":{"215":1,"233":1,"247":1,"266":1,"278":1,"321":1}}],["загрузке",{"2":{"184":1,"195":1,"196":2,"236":1,"323":1,"409":1,"435":1,"444":1,"461":1}}],["загрузка",{"2":{"112":1,"228":1,"229":1,"236":1,"278":2,"422":1,"435":1}}],["загрузки",{"0":{"111":1},"2":{"110":1,"111":1,"183":2,"208":3,"215":1,"216":1,"228":2,"233":1,"265":1,"278":2,"384":2,"409":1,"435":2,"440":1,"448":1,"524":1,"544":1}}],["загружен",{"2":{"183":1,"218":1,"233":1}}],["загружено",{"2":{"123":1}}],["загружают",{"2":{"236":1}}],["загружаются",{"2":{"183":1}}],["загружаясь",{"2":{"440":1}}],["загружая",{"2":{"236":1}}],["загружает",{"2":{"208":1,"214":1,"278":1}}],["загружаем",{"2":{"86":1,"91":1,"97":1,"100":1}}],["загружать",{"2":{"128":1,"141":1,"151":1,"218":1}}],["загружаться",{"2":{"116":1,"215":1,"278":1}}],["заголовки",{"2":{"248":2,"398":1}}],["заголовках",{"2":{"248":1}}],["заголовка",{"2":{"245":1,"260":1,"289":1}}],["заголовком",{"2":{"190":1,"199":1,"263":1,"331":1,"515":1}}],["заголовков",{"2":{"108":1}}],["заголовок",{"2":{"222":3,"239":1,"248":1,"289":1,"290":1,"347":1}}],["загорается",{"2":{"93":1}}],["захваченного",{"2":{"416":1}}],["захват",{"2":{"416":1}}],["захватывая",{"2":{"188":1}}],["захвата",{"2":{"169":1,"222":1}}],["захостите",{"2":{"460":1}}],["захостить",{"2":{"107":1,"439":1}}],["захотеть",{"2":{"139":1}}],["захотим",{"2":{"48":1,"96":1}}],["захардкодим",{"2":{"90":1}}],["заранее",{"2":{"461":1}}],["заработать",{"2":{"61":1,"62":1}}],["зародились",{"2":{"138":1}}],["заряде",{"2":{"106":1}}],["зарегистрируйте",{"2":{"460":1}}],["зарегистрирует",{"2":{"195":1}}],["зарегистрировать",{"2":{"265":1,"289":1,"322":1,"326":1}}],["зарегистрироваться",{"2":{"57":1,"245":1,"460":1}}],["зарегистрировали",{"2":{"246":1,"247":1}}],["зарегистрированное",{"2":{"322":1}}],["зарегистрированной",{"2":{"250":1}}],["зарегистрированным",{"2":{"289":1}}],["зарегистрированных",{"2":{"58":1,"242":1}}],["зарегистрировано",{"2":{"245":1}}],["зарегистрирован",{"2":{"125":1,"249":1,"264":1}}],["зарекомендовавшие",{"2":{"138":1}}],["зарекомендовавшую",{"2":{"39":1}}],["зарезервированный",{"2":{"189":1}}],["зарезервированных",{"2":{"125":1}}],["зарезервированное",{"2":{"125":1,"143":1,"386":1}}],["запятыми",{"2":{"396":1}}],["запятой",{"2":{"125":1}}],["запланированных",{"2":{"391":1}}],["запланированы",{"2":{"327":1}}],["запишем",{"2":{"273":1}}],["записывается",{"2":{"251":1}}],["записываются",{"2":{"155":1}}],["записью",{"2":{"396":1}}],["запись",{"2":{"125":2,"396":1}}],["записать",{"2":{"125":1,"355":1}}],["записанный",{"2":{"106":1}}],["записи",{"0":{"125":1},"1":{"127":1},"2":{"58":1,"106":1,"125":4,"137":1,"143":1,"251":1,"357":1,"391":1}}],["записей",{"2":{"48":1,"125":2,"136":1,"189":1,"410":1}}],["заполнителя",{"2":{"395":1}}],["заполнить",{"2":{"322":1}}],["заполним",{"2":{"222":1}}],["заполнено",{"2":{"449":1}}],["заполнен",{"2":{"239":1}}],["заполнения",{"2":{"170":1,"289":1}}],["заполнял",{"2":{"283":1}}],["заполнять",{"2":{"261":1}}],["заполняется",{"2":{"237":1}}],["заполняющего",{"2":{"199":1}}],["запоминается",{"2":{"545":1}}],["запоминаемость",{"2":{"172":1}}],["запоминанием",{"2":{"245":1}}],["запоминать",{"2":{"212":1}}],["запомнить",{"2":{"177":1,"329":1}}],["запомните",{"2":{"142":1}}],["запущен",{"2":{"384":1,"450":1}}],["запутывающее",{"2":{"449":1}}],["запутывает",{"2":{"170":1}}],["запутанным",{"2":{"416":1}}],["запутать",{"2":{"351":1}}],["запустили",{"2":{"416":1}}],["запустив",{"2":{"239":2}}],["запустим",{"2":{"141":1,"264":1}}],["запустится",{"2":{"419":1}}],["запустит",{"2":{"214":1,"215":1}}],["запустите",{"2":{"135":1,"222":1,"407":1,"422":1}}],["запустить",{"2":{"58":1,"107":2,"134":1,"214":3,"217":1,"263":1,"347":1,"393":1,"402":1,"411":2,"413":1,"419":2,"423":1,"425":1,"429":1,"444":1}}],["запуском",{"2":{"430":1}}],["запуске",{"2":{"230":1,"256":1,"260":1,"277":1,"278":1,"358":1,"414":1,"461":2}}],["запуск",{"0":{"490":1},"2":{"215":1,"263":1,"350":1,"405":1,"407":1,"411":1,"475":1}}],["запуску",{"2":{"135":1}}],["запускалось",{"2":{"461":1}}],["запускают",{"2":{"430":1}}],["запускаются",{"2":{"143":1,"444":1}}],["запускаться",{"2":{"384":1}}],["запускать",{"2":{"184":1,"215":3,"239":2,"251":1,"384":1,"411":1,"414":1,"422":1,"542":1}}],["запускается",{"2":{"250":1,"384":1,"443":1}}],["запускает",{"2":{"141":1,"236":1,"242":1,"263":2,"430":1}}],["запускаем",{"2":{"100":1,"289":1,"343":1,"344":1}}],["запуска",{"0":{"111":1},"2":{"110":1,"111":1,"114":2,"249":2,"263":1,"342":1,"347":1,"365":1,"397":1,"409":1,"410":2,"419":1}}],["запасного",{"2":{"151":1}}],["запрограммировать",{"2":{"430":1}}],["запрограммированной",{"2":{"264":1}}],["запрошенное",{"2":{"330":1}}],["запрошен",{"2":{"108":1}}],["запросом",{"2":{"461":1}}],["запросов",{"2":{"11":1,"40":1,"58":1,"105":1,"108":1,"109":2,"128":1,"129":1,"242":1,"243":1,"402":3,"501":1}}],["запросу",{"2":{"192":1,"243":1,"421":1}}],["запросить",{"2":{"179":1,"251":1}}],["запросами",{"2":{"310":1}}],["запросам",{"2":{"108":1}}],["запроса",{"2":{"105":1,"108":4,"236":2,"238":1,"242":1,"243":1,"245":1,"246":2,"247":2,"250":1,"253":1,"263":1,"388":1,"391":1,"395":1,"398":1,"399":1,"400":2,"402":3,"461":1}}],["запросы",{"2":{"47":1,"50":1,"55":2,"58":2,"109":1,"126":1,"128":1,"129":1,"314":1,"402":2,"444":2,"461":2}}],["запросе",{"2":{"47":1,"106":2,"402":1}}],["запрос",{"2":{"41":1,"58":1,"108":3,"126":1,"128":1,"130":1,"214":1,"244":1,"250":1,"263":3,"264":1,"393":1,"397":2,"398":1,"400":1,"402":1,"418":1}}],["запрашивают",{"2":{"355":1}}],["запрашивающий",{"2":{"106":1,"251":1}}],["запрашиваем",{"2":{"251":1}}],["запрашиваемая",{"2":{"248":1}}],["запрашиваемого",{"2":{"108":1,"357":1}}],["запрашиваемому",{"2":{"106":1}}],["запрашивает",{"2":{"108":1,"209":1}}],["запрашивать",{"2":{"107":1}}],["запрещены",{"2":{"106":1}}],["завернуть",{"2":{"336":1}}],["завершится",{"2":{"428":1}}],["завершиться",{"2":{"407":1}}],["завершить",{"2":{"289":3}}],["завершая",{"2":{"428":1}}],["завершаться",{"2":{"384":1}}],["завершают",{"2":{"355":1}}],["завершает",{"2":{"294":1,"411":1}}],["завершена",{"2":{"384":1}}],["завершение",{"2":{"348":1}}],["завершении",{"2":{"335":1}}],["завершению",{"2":{"289":1}}],["завершения",{"2":{"220":1,"335":1,"384":1,"385":1,"401":1,"414":1,"422":1}}],["завершенного",{"2":{"264":1}}],["завершенные",{"2":{"222":2}}],["завершенных",{"2":{"222":1}}],["зависанию",{"2":{"335":1}}],["зависеть",{"2":{"247":1,"335":1}}],["завис",{"2":{"181":1}}],["зависящих",{"2":{"335":1}}],["зависящие",{"2":{"222":1,"451":1}}],["зависящей",{"2":{"170":1}}],["зависят",{"2":{"163":1,"256":1,"294":1}}],["зависимой",{"2":{"316":1,"323":1}}],["зависимое",{"2":{"139":1}}],["зависимость",{"2":{"265":1,"288":1,"289":2,"318":1,"320":1,"321":3,"322":3,"323":1,"418":1,"419":1,"449":1,"453":1,"459":2,"492":1}}],["зависимостями",{"2":{"215":1,"318":1,"339":1}}],["зависимостей",{"0":{"316":1,"453":1},"1":{"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1},"2":{"139":1,"154":1,"214":1,"215":2,"275":1,"280":1,"281":1,"282":1,"286":1,"292":1,"294":1,"316":1,"317":1,"318":1,"320":2,"321":3,"322":2,"324":1,"330":1,"344":1,"409":1,"410":1,"448":1,"451":2,"492":1,"525":1}}],["зависимости",{"0":{"281":1},"2":{"23":2,"55":1,"106":1,"110":1,"125":1,"134":1,"139":2,"142":1,"143":1,"147":1,"179":1,"194":1,"214":3,"215":1,"216":1,"222":1,"230":1,"244":1,"263":1,"277":1,"278":1,"283":1,"285":1,"296":1,"306":2,"310":1,"316":1,"317":1,"318":1,"320":2,"321":4,"323":2,"326":1,"328":1,"338":1,"355":1,"384":2,"394":2,"397":1,"401":1,"405":1,"410":1,"414":1,"418":2,"423":1,"426":1,"440":1,"460":1,"461":1,"495":1}}],["зависит",{"2":{"102":1,"108":1,"112":1,"139":1,"140":1,"169":1,"244":2,"245":1,"250":1,"294":1,"320":1,"405":1,"420":1,"430":1,"495":1}}],["завязанные",{"2":{"39":1}}],["закэшировать",{"2":{"461":1}}],["закладывающих",{"2":{"254":1}}],["заключаться",{"2":{"356":1}}],["заключает",{"2":{"305":1}}],["заключается",{"2":{"139":4,"143":1,"151":1,"177":1,"178":2,"179":1,"184":1,"191":1,"194":1,"200":1,"201":1,"202":1,"204":1,"218":1,"220":1,"236":2,"249":1,"250":1,"254":1,"272":1,"285":1,"290":1,"301":1,"302":1,"304":1,"318":1,"323":2,"327":1,"331":1,"337":1,"355":2,"402":1,"412":1,"413":1,"415":1,"416":1,"417":1}}],["заключенного",{"2":{"141":1}}],["заключена",{"2":{"34":1}}],["закрываем",{"2":{"291":1}}],["закрывать",{"2":{"289":1}}],["закрытие",{"2":{"289":1}}],["закрытия",{"2":{"163":1,"169":1}}],["закрытый",{"2":{"435":1}}],["закрытых",{"2":{"251":1}}],["закрытым",{"2":{"244":1}}],["закрыть",{"2":{"206":2}}],["закрепления",{"2":{"268":1}}],["закрепить",{"2":{"159":1,"253":1,"338":1}}],["закомитьте",{"2":{"428":1}}],["закоммичен",{"2":{"428":1}}],["закоммитьте",{"2":{"428":1}}],["закоммитили",{"2":{"426":1}}],["закомментируем",{"2":{"100":1}}],["закодированное",{"2":{"392":1}}],["закодированные",{"2":{"245":1,"323":1}}],["законченный",{"2":{"460":1}}],["закончить",{"2":{"400":1}}],["закончите",{"2":{"363":1}}],["закончила",{"2":{"349":1}}],["закончилась",{"2":{"122":1}}],["закончили",{"2":{"267":1,"289":1}}],["законодательством",{"2":{"244":1}}],["закономерности",{"2":{"210":1}}],["законом",{"2":{"171":1}}],["законе",{"2":{"169":1,"170":1}}],["закона",{"2":{"169":2,"170":2}}],["законы",{"0":{"168":1},"2":{"168":1,"171":1}}],["закон",{"0":{"169":1,"170":1},"2":{"139":1,"169":1,"170":1,"418":1}}],["заканчивается",{"2":{"355":1}}],["заканчивая",{"2":{"76":2,"136":1,"142":1,"196":1,"252":1,"272":1,"295":1,"297":1}}],["заказа",{"2":{"200":2}}],["заказами",{"2":{"58":1}}],["заказчик",{"2":{"452":1,"456":1}}],["заказчика",{"2":{"67":1}}],["заказчиком",{"2":{"9":1,"12":1}}],["заказ",{"2":{"12":1}}],["заказов",{"2":{"12":1,"36":1,"79":1}}],["заказываете",{"2":{"26":1}}],["заказы",{"2":{"4":1,"58":1,"96":1}}],["закупаете",{"2":{"26":1}}],["зато",{"2":{"335":1}}],["затушевывает",{"2":{"277":1}}],["затронуты",{"2":{"396":1}}],["затронуть",{"2":{"239":1}}],["затронуло",{"2":{"118":1}}],["затруднена",{"2":{"349":1}}],["затруднение",{"2":{"228":1}}],["затрудняет",{"2":{"191":1,"342":1,"354":1,"355":1}}],["затраченные",{"2":{"397":1}}],["затрагиваемым",{"2":{"485":1}}],["затрагивает",{"2":{"118":1}}],["затрагивая",{"2":{"426":1,"427":1}}],["затрагивают",{"2":{"110":1}}],["затраты",{"2":{"312":1}}],["затратно",{"2":{"41":1}}],["затратами",{"2":{"40":1,"452":1}}],["затрат",{"2":{"12":1,"256":1,"384":1}}],["затем",{"2":{"6":1,"81":1,"106":1,"107":1,"111":1,"113":1,"114":1,"125":1,"134":1,"141":2,"163":1,"194":2,"202":1,"215":1,"222":1,"236":2,"237":1,"243":1,"245":2,"247":1,"248":1,"249":3,"250":1,"251":1,"264":4,"274":1,"284":3,"289":2,"292":1,"297":1,"315":2,"317":1,"323":1,"327":2,"333":1,"337":1,"349":1,"352":1,"355":1,"357":2,"363":1,"382":1,"384":2,"392":2,"395":1,"411":2,"415":1,"416":2,"419":1,"422":1,"428":2,"430":1,"442":1,"461":3}}],["задумываемся",{"2":{"195":1}}],["задуман",{"2":{"219":1}}],["задумал",{"2":{"172":1,"199":1,"206":1}}],["задуматься",{"2":{"114":1}}],["задает",{"2":{"448":1}}],["задаем",{"2":{"182":1,"398":1}}],["задаст",{"2":{"401":1}}],["зададим",{"2":{"236":1}}],["задаются",{"2":{"215":1}}],["заданный",{"2":{"259":1}}],["заданными",{"2":{"239":1}}],["заданное",{"2":{"411":1}}],["заданного",{"2":{"249":1,"335":1}}],["заданном",{"2":{"141":1}}],["заданному",{"2":{"107":1,"289":1}}],["задания",{"2":{"320":1}}],["заданиями",{"2":{"291":1}}],["заданий",{"2":{"222":1}}],["задание",{"2":{"181":2,"330":1}}],["задавать",{"2":{"398":1}}],["задаваемые",{"2":{"190":1,"485":1}}],["задав",{"2":{"127":1}}],["задать",{"2":{"106":1,"451":2}}],["задачу",{"2":{"222":1,"407":1,"496":1}}],["задачей",{"2":{"236":1,"420":1,"451":1}}],["задаче",{"2":{"220":1,"223":1}}],["задач",{"2":{"14":1,"67":1,"69":1,"94":1,"171":2,"178":1,"181":1,"194":1,"215":1,"220":1,"222":6,"242":1,"251":1,"291":1,"297":1,"305":1,"327":1,"328":1,"388":1,"391":1,"495":3}}],["задачи",{"0":{"75":1},"1":{"76":1,"77":1,"78":1,"79":1},"2":{"12":1,"67":1,"79":1,"170":1,"220":2,"222":3,"223":1,"251":1,"299":1,"305":1,"333":1,"384":2,"389":1,"405":1,"407":1,"420":1}}],["задачами",{"2":{"160":1}}],["задача",{"2":{"11":1,"12":1,"163":1,"164":1,"165":1,"188":1,"222":1,"229":1,"250":1,"285":1,"334":1,"408":1,"410":2,"444":1}}],["задержка",{"2":{"393":1}}],["задержкам",{"2":{"278":1}}],["задеплоится",{"2":{"100":1}}],["задействовано",{"2":{"405":1}}],["задействовать",{"0":{"107":1},"2":{"23":1,"461":1}}],["задействуем",{"2":{"17":1}}],["задокументированный",{"2":{"77":1}}],["задокументировать",{"2":{"9":1}}],["за",{"0":{"166":1},"2":{"2":1,"6":1,"41":1,"50":1,"96":1,"100":1,"106":1,"109":1,"114":1,"124":1,"126":1,"138":1,"139":1,"143":1,"147":1,"151":3,"157":1,"162":1,"166":1,"179":1,"183":1,"184":3,"194":3,"200":1,"213":1,"215":1,"216":1,"218":1,"233":1,"236":2,"242":1,"243":1,"244":7,"248":1,"251":2,"254":1,"264":1,"265":1,"269":1,"271":2,"273":1,"283":1,"292":1,"299":1,"300":1,"301":3,"302":1,"303":1,"304":1,"320":1,"321":1,"325":1,"326":1,"330":1,"334":2,"335":1,"340":1,"344":1,"355":2,"368":2,"372":1,"384":4,"388":1,"395":1,"397":1,"408":1,"411":1,"420":1,"426":1,"429":3,"438":2,"444":1,"448":2,"449":4,"451":6,"460":1,"496":1,"524":1,"545":1}}],["тёмной",{"2":{"545":1}}],["тише",{"2":{"444":1}}],["типизировать",{"2":{"438":1}}],["типизированным",{"2":{"299":1}}],["типизируем",{"2":{"23":1}}],["типичными",{"2":{"216":1}}],["типичный",{"2":{"183":1}}],["типичного",{"2":{"183":2}}],["типом",{"2":{"258":1,"279":1}}],["типографика",{"2":{"167":1}}],["типографики",{"2":{"162":1,"164":1,"166":1}}],["типов",{"2":{"114":1,"174":2,"176":1,"283":1,"316":1,"384":1,"407":1,"449":1,"450":1,"543":1}}],["типе",{"2":{"128":1,"254":1}}],["тип",{"2":{"125":1,"128":2,"135":1,"167":1,"236":1,"239":1,"243":1,"245":3,"261":1,"279":1,"385":1,"397":2,"400":1,"402":1,"425":1,"459":1}}],["типу",{"2":{"114":1}}],["типыref",{"2":{"449":1}}],["типы",{"0":{"17":1},"1":{"18":1,"19":1},"2":{"16":1,"26":1,"83":1,"115":1,"125":1,"149":1,"176":1,"189":1,"279":1,"281":1,"342":1,"385":1,"411":1,"449":1,"508":1}}],["типам",{"2":{"162":1}}],["типами",{"2":{"114":1}}],["типах",{"2":{"136":1,"279":1}}],["типа",{"2":{"11":1,"17":2,"50":1,"61":1,"108":1,"135":1,"142":1,"228":1,"251":1,"279":1,"281":1,"306":1,"335":1,"394":1,"397":1,"439":1,"440":1,"443":1,"452":1,"459":3,"460":2,"461":1,"516":1,"543":1}}],["твердые",{"2":{"382":1}}],["творчества",{"2":{"305":1}}],["творческим",{"2":{"275":1}}],["творчески",{"2":{"26":1,"410":1}}],["творческие",{"0":{"26":1}}],["твой",{"2":{"106":1,"107":1,"444":1}}],["твоего",{"2":{"106":1}}],["твоему",{"2":{"106":1,"107":1}}],["твоем",{"2":{"106":1,"444":1}}],["тканей",{"2":{"297":1}}],["тяжеловеса",{"2":{"448":1,"524":1}}],["тяжеловесности",{"2":{"445":1}}],["тяжелые",{"2":{"384":1}}],["тяжелыми",{"2":{"384":1}}],["тяжелым",{"2":{"174":1}}],["тяжесть",{"2":{"134":1}}],["тщательно",{"2":{"172":1,"198":1,"408":1}}],["тщательную",{"2":{"90":1}}],["тысячи",{"2":{"197":1,"334":1}}],["тысяч",{"2":{"125":1,"299":1}}],["ты",{"2":{"81":2,"106":1,"452":1}}],["тупиковой",{"2":{"461":1}}],["ту",{"2":{"222":1,"326":1,"347":1,"410":1}}],["тумблер",{"2":{"175":4}}],["тумблеры",{"0":{"175":1},"2":{"175":1}}],["туда",{"2":{"44":1,"107":1,"142":1,"455":1}}],["туториал",{"2":{"60":1}}],["тут",{"2":{"41":1,"64":1,"96":1,"107":1}}],["тэгов",{"2":{"459":1}}],["тэг",{"2":{"23":1,"86":1,"91":1,"97":1,"497":1}}],["тэги",{"2":{"16":1,"176":1,"530":1,"540":1}}],["тайлвинде",{"2":{"456":1}}],["таймстемпа",{"2":{"435":1}}],["таймер",{"2":{"393":1}}],["таймера",{"2":{"180":1,"249":1}}],["тайм",{"2":{"165":1,"391":1}}],["тарифы",{"2":{"439":1}}],["тарифных",{"2":{"203":1}}],["тараканов",{"0":{"201":1}}],["таблетками",{"2":{"176":1}}],["таблетки",{"0":{"176":1}}],["таблицу",{"2":{"215":1,"218":1}}],["таблицы",{"2":{"48":1,"58":1,"138":1,"215":1,"218":1,"228":1,"273":1,"316":1}}],["таблиц",{"2":{"47":3,"183":1,"216":1,"396":1}}],["таблицам",{"2":{"52":1,"58":1}}],["таблицами",{"2":{"47":1}}],["таблица",{"2":{"17":1,"114":1,"125":1,"128":1,"217":1,"228":1,"261":1}}],["таблицах",{"2":{"17":2,"47":1}}],["таблицей",{"2":{"43":1}}],["таблице",{"2":{"16":1,"48":2,"58":1,"228":1,"261":1}}],["та",{"2":{"165":1,"192":1,"205":1,"248":1}}],["там",{"2":{"29":1,"107":1,"290":1,"344":1,"435":2,"444":1,"449":1,"450":1,"503":1}}],["такая",{"2":{"160":1,"187":1,"202":1,"236":1,"244":1,"245":1,"302":1}}],["таком",{"2":{"278":1}}],["такому",{"2":{"125":1}}],["такого",{"2":{"143":1,"183":1,"198":1,"228":2,"256":1,"297":1,"310":1,"321":1,"355":1,"397":1,"404":1}}],["такова",{"2":{"208":1}}],["таковые",{"2":{"242":1,"289":1}}],["таковыми",{"2":{"459":1}}],["таковым",{"2":{"207":1}}],["таковы",{"2":{"139":1}}],["такового",{"2":{"106":1}}],["такое",{"0":{"228":1,"305":1,"407":1,"420":1},"2":{"106":2,"107":1,"108":1,"109":1,"137":4,"138":1,"139":2,"141":1,"151":1,"159":1,"160":1,"165":1,"195":1,"202":1,"211":2,"228":2,"251":1,"254":1,"256":1,"268":2,"274":2,"293":1,"336":1,"339":1,"360":2,"384":2,"388":1,"389":1,"404":1,"432":2,"433":1,"435":1,"449":1,"450":1,"451":1,"452":1,"459":1,"461":1}}],["такой",{"2":{"17":1,"129":1,"135":1,"143":1,"160":1,"180":1,"187":2,"196":1,"198":1,"200":1,"237":1,"245":1,"256":1,"269":1,"280":1,"284":1,"298":1,"299":1,"320":1,"324":1,"337":1,"347":1,"387":1,"413":1,"416":1,"417":1,"461":1}}],["такую",{"2":{"88":1,"141":1,"243":1,"245":1,"345":1,"420":1}}],["также",{"2":{"62":1,"90":1,"91":1,"96":1,"100":1,"106":3,"107":1,"110":3,"111":1,"118":2,"119":2,"124":1,"125":3,"130":1,"134":1,"135":4,"136":2,"138":2,"139":3,"142":3,"143":1,"144":2,"150":2,"151":2,"157":1,"160":1,"166":2,"167":1,"169":1,"171":1,"172":2,"175":1,"178":1,"190":1,"196":1,"209":1,"210":2,"213":2,"215":5,"217":1,"219":2,"221":1,"222":8,"223":1,"224":3,"226":1,"228":1,"231":3,"233":5,"236":2,"237":2,"239":7,"242":1,"244":1,"245":4,"246":1,"248":1,"249":2,"251":5,"252":3,"254":1,"256":1,"258":1,"261":1,"263":1,"264":2,"265":1,"266":3,"267":1,"269":1,"279":1,"281":2,"283":2,"285":1,"288":1,"289":1,"290":2,"292":1,"295":1,"298":1,"299":2,"301":1,"304":1,"305":1,"310":1,"314":1,"315":1,"320":2,"323":1,"325":2,"327":3,"329":1,"330":2,"331":1,"332":1,"333":2,"334":1,"336":1,"337":2,"342":1,"344":3,"345":1,"347":2,"349":1,"350":2,"352":1,"355":5,"358":2,"359":1,"363":2,"365":1,"375":1,"377":1,"378":2,"382":4,"384":2,"386":1,"388":1,"390":1,"391":2,"392":1,"394":2,"395":1,"396":1,"397":2,"402":3,"403":2,"408":2,"410":1,"411":1,"413":1,"416":2,"417":1,"418":2,"419":1,"420":1,"421":1,"426":3,"428":1,"429":3,"430":1,"431":3,"438":1,"439":1,"443":1,"444":1,"449":2,"450":1,"451":2,"454":1,"459":2,"460":5,"461":1,"483":1,"489":1,"496":1,"536":1}}],["таки",{"2":{"58":1,"460":1,"461":1}}],["такие",{"2":{"43":1,"61":1,"68":1,"119":1,"125":2,"139":1,"149":2,"162":1,"163":1,"180":1,"189":1,"200":2,"216":1,"243":1,"251":2,"252":1,"270":1,"278":2,"279":1,"281":1,"283":2,"295":1,"334":1,"397":1,"411":1,"416":1,"426":1,"429":1,"496":1}}],["такими",{"2":{"162":1,"180":1,"218":1,"228":1,"283":1,"297":1,"301":1,"365":1,"501":1}}],["таким",{"2":{"17":1,"36":1,"106":2,"107":1,"117":1,"140":1,"141":1,"148":1,"162":1,"164":1,"166":1,"189":1,"202":1,"203":1,"217":1,"219":1,"222":1,"229":1,"233":1,"237":1,"242":1,"245":1,"264":1,"277":1,"280":1,"281":1,"284":1,"315":2,"321":1,"329":1,"332":1,"337":1,"342":1,"385":1,"396":1,"398":1,"410":1,"413":1,"414":1,"416":1,"429":1,"459":1}}],["таких",{"2":{"2":1,"4":1,"22":1,"66":1,"134":1,"162":1,"163":1,"168":1,"171":1,"173":1,"174":1,"181":1,"184":2,"196":1,"200":1,"216":2,"228":1,"233":1,"236":1,"243":2,"245":2,"256":1,"263":1,"285":1,"299":1,"337":2,"349":1,"355":1,"405":1,"411":1,"412":1,"420":1,"426":1}}],["так",{"0":{"112":1},"2":{"9":2,"11":1,"14":1,"16":1,"22":1,"26":2,"32":1,"44":1,"61":1,"62":1,"78":1,"86":1,"88":1,"93":1,"94":1,"95":1,"105":1,"106":1,"109":1,"110":1,"117":1,"126":1,"134":1,"138":1,"139":1,"140":2,"143":3,"147":2,"157":1,"160":1,"162":2,"165":1,"169":1,"170":1,"171":1,"176":1,"180":1,"187":1,"192":1,"195":2,"202":1,"207":1,"212":2,"213":2,"214":1,"215":3,"216":1,"217":1,"218":3,"219":2,"221":1,"222":4,"223":1,"225":1,"228":3,"244":2,"245":2,"247":1,"248":1,"249":2,"251":1,"254":1,"256":3,"266":1,"267":1,"278":1,"283":4,"284":1,"289":2,"297":1,"299":1,"302":2,"304":1,"305":1,"323":1,"324":1,"326":1,"331":3,"335":1,"337":1,"338":1,"339":2,"345":1,"348":1,"349":3,"351":1,"354":1,"355":2,"356":1,"358":1,"384":2,"386":1,"388":1,"391":1,"394":1,"397":2,"398":1,"400":1,"402":2,"407":1,"408":1,"410":2,"411":2,"412":1,"413":1,"414":1,"416":2,"418":1,"421":2,"425":1,"426":1,"428":1,"435":3,"443":1,"444":1,"448":1,"449":3,"450":1,"460":4,"461":3,"485":2,"495":1,"497":1,"500":1,"527":2,"533":1}}],["теcты",{"2":{"450":1}}],["теряете",{"2":{"449":1}}],["термины",{"2":{"432":1}}],["терминологией",{"2":{"139":1}}],["терминов",{"2":{"139":1,"245":1}}],["термина",{"2":{"162":1}}],["терминала",{"2":{"213":1,"214":1,"401":1,"425":2}}],["терминал",{"2":{"134":1,"213":1,"422":1}}],["терминалом",{"2":{"128":1}}],["терминале",{"2":{"127":1,"214":3,"222":1,"230":1,"265":1,"345":1,"397":1,"424":2,"428":1}}],["терминами",{"2":{"122":2,"139":1,"210":1}}],["терминах",{"2":{"67":1}}],["термин",{"2":{"87":1,"124":1,"194":1,"254":1,"256":1}}],["теоретическая",{"2":{"390":1}}],["теоретические",{"2":{"212":1,"452":1}}],["теоретически",{"2":{"139":1,"213":1,"355":1,"416":1}}],["теории",{"2":{"335":2}}],["тесно",{"2":{"437":1}}],["тесной",{"2":{"261":1,"438":1}}],["тесную",{"2":{"323":1}}],["тестам",{"2":{"449":1}}],["тестами",{"2":{"418":2}}],["теста",{"2":{"407":1,"410":1,"415":2}}],["тестироваться",{"2":{"414":1}}],["тестировать",{"0":{"408":1},"2":{"407":1,"408":2,"413":1}}],["тестированию",{"2":{"405":1,"413":1}}],["тестировании",{"2":{"228":1,"412":1,"416":1,"417":1}}],["тестированием",{"2":{"136":1,"450":2}}],["тестирование",{"0":{"71":1,"262":1,"266":1,"378":1,"405":1,"407":1,"417":1,"450":1},"1":{"406":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,"419":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},"2":{"66":1,"71":1,"134":1,"213":1,"215":1,"402":1,"405":1,"407":4,"408":1,"416":1,"430":1,"432":1,"450":2}}],["тестирования",{"0":{"401":1},"1":{"402":1},"2":{"50":1,"70":1,"107":1,"251":1,"266":1,"275":1,"363":1,"378":1,"382":2,"399":1,"401":1,"403":1,"405":1,"407":5,"408":4,"409":2,"410":2,"411":1,"412":1,"413":1,"414":3,"415":1,"419":1,"420":1,"432":2,"433":1,"435":1,"450":2,"491":1,"533":1}}],["тестирующее",{"2":{"407":1}}],["тестируемый",{"2":{"410":1}}],["тестируем",{"2":{"401":1}}],["тест",{"2":{"266":1,"399":1,"407":1,"411":3,"413":1,"416":1,"460":1}}],["тестовая",{"2":{"411":1}}],["тестовую",{"2":{"411":1}}],["тестового",{"2":{"405":1,"407":2,"408":1,"411":1,"419":1}}],["тестовой",{"2":{"405":1,"415":2}}],["тестовое",{"2":{"393":1}}],["тестовыми",{"2":{"411":1,"419":1}}],["тестовый",{"2":{"393":1,"399":1,"400":2,"409":2,"410":4,"412":1,"414":1,"417":2,"419":1}}],["тестовые",{"2":{"378":1,"410":1,"417":1}}],["тестовых",{"2":{"135":1,"408":1,"410":1,"411":2}}],["тестов",{"2":{"266":1,"405":2,"407":2,"408":1,"409":1,"410":3,"411":10,"415":1,"416":2,"419":1,"431":1,"450":3}}],["тесты",{"2":{"71":1,"266":1,"407":1,"410":1,"411":3,"413":2,"414":1,"416":1,"417":4,"419":1,"430":1,"450":7,"461":1}}],["телеграм",{"0":{"486":1},"2":{"485":1}}],["теле",{"2":{"402":1}}],["телефоны",{"2":{"256":1}}],["телефонную",{"2":{"250":1}}],["телефона",{"2":{"249":1,"250":1}}],["телефон",{"2":{"249":1}}],["телодвижения",{"2":{"106":1}}],["тело",{"2":{"81":1,"352":1}}],["тень",{"2":{"452":1}}],["тенденции",{"2":{"459":1}}],["тенденцию",{"2":{"299":1,"420":1}}],["тенденция",{"2":{"199":1}}],["теневым",{"2":{"198":1}}],["тегом",{"2":{"236":1,"428":1}}],["тегов",{"2":{"176":1,"283":1,"332":1}}],["теги",{"0":{"176":1},"2":{"283":1}}],["теге",{"2":{"144":1,"216":1}}],["тег",{"2":{"140":1,"142":3,"143":1,"215":1,"216":2,"218":1,"236":1,"277":1,"331":1,"352":1}}],["тегами",{"2":{"283":1}}],["тега",{"2":{"140":2,"215":1,"217":1}}],["те",{"2":{"128":1,"144":1,"218":1,"228":1,"234":1,"241":1,"277":1,"286":1,"288":1,"295":1,"326":1,"331":1,"338":1,"342":1,"418":1,"420":1,"436":2}}],["течение",{"2":{"125":1,"143":1,"249":1,"250":1,"355":2,"384":1}}],["течением",{"2":{"116":1,"284":1}}],["тексте",{"2":{"341":1,"428":1}}],["тексты",{"2":{"249":1}}],["текстом",{"2":{"186":1,"213":1,"218":1}}],["текстов",{"0":{"378":1},"2":{"213":1,"215":2,"269":1,"419":1,"420":1}}],["текстовых",{"2":{"249":1,"255":1}}],["текстовые",{"2":{"228":1,"346":1}}],["текстовым",{"2":{"181":1}}],["текстовый",{"2":{"142":1,"165":1,"179":1,"213":1,"426":1,"461":1}}],["текстового",{"2":{"189":1,"249":1}}],["текстовом",{"2":{"177":1}}],["текстовое",{"2":{"83":1,"461":1}}],["текстовую",{"2":{"174":1}}],["текстовая",{"2":{"125":1}}],["текстами",{"0":{"421":1}}],["текста",{"2":{"164":1,"174":1,"182":1,"219":1,"222":3,"291":1,"337":1,"394":1,"411":1,"524":1}}],["текст",{"2":{"149":1,"174":1,"176":1,"177":1,"192":1,"199":1,"237":1,"245":1,"291":1,"415":1,"437":1,"461":2}}],["текущим",{"2":{"284":1}}],["текущий",{"2":{"214":1,"223":1,"241":1,"290":1}}],["текущей",{"2":{"251":1,"425":1,"427":3,"428":2,"435":1,"448":1,"489":1}}],["текущем",{"2":{"214":1,"239":1,"242":1,"264":1}}],["текущему",{"2":{"143":1,"242":1,"289":1,"421":1}}],["текущего",{"2":{"189":1,"251":1,"288":1,"289":2}}],["текущее",{"2":{"181":1,"187":1,"242":1}}],["текущую",{"2":{"178":1,"214":1}}],["текущая",{"2":{"74":1}}],["тебе",{"2":{"81":1,"452":1}}],["техноологии",{"2":{"448":1}}],["технология",{"2":{"228":1,"256":1,"334":1,"384":1,"403":1,"433":1}}],["технологиями",{"2":{"365":1}}],["технологиям",{"2":{"228":1}}],["технологии",{"2":{"138":1,"228":2,"251":1,"254":1,"256":2,"284":1,"294":1,"364":1,"443":1,"460":2}}],["технологий",{"2":{"138":1,"228":3,"243":1,"251":3,"254":2,"256":4,"267":1,"334":2,"430":1,"495":1}}],["технического",{"2":{"458":1,"460":1}}],["техническим",{"2":{"68":1}}],["технический",{"0":{"23":1}}],["технически",{"2":{"12":1,"36":1}}],["технические",{"0":{"123":1,"161":1,"213":1,"227":1,"255":1,"270":1,"341":1,"383":1,"406":1},"2":{"9":1}}],["техник",{"2":{"496":1}}],["техника",{"2":{"184":2}}],["технику",{"2":{"184":1}}],["техники",{"2":{"161":1,"294":1,"395":1}}],["тех",{"2":{"63":1,"133":1,"139":1,"151":1,"174":1,"188":1,"201":1,"215":1,"228":1,"236":2,"249":1,"251":1,"259":1,"272":1,"275":2,"277":1,"298":1,"304":1,"318":1,"335":1,"337":1,"348":1,"384":1,"414":1,"421":1,"461":1}}],["теперь",{"0":{"113":1},"2":{"41":1,"83":1,"86":1,"93":1,"100":2,"110":1,"111":2,"113":1,"115":1,"116":1,"117":2,"118":1,"119":1,"127":2,"134":2,"139":1,"143":3,"151":1,"184":1,"213":1,"215":2,"216":1,"217":2,"218":1,"221":1,"222":3,"226":1,"228":3,"233":1,"234":1,"236":2,"239":1,"242":1,"248":1,"256":1,"263":2,"272":1,"278":1,"280":2,"283":2,"285":1,"289":1,"290":1,"317":1,"318":1,"329":1,"331":2,"334":3,"336":2,"337":3,"340":1,"343":1,"353":1,"357":1,"358":1,"384":1,"390":2,"391":1,"393":1,"399":1,"402":1,"407":1,"409":1,"414":2,"415":1,"417":1,"426":1,"428":2}}],["темой",{"2":{"263":1,"283":1}}],["темам",{"2":{"485":1}}],["тема",{"2":{"216":1,"262":1,"354":1,"531":1,"545":1}}],["темная",{"2":{"197":1,"201":1,"202":1,"531":1}}],["темный",{"2":{"200":1,"256":1}}],["темные",{"0":{"198":1},"1":{"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"207":1,"208":1,"209":1},"2":{"198":1,"211":1}}],["темными",{"2":{"207":1}}],["темным",{"2":{"172":1}}],["темных",{"2":{"160":1,"197":1,"209":1,"210":1}}],["темном",{"2":{"209":1}}],["темно",{"2":{"164":1}}],["теми",{"2":{"138":1,"162":1,"323":1,"402":1}}],["тему",{"2":{"109":1,"126":1,"134":1,"171":1,"228":1,"283":1,"407":1,"450":1}}],["теме",{"2":{"106":1,"108":1,"134":1,"305":1,"420":1,"429":1,"449":1}}],["темы",{"0":{"545":1},"2":{"78":1,"136":1,"138":1,"251":1,"340":1,"382":2,"437":2,"452":1,"494":1,"496":1,"533":1,"545":2}}],["тем",{"2":{"2":1,"6":1,"39":1,"109":2,"127":1,"128":1,"139":2,"141":1,"142":1,"143":2,"149":1,"169":1,"181":1,"195":1,"214":1,"215":1,"218":1,"221":1,"239":2,"245":1,"251":1,"253":1,"264":1,"303":1,"325":1,"330":1,"334":1,"335":1,"336":1,"337":1,"355":1,"388":1,"395":1,"396":1,"402":1,"407":1,"416":1,"428":2,"449":1,"495":1,"531":1,"545":3}}],["трагедия",{"2":{"459":1}}],["трафика",{"2":{"256":1}}],["традиционным",{"2":{"337":1}}],["традиционными",{"2":{"228":1}}],["традиционно",{"2":{"142":1,"177":1,"244":1,"315":1,"337":1}}],["традиционном",{"2":{"139":1,"256":1}}],["традиции",{"2":{"218":1}}],["тратить",{"2":{"170":1,"304":1}}],["траекторию",{"2":{"121":1}}],["транзакционной",{"2":{"355":1}}],["транзакционность",{"2":{"17":1}}],["транспорт",{"2":{"500":1}}],["транспортного",{"2":{"500":1}}],["транспортные",{"2":{"109":1,"460":1}}],["транспортным",{"2":{"105":1}}],["транспиляции",{"2":{"443":1}}],["трансформация",{"2":{"194":1}}],["трансформацию",{"2":{"138":1}}],["труднее",{"2":{"303":1}}],["трудночитаемый",{"2":{"304":1}}],["трудно",{"2":{"143":1,"163":1,"213":1,"299":1,"418":1}}],["трудности",{"2":{"219":1}}],["трудностями",{"2":{"139":1}}],["трудностей",{"2":{"109":1}}],["трудозатратней",{"2":{"461":1}}],["трудозатратам",{"2":{"461":1}}],["трудов",{"2":{"214":1}}],["трудоемко",{"2":{"12":1}}],["труда",{"2":{"58":1}}],["трем",{"2":{"268":1}}],["тремя",{"2":{"180":1,"337":1,"392":1}}],["трехуровневая",{"2":{"237":1}}],["трехуровневых",{"2":{"6":1}}],["трех",{"2":{"186":1,"191":1,"253":1,"391":2}}],["трехмесячные",{"2":{"160":1}}],["третьего",{"2":{"250":1}}],["третьей",{"2":{"245":1,"273":1}}],["третье",{"2":{"223":1}}],["третьему",{"2":{"96":1}}],["третий",{"2":{"66":1,"278":1}}],["требовать",{"2":{"320":1}}],["требоваться",{"2":{"183":1}}],["требование",{"2":{"257":1}}],["требованием",{"2":{"135":1}}],["требованиях",{"2":{"407":2}}],["требованиями",{"2":{"128":1,"222":1,"403":1,"407":1}}],["требованиям",{"2":{"68":1,"256":1,"266":1,"268":1,"271":1,"275":1,"365":1,"407":1}}],["требования",{"0":{"77":1,"78":1,"123":1,"161":1,"213":1,"227":1,"255":1,"270":1,"341":1,"383":1,"406":1},"2":{"67":1,"128":1,"225":1,"257":1,"270":1,"365":1,"405":1,"408":1,"459":1,"461":1}}],["требований",{"2":{"66":1,"68":1,"106":1,"365":1,"383":1,"394":1,"405":1,"406":1}}],["требуемого",{"2":{"397":1,"492":1}}],["требуемой",{"2":{"216":1,"397":1}}],["требуеться",{"2":{"443":1}}],["требует",{"2":{"109":1,"121":1,"122":2,"129":1,"215":1,"228":1,"233":1,"250":1,"256":1,"258":1,"261":1,"264":1,"294":1,"403":1,"407":1,"425":1,"443":1}}],["требуется",{"2":{"107":1,"111":1,"113":1,"128":1,"170":1,"275":1,"282":1,"397":2,"437":1}}],["требующее",{"2":{"178":1}}],["требующий",{"2":{"93":1,"233":1}}],["требующих",{"2":{"17":1,"179":1,"181":1}}],["требуются",{"2":{"448":1,"524":1}}],["требуют",{"2":{"151":1,"201":1,"384":1,"439":1}}],["триггерного",{"2":{"263":1}}],["триггерную",{"2":{"192":1}}],["тривиален",{"2":{"248":1}}],["тривиальными",{"2":{"249":1}}],["тривиальность",{"2":{"249":1,"411":1}}],["тривиально",{"2":{"236":1}}],["тривиального",{"2":{"143":1,"342":1}}],["тривиальную",{"2":{"180":1}}],["тривиальна",{"2":{"131":1,"176":1,"181":1,"239":1,"250":1,"263":1,"389":1,"400":1}}],["три",{"2":{"7":1,"11":1,"94":2,"142":1,"189":4,"215":1,"216":1,"245":2,"251":1,"299":1,"329":1,"330":1,"333":1,"337":1,"342":1,"357":1,"391":1,"400":1,"409":1,"411":1,"435":2,"543":1}}],["т",{"0":{"274":1},"2":{"4":1,"38":1,"67":2,"103":1,"107":1,"110":1,"111":1,"115":1,"124":1,"139":1,"140":1,"142":1,"143":2,"149":1,"151":1,"162":5,"166":2,"171":2,"175":1,"177":1,"178":1,"179":2,"183":2,"196":1,"213":1,"215":3,"218":1,"228":3,"233":1,"242":1,"243":1,"244":1,"248":1,"249":1,"250":2,"256":3,"258":1,"259":1,"260":1,"283":1,"284":1,"291":2,"297":1,"322":1,"325":1,"329":1,"332":1,"337":1,"342":1,"384":1,"385":1,"397":1,"405":1,"407":3,"408":1,"411":3,"413":1,"414":1,"426":1,"427":1,"430":1,"450":1,"452":1,"457":1,"461":1,"484":1,"494":2,"495":1,"496":4}}],["торопитесь",{"2":{"453":1}}],["тормозит",{"2":{"452":1}}],["тормозящим",{"2":{"384":1}}],["торвальдс",{"2":{"421":1}}],["торвальдсом",{"2":{"421":1}}],["торговые",{"2":{"139":1,"180":1}}],["толку",{"2":{"204":1,"336":1,"410":1}}],["только",{"2":{"4":1,"16":1,"22":1,"23":2,"34":1,"39":1,"41":3,"57":1,"58":1,"70":1,"73":1,"83":1,"86":1,"88":1,"93":1,"94":1,"96":1,"102":1,"106":2,"107":1,"108":2,"110":1,"114":2,"118":1,"125":3,"135":1,"139":1,"140":1,"141":1,"142":1,"143":2,"145":2,"147":1,"152":1,"162":1,"165":1,"166":2,"169":1,"174":1,"175":1,"179":1,"182":1,"188":1,"190":3,"194":2,"208":1,"214":4,"216":1,"218":4,"219":3,"221":2,"222":4,"223":4,"225":1,"228":1,"233":1,"236":4,"238":1,"239":4,"245":3,"249":1,"251":1,"256":1,"263":4,"264":2,"267":1,"273":2,"277":1,"278":1,"279":1,"281":1,"289":1,"290":2,"291":2,"294":1,"299":1,"300":2,"302":2,"304":1,"311":1,"312":1,"328":1,"337":2,"342":2,"349":1,"350":2,"355":5,"357":1,"383":1,"384":1,"388":2,"396":1,"397":1,"398":1,"411":1,"416":1,"418":1,"419":1,"428":1,"433":1,"437":1,"442":1,"444":3,"448":2,"449":4,"451":1,"456":1,"459":2,"460":1,"489":1,"492":2}}],["тостах",{"2":{"179":1}}],["тостер",{"2":{"492":1}}],["тосте",{"2":{"179":1}}],["тостовое",{"2":{"179":2}}],["тостовые",{"0":{"179":1}}],["тонкая",{"2":{"496":1}}],["тонкую",{"2":{"444":1}}],["тонкостей",{"2":{"160":1}}],["тонкий",{"2":{"143":2,"219":1,"265":1}}],["той",{"2":{"125":1,"126":1,"147":1,"166":1,"206":1,"222":1,"229":1,"263":1,"297":1,"303":1,"304":1,"331":1,"355":2,"384":1,"408":1,"420":1,"429":1,"435":1,"449":1,"495":1}}],["тобой",{"2":{"107":1}}],["токены",{"2":{"248":1,"437":1}}],["токенов",{"2":{"245":1,"248":1}}],["токеном",{"2":{"106":1}}],["токенами",{"2":{"245":2}}],["токена",{"2":{"106":2,"245":5}}],["токенах",{"2":{"106":2,"533":1}}],["токену",{"2":{"106":1}}],["токен",{"2":{"106":7,"245":3,"248":1,"484":2}}],["тот",{"2":{"41":1,"114":1,"115":1,"116":1,"139":2,"143":1,"177":1,"204":1,"245":1,"246":1,"251":2,"256":1,"302":1,"314":1,"324":1,"329":3,"330":1,"331":2,"332":1,"333":1,"334":1,"336":1,"337":1,"352":3,"355":1,"357":1,"387":1,"414":1,"451":1,"460":1}}],["тоже",{"2":{"16":1,"43":1,"48":1,"100":1,"186":1,"451":1,"461":1}}],["точек",{"2":{"245":1,"355":1,"401":1}}],["точечной",{"2":{"180":1}}],["точка",{"2":{"194":1,"214":1,"215":1,"258":1,"287":1,"398":1,"402":1,"461":1}}],["точками",{"2":{"125":1,"194":1,"397":1}}],["точке",{"2":{"128":1,"303":1,"397":1}}],["точкой",{"2":{"125":2,"178":1,"215":1,"245":2,"254":1,"272":1,"390":2}}],["точку",{"2":{"110":1,"140":1,"164":2,"214":2,"244":1,"246":1,"247":1,"250":2,"271":1,"315":1,"327":1,"388":1}}],["точки",{"0":{"178":1},"2":{"11":1,"22":1,"94":1,"114":1,"142":1,"162":1,"164":1,"189":2,"215":1,"335":1,"354":1,"388":3,"402":1,"403":1,"429":1,"449":3,"484":1}}],["точное",{"2":{"183":1}}],["точностью",{"2":{"163":1}}],["точно",{"2":{"81":1,"96":1,"108":1,"157":1,"331":1,"349":1,"405":1,"411":1}}],["точней",{"2":{"4":1,"461":1}}],["томасу",{"2":{"302":1}}],["тому",{"2":{"194":1,"199":1,"228":1,"251":1,"252":1,"301":1,"304":1,"386":1,"429":1}}],["том",{"2":{"7":1,"13":1,"22":1,"25":2,"67":2,"93":1,"116":1,"127":1,"135":1,"136":1,"138":1,"139":4,"140":1,"141":1,"143":1,"147":1,"160":1,"162":1,"169":2,"177":1,"178":1,"181":1,"190":1,"191":1,"194":1,"200":1,"201":1,"202":1,"210":1,"215":2,"218":1,"222":1,"223":1,"236":1,"249":1,"250":1,"251":1,"254":1,"256":1,"263":2,"272":1,"275":1,"280":1,"285":1,"290":1,"300":1,"302":1,"304":2,"305":1,"318":1,"323":1,"328":1,"330":2,"334":1,"337":1,"340":1,"355":3,"382":1,"384":1,"388":1,"390":1,"395":2,"398":1,"402":1,"408":1,"410":1,"412":1,"413":1,"416":1,"417":1,"418":2,"428":1,"449":1,"461":1,"496":1}}],["тогдашний",{"2":{"117":1}}],["тогда",{"2":{"3":1,"44":1,"95":1,"105":1,"130":1,"150":1,"245":1,"324":1,"331":1,"337":1,"345":1,"384":1}}],["того",{"2":{"2":1,"7":1,"22":1,"43":1,"68":1,"93":1,"100":1,"106":1,"109":1,"114":1,"121":1,"125":1,"126":1,"127":1,"139":2,"140":1,"143":7,"150":1,"159":1,"162":1,"163":1,"170":1,"173":1,"177":1,"182":1,"183":1,"189":1,"207":1,"214":2,"216":1,"218":1,"219":1,"222":2,"229":1,"230":1,"233":1,"236":2,"242":1,"250":1,"251":1,"256":5,"261":1,"262":1,"263":5,"264":1,"272":1,"275":2,"281":1,"283":2,"289":1,"290":1,"292":2,"294":2,"297":1,"298":1,"300":1,"303":1,"315":1,"319":1,"320":1,"322":1,"326":3,"327":1,"328":1,"330":1,"331":1,"336":1,"337":1,"342":1,"344":1,"349":1,"352":1,"357":1,"358":1,"360":1,"363":1,"379":1,"382":1,"384":3,"387":1,"388":1,"391":1,"396":1,"402":1,"405":1,"407":1,"408":1,"409":1,"414":1,"417":1,"421":1,"422":1,"425":2,"426":1,"431":1,"435":3,"436":1,"443":2,"449":1,"451":1,"453":1,"461":3,"515":1,"522":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,"58":3,"60":1,"61":1,"76":1,"84":1,"86":1,"88":2,"93":1,"103":1,"106":4,"107":3,"113":2,"114":1,"116":1,"118":1,"125":2,"126":3,"127":2,"128":1,"132":1,"135":2,"139":7,"141":1,"142":2,"143":3,"145":2,"146":1,"151":1,"159":2,"160":2,"163":2,"165":3,"166":1,"167":1,"169":2,"171":1,"172":4,"178":1,"180":2,"181":1,"183":1,"186":1,"189":1,"196":2,"199":1,"201":1,"202":1,"207":1,"209":1,"211":1,"213":1,"214":5,"215":1,"216":1,"217":1,"218":3,"219":1,"221":1,"222":2,"223":1,"226":1,"228":2,"230":1,"233":2,"236":2,"239":1,"242":2,"244":1,"245":5,"250":1,"251":1,"256":3,"264":3,"265":1,"266":1,"271":1,"272":1,"273":2,"277":1,"280":1,"281":1,"283":2,"289":1,"290":1,"297":1,"299":1,"301":4,"302":3,"304":4,"305":1,"314":1,"315":1,"316":1,"318":3,"320":1,"321":2,"328":1,"329":5,"330":3,"331":3,"335":1,"337":1,"342":4,"345":1,"346":1,"347":6,"349":3,"350":1,"351":1,"353":1,"354":1,"356":1,"357":2,"358":1,"365":1,"384":10,"385":3,"389":2,"392":1,"393":2,"397":2,"407":1,"408":1,"410":4,"411":1,"412":1,"414":2,"417":2,"420":1,"425":2,"435":1,"436":1,"438":1,"439":1,"443":1,"444":1,"448":2,"449":5,"450":4,"451":1,"452":2,"454":2,"460":4,"461":6,"495":1,"516":2,"524":1}}],["товару",{"2":{"196":1}}],["товаров",{"0":{"38":1,"101":1},"1":{"102":1,"103":1},"2":{"4":1,"22":1,"30":1,"31":1,"41":1,"47":1,"79":2,"86":1,"93":1,"102":2,"180":1,"436":1}}],["товаре",{"2":{"4":1,"31":1}}],["товары",{"2":{"4":1,"7":1,"16":1,"93":1,"200":2}}],["товар",{"0":{"16":1},"2":{"3":2,"16":2,"93":1,"196":1,"200":2}}],["товарам",{"2":{"47":1,"79":1,"86":1}}],["товарами",{"2":{"3":1,"43":1}}],["товара",{"0":{"93":1},"2":{"3":3,"4":2,"7":1,"16":2,"17":1,"22":1,"30":1,"47":2,"48":1,"93":1,"102":1,"103":1,"106":1,"205":1,"436":1,"461":1}}],["мгновенную",{"2":{"426":1}}],["мгновений",{"2":{"397":1}}],["мб",{"2":{"355":2}}],["мучается",{"2":{"456":1}}],["мутировать",{"2":{"299":1}}],["мутный",{"2":{"10":1}}],["мусора",{"2":{"301":1}}],["мусор",{"2":{"151":1}}],["множественного",{"2":{"448":1}}],["множественность",{"2":{"348":1}}],["множественном",{"2":{"239":1}}],["множестве",{"2":{"233":1}}],["множеством",{"2":{"128":1,"214":1,"218":1,"244":1,"267":1,"421":1}}],["множество",{"2":{"125":1,"133":1,"134":1,"174":1,"180":1,"187":1,"217":1,"237":1,"245":2,"251":2,"253":1,"271":1,"272":1,"273":1,"286":1,"290":1,"298":1,"306":1,"313":1,"318":1,"388":1,"394":1,"397":1,"407":1,"408":1,"411":1,"420":1,"444":2,"451":1,"461":1}}],["множества",{"2":{"16":1,"194":1,"297":1}}],["многим",{"2":{"304":1}}],["многих",{"2":{"157":1,"160":1,"170":1,"179":1,"192":1,"200":1,"217":1,"219":1,"242":1,"299":1,"384":1,"405":1,"495":1}}],["многие",{"2":{"116":1,"198":1,"230":1,"301":1,"439":1,"444":1,"452":1,"460":1}}],["многолетним",{"2":{"461":1}}],["многолетние",{"2":{"160":1}}],["многочисленные",{"2":{"312":1}}],["многочисленных",{"2":{"220":1}}],["многого",{"2":{"302":1}}],["многоцелевые",{"2":{"299":1}}],["многопоточной",{"2":{"451":1}}],["многопоточности",{"2":{"377":1}}],["многопоточность",{"0":{"377":1,"382":1},"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,"398":1,"399":1,"400":1,"401":1,"402":1,"403":1,"404":1},"2":{"243":1,"254":1,"302":1,"305":1,"328":1,"334":1,"355":2,"382":1,"383":1,"403":1}}],["многопоточным",{"2":{"363":1}}],["многоплатформенностью",{"2":{"256":1}}],["многостраничное",{"2":{"256":1}}],["многостраничные",{"2":{"228":1}}],["многословны",{"2":{"354":1}}],["многословным",{"2":{"264":1,"337":1,"425":1}}],["многословно",{"2":{"329":1,"337":1,"344":1}}],["многословность",{"2":{"143":1}}],["многословной",{"2":{"143":1}}],["многословен",{"2":{"143":1,"337":1}}],["многом",{"2":{"140":1,"294":1}}],["многократно",{"2":{"139":1,"141":1,"269":1,"275":1,"390":1}}],["много",{"2":{"62":1,"66":1,"84":1,"106":1,"107":1,"108":1,"116":1,"125":1,"218":1,"219":1,"289":1,"297":1,"299":1,"329":1,"349":1,"352":1,"384":3,"387":1,"397":1,"440":1,"444":1,"445":1,"448":1,"451":1,"495":1,"524":1}}],["многое",{"2":{"26":1,"131":1,"139":1,"251":1,"273":1,"276":1,"291":1,"429":1}}],["мнению",{"2":{"404":1}}],["мнение",{"2":{"214":1,"485":1}}],["мнения",{"2":{"180":1}}],["мне",{"2":{"22":1,"102":1}}],["мягкое",{"2":{"355":1}}],["мягкие",{"2":{"19":1}}],["мягкая",{"2":{"18":1}}],["м",{"2":{"16":1}}],["мидл",{"2":{"452":1}}],["микрософт",{"2":{"461":1}}],["микросервисов",{"2":{"452":1}}],["микросервиса",{"2":{"451":1}}],["микро",{"2":{"444":1}}],["миксинов",{"2":{"143":1,"284":1}}],["миксины",{"0":{"284":1},"1":{"285":1},"2":{"143":2,"284":1,"448":4}}],["миллисекундах",{"2":{"278":1}}],["миллисекунд",{"2":{"278":1}}],["миллисекунды",{"2":{"214":1,"384":1}}],["миллионами",{"2":{"125":1}}],["миллионов",{"2":{"48":1,"62":1}}],["мир",{"2":{"459":1}}],["мира",{"2":{"429":1}}],["миру",{"2":{"420":1,"461":1}}],["миров",{"2":{"256":1}}],["миром",{"2":{"3":1,"34":1}}],["мире",{"2":{"116":1,"141":1,"331":1,"365":1,"421":1}}],["миграции",{"2":{"110":2,"116":1,"143":1,"354":1,"381":1}}],["миграция",{"0":{"110":1,"381":1},"1":{"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1},"2":{"143":1}}],["минут",{"2":{"460":1,"496":1}}],["минуточку",{"2":{"384":1}}],["минуты",{"2":{"278":1}}],["минуя",{"2":{"139":1}}],["минусы",{"2":{"459":2}}],["минусов",{"2":{"449":1}}],["минус",{"2":{"96":1,"449":1}}],["минисервере",{"2":{"444":1}}],["мини",{"2":{"394":1,"444":2}}],["миниатюр",{"2":{"180":1}}],["миниатюре",{"2":{"107":1}}],["минималистичным",{"2":{"495":1}}],["минимален",{"2":{"184":1}}],["минимальную",{"2":{"222":1,"492":1}}],["минимальным",{"2":{"347":1}}],["минимальны",{"2":{"215":1}}],["минимальный",{"2":{"183":1,"258":1}}],["минимальной",{"2":{"47":1,"322":1}}],["минимальна",{"2":{"22":1}}],["минимуму",{"2":{"170":1}}],["минимум",{"2":{"12":1,"233":1,"249":1,"256":1,"259":1,"261":1,"299":1,"329":1,"365":2,"388":1,"397":1,"444":1,"449":1,"458":1,"460":2}}],["мае",{"2":{"460":1}}],["маяк",{"2":{"266":1}}],["манифест",{"2":{"268":1,"461":3}}],["манифестом",{"2":{"265":1}}],["манифесте",{"2":{"263":1}}],["манифеста",{"0":{"258":1,"262":1},"1":{"259":1,"260":1,"261":1},"2":{"254":1,"256":2,"258":2,"261":2,"262":2,"264":1,"265":2,"530":1,"542":1}}],["манипулирование",{"2":{"210":1}}],["манипулирования",{"2":{"138":1,"147":1,"204":1}}],["манипулироваться",{"2":{"342":1}}],["манипулировать",{"2":{"198":1,"342":2,"416":1}}],["манипулятивный",{"2":{"207":1}}],["манипулятивных",{"2":{"197":1}}],["манипулятивная",{"2":{"207":1}}],["манипуляций",{"2":{"184":1}}],["манипуляции",{"2":{"106":1,"342":1}}],["манере",{"2":{"157":1}}],["магические",{"2":{"448":1}}],["магия",{"2":{"149":1}}],["магию",{"2":{"142":1,"218":1,"411":1}}],["магазине",{"2":{"461":1}}],["магазины",{"2":{"22":1,"27":1,"79":1,"103":1,"256":2}}],["магазином",{"2":{"22":1}}],["магазинов",{"2":{"21":1,"28":1,"79":1,"103":1,"256":1}}],["магазинах",{"2":{"88":1,"258":1}}],["магазинами",{"2":{"96":1}}],["магазинам",{"2":{"22":1}}],["магазина",{"2":{"14":1,"22":1,"39":2,"78":1,"180":1,"196":1,"256":1,"436":1}}],["магазин",{"0":{"12":1},"2":{"9":1,"12":1,"22":2,"43":1,"60":1,"62":1,"106":1,"494":1,"495":1,"496":1}}],["машине",{"2":{"214":1,"328":1,"460":1}}],["машин",{"2":{"138":1}}],["машиной",{"2":{"128":1}}],["машина",{"2":{"128":1,"171":1}}],["машины",{"2":{"128":1,"290":1,"444":1}}],["максимальная",{"2":{"536":1}}],["максимальную",{"0":{"365":1},"2":{"222":1,"365":1}}],["максимального",{"2":{"405":1}}],["максимально",{"2":{"210":1,"254":1,"294":1,"459":1,"461":1,"501":1}}],["максимум",{"2":{"196":1,"218":1}}],["максимизации",{"2":{"169":1}}],["макрос",{"2":{"115":1}}],["макросами",{"2":{"115":1}}],["макете",{"2":{"530":2}}],["макетов",{"0":{"272":1},"2":{"237":1}}],["макетом",{"2":{"221":1,"272":1}}],["макетами",{"2":{"438":1}}],["макета",{"2":{"222":1,"235":1,"283":1,"494":1}}],["макеты",{"2":{"167":1,"239":1,"263":1,"496":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,"165":1,"194":1,"271":1,"272":2,"530":1,"534":1}}],["материал",{"2":{"103":1}}],["материалах",{"2":{"486":1}}],["материала",{"2":{"64":1,"323":1,"483":1}}],["массовый",{"2":{"426":1}}],["массовых",{"2":{"394":1}}],["массовой",{"2":{"209":1,"429":1}}],["массу",{"2":{"218":1}}],["массиву",{"2":{"326":1,"392":1,"416":1}}],["массива",{"2":{"222":2,"237":1,"279":1,"416":1,"448":3,"451":1,"460":1}}],["массивам",{"2":{"114":2}}],["массиве",{"2":{"148":1,"222":1,"279":1,"416":1}}],["массивы",{"2":{"115":1,"149":1,"279":1,"281":1,"342":1,"385":1,"524":1}}],["массивов",{"2":{"114":1}}],["массив",{"2":{"41":1,"222":5,"233":1,"238":1,"251":1,"259":1,"261":3,"279":3,"280":1,"290":1,"326":2,"327":1,"392":2,"396":1,"398":1,"416":3,"448":3,"451":1}}],["масштабируемых",{"2":{"451":1}}],["масштабируемой",{"2":{"403":1}}],["масштабирования",{"2":{"139":1,"382":1}}],["масштаб",{"2":{"384":1}}],["масштабе",{"2":{"328":1,"388":1}}],["масштабах",{"2":{"147":1}}],["мастере",{"2":{"410":1}}],["мастер",{"2":{"135":1,"401":1}}],["мастером",{"2":{"61":1}}],["маске",{"2":{"441":1}}],["маскируемый",{"2":{"265":1}}],["маскирует",{"2":{"203":1,"206":1}}],["маскируются",{"2":{"208":1}}],["маскировка",{"2":{"208":1}}],["маскироваться",{"2":{"208":1}}],["маску",{"2":{"125":1}}],["маска",{"2":{"108":2}}],["малая",{"2":{"407":1}}],["маленьком",{"2":{"239":1}}],["маленькой",{"2":{"200":1}}],["маленького",{"2":{"178":1,"440":1}}],["маленьких",{"2":{"141":1,"297":1}}],["маленький",{"2":{"106":1,"178":2}}],["маленькая",{"2":{"22":1,"178":1}}],["маломощных",{"2":{"384":1}}],["малого",{"2":{"139":2}}],["мало",{"2":{"38":1,"223":1,"236":1,"238":1,"264":1}}],["маркерами",{"2":{"428":1}}],["маркером",{"2":{"248":1}}],["маркетинговые",{"2":{"163":1}}],["маркетинг",{"2":{"162":1}}],["маркетплейсом",{"2":{"22":1,"76":1}}],["маркетплейсов",{"2":{"21":1}}],["маркетплейс",{"0":{"13":1,"59":1},"1":{"60":1,"61":1,"62":1,"63":1,"64":1},"2":{"9":1,"22":2,"60":1,"79":1}}],["маркетплейса",{"2":{"4":1,"12":1,"22":2,"43":1,"60":1,"78":1,"79":1}}],["маршруте",{"2":{"233":2,"239":3}}],["маршрутов",{"0":{"232":1,"238":1},"1":{"233":1,"234":1},"2":{"231":1,"235":1,"237":2,"238":1,"239":2,"242":2,"244":1,"245":1,"278":1}}],["маршруту",{"2":{"230":1,"233":1,"238":2,"249":1,"253":1}}],["маршрут",{"2":{"127":1,"231":1,"233":5,"236":1,"238":1,"249":1,"250":2}}],["маршрутизации",{"2":{"127":1,"226":1,"328":1}}],["маршрутизацию",{"2":{"11":1}}],["маршрутизатору",{"2":{"239":1}}],["маршрутизатором",{"2":{"118":1,"238":1,"239":1}}],["маршрутизатора",{"0":{"235":1},"2":{"118":1,"226":1,"229":4,"230":1,"236":1,"252":1,"253":1}}],["маршрутизатор",{"2":{"118":1,"228":1,"230":3,"233":1,"234":1,"236":1,"237":1,"238":1,"239":1,"247":1,"374":1}}],["маршрутизаторе",{"2":{"110":1,"118":2,"128":1}}],["маршруты",{"0":{"237":1},"1":{"238":1,"239":1},"2":{"88":1,"229":2,"230":3,"232":1,"233":3,"237":2,"238":2,"242":1,"264":1,"535":1}}],["маршрутам",{"2":{"235":1,"236":1,"239":1,"244":1}}],["маршрутами",{"2":{"127":1,"230":1,"233":1,"242":1}}],["маршрута",{"2":{"7":1,"233":1,"235":1,"236":3,"239":4,"242":3}}],["мыслить",{"2":{"452":1}}],["мыслит",{"2":{"294":1}}],["мышку",{"2":{"444":1}}],["мышление",{"2":{"407":1}}],["мышления",{"2":{"139":1}}],["мышью",{"2":{"169":1,"183":1}}],["мышь",{"2":{"165":1,"169":1,"384":1}}],["мыши",{"2":{"150":1,"177":1,"191":1,"192":1,"261":1,"284":1,"290":2}}],["мы",{"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,"55":1,"58":1,"83":1,"86":1,"88":1,"94":1,"96":1,"111":2,"112":3,"113":1,"115":2,"122":2,"124":2,"125":5,"126":4,"127":3,"128":7,"130":1,"131":2,"132":8,"134":3,"135":1,"136":5,"137":1,"138":3,"139":2,"140":10,"141":4,"142":13,"143":14,"144":1,"145":1,"149":3,"150":8,"151":3,"152":1,"157":1,"158":3,"160":2,"163":2,"165":1,"166":2,"167":2,"170":1,"172":1,"182":1,"183":1,"184":10,"188":1,"194":1,"195":1,"196":2,"210":3,"212":5,"213":4,"214":7,"215":10,"216":4,"217":2,"218":12,"219":8,"220":4,"221":11,"222":22,"223":10,"224":4,"226":5,"228":9,"229":1,"230":4,"231":9,"233":15,"235":2,"236":20,"237":5,"238":3,"239":11,"242":4,"243":4,"244":7,"245":4,"246":5,"247":3,"248":8,"249":6,"250":2,"251":8,"252":4,"253":1,"254":3,"256":1,"257":1,"258":4,"262":3,"263":8,"264":13,"265":6,"267":3,"269":7,"271":4,"272":4,"273":4,"275":6,"276":2,"277":3,"278":6,"279":1,"280":7,"281":8,"282":1,"283":11,"284":10,"285":5,"286":3,"288":1,"289":19,"290":18,"291":4,"292":8,"293":3,"294":1,"297":4,"298":1,"300":1,"301":4,"302":2,"305":3,"306":1,"315":5,"316":1,"317":1,"320":1,"321":7,"322":6,"323":2,"324":1,"326":8,"328":3,"329":2,"330":15,"331":5,"332":4,"333":5,"334":6,"335":2,"336":6,"337":11,"338":5,"340":7,"341":1,"342":4,"343":3,"344":8,"345":4,"346":1,"347":7,"348":3,"349":7,"350":3,"351":4,"352":8,"353":1,"354":5,"355":8,"356":6,"357":10,"358":5,"359":4,"360":1,"372":1,"378":1,"382":8,"383":1,"384":4,"385":1,"386":3,"387":6,"388":5,"389":4,"390":6,"391":7,"392":7,"393":2,"394":2,"395":6,"396":8,"397":3,"398":6,"399":1,"400":7,"401":1,"402":13,"403":4,"405":2,"407":2,"408":3,"409":3,"410":7,"411":10,"412":1,"413":5,"414":1,"415":10,"416":21,"417":3,"418":5,"419":1,"420":2,"422":1,"425":1,"426":5,"428":3,"429":2,"431":2,"435":2,"452":5}}],["молчаливая",{"2":{"489":1}}],["морган",{"2":{"460":1}}],["морскими",{"2":{"303":1}}],["мотивации",{"2":{"460":1}}],["мощь",{"2":{"449":1,"452":1}}],["мощную",{"2":{"355":1}}],["мощного",{"0":{"350":1},"1":{"351":1,"352":1,"353":1,"354":1},"2":{"340":1}}],["мощной",{"2":{"213":1}}],["мощности",{"2":{"138":1,"228":1,"254":1,"282":1,"382":1,"393":1}}],["мощность",{"2":{"128":1,"251":1}}],["мощная",{"2":{"139":1,"394":1}}],["мощный",{"2":{"282":1}}],["мощные",{"2":{"256":1,"280":1}}],["мощным",{"2":{"191":1,"336":1}}],["мощными",{"2":{"134":1,"438":1}}],["мощных",{"2":{"138":1}}],["мой",{"2":{"305":1}}],["моем",{"2":{"443":1}}],["моему",{"2":{"299":1,"306":1,"384":1}}],["мое",{"2":{"214":1}}],["моей",{"2":{"22":1}}],["мошенническими",{"2":{"200":1}}],["могла",{"2":{"395":1}}],["могло",{"2":{"385":1}}],["могли",{"2":{"223":1,"228":1,"230":1,"231":1,"243":1,"250":1,"269":1,"289":1,"291":1,"321":2,"330":1,"344":1,"356":2,"357":1,"402":1,"416":1}}],["могущие",{"2":{"485":1}}],["могу",{"2":{"242":1}}],["могут",{"2":{"17":1,"47":1,"108":2,"119":1,"125":1,"138":1,"139":2,"143":1,"147":1,"151":1,"167":1,"176":1,"179":1,"180":3,"181":1,"185":1,"198":1,"213":1,"215":1,"216":1,"219":1,"228":1,"233":1,"238":1,"242":1,"245":2,"250":1,"251":1,"252":1,"254":1,"256":4,"258":1,"267":1,"272":2,"273":1,"275":1,"279":2,"281":1,"292":1,"293":1,"295":2,"323":1,"327":1,"331":1,"338":1,"345":2,"351":1,"355":2,"356":1,"363":1,"365":1,"384":3,"386":1,"389":1,"404":2,"405":1,"407":1,"408":1,"436":1,"438":1,"440":1,"444":1,"451":2,"453":1,"460":2,"496":1}}],["мог",{"2":{"142":1,"171":1,"228":1,"237":1,"251":1,"350":1,"461":1,"495":1}}],["мои",{"2":{"109":1}}],["монитора",{"2":{"444":1}}],["монитор",{"2":{"444":1}}],["мониторинг",{"2":{"202":1}}],["мониторингом",{"2":{"106":1}}],["монолитных",{"2":{"299":1}}],["монополистом",{"2":{"50":1}}],["монтируется",{"2":{"301":1}}],["монтируем",{"2":{"111":1,"277":1}}],["монтирования",{"2":{"112":1,"236":1,"301":1,"416":1}}],["монетизация",{"2":{"63":1}}],["мобильную",{"2":{"263":1}}],["мобильный",{"2":{"250":1}}],["мобильных",{"2":{"186":3,"189":1,"194":1,"217":1,"228":1,"245":1,"254":1,"256":1,"259":1,"260":1,"263":2,"506":1}}],["мобильные",{"2":{"162":1,"249":1,"251":1,"256":1}}],["мобильное",{"2":{"461":1}}],["мобильного",{"2":{"194":1}}],["мобильном",{"2":{"86":1,"102":1,"194":1,"258":1}}],["мобильной",{"2":{"29":1,"30":1,"33":2,"35":1}}],["мобильная",{"0":{"33":1},"2":{"263":1}}],["модал",{"2":{"289":2,"290":1}}],["модала",{"2":{"289":4}}],["модалы",{"2":{"274":1}}],["модалов",{"0":{"286":1},"1":{"287":1,"288":1,"289":1},"2":{"273":1}}],["модальное",{"2":{"288":1,"492":1}}],["модального",{"2":{"288":4,"289":3}}],["модальной",{"2":{"275":1}}],["модальном",{"2":{"189":1}}],["модальных",{"2":{"188":1,"273":1,"274":1,"275":1,"281":1,"292":1}}],["модальный",{"2":{"188":1,"274":1,"275":2,"288":2,"289":6}}],["модальные",{"0":{"188":1},"2":{"188":1,"231":1,"272":1,"275":1,"286":1,"290":1}}],["модернизируем",{"2":{"256":1}}],["моделям",{"2":{"267":1,"456":1}}],["модели",{"2":{"139":1,"175":1,"194":1,"223":1,"236":1,"280":1,"349":1,"384":1}}],["моделей",{"2":{"115":1,"157":1,"280":1,"354":1}}],["моделью",{"2":{"115":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,"139":2,"236":1,"390":2,"394":1,"449":2,"451":1,"459":1}}],["модифицирует",{"2":{"274":1,"332":1}}],["модифицируем",{"2":{"214":1,"217":1,"222":1,"229":1}}],["модифицировали",{"2":{"236":1}}],["модифицировать",{"2":{"68":1,"131":1,"235":1,"347":1}}],["модификаций",{"2":{"231":1,"336":1}}],["модификация",{"2":{"212":1,"236":1}}],["модификации",{"0":{"215":1},"2":{"126":1,"146":1,"230":1,"349":1}}],["модификатор",{"2":{"142":1,"280":1}}],["модули",{"2":{"290":1,"299":1,"314":2,"334":1,"436":1,"449":2,"452":1,"455":1}}],["модулях",{"2":{"354":1}}],["модуля",{"2":{"87":1,"349":1,"449":1,"501":1,"530":1,"533":1}}],["модуле",{"2":{"86":1,"88":1,"216":1,"232":1,"357":1,"436":1,"449":1,"451":1}}],["модулей",{"2":{"5":1,"81":1,"300":1}}],["модульная",{"2":{"436":1}}],["модульными",{"2":{"139":1}}],["модульности",{"2":{"118":1}}],["модульной",{"2":{"86":1}}],["модуль",{"0":{"499":1},"1":{"500":1,"501":1},"2":{"4":2,"41":1,"105":2,"129":1,"142":1,"284":1,"286":1,"302":2,"314":2,"323":1,"350":1,"354":1,"436":6,"452":1,"494":2,"496":2,"530":1}}],["моменты",{"2":{"460":1,"485":1}}],["моментов",{"2":{"450":1}}],["моментом",{"2":{"128":1,"290":1,"342":1,"495":1}}],["моментами",{"2":{"244":1}}],["момента",{"2":{"222":1,"248":1,"384":1}}],["момент",{"2":{"9":1,"16":1,"36":1,"43":1,"114":1,"125":1,"151":1,"184":1,"215":1,"219":1,"236":1,"256":1,"263":1,"285":1,"289":1,"290":1,"296":1,"320":1,"321":1,"414":1,"425":1,"448":1,"461":1,"505":1,"508":1,"530":1,"537":1}}],["можем",{"2":{"22":1,"23":2,"36":1,"112":1,"115":1,"125":1,"126":1,"127":1,"132":1,"134":1,"136":1,"137":1,"140":1,"142":5,"143":3,"144":1,"149":1,"150":2,"151":1,"170":1,"184":1,"215":3,"216":1,"218":4,"219":3,"221":1,"222":2,"223":2,"229":1,"231":3,"233":5,"235":1,"236":2,"237":1,"238":1,"239":3,"246":1,"247":1,"248":1,"249":1,"251":1,"263":2,"264":3,"265":1,"271":3,"272":1,"275":2,"277":2,"278":2,"280":2,"281":3,"284":1,"289":2,"290":2,"291":1,"293":2,"297":1,"322":1,"323":1,"330":1,"331":1,"332":1,"336":3,"342":3,"345":1,"348":2,"349":3,"355":2,"357":1,"358":2,"360":1,"384":1,"387":4,"388":2,"395":1,"398":1,"402":4,"408":1,"410":2,"411":3,"413":1,"415":1,"416":3,"417":3,"418":1,"419":1}}],["можете",{"2":{"114":2,"116":1,"125":2,"134":1,"139":5,"141":1,"143":2,"152":1,"157":2,"159":2,"167":1,"175":1,"188":1,"194":1,"211":1,"214":1,"215":3,"216":1,"225":1,"231":1,"236":1,"243":1,"256":3,"262":1,"305":1,"314":1,"320":1,"329":2,"336":1,"339":2,"355":1,"384":2,"393":1,"395":1,"411":1,"421":1,"425":1,"426":2,"427":1,"429":1,"430":1,"437":2,"440":1,"483":1}}],["может",{"2":{"2":2,"3":1,"4":1,"14":1,"16":1,"17":1,"18":1,"26":1,"43":1,"44":1,"66":1,"67":1,"68":1,"87":1,"89":1,"96":2,"103":1,"106":2,"107":2,"108":1,"109":1,"110":1,"114":2,"115":2,"116":1,"125":2,"128":1,"131":1,"138":1,"139":4,"141":1,"142":3,"143":3,"146":1,"151":2,"160":1,"162":1,"170":1,"171":1,"175":1,"176":2,"177":2,"178":1,"179":1,"180":1,"181":4,"183":4,"190":1,"191":3,"192":2,"199":1,"203":2,"207":2,"208":2,"209":1,"211":1,"214":3,"215":1,"219":1,"220":1,"223":1,"237":1,"244":1,"245":2,"250":1,"251":3,"254":1,"255":1,"256":3,"258":2,"262":1,"263":7,"264":1,"269":1,"272":2,"273":1,"275":3,"278":3,"281":1,"283":3,"285":2,"286":2,"290":2,"297":1,"298":1,"299":1,"301":2,"302":1,"303":1,"310":1,"311":1,"315":2,"322":1,"325":1,"328":2,"329":4,"331":3,"336":1,"337":2,"340":1,"342":1,"344":1,"345":2,"348":1,"349":1,"351":1,"352":1,"355":7,"357":1,"365":1,"384":9,"385":3,"388":1,"389":2,"392":1,"394":1,"400":2,"405":1,"407":4,"410":3,"416":2,"418":2,"423":1,"428":2,"429":1,"430":1,"435":1,"438":3,"440":1,"443":1,"444":1,"448":1,"449":6,"450":1,"451":3,"453":1,"459":3,"460":1,"461":6,"489":1,"495":2,"500":1,"522":1,"536":1,"544":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,"52":1,"58":1,"62":2,"63":1,"66":1,"81":1,"83":1,"89":1,"93":1,"95":2,"96":1,"102":1,"103":1,"105":1,"106":4,"107":2,"109":1,"115":1,"118":1,"120":1,"123":1,"125":4,"131":1,"133":1,"134":1,"135":2,"139":2,"140":1,"141":3,"150":1,"151":3,"157":1,"161":1,"162":1,"165":1,"166":1,"169":1,"170":1,"171":1,"174":1,"175":1,"180":1,"181":1,"189":1,"191":2,"192":1,"194":1,"198":1,"208":1,"213":5,"216":4,"217":2,"218":3,"219":3,"223":1,"224":1,"227":1,"228":1,"236":3,"237":1,"239":3,"242":4,"243":1,"245":4,"247":1,"249":1,"250":2,"251":1,"252":1,"253":2,"256":1,"263":1,"264":2,"265":1,"267":1,"268":1,"269":1,"270":1,"278":1,"280":3,"282":1,"283":3,"285":1,"288":1,"289":1,"290":2,"291":1,"297":2,"299":3,"302":1,"305":2,"318":1,"322":1,"326":1,"328":1,"329":1,"331":3,"334":1,"336":2,"337":2,"339":1,"344":1,"350":1,"352":1,"353":1,"354":1,"355":3,"358":1,"360":1,"367":1,"368":1,"382":2,"384":2,"385":1,"386":1,"387":1,"388":2,"389":1,"390":1,"393":1,"394":2,"395":1,"397":2,"404":1,"405":2,"406":1,"407":3,"408":1,"409":1,"410":1,"411":3,"414":2,"415":1,"416":1,"418":1,"419":1,"423":2,"424":1,"425":3,"429":1,"430":2,"436":1,"438":1,"439":3,"440":1,"444":2,"448":2,"449":3,"451":3,"452":2,"459":1,"460":5,"461":3,"489":1,"492":1,"497":1,"505":1,"508":1,"524":1,"537":1,"543":1}}],["механической",{"2":{"460":1}}],["механизмы",{"2":{"449":1}}],["механизм",{"2":{"348":1}}],["медленней",{"2":{"449":1}}],["медиазапросов",{"2":{"194":1}}],["медиазапросами",{"2":{"194":1}}],["межпроцессное",{"2":{"397":1}}],["межпроцессного",{"2":{"385":1}}],["межпроцессные",{"2":{"337":1}}],["межстрочные",{"2":{"304":1}}],["между",{"0":{"95":1,"164":1},"2":{"3":1,"17":1,"22":1,"34":1,"43":2,"67":2,"68":1,"95":1,"108":1,"110":1,"114":1,"135":1,"138":3,"139":3,"142":1,"143":2,"159":1,"160":1,"162":1,"169":1,"180":1,"183":1,"189":1,"215":1,"222":2,"229":1,"233":1,"236":1,"244":1,"245":3,"250":1,"252":1,"256":1,"268":1,"271":1,"272":1,"277":1,"280":1,"281":1,"283":1,"284":2,"286":1,"290":1,"302":1,"305":1,"308":1,"309":1,"323":1,"325":1,"328":1,"329":1,"330":1,"331":1,"334":1,"339":2,"340":1,"341":1,"342":1,"350":1,"351":1,"354":1,"359":1,"360":2,"380":1,"384":2,"388":2,"389":2,"397":1,"419":1,"421":1,"438":2,"444":1,"449":2,"460":2,"461":1}}],["мелких",{"2":{"303":1,"449":1}}],["мелкие",{"2":{"170":1,"297":1}}],["мельчайшей",{"2":{"297":1}}],["мечом",{"2":{"207":1}}],["мегабайт",{"2":{"525":1}}],["мега",{"2":{"191":4}}],["мегаменю",{"0":{"191":1},"2":{"29":1,"191":2,"192":1}}],["мета",{"2":{"530":1,"540":1}}],["метасервисы",{"2":{"248":1}}],["метрике",{"2":{"461":1}}],["метрики",{"2":{"461":1}}],["метку",{"2":{"342":1}}],["метка",{"2":{"245":1}}],["метки",{"0":{"178":1},"2":{"428":1}}],["методу",{"2":{"337":1}}],["методом",{"2":{"250":1,"461":1}}],["методологии",{"2":{"228":1,"229":1}}],["методов",{"2":{"14":1,"238":1,"239":1,"242":2,"245":1,"250":1,"321":1,"323":1,"345":1,"351":1,"354":1,"392":1,"411":3,"448":1}}],["методе",{"2":{"143":1,"233":1,"315":1,"402":1}}],["метод",{"0":{"314":1,"315":1},"2":{"106":1,"114":1,"140":3,"143":1,"194":3,"233":1,"240":1,"242":1,"245":2,"250":3,"263":2,"277":2,"281":1,"286":1,"289":2,"290":1,"299":1,"315":3,"321":2,"324":2,"326":3,"328":1,"337":3,"386":1,"391":3,"396":1,"397":1,"399":1,"402":1,"416":2,"489":1}}],["методы",{"0":{"156":1},"2":{"79":1,"108":1,"112":1,"114":1,"138":1,"140":1,"141":1,"226":1,"233":1,"242":1,"243":2,"281":1,"286":1,"289":1,"300":1,"301":1,"315":1,"326":1,"329":1,"337":1,"347":1,"350":1,"352":2,"354":1,"355":1,"359":1,"360":1,"391":2,"397":2,"398":1,"402":2,"403":1,"416":2,"449":1}}],["методах",{"2":{"355":1}}],["методами",{"2":{"250":1,"337":1,"449":1,"460":1}}],["методам",{"2":{"143":1,"243":1,"398":1,"415":1}}],["метода",{"2":{"3":1,"233":1,"250":1,"289":1,"313":1,"326":1,"331":1,"357":1,"359":1,"386":1,"396":1,"397":2,"398":2,"400":1,"402":2,"461":1}}],["месяцев",{"2":{"135":1}}],["месяца",{"2":{"135":1}}],["места",{"2":{"259":1,"347":1,"355":2,"365":1,"426":1,"448":1}}],["местах",{"2":{"170":1,"357":1}}],["местным",{"2":{"244":1}}],["местом",{"2":{"191":1,"196":1,"231":1}}],["местоположение",{"2":{"183":1}}],["место",{"2":{"117":1,"138":1,"151":1,"191":1,"215":1,"235":1,"269":1,"355":2,"451":1}}],["мест",{"2":{"96":1,"461":1}}],["месте",{"2":{"83":1,"96":1,"142":1,"219":1,"236":1,"263":1,"302":1,"323":1,"344":1,"397":1,"430":1,"451":1}}],["мешает",{"2":{"100":1}}],["мер",{"2":{"402":1,"407":1}}],["меры",{"2":{"106":1,"171":1,"247":1}}],["меру",{"2":{"23":1}}],["мере",{"2":{"12":2,"124":1,"138":2,"141":1,"143":2,"150":1,"158":1,"183":1,"189":1,"212":2,"223":1,"228":1,"245":1,"256":1,"261":1,"272":1,"278":1,"300":1,"318":1,"322":1,"330":1,"335":1,"338":1,"365":1,"384":1,"390":1,"405":1}}],["ментор",{"2":{"460":2}}],["менталитета",{"2":{"121":1}}],["меньших",{"2":{"256":1}}],["меньшим",{"2":{"228":1,"251":1}}],["меньший",{"2":{"143":1,"451":1}}],["меньшего",{"2":{"278":1}}],["меньше",{"2":{"180":1,"304":1,"384":1,"451":1,"528":1}}],["менеджера",{"2":{"423":1,"435":1}}],["менеджер",{"2":{"106":3,"214":1,"356":1,"410":1}}],["менее",{"2":{"2":1,"165":1,"221":1,"239":1,"253":1,"330":1,"334":1,"335":1,"337":1,"354":1,"355":1,"402":1,"407":1,"461":1,"495":1}}],["меня",{"2":{"449":1}}],["меняющими",{"2":{"147":1}}],["меняются",{"2":{"148":1,"212":1,"448":1}}],["меняют",{"2":{"139":1}}],["меняете",{"2":{"449":1}}],["меняет",{"2":{"143":1}}],["меняется",{"2":{"105":1,"236":1,"239":1,"398":1}}],["меняем",{"2":{"130":1,"452":1}}],["меняя",{"2":{"17":1,"496":1}}],["меняться",{"2":{"233":1,"405":1,"448":1}}],["менять",{"2":{"17":1,"41":1,"96":1,"250":1,"440":1,"533":1}}],["меню",{"0":{"186":1,"189":1,"190":1,"192":1},"2":{"3":2,"4":1,"29":1,"30":1,"33":1,"86":1,"89":2,"163":1,"164":1,"165":2,"166":1,"171":1,"177":5,"183":1,"186":4,"187":1,"189":7,"190":3,"191":8,"192":3,"194":2,"196":2,"214":1,"230":1,"236":1,"261":2,"262":1,"263":3,"266":2,"272":1,"283":2,"436":1,"438":2,"515":1,"530":1}}],["ах",{"2":{"448":1}}],["аудио",{"2":{"440":1}}],["аута",{"2":{"391":1}}],["аутентифицирует",{"2":{"250":1}}],["аутентифицирующему",{"2":{"245":1}}],["аутентификаторы",{"2":{"249":1}}],["аутентификацию",{"2":{"107":1,"245":2,"246":1}}],["аутентификацией",{"2":{"106":1}}],["аутентификация",{"0":{"106":1,"244":1,"245":1,"249":2,"250":1,"251":1},"2":{"79":1,"106":5,"243":1,"244":1,"247":2,"249":2,"250":1}}],["аутентификации",{"0":{"243":1},"1":{"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1},"2":{"58":1,"106":1,"226":2,"233":1,"242":1,"243":1,"244":4,"245":5,"246":4,"247":2,"248":1,"250":5,"251":1,"252":2,"253":2,"398":2,"437":3,"449":1,"484":2,"533":1}}],["аутентификаций",{"2":{"40":1}}],["апгрейд",{"2":{"461":1}}],["апдейта",{"2":{"435":1}}],["апплеты",{"2":{"138":1}}],["аппаратного",{"2":{"335":1}}],["аппаратное",{"2":{"256":1,"365":1}}],["аппаратному",{"2":{"128":1,"365":1}}],["аппаратных",{"2":{"403":1}}],["аппаратные",{"2":{"162":1}}],["аппаратным",{"2":{"162":1}}],["аппарате",{"2":{"67":1}}],["ами",{"2":{"391":1}}],["аварийно",{"2":{"355":1}}],["авиабилетов",{"2":{"204":1}}],["авиабилеты",{"2":{"200":1}}],["автошколе",{"2":{"460":1}}],["автономным",{"2":{"363":1}}],["автономной",{"2":{"264":1}}],["автономности",{"2":{"263":1}}],["автономное",{"2":{"254":1,"256":1}}],["автономного",{"2":{"140":1,"256":2,"263":1}}],["автозаполнения",{"2":{"354":1}}],["автор",{"2":{"361":1}}],["авторство",{"2":{"302":1}}],["авторизации",{"2":{"245":2}}],["авторизационный",{"2":{"106":1}}],["авторизация",{"0":{"106":1},"2":{"79":1,"106":4}}],["автоматы",{"2":{"290":1}}],["автомат",{"2":{"290":2}}],["автоматического",{"2":{"135":1,"139":1,"265":1,"403":1,"435":1}}],["автоматические",{"2":{"430":1}}],["автоматически",{"2":{"52":1,"100":2,"125":1,"138":1,"143":1,"200":1,"214":1,"215":1,"218":1,"222":1,"229":1,"233":1,"236":2,"239":1,"242":2,"251":1,"263":2,"278":2,"329":1,"330":1,"331":1,"354":1,"358":1,"396":2,"411":1,"414":1,"435":1,"451":1,"515":1}}],["автоматизацией",{"2":{"460":1}}],["автоматизацию",{"2":{"215":1}}],["автоматизации",{"2":{"70":1,"254":1,"433":1,"435":2}}],["автоматизированный",{"2":{"430":1}}],["автоматизированными",{"2":{"418":1}}],["автоматизированных",{"2":{"407":1,"431":1}}],["автоматизированное",{"2":{"407":1,"432":1}}],["автоматизировано",{"2":{"407":1}}],["автоматизировать",{"2":{"134":1}}],["автоматизирует",{"2":{"135":1}}],["автообновление",{"2":{"135":1}}],["автокомплита",{"2":{"81":1}}],["автокомплит",{"0":{"81":1},"2":{"81":1}}],["ассоциируют",{"2":{"429":1}}],["ассоциируются",{"2":{"162":1}}],["асинхронная",{"2":{"336":1,"384":1}}],["асинхронную",{"2":{"302":1,"335":1,"336":1,"384":1,"413":1,"500":1}}],["асинхронным",{"2":{"337":1,"349":1}}],["асинхронными",{"2":{"310":1,"337":1,"384":1,"397":1}}],["асинхронный",{"0":{"278":1,"413":1},"2":{"384":1,"413":1}}],["асинхронных",{"2":{"243":1,"334":1,"335":2,"336":1}}],["асинхронные",{"0":{"310":1},"2":{"151":1,"228":1,"335":2,"384":1,"408":1}}],["асинхронно",{"2":{"355":1}}],["асинхронное",{"2":{"339":1}}],["асинхронном",{"2":{"337":1}}],["асинхронного",{"2":{"243":1,"278":1,"327":1,"384":1,"405":1}}],["асинхронной",{"2":{"179":1,"335":1,"336":1,"396":1}}],["аспекте",{"2":{"450":1,"451":1}}],["аспекты",{"2":{"162":1,"370":1}}],["аспект",{"2":{"64":1,"163":1}}],["аспиранты",{"2":{"64":1}}],["азы",{"2":{"139":1}}],["абзаца",{"2":{"167":1,"177":1,"199":1}}],["абзацев",{"2":{"167":1}}],["абы",{"2":{"109":1}}],["абсолютно",{"2":{"460":2}}],["абсолютном",{"2":{"107":1}}],["абсолютный",{"2":{"132":1}}],["абстрагированный",{"2":{"305":1}}],["абстрагирование",{"2":{"105":1,"302":1}}],["абстрагировать",{"2":{"302":1}}],["абстракции",{"2":{"294":1,"316":1}}],["абстракция",{"0":{"3":1,"104":1},"1":{"105":1},"2":{"297":1,"500":1}}],["абстрактный",{"2":{"530":1}}],["абстрактны",{"2":{"158":1}}],["абстрактное",{"2":{"157":1}}],["анонсы",{"2":{"486":1}}],["аномалией",{"2":{"420":1}}],["антипаттерн",{"2":{"342":1}}],["антипаттерны",{"2":{"305":1}}],["антипаттерном",{"2":{"305":1,"438":1}}],["анимация",{"2":{"284":1}}],["анимации",{"2":{"151":3,"162":1,"229":1}}],["анимацию",{"2":{"138":1,"461":1}}],["английского",{"2":{"460":1}}],["английском",{"2":{"366":1,"460":2}}],["англ",{"2":{"108":1,"251":1}}],["аналогу",{"2":{"461":1}}],["аналогов",{"2":{"451":1}}],["аналогом",{"2":{"449":1}}],["аналогами",{"2":{"351":1}}],["аналог",{"2":{"115":1,"410":1,"449":1}}],["аналогию",{"2":{"460":1}}],["аналогией",{"2":{"452":1}}],["аналогичен",{"2":{"283":1,"304":1,"507":1,"536":1}}],["аналогичную",{"2":{"416":1}}],["аналогичные",{"2":{"449":1}}],["аналогичным",{"2":{"222":1,"408":1}}],["аналогичных",{"2":{"89":1,"256":1}}],["аналогичный",{"2":{"81":1,"165":1,"251":1,"283":1,"350":1,"460":1}}],["аналогичного",{"2":{"495":1}}],["аналогичном",{"2":{"22":1}}],["аналогично",{"2":{"2":1,"18":1,"259":1,"386":1}}],["аналогии",{"2":{"283":1}}],["аналоги",{"0":{"22":1},"2":{"5":1,"449":1}}],["аналитика",{"2":{"67":1}}],["анализировать",{"2":{"266":1}}],["анализа",{"2":{"14":1,"253":1,"384":1}}],["анализ",{"0":{"8":1,"20":1,"67":1},"1":{"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"21":1,"22":1},"2":{"12":1,"66":1,"164":1,"194":1}}],["академическое",{"2":{"321":1}}],["академических",{"2":{"138":1}}],["аккуратней",{"2":{"450":1}}],["аккуратно",{"2":{"410":1}}],["аккордеона",{"2":{"190":1,"191":1}}],["аккордеонное",{"2":{"190":1,"192":2}}],["аккордеонные",{"0":{"190":1}}],["аккаунт",{"2":{"106":1}}],["аккаунтом",{"2":{"106":1}}],["аккаунта",{"2":{"89":1,"436":1}}],["акт",{"2":{"425":1}}],["активных",{"2":{"395":1}}],["активными",{"2":{"384":1}}],["активного",{"2":{"289":1}}],["активности",{"2":{"202":1}}],["активно",{"2":{"135":1,"273":1,"451":1}}],["активен",{"2":{"236":1}}],["активы",{"2":{"216":1,"264":1}}],["активизируется",{"2":{"249":1}}],["активизируются",{"2":{"192":1}}],["активировать",{"2":{"263":1,"425":1}}],["активированным",{"2":{"264":1}}],["активирован",{"2":{"175":1,"355":1}}],["активирует",{"2":{"177":1}}],["активации",{"2":{"175":2,"177":1,"264":1,"386":1}}],["актуальность",{"2":{"228":1,"485":1}}],["актуальные",{"2":{"354":1}}],["актуальных",{"2":{"228":1,"390":1}}],["актуальны",{"2":{"171":1,"252":1}}],["актуален",{"2":{"143":1}}],["акции",{"2":{"4":1}}],["атомарного",{"2":{"216":1,"297":1}}],["аттрибутах",{"2":{"459":1}}],["аттрибута",{"2":{"278":1}}],["аттрибут",{"2":{"140":1}}],["аттрибуту",{"2":{"13":1}}],["атрибутом",{"2":{"285":1}}],["атрибутов",{"2":{"168":1,"176":1,"203":1,"242":1,"258":3,"285":1,"289":1,"407":1}}],["атрибутами",{"2":{"240":1,"278":1}}],["атрибутам",{"2":{"222":1,"405":1}}],["атрибута",{"2":{"145":1,"146":1,"148":1,"222":2,"236":1,"238":1,"239":2,"259":1,"283":1,"321":1,"357":1}}],["атрибуту",{"2":{"143":1,"174":1,"321":2}}],["атрибут",{"2":{"113":2,"115":1,"139":2,"142":3,"143":1,"145":1,"148":2,"236":4,"238":2,"239":1,"258":1,"259":1,"260":1,"261":1,"279":1,"332":1,"333":1}}],["атрибуте",{"2":{"113":1,"391":1}}],["атрибуты",{"2":{"68":1,"114":2,"143":1,"144":1,"242":1,"258":2,"278":2,"279":2,"295":1}}],["ат",{"2":{"106":2}}],["алиаса",{"2":{"443":1}}],["алиасы",{"2":{"443":1}}],["алиас",{"2":{"443":2}}],["алгоритмы",{"2":{"303":1}}],["алгоритму",{"2":{"245":1}}],["алгоритм",{"2":{"245":2,"301":1}}],["алгоритмов",{"2":{"67":1}}],["альтернативной",{"2":{"321":1}}],["альтернативный",{"2":{"143":1,"277":1,"283":1,"386":1}}],["альтернативные",{"2":{"67":1,"204":1}}],["альтернативы",{"2":{"218":1,"417":1,"424":1}}],["альтернативой",{"2":{"183":1,"191":1,"278":2,"299":1}}],["альтернативах",{"2":{"175":1}}],["альтернатива",{"2":{"81":1,"107":1,"135":1,"329":1,"342":1,"416":1,"418":1}}],["альтернатив",{"2":{"50":1,"194":1,"340":1,"342":1,"384":1}}],["аргумент",{"2":{"279":1,"283":1,"351":1}}],["аргументов",{"2":{"279":1,"342":1,"416":2}}],["аргументы",{"2":{"219":1,"357":1}}],["аргументами",{"2":{"411":1,"416":1}}],["аргумента",{"2":{"114":1,"140":1,"256":1,"277":1,"278":1,"279":1,"322":1,"330":1,"351":2,"357":1,"402":1,"411":2,"415":1}}],["арендовать",{"2":{"136":1}}],["арендуем",{"2":{"128":1}}],["артефакты",{"2":{"67":1}}],["архитектуру",{"2":{"403":1}}],["архитектур",{"2":{"363":1,"403":1}}],["архитектурой",{"2":{"139":1,"213":1}}],["архитектуре",{"2":{"86":1,"382":1,"392":1}}],["архитектурные",{"0":{"436":1},"1":{"437":1,"438":1}}],["архитектурный",{"2":{"297":1}}],["архитектурными",{"2":{"139":1,"388":1}}],["архитектурных",{"2":{"68":1,"212":1,"388":1}}],["архитектурная",{"2":{"139":1}}],["архитектурной",{"2":{"448":1}}],["архитектурное",{"2":{"68":1}}],["архитектурно",{"2":{"6":1,"449":1}}],["архитектуры",{"2":{"40":1,"76":1,"128":1,"160":1,"243":1,"295":1,"297":1,"306":1,"365":1,"371":1,"377":1,"384":1,"403":1,"496":1}}],["архитектура",{"0":{"1":1,"6":1,"68":1,"452":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"453":1,"454":1,"455":1,"456":1,"457":1,"458":1},"2":{"66":1,"68":2,"272":1,"354":1,"390":1,"436":2,"452":2,"484":1}}],["адресом",{"2":{"214":1}}],["адресов",{"2":{"125":2}}],["адресе",{"2":{"125":1,"127":1,"237":2}}],["адресное",{"2":{"125":1}}],["адресата",{"2":{"125":1}}],["адресату",{"2":{"125":1}}],["адресах",{"2":{"125":1,"127":1}}],["адреса",{"2":{"125":5,"135":1,"196":1,"215":1,"229":1}}],["адрес",{"2":{"125":8,"127":1,"145":1,"214":1,"222":1,"228":1,"236":1,"246":1,"251":2,"259":1,"261":1,"402":1,"419":1}}],["адресу",{"2":{"100":1,"108":1,"120":1,"125":1,"161":1,"169":1,"213":1,"227":1,"242":2,"251":1,"255":1,"269":1,"283":1,"285":1,"289":1,"354":1,"367":1,"402":2,"406":1,"515":1}}],["администратора",{"2":{"425":1}}],["административного",{"2":{"125":1}}],["административная",{"2":{"79":1}}],["администрирования",{"2":{"129":1}}],["админ",{"2":{"106":1,"436":1}}],["админке",{"2":{"13":1,"106":1}}],["админка",{"2":{"12":1}}],["адаптацию",{"2":{"299":1}}],["адаптация",{"2":{"264":1}}],["адаптации",{"2":{"256":1,"305":1}}],["адаптировать",{"2":{"234":1,"303":1}}],["адаптированная",{"2":{"213":1}}],["адаптируется",{"2":{"194":2}}],["адаптивны",{"2":{"518":1}}],["адаптивный",{"2":{"254":1}}],["адаптивного",{"2":{"495":1}}],["адаптивноcти",{"2":{"456":1}}],["адаптивность",{"0":{"35":1,"497":1},"2":{"452":1,"459":1,"497":2}}],["адаптивностью",{"2":{"25":1}}],["адаптивности",{"2":{"23":1,"89":1}}],["адаптивная",{"2":{"36":1}}],["адаптер",{"2":{"41":2,"501":2,"530":1}}],["адаптеры",{"0":{"41":1},"2":{"41":1}}],["а",{"2":{"4":1,"11":1,"12":2,"16":1,"23":1,"25":1,"39":1,"64":1,"87":2,"93":1,"95":1,"96":1,"106":2,"107":1,"108":2,"110":2,"111":1,"113":1,"114":2,"115":1,"119":1,"125":3,"134":2,"135":2,"139":4,"140":1,"141":1,"142":1,"143":4,"150":1,"151":1,"153":1,"160":1,"162":1,"163":2,"164":2,"165":1,"166":2,"171":1,"172":1,"183":2,"187":1,"189":1,"190":1,"194":2,"196":1,"200":1,"202":1,"204":1,"208":1,"212":1,"214":2,"215":6,"216":2,"219":6,"222":5,"223":1,"224":2,"225":1,"231":1,"233":3,"236":4,"237":1,"238":1,"239":3,"242":1,"244":2,"245":3,"246":1,"249":5,"250":1,"251":3,"252":1,"254":1,"256":3,"258":1,"261":2,"263":3,"264":4,"265":1,"266":3,"269":1,"279":1,"280":2,"281":2,"283":1,"284":1,"288":2,"289":2,"290":1,"291":1,"297":2,"298":1,"301":3,"304":1,"305":2,"310":1,"315":3,"316":2,"320":1,"325":1,"327":1,"328":1,"329":3,"331":1,"332":1,"333":1,"334":1,"336":1,"340":1,"342":3,"344":1,"346":1,"350":1,"351":1,"352":4,"354":2,"355":3,"357":2,"358":1,"363":2,"375":1,"378":2,"382":3,"384":2,"386":2,"388":2,"390":1,"391":1,"392":1,"394":2,"397":1,"402":2,"403":2,"404":1,"408":1,"411":3,"412":1,"413":3,"415":2,"416":2,"417":2,"420":3,"422":1,"426":1,"428":3,"429":2,"430":1,"431":2,"438":1,"448":2,"449":5,"451":1,"452":1,"454":1,"460":4,"461":5,"492":1,"496":1,"506":1,"522":1}}],["ощущениям",{"2":{"461":1}}],["ощущение",{"2":{"166":1}}],["ощутим",{"2":{"403":1}}],["ощутить",{"2":{"384":1}}],["оцените",{"2":{"438":1}}],["оценить",{"2":{"267":1,"393":1}}],["оценки",{"2":{"266":2,"375":1,"407":1}}],["охватить",{"2":{"256":2,"408":1}}],["охватывают",{"2":{"252":1,"283":1}}],["охватывает",{"2":{"135":1,"162":1,"176":1,"485":1}}],["оживают",{"2":{"256":1}}],["ожидая",{"2":{"249":1,"335":1}}],["ожиданий",{"2":{"420":1}}],["ожидание",{"2":{"393":1}}],["ожидания",{"2":{"249":1,"278":1,"337":1}}],["ожидании",{"2":{"223":1}}],["ожидалось",{"2":{"222":1,"332":1,"336":1,"393":1,"412":1,"416":1}}],["ожидающие",{"2":{"220":1,"222":1}}],["ожидать",{"2":{"189":1,"349":1,"352":1,"354":1}}],["ожидаемую",{"2":{"416":1}}],["ожидаемому",{"2":{"318":1,"411":1}}],["ожидаемых",{"2":{"407":1}}],["ожидаемый",{"2":{"321":1}}],["ожидаемым",{"2":{"280":1}}],["ожидаемые",{"2":{"143":1}}],["ожидает",{"2":{"146":1,"150":1,"239":1,"249":1,"336":1,"392":1}}],["ожидается",{"2":{"116":1,"407":1,"412":1}}],["ом",{"2":{"215":1,"425":1,"428":1,"431":1,"432":1,"451":1,"461":1}}],["оговорками",{"2":{"143":1}}],["огромен",{"2":{"216":1}}],["огромный",{"2":{"428":1,"442":1}}],["огромные",{"2":{"139":1}}],["огромного",{"2":{"302":1}}],["огромном",{"2":{"125":1}}],["огромная",{"2":{"139":1}}],["ограничивают",{"2":{"256":1}}],["ограничивает",{"2":{"142":1,"222":1}}],["ограничить",{"2":{"218":1}}],["ограничимся",{"2":{"251":1}}],["ограничим",{"2":{"163":1}}],["ограничен",{"2":{"355":1}}],["ограничено",{"2":{"337":1}}],["ограниченный",{"2":{"330":1}}],["ограниченным",{"2":{"244":1}}],["ограниченного",{"2":{"125":1,"181":1,"183":1}}],["ограниченное",{"2":{"125":1,"164":1}}],["ограничены",{"2":{"216":1}}],["ограничений",{"2":{"143":1,"355":2,"408":1,"449":1,"461":1}}],["ограничением",{"2":{"184":1,"280":1}}],["ограничение",{"2":{"137":1,"228":1,"355":2}}],["ограничения",{"2":{"119":1,"139":1,"282":1,"334":1,"344":1,"347":1,"355":3,"404":2,"459":1}}],["оффлайн",{"2":{"461":2}}],["оффлайном",{"2":{"256":1}}],["оформить",{"2":{"436":1}}],["оформлении",{"2":{"200":1}}],["оформлением",{"2":{"347":1}}],["оформление",{"2":{"79":1}}],["оформления",{"2":{"25":1,"200":1,"395":1}}],["официальная",{"2":{"258":1,"449":1,"485":1}}],["официальную",{"2":{"212":1,"354":1}}],["официальные",{"2":{"408":1,"422":1,"431":1,"444":1}}],["официальными",{"2":{"378":1}}],["официальным",{"2":{"141":1,"219":1,"354":1}}],["официальных",{"2":{"125":1,"219":1,"407":1}}],["официальный",{"2":{"110":1,"116":1,"191":1,"213":5,"229":1,"285":1,"376":1,"423":1}}],["официально",{"2":{"350":1,"449":1}}],["официального",{"2":{"213":1,"422":1}}],["официальному",{"2":{"349":1}}],["официальном",{"2":{"191":1,"217":1,"354":1,"406":1}}],["официальное",{"2":{"118":1}}],["официальной",{"2":{"110":1,"119":1,"120":1,"128":1,"129":1,"133":1,"150":1,"151":1,"213":1,"233":1,"242":2,"283":1,"285":1,"398":1,"411":1,"414":1,"415":1,"423":1,"424":1,"438":1}}],["очищен",{"2":{"395":1}}],["очищаются",{"2":{"151":1}}],["очищаться",{"2":{"106":1}}],["очистит",{"2":{"543":1}}],["очистить",{"2":{"217":1,"223":1,"326":1}}],["очистки",{"2":{"419":1}}],["очистке",{"2":{"325":1}}],["очереди",{"2":{"198":1,"223":1,"328":1}}],["очередь",{"2":{"25":1,"140":1,"228":1,"238":1,"290":1,"297":2,"327":2,"328":1,"337":2,"384":1,"388":1,"436":1,"449":2}}],["очевидны",{"2":{"274":1}}],["очевидным",{"2":{"140":1,"142":1,"163":1,"233":1,"395":1}}],["очевидной",{"2":{"243":1,"285":1,"408":1}}],["очевидно",{"2":{"16":1,"22":1,"141":1,"164":1,"233":1}}],["очень",{"2":{"3":1,"12":1,"14":1,"39":1,"40":1,"41":1,"44":1,"50":1,"61":1,"106":3,"107":2,"121":1,"128":4,"129":1,"133":1,"139":1,"140":1,"141":2,"143":1,"148":1,"162":1,"167":1,"172":1,"175":1,"180":1,"181":1,"189":1,"191":1,"195":1,"201":1,"202":1,"213":3,"214":3,"215":1,"223":1,"228":1,"231":1,"236":1,"249":1,"251":1,"275":1,"278":1,"280":1,"281":1,"282":1,"283":1,"286":1,"290":1,"299":3,"301":1,"303":1,"311":1,"316":1,"318":1,"321":1,"323":2,"325":1,"327":1,"331":2,"333":2,"334":1,"335":2,"336":1,"345":1,"349":2,"355":1,"385":1,"386":1,"394":3,"395":1,"397":1,"398":1,"403":1,"409":1,"410":1,"416":2,"418":2,"420":2,"426":1,"427":1,"431":1,"438":1,"439":1,"443":1,"444":4,"447":1,"448":3,"449":1,"450":1,"451":1,"458":1,"459":1,"460":4,"461":3,"501":1,"524":2}}],["ооп",{"2":{"94":1,"298":4,"299":1,"449":1,"451":1,"452":3}}],["ошибку",{"2":{"320":1,"321":1,"337":1,"385":2,"395":1,"411":2,"412":1}}],["ошибке",{"2":{"171":1,"335":1,"412":1,"428":1}}],["ошибкам",{"2":{"351":1,"405":2}}],["ошибка",{"0":{"412":1},"2":{"143":1,"179":1,"251":1,"337":1,"385":1,"396":1,"416":1,"452":1}}],["ошибки",{"2":{"108":1,"243":1,"247":1,"248":1,"336":1,"385":2,"396":1,"407":1,"411":1,"412":2,"444":1}}],["ошибетесь",{"2":{"142":1}}],["ошибемся",{"2":{"40":1}}],["ошибок",{"2":{"73":1,"171":3,"248":1,"249":1,"321":2,"326":1,"329":1,"407":2,"411":1,"470":1}}],["оригинал",{"2":{"426":1}}],["оригинальный",{"2":{"329":1}}],["оригинального",{"2":{"175":1}}],["ориентацию",{"2":{"260":1}}],["ориентации",{"2":{"194":1}}],["ориентация",{"2":{"139":1}}],["ориентированных",{"2":{"452":1}}],["ориентированными",{"2":{"142":1}}],["ориентированное",{"2":{"388":1,"451":1}}],["ориентированного",{"2":{"3":1,"298":1,"451":1}}],["ориентироваться",{"2":{"22":1,"186":1}}],["ориентируемся",{"2":{"12":1,"13":1}}],["оранжевого",{"2":{"164":1}}],["органами",{"2":{"297":1}}],["органом",{"2":{"135":1}}],["организм",{"2":{"297":1}}],["организовываться",{"2":{"290":1}}],["организовывать",{"2":{"143":1}}],["организован",{"2":{"410":1}}],["организованными",{"2":{"252":1}}],["организованности",{"2":{"166":1}}],["организованы",{"2":{"117":1,"191":1}}],["организовать",{"2":{"109":1,"141":1,"143":1,"224":1,"226":1,"235":1,"252":1,"390":1,"430":1,"438":1}}],["организациям",{"2":{"209":1}}],["организациях",{"2":{"191":1,"230":1}}],["организация",{"2":{"143":1}}],["организаций",{"2":{"125":2}}],["организацией",{"2":{"125":1,"193":1}}],["организацию",{"2":{"117":1,"214":1,"410":1}}],["организации",{"0":{"117":1,"193":1},"1":{"194":1,"195":1,"196":1,"197":1},"2":{"63":1,"110":1,"125":1,"140":1,"250":1,"251":1,"301":1,"347":1,"405":1,"410":1,"439":1,"451":1}}],["ов",{"2":{"48":1,"63":1}}],["одинаковую",{"2":{"354":1}}],["одинаковым",{"2":{"330":1}}],["одинаковыми",{"2":{"223":1,"443":1}}],["одинаковы",{"2":{"223":1,"402":1,"432":1}}],["одинаковых",{"2":{"222":1}}],["одинаковый",{"2":{"166":1,"355":1}}],["одинакового",{"2":{"183":1}}],["одинаковое",{"2":{"165":1}}],["одинаково",{"2":{"113":1,"222":1,"345":1}}],["один",{"2":{"36":1,"41":1,"43":1,"57":1,"94":1,"95":1,"106":2,"114":1,"125":1,"141":1,"142":1,"145":1,"151":1,"165":1,"175":1,"180":1,"187":1,"204":1,"208":1,"213":1,"214":1,"221":1,"222":2,"228":1,"233":1,"237":1,"239":2,"244":1,"248":1,"250":2,"251":1,"263":3,"273":1,"277":1,"278":3,"283":1,"285":1,"289":2,"290":2,"291":1,"299":1,"302":1,"303":1,"311":2,"312":1,"314":1,"324":1,"325":2,"331":1,"332":1,"333":1,"345":1,"352":1,"354":1,"388":1,"399":1,"402":1,"409":1,"411":2,"413":1,"414":1,"419":1,"438":1,"443":1,"449":4,"450":1,"461":1}}],["одаренный",{"2":{"26":1}}],["одних",{"2":{"348":1}}],["одни",{"2":{"228":1,"237":1,"295":1,"420":1,"421":1,"436":2}}],["одним",{"2":{"14":1,"41":1,"121":1,"142":1,"143":1,"191":1,"209":1,"218":3,"223":1,"243":1,"245":1,"275":1,"280":1,"283":1,"290":2,"334":1,"384":1,"397":2,"404":1,"408":1}}],["одними",{"2":{"3":1,"218":1}}],["одну",{"2":{"162":1,"194":1,"206":1,"218":1,"233":1,"250":1,"299":1,"326":1,"331":1,"347":1,"355":1,"357":1,"400":1,"402":1,"410":1,"451":1}}],["одна",{"2":{"102":1,"103":1,"165":2,"183":1,"190":1,"208":1,"239":1,"262":1,"290":1,"384":1,"418":1}}],["однажды",{"2":{"61":1}}],["однако",{"2":{"12":1,"13":1,"23":1,"50":1,"61":2,"121":1,"123":1,"133":1,"135":1,"139":2,"142":1,"143":5,"157":1,"158":1,"161":1,"163":1,"180":1,"183":1,"187":1,"189":1,"191":2,"195":1,"197":1,"212":1,"213":1,"214":1,"216":1,"218":1,"223":1,"228":1,"230":1,"233":1,"236":1,"238":1,"239":1,"244":1,"245":3,"256":2,"258":1,"263":1,"264":2,"275":1,"277":1,"278":2,"279":2,"285":1,"289":1,"299":1,"301":1,"303":1,"313":1,"330":1,"331":2,"336":2,"337":1,"342":1,"347":1,"349":1,"351":2,"354":1,"383":1,"384":2,"394":1,"395":1,"405":1,"407":1,"408":2,"411":1,"413":1,"416":2,"423":1,"425":1,"445":1,"448":1,"449":2,"459":1,"460":2,"461":2,"491":1,"492":1,"524":1}}],["однократный",{"2":{"411":1}}],["однокомпонентного",{"2":{"394":1}}],["однокомпонентное",{"2":{"225":1,"394":1}}],["однозначных",{"2":{"384":1}}],["однозначно",{"2":{"355":1,"444":1,"451":1}}],["однопоточным",{"2":{"384":1}}],["однопоточными",{"2":{"335":1}}],["однопоточных",{"2":{"310":1}}],["одноразового",{"2":{"249":1}}],["одноразовому",{"0":{"249":1}}],["одноименный",{"2":{"236":1}}],["однофайловыми",{"2":{"410":1}}],["однофайловый",{"2":{"142":1}}],["однофайловых",{"0":{"142":1},"2":{"140":1,"300":1,"414":1,"432":1}}],["однофайловые",{"2":{"138":1,"159":1,"215":1,"413":1}}],["одновременно",{"2":{"128":1,"171":1,"190":1,"214":1,"223":1,"286":1,"329":1,"411":1,"417":1,"436":1}}],["одновременного",{"2":{"115":1,"347":1}}],["одновременных",{"2":{"128":1}}],["одностраничное",{"2":{"254":1,"292":1}}],["одностраничного",{"2":{"122":1}}],["одностраничных",{"2":{"374":1,"382":1}}],["одностраничными",{"2":{"226":1}}],["одностраничные",{"0":{"226":1,"374":1},"1":{"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":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},"2":{"118":1,"126":2,"188":1,"228":1,"278":1,"285":1,"398":1}}],["одного",{"2":{"119":1,"129":1,"189":1,"225":1,"251":1,"269":1,"290":1,"311":1,"335":1,"350":1,"355":1,"392":1,"405":1,"410":1,"421":1,"426":1,"449":2}}],["одномоментное",{"2":{"354":1}}],["одному",{"2":{"125":1,"321":1,"410":1}}],["одном",{"2":{"94":1,"96":1,"125":1,"142":1,"169":1,"176":1,"180":1,"188":1,"194":1,"219":1,"220":1,"223":1,"302":1,"305":1,"323":1,"335":1,"351":1,"355":1,"384":1,"409":1,"417":1,"451":1}}],["одно",{"2":{"48":1,"139":1,"143":1,"181":1,"236":1,"244":1,"279":1,"283":1,"290":1,"298":1,"302":1,"303":1,"326":1,"329":1,"331":1,"337":2,"347":1,"348":1,"408":1,"410":1,"411":1,"416":1,"429":1,"435":1,"451":1}}],["одной",{"2":{"16":1,"34":1,"50":1,"139":3,"166":1,"182":1,"194":1,"222":1,"228":1,"251":1,"256":1,"263":1,"282":1,"291":1,"299":1,"320":1,"325":1,"334":1,"335":1,"340":1,"355":1,"384":1,"416":1,"420":1,"429":1,"440":1,"449":1,"495":1}}],["ознакомления",{"2":{"354":1,"491":1}}],["ознакомьтесь",{"2":{"251":1,"358":1,"390":1,"460":1}}],["ознакомительный",{"2":{"431":1}}],["ознакомиться",{"2":{"106":1,"123":1,"125":1,"164":1,"242":1,"281":1,"284":1,"341":1,"357":1,"495":1,"496":1}}],["ознакомились",{"2":{"141":1}}],["означают",{"2":{"228":1,"432":1}}],["означает",{"2":{"11":2,"135":1,"139":2,"143":1,"163":1,"164":1,"191":1,"216":1,"219":1,"233":1,"243":1,"248":1,"273":1,"279":1,"280":1,"284":1,"294":1,"303":2,"325":1,"329":1,"331":1,"347":1,"350":1,"384":2,"411":1,"421":1,"489":1,"492":1}}],["озон",{"2":{"4":1}}],["осущестляется",{"2":{"440":1}}],["осуществляются",{"2":{"311":1}}],["осуществлять",{"2":{"280":1,"385":1}}],["осуществляться",{"2":{"244":1,"245":1,"251":1,"280":1,"324":1}}],["осуществляет",{"2":{"240":1}}],["осуществляется",{"2":{"128":1,"135":2,"312":1,"351":1,"355":1}}],["осуществления",{"2":{"105":1,"243":1}}],["освоения",{"2":{"431":1}}],["освоении",{"2":{"256":1}}],["освобождаем",{"2":{"301":1}}],["освобождать",{"2":{"301":1}}],["освобождения",{"2":{"301":1}}],["освободить",{"2":{"301":1}}],["осваивать",{"2":{"212":1}}],["осведомлен",{"2":{"202":1}}],["освежить",{"2":{"126":1}}],["оскорбления",{"2":{"207":1}}],["острова",{"2":{"272":1}}],["осторожность",{"2":{"384":1}}],["осторожно",{"2":{"195":1}}],["остаться",{"2":{"427":1,"449":1}}],["останемся",{"2":{"392":1}}],["останова",{"2":{"194":2}}],["остановится",{"2":{"183":1}}],["остановиться",{"2":{"116":1}}],["остановимся",{"2":{"12":1,"222":1,"233":1,"273":1,"316":1,"390":1,"407":1}}],["осталось",{"2":{"218":1,"353":1}}],["остальная",{"2":{"400":1}}],["остальной",{"2":{"289":1}}],["остальное",{"2":{"50":1,"142":1,"352":1,"444":1}}],["остальным",{"2":{"218":1}}],["остальными",{"2":{"188":1}}],["остальных",{"2":{"113":1,"165":1,"294":1,"338":2,"398":1,"432":1}}],["остальные",{"2":{"17":1,"91":1,"113":1,"189":1,"208":1,"236":1}}],["остается",{"2":{"87":1,"105":1,"110":1,"214":1,"236":1}}],["оставьте",{"2":{"438":1}}],["оставались",{"2":{"384":1}}],["оставаться",{"2":{"303":1,"321":1}}],["оставшихся",{"2":{"301":1}}],["оставшейся",{"2":{"214":1}}],["оставить",{"2":{"199":1}}],["оставим",{"2":{"7":1,"90":1}}],["оставляем",{"2":{"88":1}}],["оставлять",{"2":{"63":1,"181":1}}],["остаются",{"2":{"17":1,"405":1,"501":1}}],["ос",{"2":{"175":1,"179":3,"181":1,"213":1,"215":1,"260":1,"444":1}}],["особый",{"2":{"413":1}}],["особых",{"2":{"261":1,"265":1,"280":1,"365":1,"403":1}}],["особенного",{"2":{"393":1}}],["особенностей",{"2":{"331":1,"335":1,"384":1}}],["особенностью",{"2":{"330":1}}],["особенность",{"2":{"121":1,"451":1}}],["особенно",{"2":{"109":1,"128":1,"171":1,"213":1,"299":1,"304":1,"324":1,"327":1,"335":1,"337":1,"382":1,"397":1,"450":1,"496":1}}],["особого",{"2":{"258":1,"321":1}}],["особому",{"2":{"256":1}}],["особое",{"2":{"125":1,"256":1}}],["особо",{"2":{"63":1}}],["основополагающих",{"2":{"334":1}}],["основополагающим",{"2":{"135":1}}],["основу",{"2":{"254":1,"294":1,"431":1}}],["основательным",{"2":{"449":1}}],["основателя",{"2":{"202":1}}],["основа",{"2":{"159":1,"429":1}}],["основано",{"2":{"429":1}}],["основанное",{"2":{"409":1}}],["основанного",{"2":{"318":1,"407":1}}],["основанные",{"2":{"448":1}}],["основанным",{"2":{"223":1}}],["основанный",{"2":{"213":1,"217":1}}],["основанных",{"2":{"128":1}}],["основана",{"2":{"303":1}}],["основан",{"2":{"165":1,"245":1,"264":1,"419":1}}],["основаны",{"2":{"139":1,"160":1,"263":1,"431":1}}],["основании",{"2":{"81":1,"328":1,"391":1}}],["основ",{"2":{"158":1,"325":1,"363":1,"409":1,"460":1}}],["основе",{"2":{"138":1,"139":1,"151":1,"163":1,"203":1,"214":1,"220":1,"228":1,"239":1,"243":1,"249":1,"266":1,"278":1,"355":1,"375":1,"394":3,"411":1,"427":1,"430":1,"449":1}}],["основываясь",{"2":{"289":1,"324":1}}],["основы",{"2":{"136":1,"212":1,"326":1,"338":1,"372":1}}],["основную",{"2":{"236":1,"345":1}}],["основная",{"2":{"34":1,"64":1,"122":1,"125":1,"151":1,"162":1,"164":1,"172":1,"178":1,"181":1,"191":1,"194":1,"201":1,"222":1,"249":1,"250":1,"254":1,"302":1,"311":1,"327":1}}],["основное",{"0":{"342":1},"1":{"343":1,"344":1},"2":{"267":1,"284":1,"318":1,"334":1,"355":1,"449":1}}],["основной",{"2":{"35":1,"110":1,"164":1,"187":1,"194":2,"200":1,"215":1,"218":1,"221":2,"233":1,"245":1,"251":1,"260":1,"263":2,"278":1,"335":2,"355":1,"384":1,"426":1,"444":1,"449":1,"458":1}}],["основного",{"2":{"29":2,"105":1,"221":1,"325":1,"356":1}}],["основном",{"2":{"10":1,"123":1,"151":1,"161":1,"166":1,"177":1,"180":1,"181":1,"186":1,"190":1,"210":1,"212":1,"228":1,"233":1,"244":1,"245":1,"260":1,"321":1,"322":1,"331":1,"347":1,"386":1,"400":1,"495":1}}],["основным",{"2":{"140":1,"187":1,"268":1,"272":1}}],["основными",{"2":{"39":1,"160":1,"269":1}}],["основные",{"0":{"28":1},"1":{"29":1,"30":1,"31":1,"32":1},"2":{"23":1,"58":1,"68":1,"87":1,"106":1,"136":1,"167":1,"274":1,"279":1,"385":1,"394":1,"433":1,"450":1,"452":1,"485":1}}],["основных",{"2":{"17":1,"63":1,"68":1,"110":1,"186":1,"290":1,"422":1,"450":1}}],["о",{"0":{"126":1,"451":1},"1":{"127":1},"2":{"4":1,"10":1,"11":3,"31":1,"57":1,"67":1,"81":1,"110":1,"118":1,"119":1,"121":1,"125":2,"128":1,"136":4,"138":1,"139":1,"140":2,"141":1,"142":1,"143":1,"160":2,"162":1,"171":1,"177":1,"179":3,"181":3,"191":1,"194":1,"195":1,"196":1,"210":2,"214":1,"215":1,"216":1,"222":1,"223":1,"236":1,"239":1,"242":2,"248":1,"256":4,"257":1,"263":2,"265":2,"269":2,"275":1,"279":1,"285":2,"290":2,"292":1,"300":1,"304":2,"330":1,"331":1,"332":1,"355":3,"364":1,"371":1,"382":1,"384":1,"387":1,"389":1,"390":2,"395":1,"398":2,"402":1,"408":2,"410":1,"411":1,"413":1,"418":6,"420":1,"426":1,"428":1,"429":2,"431":1,"438":1,"442":1,"448":2,"451":2,"461":2,"470":1,"486":1,"542":1}}],["окошко",{"2":{"336":1}}],["окончательный",{"2":{"406":1}}],["окончательные",{"2":{"127":1}}],["окончательном",{"2":{"221":1}}],["окончания",{"2":{"411":1}}],["окончании",{"2":{"217":1,"290":1}}],["окончанием",{"2":{"171":1}}],["окажется",{"2":{"250":1}}],["оказывается",{"2":{"205":1}}],["оказывают",{"2":{"197":1}}],["оказание",{"2":{"73":1}}],["оказать",{"2":{"68":1}}],["оказаться",{"2":{"4":1,"214":1,"264":1}}],["оказалось",{"2":{"61":1}}],["окне",{"2":{"179":1,"189":1,"206":1,"256":1,"416":1}}],["окном",{"2":{"436":1}}],["окно",{"2":{"177":1,"188":1,"206":1,"214":1,"233":1,"251":1,"288":1,"401":1,"413":1,"415":1,"425":1,"492":1}}],["окна",{"2":{"163":1,"165":1,"169":2,"170":1,"179":1,"260":1,"263":1,"272":1,"284":2,"288":1,"301":2,"355":1,"425":1,"542":1}}],["окружности",{"2":{"182":1}}],["окружению",{"2":{"435":1}}],["окружения",{"2":{"435":1,"439":1,"495":1}}],["окружений",{"2":{"435":1}}],["окружении",{"2":{"179":1,"384":1}}],["окружение",{"2":{"151":1,"414":1}}],["окружающей",{"2":{"284":1}}],["окружающим",{"2":{"3":1,"34":1}}],["окружает",{"2":{"142":2}}],["опен",{"2":{"460":1}}],["оперировать",{"2":{"330":1,"391":1}}],["оперирующие",{"2":{"39":1}}],["оперируют",{"2":{"3":1}}],["оперативной",{"2":{"444":1}}],["оператора",{"2":{"357":1}}],["оператор",{"2":{"290":1,"386":1}}],["операцией",{"2":{"278":1}}],["операциям",{"2":{"397":1}}],["операциями",{"2":{"301":1,"337":1}}],["операциях",{"2":{"355":1}}],["операция",{"2":{"248":1,"250":1,"278":1,"330":2,"336":1,"396":2}}],["операции",{"2":{"179":1,"244":1,"247":1,"273":1,"274":1,"275":1,"278":1,"316":2,"331":2,"335":3,"336":1,"337":1,"355":1,"384":1,"391":1,"394":2,"395":2,"396":2,"397":5,"408":1,"427":1}}],["операцию",{"2":{"171":1,"207":1,"299":1,"335":1,"337":2}}],["операций",{"2":{"147":1,"236":1,"251":2,"329":2,"335":2,"336":1,"337":2,"357":2,"394":1,"397":1,"422":1,"429":1,"448":1}}],["операционные",{"2":{"256":1}}],["операционных",{"2":{"256":1,"263":1,"403":1}}],["операционными",{"2":{"254":1,"256":1}}],["операционной",{"2":{"135":1,"256":3,"258":1,"261":1,"355":1,"365":1,"422":1}}],["операционная",{"2":{"128":1,"256":1}}],["операционную",{"2":{"128":1}}],["опираться",{"2":{"416":1}}],["опираясь",{"2":{"331":1}}],["описательная",{"2":{"273":1}}],["описательные",{"0":{"261":1},"2":{"261":1}}],["описательным",{"2":{"254":1,"258":1,"281":1}}],["описать",{"2":{"142":1}}],["описан",{"2":{"435":1}}],["описанная",{"2":{"390":1}}],["описанных",{"2":{"196":1,"213":1,"300":1}}],["описанным",{"2":{"79":1}}],["описаны",{"2":{"111":1,"117":1,"138":1}}],["описаний",{"2":{"222":1}}],["описании",{"2":{"196":1}}],["описания",{"2":{"67":1,"112":1,"143":1,"189":1,"222":1,"258":1,"411":1,"416":1}}],["описанию",{"2":{"48":1}}],["описание",{"0":{"494":1},"2":{"47":1,"63":1,"67":3,"83":1,"86":1,"102":1,"103":1,"125":1,"142":1,"151":1,"205":1,"220":1,"222":2,"242":1,"261":1,"310":1,"385":1,"411":2,"461":1}}],["описанием",{"2":{"11":1,"173":1,"261":1}}],["описываются",{"2":{"485":1}}],["описывающий",{"2":{"395":1}}],["описывающие",{"2":{"143":1}}],["описывайте",{"2":{"458":1}}],["описывает",{"2":{"68":2}}],["описываться",{"2":{"60":1}}],["оповестить",{"2":{"451":1}}],["оповещение",{"2":{"356":1}}],["оповещения",{"2":{"325":1,"347":2}}],["оповещает",{"2":{"325":1}}],["опору",{"2":{"171":1}}],["опытным",{"2":{"496":1}}],["опытный",{"2":{"460":1}}],["опытных",{"2":{"109":1,"165":1,"381":1,"485":2}}],["опытному",{"2":{"460":1,"495":1}}],["опыту",{"2":{"172":1,"299":1,"306":1,"384":1}}],["опытом",{"2":{"162":1}}],["опыт",{"2":{"136":1,"142":1,"162":1,"181":1,"197":1,"210":1,"336":1,"460":3,"461":1,"484":2,"543":1}}],["опыта",{"2":{"109":1,"140":1,"160":1,"197":1,"210":1,"341":1,"380":1,"388":1,"410":1}}],["опционально",{"2":{"261":1,"483":1}}],["опциональными",{"2":{"258":1}}],["опция",{"2":{"214":2,"215":1,"299":1,"425":1}}],["опциями",{"2":{"100":1,"111":1,"135":1,"170":2,"265":1,"289":1,"398":1,"489":1}}],["опцию",{"2":{"199":1,"206":1,"230":1,"410":1,"418":1}}],["опций",{"2":{"135":1,"170":1,"191":3,"192":2,"204":1,"215":1,"218":1,"416":1,"530":1}}],["опции",{"0":{"128":1,"219":1,"529":1,"530":1},"1":{"129":1,"130":1,"131":1,"132":1,"133":1,"530":1,"531":1,"532":1,"533":1},"2":{"16":1,"135":1,"142":1,"143":1,"189":1,"219":1,"283":1,"398":1,"448":1,"489":1}}],["опубликовывать",{"2":{"325":1}}],["опубликовала",{"2":{"354":1}}],["опубликовал",{"2":{"171":1}}],["опубликовать",{"2":{"86":1,"122":1,"326":1,"345":1,"379":1}}],["опускаю",{"2":{"289":1}}],["опустил",{"2":{"273":1}}],["опустили",{"2":{"249":1}}],["опустим",{"2":{"269":1}}],["опустить",{"2":{"9":1,"355":1}}],["опущено",{"2":{"289":1}}],["опущены",{"2":{"235":1,"248":1,"263":1}}],["оптимизируют",{"2":{"408":1}}],["оптимизируя",{"2":{"68":1}}],["оптимизирован",{"2":{"278":1}}],["оптимизировать",{"2":{"141":1,"215":1,"407":1}}],["оптимизаций",{"2":{"141":1,"384":1}}],["оптимизация",{"2":{"79":1,"461":1}}],["оптимизации",{"2":{"48":1,"184":1,"384":1}}],["опять",{"2":{"55":1,"128":1,"326":1,"342":1,"344":1,"351":1,"416":1,"429":1}}],["оправдали",{"2":{"420":1}}],["оправдан",{"2":{"121":1}}],["оправдывает",{"2":{"397":1}}],["опробованы",{"2":{"61":1}}],["опрятностью",{"2":{"17":1}}],["определённых",{"2":{"452":1}}],["определите",{"2":{"289":1}}],["определиться",{"2":{"139":1}}],["определить",{"2":{"16":1,"67":1,"115":1,"166":1,"182":1,"222":1,"232":1,"236":1,"239":1,"251":1,"264":1,"281":1,"289":2,"294":1,"363":1,"396":1,"405":1}}],["определил",{"2":{"233":1,"236":1}}],["определились",{"2":{"281":1,"289":1}}],["определили",{"2":{"157":1,"224":1,"272":1}}],["определим",{"2":{"221":2,"271":1}}],["определяя",{"2":{"350":1}}],["определяю",{"2":{"143":1}}],["определяют",{"2":{"140":2,"143":2,"279":1}}],["определяются",{"2":{"67":1}}],["определяющая",{"2":{"260":1}}],["определяющим",{"2":{"290":1,"389":1}}],["определяющих",{"2":{"261":1}}],["определяющий",{"2":{"215":1,"397":1}}],["определяющие",{"2":{"139":1,"142":2}}],["определяющую",{"2":{"125":1}}],["определять",{"2":{"115":1,"143":1,"216":1,"236":1,"281":1,"355":1}}],["определяемой",{"2":{"278":1}}],["определяемого",{"2":{"147":1}}],["определяемое",{"2":{"68":1}}],["определяем",{"2":{"140":2,"182":1,"222":1,"233":1,"236":1,"239":1,"263":1,"289":1,"350":1,"392":2,"396":1}}],["определяете",{"2":{"142":1,"449":1}}],["определяется",{"2":{"106":1,"143":1,"264":1,"391":1}}],["определяет",{"2":{"68":1,"106":1,"138":1,"139":1,"140":1,"142":1,"169":1,"215":1,"260":1,"263":1,"311":1,"314":1,"325":2}}],["определены",{"2":{"168":1,"233":1,"278":1,"279":1,"545":1}}],["определено",{"2":{"151":1,"411":1}}],["определен",{"2":{"143":1,"239":1,"389":1,"412":1}}],["определений",{"2":{"279":1}}],["определении",{"2":{"184":1,"239":2,"251":1,"278":1,"279":1}}],["определение",{"0":{"232":1,"238":1,"272":1,"273":1,"274":1},"1":{"233":1,"234":1},"2":{"126":1,"162":1,"236":1,"239":2,"280":1,"283":1,"329":1,"351":1,"449":1,"495":1}}],["определением",{"2":{"113":1,"162":1,"235":1,"277":1,"285":1,"289":1}}],["определению",{"2":{"118":1,"139":1,"239":2,"275":1}}],["определения",{"2":{"3":1,"139":1,"183":1,"198":1,"222":1,"237":2,"239":1,"253":1,"263":2,"276":1,"279":3,"280":1,"283":1,"344":1,"351":1,"384":1,"452":1}}],["определенную",{"2":{"215":1,"244":1,"250":1,"256":1,"430":1}}],["определенный",{"2":{"247":1,"249":1,"264":1,"300":1,"321":1,"350":1,"391":1}}],["определенных",{"2":{"168":1,"228":1,"245":1,"256":1,"449":1,"495":1}}],["определенными",{"2":{"127":1,"142":1,"143":2,"163":1,"271":1,"495":1,"496":1}}],["определенным",{"2":{"106":1,"107":1,"331":1,"388":1}}],["определенные",{"2":{"83":1,"139":1,"140":1,"143":1,"194":1,"217":1,"239":1,"274":1,"283":1,"299":1,"305":1,"417":1,"426":1,"429":1}}],["определенном",{"2":{"263":1}}],["определенному",{"2":{"41":1,"107":1,"139":1,"411":1}}],["определенное",{"2":{"263":1,"345":1}}],["определенного",{"2":{"7":1,"219":1,"250":1,"331":1,"448":1}}],["определенной",{"2":{"7":1,"11":1,"192":1,"427":1,"492":2}}],["оплаты",{"2":{"4":1,"12":1,"79":1,"205":1}}],["обёртку",{"2":{"492":1}}],["обзора",{"2":{"360":1}}],["обзор",{"2":{"340":1,"354":1,"445":1}}],["обхода",{"2":{"305":1,"402":1}}],["обходимся",{"2":{"23":1}}],["обиход",{"2":{"303":1}}],["обучающие",{"2":{"460":2}}],["обучающего",{"2":{"223":1}}],["обучение",{"2":{"223":1,"459":1,"460":1}}],["обучением",{"2":{"160":1}}],["обучения",{"2":{"62":1,"160":1}}],["обман",{"2":{"461":1}}],["обмануть",{"2":{"198":1,"199":1}}],["обманных",{"2":{"197":1}}],["обменять",{"2":{"247":1}}],["обмена",{"2":{"236":1,"244":1,"245":3,"259":1,"340":1,"348":1,"360":1,"385":1,"391":1,"429":1}}],["обмену",{"2":{"143":1,"344":1}}],["обмен",{"2":{"135":1,"244":1,"245":1,"280":1}}],["обмениваются",{"2":{"340":1}}],["обмениваться",{"2":{"41":1,"284":1,"286":1}}],["обменивается",{"2":{"3":1}}],["обсуждение",{"2":{"449":1}}],["обсуждать",{"2":{"285":1}}],["обсуждали",{"2":{"256":1}}],["обсуждается",{"2":{"163":1}}],["обсервер",{"2":{"294":1}}],["обслуживается",{"2":{"214":1}}],["обслуживании",{"2":{"219":1,"323":1,"377":1}}],["обслуживанием",{"2":{"331":1}}],["обслуживание",{"2":{"135":1,"162":1,"257":1}}],["обслуживания",{"2":{"126":1,"128":1,"132":1,"136":1,"264":1,"329":1,"398":1,"402":1}}],["обслуживать",{"2":{"128":1,"303":1}}],["обслуживаться",{"2":{"126":1,"256":1}}],["обстоятельствах",{"2":{"192":1}}],["обстоятельств",{"2":{"12":1}}],["общая",{"2":{"205":1,"298":1}}],["общую",{"2":{"143":1,"162":1,"254":1,"273":1,"277":1}}],["общепризнанная",{"2":{"485":1}}],["общедоступным",{"2":{"251":1}}],["общее",{"2":{"222":1,"342":1,"390":1,"484":1}}],["общения",{"2":{"209":1}}],["общение",{"2":{"109":1,"340":1,"467":1}}],["общего",{"2":{"165":1,"297":1,"331":1,"390":1,"496":2}}],["общей",{"2":{"139":1,"187":1,"193":1,"273":1,"279":1,"297":1,"355":1,"384":1,"448":1}}],["общем",{"2":{"124":1,"139":1,"228":1,"284":1,"297":1}}],["общим",{"2":{"348":1}}],["общих",{"2":{"139":2,"171":1,"363":1}}],["общий",{"2":{"68":1,"135":1,"157":1,"160":1,"249":1,"271":1,"324":1,"348":1,"380":1,"388":1}}],["общие",{"0":{"78":1,"173":1,"185":1,"193":1},"1":{"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1,"194":1,"195":1,"196":1,"197":1},"2":{"68":1,"78":1,"86":1,"176":1,"224":1,"242":1,"243":1,"253":1,"380":2,"437":1}}],["оба",{"2":{"107":1,"242":1,"278":1,"324":1,"336":1,"384":1,"402":1,"430":1,"443":1,"527":1}}],["обновят",{"2":{"423":2}}],["обновим",{"2":{"358":1}}],["обновилось",{"2":{"330":1}}],["обновить",{"2":{"264":1,"414":1}}],["обновится",{"2":{"214":1,"451":1}}],["обновлено",{"2":{"280":1}}],["обновлении",{"2":{"329":1,"355":1,"356":1,"451":1}}],["обновлением",{"2":{"220":1}}],["обновление",{"2":{"145":1,"223":1,"330":1,"354":1,"435":1,"451":1}}],["обновления",{"2":{"135":2,"214":1,"236":1,"256":1,"301":1,"394":1}}],["обновляют",{"2":{"397":1}}],["обновлять",{"2":{"250":1,"290":1}}],["обновляться",{"2":{"231":2,"450":1}}],["обновляется",{"2":{"237":2,"290":1}}],["обновляет",{"2":{"106":1,"222":1,"236":1,"284":1,"331":1}}],["обновляем",{"2":{"88":1,"291":1}}],["обнаружении",{"2":{"429":1}}],["обнаружения",{"2":{"114":2,"228":1,"236":2,"301":1}}],["обнаружились",{"2":{"461":1}}],["обнаружили",{"2":{"304":1,"384":1}}],["обнаружить",{"2":{"283":1,"453":1}}],["обнаружите",{"2":{"215":1}}],["обнаруживает",{"2":{"263":1,"430":1}}],["обнаруживаем",{"2":{"214":1}}],["обнуляет",{"2":{"106":1}}],["обязательная",{"2":{"492":1}}],["обязательно",{"2":{"278":1,"460":2}}],["обязательной",{"2":{"214":1}}],["обязательные",{"2":{"246":1,"295":1}}],["обязательными",{"2":{"157":1}}],["обязательным",{"2":{"143":1,"354":1}}],["обязательных",{"2":{"23":1}}],["обязанность",{"2":{"209":1}}],["обязанности",{"2":{"162":1}}],["обязаны",{"2":{"64":1}}],["объявим",{"2":{"349":1}}],["объявивший",{"2":{"342":1}}],["объявили",{"2":{"221":1,"222":1}}],["объявить",{"2":{"142":1,"277":1}}],["объявляя",{"2":{"347":1}}],["объявляют",{"2":{"143":2}}],["объявлять",{"2":{"113":1,"143":1,"222":1,"276":1}}],["объявляете",{"2":{"384":1}}],["объявляется",{"2":{"108":1,"143":1,"144":1}}],["объявляем",{"2":{"112":1,"132":2,"140":1,"143":1,"222":1,"245":1,"290":1,"321":1,"322":1,"326":1,"330":3,"332":1,"343":1,"349":1,"351":1,"352":1,"357":1,"400":1}}],["объявлены",{"2":{"449":1}}],["объявления",{"2":{"208":1,"337":1}}],["объявление",{"2":{"108":1,"278":1,"280":2,"337":1}}],["объявлено",{"2":{"150":1}}],["объявленным",{"2":{"143":1}}],["объявленного",{"2":{"108":1}}],["объяснить",{"2":{"228":2,"460":1}}],["объяснимо",{"2":{"429":1}}],["объясним",{"2":{"221":1,"409":1}}],["объяснению",{"2":{"461":1}}],["объяснения",{"2":{"200":1}}],["объяснение",{"2":{"63":1,"83":1}}],["объясняющие",{"2":{"304":1}}],["объясняя",{"2":{"124":1}}],["объясняет",{"2":{"67":1,"460":1}}],["объем",{"2":{"222":1,"305":1}}],["объемном",{"2":{"202":1}}],["объему",{"2":{"47":1}}],["объединению",{"2":{"420":1}}],["объединением",{"2":{"420":1}}],["объединение",{"2":{"17":1,"68":1,"249":1,"250":1}}],["объединены",{"2":{"297":1}}],["объединен",{"2":{"215":1}}],["объединяющие",{"2":{"408":1}}],["объединяются",{"2":{"125":1,"162":1}}],["объединяет",{"2":{"250":1,"411":1}}],["объединять",{"2":{"16":1,"421":3}}],["объединить",{"2":{"95":1,"428":1}}],["объективная",{"2":{"485":1}}],["объективных",{"2":{"12":1}}],["объекту",{"2":{"143":1,"177":1,"216":1,"233":1,"239":1,"283":1,"320":2,"321":1,"323":1,"327":1,"329":1,"331":1,"355":1}}],["объектах",{"2":{"321":1,"448":1}}],["объекта",{"2":{"143":2,"146":1,"148":1,"239":1,"279":2,"281":1,"290":2,"301":1,"311":1,"318":1,"319":1,"320":1,"321":1,"323":1,"327":1,"329":2,"330":4,"331":4,"332":1,"334":2,"349":1,"352":1,"355":1,"357":2,"358":1,"395":2,"400":1,"402":1,"413":1,"415":1,"448":2,"449":1,"451":1,"452":1}}],["объектами",{"2":{"308":1,"325":1,"329":1,"348":1,"448":1}}],["объектам",{"2":{"108":2,"114":2,"384":1}}],["объектом",{"2":{"143":1,"233":1,"314":1,"325":1,"326":1,"329":1,"330":1,"334":1,"349":2,"355":1,"357":1,"402":1}}],["объектов",{"2":{"17":1,"114":1,"157":1,"259":1,"261":2,"290":1,"298":1,"307":1,"324":1,"329":1,"355":1,"357":1,"402":1,"448":1}}],["объекты",{"2":{"115":1,"143":2,"149":1,"154":1,"216":1,"222":1,"242":2,"279":1,"281":1,"342":1,"354":1,"355":1,"385":1,"402":1,"411":1,"448":1,"449":1,"451":1}}],["объект",{"0":{"232":1},"1":{"233":1,"234":1},"2":{"94":1,"95":1,"111":1,"113":2,"114":6,"140":3,"142":1,"143":9,"233":3,"236":2,"238":1,"239":3,"240":1,"242":3,"243":1,"245":3,"246":2,"251":4,"259":1,"261":1,"265":1,"277":1,"278":1,"279":3,"281":2,"283":1,"284":1,"286":1,"289":2,"290":2,"298":1,"311":1,"312":1,"314":2,"316":2,"322":3,"323":1,"324":1,"325":2,"326":1,"328":1,"329":5,"330":6,"331":2,"334":2,"337":3,"342":1,"345":1,"347":1,"348":2,"350":1,"351":5,"352":1,"354":1,"355":3,"357":5,"358":2,"385":1,"391":1,"395":2,"396":2,"398":1,"402":1,"411":1,"415":2,"416":1,"448":2}}],["объекте",{"2":{"94":1,"140":1,"239":1,"263":1,"320":1,"385":1,"448":1,"460":1}}],["объектным",{"2":{"452":1}}],["объектный",{"2":{"314":1,"322":1}}],["объектные",{"2":{"17":1}}],["объектной",{"2":{"384":1}}],["объектного",{"2":{"329":1}}],["объектно",{"2":{"3":1,"142":1,"298":1,"451":1,"452":1}}],["об",{"2":{"61":1,"125":1,"139":1,"141":1,"143":2,"149":1,"169":1,"170":1,"171":1,"179":1,"202":1,"215":1,"243":1,"245":1,"263":1,"280":1,"281":1,"284":1,"304":1,"315":1,"316":1,"319":1,"325":1,"334":1,"351":1,"356":1,"390":1,"402":1,"425":1,"428":1,"437":1,"451":2,"460":1}}],["образец",{"2":{"435":1}}],["образу",{"2":{"139":1}}],["образованную",{"2":{"245":1}}],["образовательный",{"2":{"64":1}}],["образом",{"2":{"17":1,"36":1,"106":2,"107":1,"117":1,"125":2,"126":1,"141":2,"148":2,"164":1,"167":1,"170":1,"183":2,"196":1,"202":1,"203":1,"216":1,"217":3,"219":3,"220":1,"221":1,"222":2,"229":1,"231":1,"233":1,"237":2,"239":1,"244":1,"251":1,"263":1,"264":1,"265":1,"271":1,"272":2,"275":1,"277":1,"280":2,"281":3,"283":1,"284":1,"288":1,"289":2,"290":1,"301":1,"315":1,"318":1,"321":2,"323":1,"328":1,"329":2,"331":1,"332":1,"334":1,"336":1,"337":2,"342":1,"345":1,"346":1,"385":2,"396":1,"398":2,"399":1,"408":1,"410":2,"413":1,"414":1,"416":1,"418":1,"419":2,"423":1,"428":1,"429":1,"459":1,"500":1}}],["обработать",{"2":{"397":1}}],["обработана",{"2":{"151":1,"395":1}}],["обработчика",{"2":{"356":1}}],["обработчиком",{"2":{"330":1}}],["обработчиков",{"2":{"114":1}}],["обработчике",{"2":{"330":1}}],["обработчики",{"2":{"329":1}}],["обработчик",{"2":{"321":1,"357":1,"392":1}}],["обработке",{"2":{"384":1,"452":1}}],["обработкой",{"2":{"301":1}}],["обработка",{"2":{"248":1,"384":2,"402":1,"452":1}}],["обработку",{"2":{"171":1,"244":1,"256":1,"348":1,"384":1}}],["обработки",{"2":{"132":1,"139":1,"219":1,"243":1,"244":1,"290":1,"321":1,"326":1,"327":2,"328":1,"334":1,"336":1,"384":1,"392":1}}],["обрабатываем",{"2":{"385":2}}],["обрабатывает",{"2":{"244":1,"284":1,"316":2}}],["обрабатывается",{"2":{"118":1}}],["обрабатывают",{"2":{"278":1}}],["обрабатываются",{"2":{"67":1,"402":1,"460":1}}],["обрабатывающий",{"2":{"245":1}}],["обрабатывать",{"2":{"215":1,"221":1,"228":1,"248":1,"329":1,"336":1,"347":1,"387":1,"398":1,"440":1,"461":2}}],["обрабатываться",{"2":{"215":1,"328":1}}],["обратимся",{"2":{"349":1}}],["обратился",{"2":{"201":1}}],["обратит",{"2":{"208":1}}],["обратитесь",{"2":{"119":1,"387":1}}],["обратите",{"2":{"113":1,"114":1,"127":1,"130":1,"140":3,"142":1,"143":1,"166":1,"167":1,"191":1,"194":1,"196":1,"215":1,"221":2,"222":3,"233":2,"239":1,"245":1,"249":1,"280":1,"289":1,"290":3,"315":1,"330":2,"335":1,"337":1,"344":1,"347":1,"351":1,"354":1,"384":1,"386":1,"395":1,"398":1,"411":1,"413":1,"416":3,"426":1}}],["обратиться",{"2":{"151":1,"265":1,"383":1}}],["обратить",{"2":{"96":1,"138":1,"139":1,"178":1,"196":1,"199":1,"236":1,"325":1,"384":1}}],["обратных",{"2":{"337":1}}],["обратными",{"2":{"337":1}}],["обратный",{"0":{"335":1},"1":{"336":1},"2":{"335":1}}],["обратные",{"2":{"294":1}}],["обратную",{"2":{"125":1,"171":1,"329":1}}],["обратная",{"2":{"116":1}}],["обратное",{"2":{"330":1}}],["обратном",{"2":{"281":1}}],["обратного",{"2":{"131":1,"335":3,"336":1,"337":3,"386":1,"402":1}}],["обратной",{"2":{"73":1,"143":1,"181":1,"228":1,"238":1,"284":1,"382":1,"407":1}}],["обратно",{"2":{"44":1,"106":1,"176":1,"247":1,"329":1,"355":1,"384":1,"399":1}}],["обращаясь",{"2":{"415":1}}],["обращающегося",{"2":{"385":1}}],["обращаются",{"2":{"278":1,"355":1}}],["обращались",{"2":{"384":1}}],["обращаемся",{"2":{"354":1,"391":1,"392":1,"415":1}}],["обращается",{"2":{"108":1,"215":1,"228":1}}],["обращаешься",{"2":{"107":1}}],["обращаться",{"2":{"52":1,"107":1,"138":1,"215":1,"216":1,"222":1,"233":1,"256":1,"342":1,"349":1,"355":2,"356":1,"402":2,"416":1,"460":1}}],["обращений",{"2":{"315":1,"357":2,"391":1,"500":1}}],["обращения",{"2":{"143":1,"264":1,"402":1,"461":1,"500":1}}],["обращении",{"2":{"107":1,"386":1,"461":2}}],["обращением",{"2":{"498":1}}],["обращение",{"2":{"41":1,"236":1}}],["обложка",{"2":{"162":1}}],["обладают",{"2":{"267":1}}],["обладает",{"2":{"139":1}}],["область",{"2":{"186":1,"192":1,"235":1,"249":1,"264":2,"289":2,"405":1}}],["областью",{"2":{"183":1}}],["области",{"2":{"128":1,"143":2,"160":1,"184":2,"194":1,"263":1,"296":1,"305":1,"410":1,"449":1}}],["облачном",{"2":{"433":1,"439":1}}],["облачное",{"2":{"107":1}}],["облачные",{"2":{"251":1,"439":1}}],["облачных",{"2":{"39":1,"107":1}}],["облегчили",{"2":{"451":1}}],["облегчит",{"2":{"392":1,"454":1}}],["облегчения",{"2":{"382":1,"492":1}}],["облегчен",{"2":{"29":1}}],["облегчающего",{"2":{"420":1}}],["облегчают",{"2":{"408":1}}],["облегчат",{"2":{"215":1,"382":1}}],["облегчать",{"2":{"23":1}}],["облегчает",{"2":{"3":1,"167":1,"299":1}}],["обычная",{"2":{"125":1,"199":1,"258":1,"428":1}}],["обычное",{"2":{"256":2,"461":1}}],["обычном",{"2":{"143":1,"216":1,"320":1,"325":1,"337":1,"338":1,"411":1,"412":1}}],["обычной",{"2":{"93":1,"106":1,"408":1,"451":1}}],["обычного",{"2":{"39":1,"57":1,"139":1,"142":1,"164":1,"166":1,"176":1,"189":1,"256":1,"335":1,"336":2,"337":1,"395":1}}],["обычно",{"2":{"28":1,"30":1,"50":1,"103":1,"106":1,"109":1,"125":1,"128":3,"131":1,"135":1,"139":1,"141":1,"151":1,"163":1,"176":1,"177":1,"183":3,"185":1,"186":1,"187":1,"189":1,"196":1,"200":1,"206":1,"212":1,"245":1,"250":1,"260":1,"261":1,"272":2,"273":1,"275":1,"284":1,"290":1,"327":1,"330":1,"384":1,"388":2,"391":1,"425":1,"429":1,"438":1,"448":1,"449":2,"450":1,"451":1,"460":1,"461":1,"495":1,"524":1}}],["обычным",{"2":{"213":1,"216":1,"415":1,"461":1}}],["обычными",{"2":{"94":1,"218":1,"348":1,"440":1}}],["обычный",{"2":{"142":2,"174":1,"214":1,"291":1,"314":1,"342":1,"388":1,"415":1,"426":1,"443":1}}],["обычных",{"2":{"22":1,"157":1,"226":1,"256":1,"414":1,"461":1}}],["обычные",{"2":{"17":1,"283":1,"331":1,"354":1,"427":1,"451":1}}],["обещанных",{"2":{"337":1}}],["обещанной",{"2":{"337":2}}],["обещаний",{"2":{"337":2}}],["обещаниe",{"0":{"337":1}}],["обещаниями",{"2":{"337":1}}],["обещания",{"2":{"289":2,"336":1,"337":4,"391":1,"396":1}}],["обещание",{"2":{"278":1,"288":2,"289":1,"337":2,"391":1,"400":1}}],["оберток",{"2":{"461":1}}],["обертывания",{"2":{"337":1}}],["обертку",{"2":{"415":1,"416":1,"500":1}}],["обертка",{"2":{"105":1,"151":1,"451":1}}],["обертки",{"0":{"454":1},"2":{"23":1,"221":1,"222":1,"394":1,"415":1,"416":2,"454":1,"461":1}}],["обернуть",{"2":{"315":1,"336":1,"337":1,"348":1,"412":1,"452":1}}],["обернутых",{"2":{"416":1}}],["обернуты",{"2":{"300":1}}],["обернутый",{"2":{"151":1}}],["обернутую",{"2":{"284":1}}],["обернем",{"2":{"222":1,"345":1,"356":1}}],["обеспечат",{"2":{"275":1,"439":1}}],["обеспечьте",{"2":{"171":1}}],["обеспечит",{"2":{"407":1}}],["обеспечить",{"2":{"139":1,"172":1,"183":1,"315":1,"326":1,"380":1}}],["обеспечим",{"2":{"393":1}}],["обеспечивая",{"2":{"181":1,"256":1}}],["обеспечивает",{"2":{"138":1,"143":1,"213":2,"223":1,"228":1,"235":1,"245":1,"278":1,"327":1,"336":1,"342":1,"418":1}}],["обеспечивается",{"2":{"135":1,"535":1}}],["обеспечивающая",{"2":{"394":1}}],["обеспечивающие",{"2":{"125":2,"403":1,"405":1}}],["обеспечивают",{"2":{"121":1,"277":1,"355":1,"393":1}}],["обеспечении",{"2":{"170":1,"297":1}}],["обеспечению",{"2":{"128":1,"365":1,"403":1,"407":1}}],["обеспечением",{"2":{"162":1,"407":1,"418":1}}],["обеспечение",{"2":{"124":1,"128":2,"160":1,"162":2,"208":1,"363":1,"365":1,"388":1,"405":1,"407":2,"420":1}}],["обеспечения",{"0":{"294":1,"295":1,"305":1,"371":1},"1":{"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"306":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,"334":1,"335":1,"336":1,"337":1,"338":1,"339":1},"2":{"66":1,"68":1,"76":1,"109":1,"116":1,"138":1,"139":1,"151":1,"160":1,"162":1,"168":1,"170":1,"208":1,"216":1,"220":1,"225":1,"269":1,"273":1,"277":1,"284":2,"294":1,"295":2,"303":1,"304":1,"305":1,"335":1,"338":1,"345":1,"356":1,"371":2,"382":1,"389":1,"405":4,"407":2,"409":1,"420":2,"430":1,"450":1}}],["обе",{"2":{"111":1,"162":1,"263":1,"355":1,"417":1,"428":1}}],["обеих",{"2":{"9":1,"428":1}}],["обобщение",{"2":{"496":1}}],["обобщить",{"2":{"211":1}}],["оболочку",{"2":{"461":1}}],["оболочки",{"2":{"436":1}}],["обоснование",{"0":{"495":1}}],["обоснования",{"2":{"452":1}}],["обоснованное",{"2":{"203":1}}],["обоих",{"2":{"315":1,"355":2,"357":1,"410":1,"536":1}}],["обоими",{"2":{"273":1}}],["обоюдоострым",{"2":{"207":1}}],["обоюдная",{"2":{"64":1}}],["обо",{"2":{"165":1}}],["обороты",{"2":{"250":1}}],["оборудовании",{"2":{"160":1,"256":1}}],["оборудование",{"2":{"128":1}}],["оборачивайте",{"2":{"459":1}}],["оборачивает",{"2":{"387":1}}],["оборачивать",{"2":{"96":1,"337":1}}],["оборачивая",{"2":{"23":1}}],["обозначить",{"2":{"263":1,"272":1}}],["обозначение",{"2":{"233":1,"283":1}}],["обозначениях",{"2":{"242":1}}],["обозначения",{"2":{"125":1,"189":1,"239":1,"289":1}}],["обозначают",{"2":{"222":1}}],["обозначаются",{"2":{"154":1,"175":1}}],["обозначающий",{"2":{"165":1}}],["обозначается",{"2":{"183":1}}],["обозначает",{"2":{"125":1,"297":1}}],["обойтись",{"2":{"23":1,"213":1,"219":1}}],["обширен",{"2":{"13":1}}],["оно",{"2":{"130":1,"139":1,"143":1,"165":1,"172":1,"177":1,"179":2,"190":1,"191":2,"195":1,"214":1,"220":1,"223":1,"233":1,"239":1,"245":1,"254":1,"256":3,"260":1,"278":1,"281":1,"291":1,"326":1,"337":2,"339":1,"350":1,"351":1,"358":1,"386":2,"398":1,"407":3,"409":2,"416":1,"432":1,"461":1}}],["она",{"2":{"34":1,"36":1,"68":2,"116":1,"134":1,"139":1,"142":1,"145":1,"146":2,"149":1,"150":1,"151":2,"202":1,"208":1,"209":1,"210":1,"218":1,"219":1,"220":1,"251":1,"256":1,"263":1,"284":1,"290":1,"294":1,"297":1,"301":2,"321":1,"322":1,"326":1,"331":1,"347":1,"349":2,"355":1,"360":1,"391":1,"394":1,"395":1,"407":2,"411":3,"420":1,"435":1,"448":2,"449":2,"451":1,"453":1,"524":2}}],["онлайновыми",{"2":{"431":1}}],["онлайном",{"2":{"256":1}}],["онлайн",{"0":{"59":1},"1":{"60":1,"61":1,"62":1,"63":1,"64":1},"2":{"12":1,"14":1,"27":1,"60":1,"106":1,"133":1,"136":1,"177":1,"405":1,"429":1,"436":1,"443":1,"444":1,"461":1,"495":1,"496":1,"533":1}}],["они",{"2":{"3":3,"21":1,"44":1,"103":1,"125":1,"126":1,"128":1,"138":1,"139":2,"147":3,"148":1,"151":3,"152":1,"153":1,"155":1,"156":1,"157":1,"160":2,"161":1,"163":2,"165":1,"169":1,"170":1,"173":1,"174":1,"176":2,"179":1,"180":1,"186":1,"189":1,"191":1,"192":1,"196":1,"212":1,"215":1,"216":1,"233":1,"235":1,"238":1,"242":4,"249":2,"251":1,"252":2,"254":1,"256":4,"258":1,"261":1,"263":2,"264":1,"267":1,"281":1,"283":1,"291":1,"292":1,"294":1,"295":1,"297":1,"299":1,"304":1,"305":1,"306":1,"307":1,"308":1,"309":1,"310":1,"320":1,"323":1,"330":1,"334":1,"335":1,"336":1,"337":2,"347":1,"354":2,"384":4,"391":1,"394":1,"395":2,"397":1,"398":1,"402":1,"407":1,"408":2,"411":3,"414":1,"416":2,"428":1,"429":2,"431":2,"432":1,"435":1,"437":2,"440":3,"443":1,"449":1,"451":2,"455":1,"460":2,"461":1}}],["он",{"0":{"420":1},"2":{"2":1,"30":1,"32":1,"50":1,"67":1,"81":1,"96":1,"106":3,"109":1,"110":1,"111":1,"114":2,"115":1,"117":1,"125":4,"131":2,"137":2,"138":1,"139":2,"142":2,"143":1,"151":2,"162":3,"164":2,"165":2,"169":1,"171":1,"172":1,"175":3,"176":1,"179":1,"181":1,"183":1,"184":2,"188":1,"189":1,"190":1,"191":1,"194":1,"195":1,"199":2,"200":1,"201":1,"204":1,"206":1,"207":2,"213":1,"214":3,"215":4,"216":1,"217":2,"218":1,"219":2,"222":1,"233":1,"235":1,"236":5,"237":1,"239":3,"240":2,"242":1,"244":1,"245":2,"250":1,"254":1,"256":1,"258":1,"262":1,"263":3,"264":3,"265":1,"268":1,"271":1,"273":2,"277":1,"278":2,"285":2,"288":2,"290":3,"298":1,"299":2,"300":1,"302":2,"303":1,"304":1,"305":1,"314":1,"315":1,"318":1,"320":1,"321":1,"323":1,"324":1,"325":4,"327":1,"329":2,"331":1,"332":3,"334":1,"335":2,"342":2,"349":1,"350":1,"351":1,"355":3,"357":1,"365":1,"384":5,"385":1,"386":2,"388":1,"389":1,"391":3,"392":1,"394":2,"398":1,"399":1,"407":2,"410":3,"411":2,"414":2,"416":1,"417":1,"418":1,"419":1,"421":3,"422":1,"425":2,"430":1,"432":3,"435":2,"443":1,"444":2,"448":1,"449":1,"450":1,"451":1,"452":1,"461":3}}],["отчетности",{"2":{"418":1}}],["отчета",{"2":{"418":1}}],["отчет",{"2":{"411":1,"418":3}}],["отходят",{"2":{"405":1}}],["отец",{"2":{"344":1}}],["отовсюду",{"2":{"449":1}}],["отодвигает",{"2":{"318":1}}],["отобрав",{"2":{"408":1}}],["отобразим",{"2":{"289":1}}],["отобразит",{"2":{"214":1,"220":2}}],["отобразится",{"2":{"177":1}}],["отобразить",{"2":{"146":1,"151":1,"179":1,"183":1,"218":1}}],["отображен",{"2":{"236":1}}],["отображено",{"2":{"148":1}}],["отображении",{"2":{"147":1,"151":2,"165":1,"178":1,"179":1,"215":1,"222":1,"384":1}}],["отображения",{"2":{"89":1,"139":1,"140":1,"147":2,"148":1,"165":1,"166":1,"176":1,"177":3,"180":4,"188":1,"190":1,"192":1,"222":4,"231":1,"259":1,"278":1,"281":1,"285":1,"289":2,"290":1,"347":1,"395":1,"419":1,"461":1}}],["отображением",{"2":{"259":1,"278":1}}],["отображение",{"2":{"22":1,"126":1,"189":1,"384":1,"449":1}}],["отображая",{"2":{"229":1}}],["отображать",{"2":{"183":1,"230":1,"231":1,"233":1,"236":1,"346":1,"399":1,"437":1,"440":1}}],["отображаться",{"2":{"179":1,"189":1,"190":1,"214":1,"235":1,"238":2,"239":1,"259":1,"263":2,"266":1,"278":2}}],["отображающего",{"2":{"419":1}}],["отображающий",{"2":{"181":1,"331":1,"449":1}}],["отображающая",{"2":{"177":1,"222":1}}],["отображают",{"2":{"176":1,"192":1,"196":1,"342":1}}],["отображаются",{"2":{"143":1,"186":1,"189":1,"196":1,"218":2,"354":1}}],["отображаемому",{"2":{"415":1}}],["отображаемый",{"2":{"289":1,"384":1}}],["отображаемые",{"2":{"143":1}}],["отображаем",{"2":{"278":1,"289":1,"344":1}}],["отображает",{"2":{"165":1,"180":1,"222":1,"231":1,"273":2,"350":1}}],["отображается",{"2":{"151":1,"177":1,"189":1,"196":1,"206":1,"231":1,"239":1,"278":1,"283":1,"299":1}}],["отбрасывании",{"2":{"301":1}}],["отладка",{"2":{"349":1}}],["отложено",{"2":{"223":1,"384":1}}],["отложенных",{"2":{"222":2}}],["отличную",{"2":{"265":1}}],["отличный",{"2":{"213":1,"229":1,"265":1,"416":1,"460":1}}],["отличным",{"2":{"134":1,"266":1}}],["отличного",{"2":{"388":1}}],["отличной",{"2":{"384":1}}],["отличное",{"2":{"208":1,"323":1,"443":1}}],["отлично",{"2":{"125":1,"337":1,"451":1}}],["отличать",{"2":{"284":1}}],["отличаться",{"2":{"213":1,"215":1,"310":1}}],["отличает",{"2":{"226":1}}],["отличается",{"2":{"22":1,"108":1,"124":1,"137":1,"236":1,"415":1,"432":1,"450":1}}],["отличалась",{"2":{"164":1}}],["отличающим",{"2":{"290":1}}],["отличающий",{"2":{"125":1}}],["отличаются",{"2":{"135":1,"448":1}}],["отличия",{"2":{"451":1}}],["отличительных",{"2":{"331":1}}],["отличительной",{"2":{"330":1}}],["отличить",{"2":{"208":1}}],["отличимы",{"2":{"164":1}}],["отличий",{"2":{"124":1}}],["отличием",{"2":{"223":1,"402":1}}],["отличие",{"2":{"26":1,"39":1,"131":1,"135":1,"147":1,"170":1,"175":1,"212":1,"215":1,"218":1,"222":1,"279":1,"318":1,"348":1,"354":1,"355":2,"407":1,"430":1,"448":1,"449":2,"451":1}}],["отнимают",{"2":{"450":1}}],["отнести",{"2":{"242":1}}],["отнесены",{"2":{"185":1}}],["относящаяся",{"2":{"486":1}}],["относящейся",{"2":{"243":1}}],["относятся",{"2":{"198":2,"228":1}}],["относительно",{"2":{"391":1,"392":1,"461":1}}],["относительные",{"2":{"219":1}}],["относиться",{"2":{"273":1}}],["относить",{"2":{"258":2}}],["относится",{"2":{"2":1,"23":1,"86":1,"143":4,"162":1,"166":1,"194":1,"254":1,"283":1,"299":1,"301":2,"337":1,"384":1}}],["отношений",{"2":{"273":1,"345":1}}],["отношении",{"2":{"147":1}}],["отношению",{"2":{"143":1}}],["отношения",{"2":{"43":1,"263":1,"277":1,"325":1,"342":1}}],["отношение",{"2":{"43":1}}],["оттенок",{"2":{"256":1}}],["отторжение",{"2":{"171":1}}],["оттуда",{"2":{"93":1}}],["отредактирован",{"2":{"542":1}}],["отредактированы",{"2":{"425":1,"428":1}}],["отредактировать",{"2":{"428":1}}],["отредактируйте",{"2":{"428":1}}],["отрендерит",{"2":{"247":1}}],["отреагировать",{"2":{"150":1}}],["отрисовкой",{"2":{"461":1}}],["отрисованные",{"2":{"416":1}}],["отрисовываться",{"2":{"233":1}}],["отрицательных",{"2":{"337":2,"412":1}}],["отрицательные",{"2":{"160":1,"242":1}}],["отрицательного",{"2":{"337":1,"412":1}}],["отражение",{"2":{"358":1}}],["отражалось",{"2":{"237":1}}],["отражается",{"2":{"348":1,"358":1}}],["отражает",{"2":{"164":1,"274":1,"399":1}}],["отражаются",{"2":{"138":1}}],["отражаться",{"2":{"145":1}}],["отражать",{"2":{"117":1,"164":1,"399":1,"400":1}}],["отразятся",{"2":{"279":1}}],["отраслевым",{"2":{"213":1}}],["отраслевыми",{"2":{"163":1}}],["отрасли",{"2":{"173":1,"209":1,"230":1,"267":1}}],["откуда",{"2":{"451":1}}],["отката",{"2":{"435":1}}],["отказывается",{"2":{"263":1}}],["отказа",{"2":{"250":1,"251":1}}],["отказаться",{"2":{"249":1}}],["отказ",{"2":{"135":1,"201":1,"207":1,"288":1,"413":1}}],["отключить",{"2":{"448":1}}],["отключена",{"2":{"425":1}}],["откладывается",{"2":{"384":1}}],["отклонив",{"2":{"392":1}}],["отклонить",{"2":{"263":1,"275":1,"391":1}}],["отклонения",{"2":{"289":2}}],["отклонение",{"2":{"178":1,"289":1}}],["отклонено",{"2":{"278":1,"337":1}}],["отклоняем",{"2":{"337":1}}],["отклоняется",{"2":{"245":1}}],["отклоняющий",{"2":{"243":1}}],["откроем",{"2":{"218":1,"401":1}}],["откройте",{"2":{"214":2,"219":1,"222":1,"266":1,"425":1}}],["откровенного",{"2":{"207":1}}],["открыла",{"2":{"302":1}}],["открыв",{"2":{"219":1}}],["открывать",{"2":{"288":1,"355":1}}],["открываться",{"2":{"256":1}}],["открываемость",{"2":{"354":1}}],["открываем",{"2":{"264":1}}],["открывается",{"2":{"177":1,"188":1,"206":1,"506":1}}],["открывает",{"2":{"140":1,"274":1,"289":1,"290":1,"316":1,"318":1,"411":1,"416":1}}],["открывающих",{"2":{"196":1}}],["открывающем",{"2":{"144":1}}],["открываются",{"2":{"177":1}}],["открыт",{"2":{"506":1}}],["открытии",{"2":{"288":1}}],["открытие",{"2":{"273":1}}],["открытия",{"2":{"266":1,"419":1}}],["открытый",{"2":{"304":1}}],["открытых",{"2":{"251":1,"355":1}}],["открытыми",{"2":{"460":1}}],["открытым",{"2":{"214":1}}],["открытые",{"2":{"107":1}}],["открытого",{"2":{"421":1}}],["открыто",{"2":{"178":1,"259":1}}],["открытом",{"2":{"136":1,"460":1}}],["открыть",{"2":{"134":1,"165":3,"215":1,"250":1,"251":2,"275":1,"288":1,"358":1,"384":1,"410":1,"425":1}}],["отзывами",{"2":{"461":1}}],["отзывчивой",{"2":{"384":1}}],["отзывчивого",{"2":{"194":1,"256":1}}],["отзывчивых",{"2":{"363":1}}],["отзывчивый",{"2":{"194":1}}],["отзывчивые",{"0":{"194":1},"2":{"256":2}}],["отзывчивыми",{"2":{"116":1,"254":1}}],["отзывы",{"2":{"4":1,"47":1,"79":1}}],["отследить",{"2":{"420":1}}],["отслеживать",{"2":{"425":1,"426":2,"431":1}}],["отслеживаться",{"2":{"425":1}}],["отслеживаются",{"2":{"354":1}}],["отслеживание",{"2":{"405":1,"420":1}}],["отслеживании",{"2":{"390":1}}],["отслеживанию",{"2":{"325":1,"330":1}}],["отслеживания",{"2":{"148":1,"213":1,"288":1,"327":1,"355":1,"419":1,"425":1,"448":2}}],["отслеживает",{"2":{"215":1,"448":3}}],["отсутствует",{"2":{"418":1}}],["отсутствие",{"2":{"405":1}}],["отсутствий",{"2":{"58":1}}],["отсутствовавшие",{"2":{"394":1}}],["отсылается",{"2":{"355":1}}],["отсылаю",{"2":{"110":1,"236":1,"337":1,"398":1}}],["отступов",{"2":{"301":1}}],["отступам",{"2":{"167":1}}],["отстает",{"2":{"460":1}}],["отстают",{"2":{"256":1}}],["отставать",{"2":{"256":1}}],["отстоит",{"2":{"251":1}}],["отсюда",{"2":{"218":1,"402":1}}],["отписки",{"2":{"347":1}}],["отпечаток",{"2":{"106":1,"304":1}}],["отправке",{"2":{"325":1}}],["отправки",{"2":{"250":2,"400":2,"402":1}}],["отправка",{"2":{"105":1,"249":1}}],["отправитель",{"2":{"402":1}}],["отправить",{"2":{"134":1,"249":1,"251":1,"385":1,"399":1}}],["отправили",{"2":{"247":1,"248":1}}],["отправленные",{"2":{"244":1}}],["отправленную",{"2":{"228":1,"399":1}}],["отправляя",{"2":{"389":1}}],["отправлять",{"2":{"250":1,"256":1,"346":1,"392":1,"461":1}}],["отправляли",{"2":{"171":1}}],["отправляемого",{"2":{"400":1}}],["отправляем",{"2":{"248":1,"393":1,"400":1,"429":1}}],["отправляемые",{"2":{"143":1}}],["отправляет",{"2":{"106":1,"228":1,"386":1,"393":1,"421":1}}],["отправляется",{"2":{"3":1,"249":1}}],["отправной",{"2":{"254":1,"272":1}}],["отправная",{"2":{"214":1,"215":1,"258":1,"287":1}}],["отправную",{"2":{"110":1,"271":1}}],["отяжелел",{"2":{"50":1}}],["отмечают",{"2":{"407":1}}],["отмечаем",{"2":{"22":1,"88":1}}],["отмеченных",{"2":{"266":1}}],["отмеченным",{"2":{"199":1}}],["отмечена",{"2":{"266":1}}],["отметить",{"2":{"220":1,"222":1,"228":1,"256":1,"281":1,"290":2,"310":1,"328":1,"334":1,"342":1,"348":1,"398":1,"459":1,"460":1}}],["отметим",{"2":{"33":1}}],["отметьте",{"2":{"199":1}}],["отметка",{"2":{"178":1}}],["отменены",{"2":{"327":1}}],["отменен",{"2":{"289":1}}],["отменена",{"2":{"220":1,"250":1}}],["отмене",{"2":{"288":1}}],["отменяет",{"2":{"228":1}}],["отменять",{"2":{"171":1}}],["отмены",{"2":{"201":1}}],["отменит",{"2":{"201":1}}],["отменить",{"2":{"171":1,"207":1,"275":1,"289":1}}],["отдавать",{"2":{"461":1}}],["отдаваемыми",{"2":{"11":1}}],["отдачи",{"2":{"418":1}}],["отделяет",{"2":{"327":1}}],["отделены",{"2":{"191":1}}],["отделить",{"2":{"451":1,"460":1}}],["отделит",{"2":{"142":1}}],["отделку",{"2":{"26":1}}],["отдельная",{"2":{"72":1,"93":1,"108":1,"256":1}}],["отдельности",{"2":{"305":1}}],["отдельном",{"2":{"264":1,"302":1,"350":1,"449":1}}],["отдельного",{"2":{"233":1,"436":1,"451":1,"496":1}}],["отдельно",{"2":{"66":1,"496":1}}],["отдельной",{"2":{"43":1,"82":1,"183":1,"401":1}}],["отдельное",{"2":{"33":1}}],["отдельным",{"2":{"384":1}}],["отдельными",{"2":{"108":1}}],["отдельных",{"2":{"136":1,"220":1,"287":1,"384":1,"403":1,"416":1,"417":2,"543":1}}],["отдельный",{"2":{"9":1,"41":1,"89":1,"93":1,"96":2,"105":2,"142":1,"302":1,"354":1,"430":1,"436":1,"459":1}}],["отдельные",{"2":{"2":1,"11":1,"79":1}}],["отдельную",{"2":{"3":1,"22":1,"259":1,"297":1,"429":1,"449":1}}],["от",{"0":{"365":1},"2":{"3":1,"22":1,"23":2,"26":1,"39":1,"60":1,"63":1,"73":1,"102":1,"105":1,"106":1,"108":4,"112":1,"118":1,"121":1,"124":1,"125":4,"131":1,"134":1,"135":2,"137":1,"138":2,"139":3,"140":1,"142":1,"143":3,"147":2,"158":1,"160":1,"163":1,"164":2,"169":1,"170":2,"174":2,"175":1,"177":1,"178":1,"179":2,"184":1,"189":1,"191":2,"192":1,"194":3,"196":2,"199":1,"201":1,"207":2,"208":2,"209":1,"212":1,"213":1,"215":2,"216":3,"218":1,"222":4,"224":1,"226":1,"244":4,"245":2,"247":1,"248":1,"249":1,"250":5,"251":1,"252":1,"256":3,"263":3,"272":1,"273":1,"279":2,"280":1,"283":1,"284":1,"285":1,"290":3,"292":1,"294":2,"296":1,"297":1,"302":1,"305":1,"306":2,"310":1,"320":1,"325":1,"327":1,"328":1,"329":3,"331":1,"332":1,"334":1,"335":3,"338":1,"342":1,"345":1,"347":3,"348":1,"349":1,"354":2,"355":3,"365":1,"384":2,"385":2,"386":1,"388":1,"390":1,"394":3,"395":1,"401":1,"403":1,"405":1,"407":1,"409":1,"415":1,"418":1,"420":4,"425":1,"429":1,"430":3,"432":1,"439":1,"440":1,"448":1,"449":3,"450":2,"451":3,"455":1,"459":1,"460":4,"484":1,"492":1,"495":1,"496":1,"524":1}}],["отводится",{"2":{"164":1}}],["отвечающие",{"2":{"449":1,"451":1}}],["отвечающий",{"2":{"384":1,"402":1}}],["отвечающего",{"2":{"420":1}}],["отвечал",{"2":{"402":1}}],["отвечаем",{"2":{"244":2,"402":1}}],["отвечает",{"2":{"106":1,"162":1,"204":1,"215":1,"264":1,"271":1,"272":1,"273":2,"274":1,"275":1,"344":1,"418":1,"438":1,"545":1}}],["отвечать",{"2":{"6":1,"365":1,"388":1}}],["ответы",{"2":{"391":1}}],["ответьте",{"2":{"268":1,"293":1}}],["ответственная",{"2":{"449":1}}],["ответственности",{"0":{"297":1,"299":1},"2":{"294":1,"297":4}}],["ответственностью",{"2":{"299":2}}],["ответственность",{"2":{"244":2,"294":1,"297":1,"321":1,"325":1}}],["ответственным",{"2":{"2":1}}],["ответов",{"2":{"187":1,"485":2}}],["ответить",{"2":{"139":1,"159":1,"418":1}}],["ответе",{"2":{"108":2}}],["ответах",{"2":{"485":1}}],["ответа",{"2":{"4":2,"244":1,"248":1,"249":2,"264":1,"335":1,"391":1,"400":1,"402":3}}],["ответ",{"2":{"4":1,"108":2,"176":1,"228":1,"236":1,"244":2,"246":1,"264":1,"274":1,"384":1,"393":1,"402":2,"413":1,"416":1,"460":1,"483":1}}],["отвлечься",{"2":{"3":1}}],["н",{"2":{"460":1}}],["нынешними",{"2":{"221":1}}],["ный",{"2":{"61":1}}],["ну",{"2":{"289":1,"334":1}}],["нулей",{"2":{"334":1}}],["нулевой",{"2":{"265":1}}],["нулевые",{"2":{"125":1}}],["нуля",{"2":{"139":1,"212":2,"338":1}}],["нули",{"2":{"125":1}}],["нуждающихся",{"2":{"353":1}}],["нуждаются",{"2":{"281":1}}],["нужд",{"2":{"243":1,"349":1}}],["нужды",{"2":{"212":1}}],["нужен",{"0":{"420":1},"2":{"17":1,"236":3,"265":1,"268":1,"322":1,"423":1,"435":1,"443":1,"449":2,"460":2,"461":1,"516":1}}],["нужную",{"2":{"323":1,"422":1,"515":1}}],["нужна",{"2":{"12":1,"109":1,"116":1,"139":1,"298":1,"301":1,"436":1,"442":1,"448":1,"453":1}}],["нужное",{"2":{"435":1}}],["нужно",{"2":{"12":1,"39":1,"41":2,"58":1,"67":1,"86":2,"93":1,"100":1,"106":2,"112":1,"114":1,"125":2,"132":1,"139":1,"140":1,"141":1,"143":2,"147":1,"151":1,"160":1,"182":1,"183":1,"212":1,"215":1,"218":2,"221":1,"222":1,"223":1,"236":2,"245":1,"249":1,"273":1,"278":1,"283":1,"284":1,"289":1,"299":1,"321":1,"326":1,"329":1,"337":1,"347":1,"352":1,"395":1,"402":1,"407":1,"410":1,"413":1,"425":1,"426":1,"428":1,"435":1,"438":1,"440":2,"443":2,"448":1,"449":2,"450":2,"452":1,"459":1,"460":1,"461":2}}],["нужного",{"2":{"9":1,"196":1}}],["нужных",{"2":{"448":1,"524":1}}],["нужный",{"2":{"125":1,"208":1,"218":1,"450":1,"528":1}}],["нужные",{"2":{"107":1,"372":1,"540":1}}],["нужны",{"2":{"7":1,"94":1,"414":1,"416":1,"437":1,"448":1,"452":1,"461":1,"524":1}}],["нужным",{"2":{"3":1}}],["нюансов",{"2":{"108":1,"110":1}}],["нём",{"2":{"41":1,"93":1,"456":1}}],["нежелаемые",{"2":{"495":1}}],["нежелательных",{"2":{"217":1}}],["нежелательные",{"2":{"180":1}}],["нежелательная",{"2":{"216":1}}],["неудобно",{"2":{"440":1}}],["неудачей",{"2":{"407":1,"428":1}}],["неудачи",{"2":{"337":2,"407":1}}],["неудача",{"2":{"335":1}}],["неудачное",{"2":{"449":1}}],["неудачного",{"2":{"337":1}}],["неудачной",{"2":{"278":1,"411":2}}],["неудачные",{"2":{"336":1}}],["неудачным",{"2":{"250":1,"335":1}}],["неудачный",{"2":{"247":1}}],["неуклюжим",{"2":{"416":1}}],["нелогично",{"2":{"449":1}}],["нелегкая",{"2":{"408":1}}],["нельзя",{"2":{"355":1,"451":1}}],["неэффективным",{"2":{"461":1}}],["неэффективной",{"2":{"347":1}}],["неэтичной",{"2":{"198":1}}],["недействительным",{"2":{"416":1}}],["неделимого",{"2":{"297":1}}],["недопущения",{"2":{"504":1}}],["недопонимание",{"2":{"67":1}}],["недорого",{"2":{"439":1}}],["недочеты",{"2":{"407":1}}],["недоумении",{"2":{"181":1}}],["недостающие",{"2":{"414":1,"418":1}}],["недостаток",{"2":{"336":1,"347":1}}],["недостаточно",{"2":{"250":1,"254":1,"255":1}}],["недостатком",{"2":{"348":1,"384":2}}],["недостатков",{"2":{"228":1,"244":1,"250":1,"277":1}}],["недостатка",{"2":{"213":1,"248":1}}],["недостатки",{"2":{"143":1,"228":1,"244":1,"256":2,"349":1,"410":1}}],["недоступна",{"2":{"116":1}}],["нецелесообразно",{"2":{"242":1}}],["независимы",{"2":{"449":1}}],["независимых",{"2":{"410":2}}],["независимость",{"2":{"436":1}}],["независимое",{"2":{"292":1}}],["независимо",{"2":{"263":1,"305":1,"345":1,"347":2,"425":1,"436":1}}],["незавершенных",{"2":{"222":1}}],["незаслужено",{"2":{"106":1}}],["неиспользуемых",{"2":{"301":1}}],["неиспользуемые",{"2":{"216":1}}],["неисчерпывающими",{"2":{"296":1}}],["неизменным",{"2":{"321":1}}],["неизменяемым",{"2":{"251":1}}],["неизменяемое",{"2":{"143":1}}],["неизбежным",{"2":{"191":1}}],["нечто",{"2":{"212":1,"231":1,"239":1,"350":1,"449":1}}],["ненужную",{"2":{"303":1}}],["ненужной",{"2":{"449":1}}],["ненужного",{"2":{"303":1}}],["ненужному",{"2":{"299":1}}],["ненужное",{"2":{"109":1}}],["ненужным",{"2":{"298":1}}],["ненависть",{"2":{"206":1}}],["ненаправленность",{"0":{"204":1}}],["неочевидные",{"2":{"485":1}}],["неотзывчивым",{"2":{"355":1,"384":1}}],["неотъемлемой",{"2":{"277":1,"334":1}}],["неоптимизированных",{"2":{"461":1}}],["неопределено",{"2":{"337":1}}],["неопределенное",{"2":{"416":1}}],["неопределенном",{"2":{"181":1,"337":1}}],["неопределенных",{"2":{"337":1}}],["неопределенна",{"2":{"335":1}}],["неопытный",{"2":{"304":1}}],["неоднократно",{"2":{"242":1,"324":1,"334":1}}],["необязателен",{"2":{"386":1}}],["необязательным",{"2":{"279":1}}],["необязательными",{"2":{"240":1}}],["необязательные",{"2":{"55":1}}],["необычными",{"2":{"363":1}}],["необычно",{"2":{"283":1}}],["необходимую",{"2":{"395":1,"461":1}}],["необходима",{"2":{"347":1}}],["необходим",{"2":{"135":1,"326":1,"353":1,"432":1,"439":1}}],["необходимы",{"2":{"242":1,"245":1,"252":1,"431":1,"437":1}}],["необходимыми",{"2":{"218":1,"327":1,"492":1}}],["необходимым",{"2":{"210":1,"258":1,"495":1}}],["необходимые",{"2":{"124":1,"213":1,"256":1,"261":1,"264":1,"283":1,"379":1,"402":1,"444":1}}],["необходимых",{"2":{"110":1,"122":1,"352":1,"410":1,"544":1}}],["необходимый",{"2":{"50":1,"124":1,"200":1,"460":1}}],["необходимому",{"2":{"170":1}}],["необходимое",{"2":{"169":1,"275":1,"411":1}}],["необходимость",{"2":{"93":1,"164":1,"178":1,"243":1,"274":1,"305":1,"420":1,"425":1,"432":1}}],["необходимости",{"2":{"58":1,"110":1,"135":1,"139":2,"143":1,"218":1,"228":1,"229":2,"233":1,"236":1,"242":1,"245":3,"261":1,"278":2,"322":1,"331":2,"349":1,"384":1,"390":1,"418":1,"435":1,"437":1,"440":1,"492":2}}],["необходимой",{"2":{"12":1,"326":1,"327":1}}],["необходимо",{"0":{"259":1},"2":{"9":1,"12":1,"58":1,"106":1,"116":2,"124":1,"125":2,"126":6,"128":1,"131":1,"135":1,"136":1,"137":1,"138":1,"139":3,"143":3,"151":1,"163":1,"174":1,"196":2,"215":1,"216":1,"218":1,"221":1,"228":1,"230":1,"232":1,"234":1,"236":2,"238":1,"239":1,"242":1,"244":1,"245":2,"246":1,"247":2,"249":1,"250":1,"251":1,"256":2,"263":1,"264":2,"265":2,"271":1,"272":1,"273":2,"277":1,"278":1,"279":1,"281":1,"283":1,"288":1,"289":2,"290":1,"298":1,"299":1,"301":2,"312":2,"315":1,"326":1,"328":1,"329":6,"332":1,"334":1,"335":2,"337":1,"347":1,"350":2,"354":1,"385":1,"386":2,"387":1,"388":1,"395":1,"396":2,"397":1,"402":1,"408":4,"409":2,"410":1,"411":2,"412":1,"413":1,"414":1,"417":2,"418":1,"423":1,"425":1,"429":1,"432":1,"438":1,"495":1,"516":1,"517":1,"540":1}}],["негативный",{"2":{"181":1}}],["негативных",{"2":{"181":1,"302":1}}],["него",{"2":{"9":1,"11":1,"81":1,"93":1,"95":1,"108":1,"121":2,"135":1,"151":1,"190":1,"192":1,"195":1,"209":1,"213":1,"216":1,"219":1,"222":1,"239":1,"248":1,"249":1,"304":1,"315":1,"344":1,"357":1,"410":1,"414":1,"416":1,"417":1,"421":1,"442":1,"444":1,"449":2,"503":1}}],["неяркой",{"2":{"175":1}}],["неявно",{"2":{"94":1}}],["нерационального",{"2":{"301":1}}],["неразличенно",{"2":{"162":1}}],["нередко",{"2":{"250":1}}],["нереактивных",{"2":{"236":1}}],["нереактивные",{"2":{"143":1}}],["невероятно",{"2":{"408":1}}],["невелика",{"2":{"236":1}}],["невелик",{"2":{"222":1}}],["невелики",{"2":{"128":1}}],["невозможен",{"2":{"229":1}}],["невозможна",{"2":{"397":1}}],["невозможным",{"2":{"201":1}}],["невозможной",{"2":{"408":1}}],["невозможность",{"2":{"201":1}}],["невозможности",{"2":{"12":1}}],["невозможно",{"2":{"125":1,"133":1,"208":1,"216":1,"290":1,"297":1,"408":1,"449":1,"460":1}}],["невыполненных",{"2":{"220":1}}],["неё",{"2":{"83":1,"86":1,"106":1,"215":1,"251":1,"500":1}}],["нефункциональные",{"0":{"77":1},"2":{"67":1}}],["некую",{"2":{"327":1}}],["некоего",{"2":{"449":1}}],["некое",{"2":{"178":1}}],["некой",{"2":{"106":1}}],["некоторая",{"2":{"251":1}}],["некоторый",{"2":{"223":1}}],["некоторыми",{"2":{"122":2,"219":1,"222":1,"237":1,"265":1,"305":1,"394":1,"407":1}}],["некоторым",{"2":{"122":2,"174":1,"384":1}}],["некоторые",{"2":{"119":1,"121":1,"125":2,"138":1,"139":3,"143":2,"160":1,"163":2,"170":1,"181":1,"185":1,"186":1,"189":1,"201":1,"208":1,"210":1,"212":1,"213":2,"215":3,"216":4,"219":1,"220":1,"224":1,"228":1,"242":1,"243":1,"248":1,"251":1,"253":2,"256":3,"258":2,"263":1,"268":1,"283":1,"285":1,"295":1,"301":1,"304":1,"325":1,"326":1,"334":1,"340":2,"344":1,"355":2,"391":1,"392":1,"394":1,"405":1,"415":2,"419":1,"428":1,"429":1,"448":1,"461":1}}],["некоторых",{"2":{"47":1,"114":1,"151":1,"162":1,"176":1,"200":1,"208":1,"214":1,"215":1,"216":1,"218":1,"245":1,"251":1,"256":2,"269":1,"285":1,"300":1,"310":1,"313":1,"323":1,"342":1,"384":1,"398":1,"407":1,"408":1,"417":1,"438":1}}],["некоторое",{"2":{"143":1,"310":1,"410":1,"411":1}}],["некоторой",{"2":{"117":1,"264":1,"291":1,"327":1,"328":1,"389":1,"411":1,"416":1}}],["некотором",{"2":{"60":1,"250":1,"449":1}}],["некоторую",{"2":{"107":1}}],["некритичными",{"2":{"40":1}}],["некий",{"2":{"9":1,"329":1,"461":1}}],["небольшая",{"0":{"291":1}}],["небольшом",{"2":{"236":1}}],["небольшого",{"2":{"106":1,"107":1,"140":1,"342":1,"356":1}}],["небольшой",{"0":{"91":1},"2":{"96":1,"128":1,"177":1,"222":1,"284":1,"397":1,"401":1,"402":1,"445":1,"461":1}}],["небольшое",{"2":{"38":1,"114":1,"127":1,"140":1,"151":1,"178":1,"188":1}}],["небольших",{"2":{"143":1,"194":1,"278":1,"340":1,"349":1,"418":1,"459":1,"496":1}}],["небольшим",{"2":{"121":1,"139":1,"223":1}}],["небольшими",{"2":{"83":1,"266":1,"358":1}}],["небольшие",{"2":{"79":1,"161":1,"183":1,"303":1}}],["небольшую",{"2":{"2":1,"200":1,"461":1}}],["ней",{"2":{"34":1,"40":1,"107":2,"161":1,"212":1,"284":1,"326":1,"342":1,"355":2,"372":1,"376":1,"377":1,"380":1,"400":1,"411":1,"448":1,"449":1,"453":1,"461":1,"524":1}}],["нетривиальная",{"2":{"444":1}}],["нетривиальные",{"2":{"408":1}}],["нетривиальных",{"2":{"405":1,"420":1}}],["нетерпеливые",{"2":{"180":1}}],["нет",{"2":{"30":1,"32":1,"61":1,"87":1,"106":2,"110":1,"125":1,"135":1,"143":2,"146":1,"159":1,"171":1,"186":1,"191":1,"200":1,"213":1,"214":1,"222":1,"225":1,"234":1,"239":1,"242":1,"291":2,"315":1,"326":1,"331":1,"349":2,"352":1,"365":1,"384":3,"410":2,"411":1,"413":2,"460":2,"461":1}}],["немножко",{"2":{"461":1}}],["немногие",{"2":{"202":1}}],["немного",{"2":{"89":1,"140":1,"158":1,"217":1,"223":1,"231":1,"239":1,"245":1,"256":3,"282":1,"332":1,"337":1,"351":1,"396":1,"451":1,"453":1,"459":1}}],["немедленным",{"2":{"393":1}}],["немедленное",{"2":{"389":1}}],["немедленно",{"2":{"290":1,"348":1}}],["немодифицированный",{"2":{"329":1}}],["нему",{"2":{"106":1,"108":1,"130":1,"236":1,"242":1,"283":1,"416":1,"429":1,"444":1,"449":1}}],["немаленький",{"2":{"44":1}}],["нем",{"2":{"29":1,"32":1,"86":1,"106":2,"108":1,"138":1,"139":1,"195":1,"331":1,"334":1,"353":1,"355":1,"384":1,"396":1,"411":1,"415":1,"435":2,"439":1,"460":1,"486":1}}],["непустое",{"2":{"146":1}}],["непрямой",{"2":{"449":1}}],["непрактичным",{"2":{"420":1}}],["неправильно",{"2":{"245":1}}],["неправильном",{"2":{"147":1,"250":1}}],["неприятных",{"2":{"284":1}}],["непрерывно",{"2":{"430":1}}],["непрерывной",{"2":{"134":1}}],["непрерывная",{"0":{"430":1},"2":{"429":1,"430":3,"433":1}}],["непредусмотренные",{"2":{"198":1}}],["непроизвольным",{"2":{"351":1}}],["непроизвольных",{"2":{"181":1}}],["непростой",{"2":{"89":1}}],["непростая",{"2":{"25":1}}],["неплохим",{"2":{"107":1}}],["неплохой",{"2":{"452":1}}],["неплохо",{"2":{"96":1,"333":1,"460":1,"527":1}}],["неполным",{"2":{"429":1}}],["неполный",{"0":{"296":1},"1":{"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1},"2":{"110":1,"173":1,"176":1,"294":1,"306":1}}],["непостоянен",{"2":{"223":1}}],["непосредственный",{"2":{"196":1}}],["непосредственное",{"2":{"197":1}}],["непосредственно",{"2":{"40":1,"113":1,"128":1,"134":1,"141":1,"196":1,"214":1,"215":2,"216":2,"222":1,"239":1,"251":2,"264":1,"265":1,"277":1,"298":1,"301":2,"315":1,"329":1,"332":1,"386":1,"391":1,"395":1,"396":1,"416":2,"448":1,"491":1,"495":1}}],["непонятным",{"2":{"215":1}}],["неподкованых",{"2":{"12":1}}],["нее",{"2":{"23":1,"143":1,"186":1,"346":1,"348":1,"426":1,"427":1,"449":1,"451":1}}],["несущественные",{"2":{"470":1}}],["нестандартные",{"2":{"460":1}}],["нестандартных",{"2":{"244":1}}],["нести",{"2":{"244":1}}],["несем",{"2":{"244":1}}],["несмотря",{"2":{"180":2,"305":1,"342":1,"397":1,"410":1,"411":1,"460":1}}],["несомненно",{"2":{"160":1}}],["несовместимости",{"2":{"138":2}}],["несоответствия",{"2":{"428":1}}],["несоответствие",{"2":{"113":2,"428":1}}],["несоответствию",{"2":{"67":1}}],["несложен",{"2":{"135":1}}],["несложных",{"2":{"461":1}}],["несложный",{"2":{"12":1}}],["несложно",{"2":{"22":1,"39":1,"57":1,"106":1}}],["несколькими",{"2":{"219":1,"251":1,"281":1,"291":1,"404":1}}],["нескольким",{"2":{"108":1,"280":1,"303":1}}],["нескольких",{"2":{"43":1,"115":1,"124":1,"125":2,"143":1,"214":1,"221":1,"231":1,"237":1,"250":1,"254":1,"267":1,"275":1,"277":1,"284":1,"293":1,"294":1,"299":1,"305":1,"347":1,"355":1,"388":1,"395":1,"402":1,"420":2,"428":1,"436":1,"438":1,"443":1,"449":1,"450":1,"451":1,"492":1}}],["несколько",{"2":{"11":1,"29":1,"38":1,"90":1,"103":2,"123":1,"125":3,"128":1,"139":1,"140":1,"141":3,"143":1,"150":2,"151":1,"171":1,"175":1,"180":2,"194":1,"196":1,"203":1,"208":2,"211":1,"215":1,"218":2,"222":1,"226":1,"239":2,"242":1,"243":1,"245":2,"252":1,"256":1,"263":1,"264":1,"275":2,"277":1,"278":2,"280":2,"283":3,"290":1,"291":1,"296":1,"299":2,"302":1,"305":1,"325":1,"331":1,"334":1,"336":1,"342":1,"345":1,"347":1,"355":2,"384":1,"397":1,"401":1,"403":1,"410":3,"411":3,"415":1,"416":1,"435":1,"438":2,"449":2,"452":1,"461":1}}],["несвязанные",{"2":{"3":1}}],["не",{"0":{"109":1,"302":1},"2":{"3":1,"10":2,"17":1,"22":2,"23":1,"26":1,"32":1,"33":1,"39":3,"40":1,"41":1,"50":1,"55":1,"58":2,"63":3,"64":1,"70":1,"72":1,"73":1,"76":1,"84":2,"87":1,"95":1,"96":2,"105":1,"106":4,"107":4,"108":3,"109":2,"110":4,"112":2,"113":1,"114":4,"115":2,"116":1,"120":1,"122":1,"124":1,"125":4,"127":1,"128":4,"130":1,"131":1,"132":2,"133":1,"134":2,"135":2,"138":2,"139":3,"140":2,"141":2,"142":2,"143":9,"145":1,"146":1,"147":1,"148":1,"150":2,"151":4,"152":1,"157":2,"161":1,"162":1,"163":2,"165":3,"167":3,"169":1,"174":2,"175":1,"178":3,"179":1,"180":1,"181":4,"183":5,"184":1,"186":1,"187":3,"188":2,"189":1,"191":5,"192":1,"195":3,"197":1,"199":4,"200":3,"201":1,"203":2,"205":1,"207":2,"208":1,"209":1,"212":3,"213":1,"214":6,"215":5,"216":3,"217":1,"218":5,"219":8,"221":2,"223":3,"225":1,"228":6,"230":2,"233":4,"236":6,"238":1,"239":3,"241":1,"242":1,"244":2,"245":3,"247":1,"248":2,"249":4,"250":6,"251":4,"253":1,"256":6,"258":3,"259":1,"261":2,"263":1,"264":7,"266":2,"267":1,"269":2,"272":1,"274":1,"275":3,"277":1,"278":1,"279":1,"280":2,"281":3,"283":5,"284":2,"285":4,"289":2,"290":3,"294":4,"295":2,"297":1,"298":3,"299":1,"300":3,"301":4,"302":3,"303":2,"304":2,"305":1,"310":1,"311":1,"314":1,"315":2,"318":1,"320":5,"321":4,"322":2,"323":2,"326":5,"328":1,"329":4,"330":1,"331":2,"332":1,"334":3,"335":7,"336":4,"337":5,"342":3,"344":4,"347":1,"349":1,"350":2,"351":1,"354":2,"355":11,"356":1,"357":1,"383":1,"384":11,"388":2,"389":1,"391":1,"393":1,"394":1,"395":3,"396":5,"397":4,"402":2,"403":1,"404":1,"405":1,"406":1,"407":3,"408":1,"410":2,"411":4,"412":5,"413":2,"414":1,"415":1,"416":3,"417":3,"419":1,"420":3,"423":1,"425":6,"426":4,"427":1,"428":3,"429":1,"432":1,"433":1,"435":1,"437":1,"438":2,"440":1,"442":1,"444":7,"447":1,"448":7,"449":11,"450":1,"451":6,"452":3,"453":5,"454":1,"456":2,"459":1,"460":5,"461":10,"485":1,"491":1,"492":3,"495":2,"496":1,"503":1,"516":2,"527":1,"543":1}}],["нижняя",{"2":{"530":1}}],["нижней",{"2":{"183":1,"184":1,"186":1,"194":1,"196":1,"263":1}}],["нижнем",{"2":{"153":1,"163":1,"165":1,"169":2,"196":1,"221":1}}],["нижний",{"2":{"166":1,"289":1}}],["ниже",{"2":{"10":1,"108":1,"116":1,"128":1,"173":1,"176":1,"178":1,"196":2,"239":1,"240":1,"251":1,"281":1,"427":1,"483":1}}],["ни",{"2":{"143":1,"244":1,"283":1,"310":1,"321":1,"350":1,"355":3,"409":1,"410":1,"411":1,"426":1}}],["низкоуровневый",{"2":{"495":1}}],["низком",{"2":{"329":1}}],["низкие",{"2":{"128":1}}],["низвело",{"2":{"93":1}}],["никогда",{"2":{"109":1,"125":1,"183":1,"215":1,"219":1,"250":1,"264":1,"277":1,"460":1}}],["никаким",{"2":{"236":1}}],["никакие",{"2":{"221":1}}],["никаких",{"2":{"109":1,"416":1,"449":1}}],["никакого",{"2":{"200":1}}],["никакой",{"2":{"184":1,"290":1,"291":1,"449":1,"461":1}}],["никак",{"2":{"3":1,"236":1}}],["ниша",{"2":{"62":1}}],["нивелирования",{"2":{"41":1}}],["ничем",{"2":{"32":1}}],["ничего",{"2":{"10":1,"141":1,"143":1,"171":1,"355":1,"393":1,"460":1}}],["нибудь",{"2":{"12":1,"171":1,"247":1}}],["ним",{"2":{"9":1,"17":1,"48":1,"50":2,"52":1,"93":1,"125":1,"183":1,"216":1,"231":1,"250":1,"334":1,"338":1,"384":1,"394":1,"402":1,"416":2,"456":1,"460":1,"461":1,"498":1}}],["ними",{"2":{"2":1,"34":1,"43":1,"95":1,"106":1,"125":1,"139":2,"142":1,"210":1,"215":1,"222":1,"226":1,"235":1,"242":1,"243":1,"250":1,"264":1,"267":1,"272":1,"331":1,"338":1,"342":1,"355":1,"357":1,"384":1,"421":1,"438":1}}],["них",{"2":{"6":1,"39":1,"41":1,"73":1,"79":1,"114":2,"125":2,"138":1,"139":1,"143":2,"144":1,"151":1,"165":1,"173":1,"175":1,"180":1,"186":1,"194":1,"198":1,"208":2,"216":2,"218":1,"222":1,"228":2,"231":1,"236":3,"242":2,"263":1,"264":1,"273":1,"280":1,"281":1,"282":1,"283":2,"285":1,"290":1,"297":1,"298":1,"304":1,"310":1,"315":1,"325":1,"326":1,"327":1,"331":1,"334":1,"337":1,"340":2,"355":1,"357":1,"371":1,"384":1,"389":2,"392":1,"408":1,"411":2,"414":1,"415":1,"420":3,"421":1,"426":1,"443":1,"448":1,"450":1,"452":1,"454":1}}],["ночных",{"2":{"430":1}}],["ноут",{"2":{"444":1}}],["ноу",{"2":{"420":1}}],["ное",{"2":{"418":1}}],["нормальный",{"2":{"317":1}}],["нормально",{"2":{"61":1,"461":1}}],["нормальному",{"2":{"38":1}}],["носят",{"2":{"207":1,"431":1}}],["носит",{"2":{"123":1,"161":1,"210":1}}],["номер",{"2":{"385":1,"461":1}}],["номера",{"2":{"249":1,"250":1}}],["номеров",{"2":{"183":1}}],["номером",{"2":{"183":1}}],["номеру",{"2":{"183":1}}],["нотация",{"2":{"416":1}}],["нотации",{"2":{"387":1}}],["нотаций",{"2":{"273":1}}],["нотацией",{"2":{"242":1}}],["нотацию",{"2":{"144":1,"221":1,"233":3,"354":1}}],["нотированной",{"2":{"115":1}}],["новички",{"2":{"365":1}}],["новичка",{"2":{"109":1}}],["новейшим",{"2":{"278":1}}],["нова",{"2":{"218":1}}],["новая",{"2":{"118":1,"183":1,"206":1,"217":1,"228":1,"290":1,"291":1,"336":1,"461":1}}],["новую",{"2":{"217":1,"226":1,"228":1,"287":1,"395":1,"396":1,"418":1,"428":1,"453":1,"533":1}}],["нововведением",{"2":{"449":1}}],["новой",{"2":{"212":1,"214":1,"239":1,"285":1,"290":1,"329":1,"396":1,"418":1,"435":1,"459":1,"527":1,"543":1}}],["новостных",{"2":{"228":1,"449":1}}],["новостные",{"2":{"180":1}}],["новостей",{"2":{"199":1,"449":1}}],["новое",{"0":{"231":1,"464":1,"469":1,"472":1,"475":1},"2":{"139":1,"251":1,"337":1,"435":1}}],["новому",{"2":{"293":1}}],["новом",{"2":{"118":2,"231":1,"275":1,"289":1}}],["нового",{"0":{"290":1,"291":1},"2":{"110":1,"116":1,"143":1,"212":2,"230":1,"238":1,"249":1,"250":1,"290":1,"348":1,"385":1,"407":1,"451":1,"483":1}}],["новыми",{"2":{"252":1}}],["новым",{"2":{"143":1,"160":1,"337":1,"399":1}}],["новые",{"0":{"119":1},"2":{"119":1,"125":1,"138":3,"183":2,"184":1,"192":1,"228":1,"231":2,"234":1,"235":1,"239":1,"243":1,"253":1,"272":1,"285":1,"286":1,"290":1,"349":1,"359":1,"363":1,"394":1,"397":1,"405":1,"419":1,"428":1,"444":1,"451":1,"460":1}}],["новый",{"2":{"96":1,"110":3,"118":1,"121":1,"142":1,"143":1,"151":2,"175":1,"184":1,"200":2,"214":2,"236":2,"240":1,"249":1,"251":1,"272":2,"280":1,"315":1,"341":1,"364":1,"425":1,"429":1,"443":1,"453":1}}],["новых",{"2":{"2":1,"119":1,"178":1,"212":1,"228":2,"254":1,"273":1,"290":2,"354":1,"355":1,"363":1,"382":1,"392":1,"395":1,"435":1,"486":1,"545":1}}],["но",{"2":{"3":1,"9":1,"17":1,"22":3,"23":1,"26":3,"29":1,"39":1,"41":1,"44":1,"58":1,"70":1,"73":1,"84":1,"88":1,"95":1,"96":2,"106":3,"107":3,"109":1,"110":3,"114":1,"116":1,"121":3,"122":1,"125":2,"128":4,"129":1,"131":1,"138":1,"139":6,"140":1,"141":1,"142":3,"143":9,"146":1,"147":1,"149":1,"150":1,"151":2,"152":1,"157":1,"162":2,"166":1,"167":2,"172":1,"175":1,"176":2,"177":2,"178":2,"180":1,"181":2,"184":2,"186":1,"191":3,"192":1,"194":2,"195":1,"200":1,"203":1,"206":1,"208":1,"209":1,"213":2,"214":2,"215":3,"216":2,"218":3,"219":2,"228":1,"229":1,"230":1,"231":1,"233":1,"236":1,"237":1,"239":2,"243":1,"244":2,"245":2,"250":4,"251":2,"254":1,"256":6,"258":2,"259":3,"262":1,"263":1,"264":1,"265":1,"273":1,"280":1,"281":1,"282":2,"283":2,"284":1,"285":1,"289":1,"290":3,"291":2,"292":1,"294":1,"299":2,"300":1,"302":2,"304":2,"320":1,"321":3,"323":2,"326":1,"329":5,"331":3,"333":1,"334":2,"335":2,"336":3,"337":3,"338":1,"340":1,"341":1,"342":2,"344":2,"347":3,"350":1,"351":1,"352":1,"354":3,"355":3,"365":1,"382":1,"384":3,"388":2,"391":1,"392":1,"397":1,"407":1,"408":2,"409":1,"410":4,"411":2,"415":3,"416":2,"419":1,"420":1,"421":1,"425":1,"427":1,"428":1,"429":2,"433":1,"435":1,"438":1,"440":1,"444":1,"448":2,"449":4,"450":1,"451":5,"452":2,"453":2,"460":4,"461":5,"495":1,"501":1,"507":1,"536":1}}],["нахождение",{"2":{"524":1}}],["находят",{"2":{"449":1}}],["находятся",{"2":{"134":1,"167":1,"196":1,"436":1,"460":1,"526":1}}],["находимся",{"2":{"426":1}}],["находим",{"2":{"89":1,"392":1,"416":1}}],["находит",{"2":{"218":1}}],["находить",{"2":{"162":1,"301":1}}],["находиться",{"2":{"17":1,"43":1,"230":2,"328":1,"388":1}}],["находится",{"2":{"48":1,"135":1,"151":1,"163":1,"175":2,"181":1,"199":1,"218":1,"244":1,"264":1,"289":1,"337":1,"347":2,"425":1,"449":1,"460":1,"503":1,"537":1,"544":1}}],["находились",{"2":{"47":1}}],["накладные",{"2":{"348":1}}],["накладывает",{"2":{"304":1,"305":1}}],["наконец",{"2":{"132":1,"138":2,"140":1,"219":1,"222":2,"233":1,"237":1,"245":1,"258":1,"284":2,"289":1,"326":1,"330":1,"357":1,"391":2,"392":1,"402":1,"417":1,"428":1}}],["научимся",{"2":{"408":1,"421":1}}],["научиться",{"2":{"363":1,"420":1}}],["научились",{"2":{"267":1,"292":1,"416":1}}],["научных",{"2":{"138":1}}],["нажали",{"2":{"416":1}}],["нажав",{"2":{"266":1}}],["нажатию",{"2":{"506":1}}],["нажатии",{"2":{"289":1,"393":1,"534":1,"536":1}}],["нажатием",{"2":{"177":1,"214":1}}],["нажать",{"2":{"165":1,"218":1}}],["нажимая",{"2":{"416":1}}],["нажимать",{"2":{"220":1}}],["нажимает",{"2":{"206":1,"249":1}}],["нажмите",{"2":{"214":3,"266":1,"515":1}}],["нажмет",{"2":{"151":1}}],["наоборот",{"2":{"143":1,"253":1,"355":1}}],["нагружает",{"2":{"461":1}}],["нагрузке",{"2":{"245":1,"390":1}}],["нагрузку",{"2":{"245":1,"392":1}}],["нагрузки",{"2":{"131":1,"245":1,"400":1}}],["наглядные",{"2":{"340":1}}],["наглядно",{"2":{"184":1}}],["наглядность",{"2":{"181":1}}],["наглядности",{"2":{"113":1}}],["наглядной",{"2":{"176":1}}],["наглядного",{"2":{"67":1}}],["нанимаемой",{"2":{"125":1}}],["наивная",{"2":{"326":1}}],["наивной",{"2":{"325":1,"326":1,"327":1,"329":1}}],["наивную",{"2":{"321":1}}],["наименьшими",{"2":{"452":1}}],["наименьшей",{"2":{"272":1}}],["наименования",{"2":{"22":1,"496":1}}],["наилучшим",{"2":{"271":1,"275":1}}],["наибольшую",{"2":{"206":1}}],["наиболее",{"2":{"125":2,"128":1,"138":1,"143":1,"144":1,"159":1,"160":1,"176":1,"194":1,"196":1,"203":1,"210":1,"213":2,"215":1,"218":1,"228":2,"239":1,"242":3,"244":1,"248":1,"251":2,"254":1,"258":1,"275":1,"303":1,"305":1,"354":1,"360":1,"363":1,"370":1,"378":1,"390":1,"397":2,"409":1,"420":1,"427":1,"429":1,"443":1,"452":1,"485":1}}],["налету",{"2":{"461":1,"524":1}}],["налево",{"2":{"125":1}}],["наложенный",{"2":{"263":1}}],["налогов",{"2":{"205":1}}],["наличия",{"2":{"242":1,"258":1,"261":1,"301":1,"451":1}}],["наличии",{"2":{"242":1}}],["наличие",{"2":{"12":1,"135":1,"189":1,"219":1,"222":1,"250":1,"320":1,"337":1,"410":1,"412":1,"450":1}}],["навязывающим",{"2":{"495":1}}],["навык",{"2":{"340":1}}],["навыков",{"2":{"212":1}}],["навыки",{"2":{"136":1,"224":1,"226":1,"252":1,"359":1,"405":1,"431":1}}],["навигационная",{"2":{"530":1}}],["навигационное",{"2":{"530":1}}],["навигационного",{"2":{"233":1}}],["навигационной",{"2":{"187":1}}],["навигационных",{"2":{"233":1,"237":1,"244":1,"505":1}}],["навигационные",{"2":{"233":1,"239":1,"272":1}}],["навигационный",{"2":{"196":1}}],["навигацией",{"2":{"185":1,"229":1,"252":1,"259":1}}],["навигацию",{"2":{"183":1,"229":2,"231":1,"235":1,"236":1,"239":1,"242":1,"244":1,"418":1}}],["навигации",{"0":{"185":1},"1":{"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1},"2":{"125":1,"180":1,"186":1,"187":2,"189":1,"191":1,"194":2,"229":1,"230":2,"237":1,"238":1,"241":1,"242":1,"252":1,"263":1,"285":1}}],["навигация",{"0":{"237":1},"1":{"238":1,"239":1},"2":{"118":1,"127":1,"135":1,"183":1,"229":1,"233":1,"239":1,"536":1}}],["наведение",{"2":{"177":1}}],["наведем",{"2":{"83":1}}],["наверное",{"2":{"321":1,"391":1,"451":1,"461":1}}],["наверняка",{"2":{"48":1}}],["наверх",{"2":{"30":1}}],["натянуть",{"2":{"452":1}}],["нативная",{"2":{"329":1}}],["нативного",{"2":{"256":1,"451":1,"461":1}}],["нативное",{"2":{"179":1,"254":1}}],["нативно",{"2":{"175":1}}],["нативный",{"2":{"542":1}}],["нативным",{"2":{"461":1}}],["нативными",{"2":{"138":1,"263":1}}],["нативные",{"2":{"116":1,"329":1}}],["нативных",{"2":{"114":1,"285":1,"334":2,"461":1}}],["нативную",{"2":{"114":1}}],["натуры",{"2":{"9":1}}],["набросать",{"2":{"289":1}}],["набросок",{"2":{"271":1}}],["набрать",{"2":{"251":1}}],["набранный",{"2":{"222":1}}],["набрав",{"2":{"215":1}}],["набирает",{"2":{"222":1,"250":1}}],["набирать",{"2":{"219":1}}],["набирают",{"2":{"157":1}}],["набираются",{"2":{"154":1}}],["наберите",{"2":{"214":1}}],["наблюдает",{"2":{"325":1}}],["наблюдающий",{"2":{"184":1}}],["наблюдателю",{"2":{"326":1}}],["наблюдателей",{"2":{"325":4}}],["наблюдатели",{"2":{"325":3}}],["наблюдатель",{"0":{"325":1},"1":{"326":1},"2":{"325":2,"326":2}}],["наблюдателям",{"2":{"325":1,"326":1}}],["наблюдателя",{"2":{"183":1,"325":1,"329":1}}],["наблюдать",{"2":{"170":1,"325":1}}],["наблюдении",{"2":{"96":1}}],["набором",{"2":{"416":1}}],["наборов",{"2":{"408":1}}],["набору",{"2":{"323":1}}],["наборе",{"2":{"183":1}}],["наборами",{"2":{"411":1}}],["набора",{"2":{"165":1,"183":1,"212":1,"244":1}}],["наборы",{"2":{"139":1,"141":1}}],["набор",{"2":{"68":1,"138":1,"152":1,"163":1,"183":2,"228":1,"258":1,"298":1,"337":1,"410":2,"414":1,"429":1,"439":1}}],["назовите",{"2":{"253":1}}],["назвать",{"2":{"211":1,"225":1,"394":1}}],["названную",{"2":{"349":1}}],["названный",{"2":{"143":1,"233":1,"385":1}}],["названа",{"2":{"202":1}}],["названий",{"2":{"204":1}}],["названиемстор",{"2":{"449":1}}],["названием",{"2":{"171":1,"221":1,"263":1,"285":1,"315":1,"326":1,"408":1,"515":1}}],["название",{"2":{"44":1,"81":1,"102":1,"103":1,"143":1,"177":1,"181":1,"228":1,"258":1,"398":1,"460":1,"516":1}}],["названиями",{"2":{"231":1}}],["названия",{"2":{"22":1,"88":1,"181":1,"256":1,"259":1,"329":1}}],["назад",{"2":{"160":1,"180":1,"223":1,"242":2,"259":1,"290":1,"448":1}}],["назначению",{"2":{"403":1}}],["назначение",{"2":{"127":1,"242":1,"265":1,"284":1,"334":1}}],["назначения",{"2":{"124":1,"325":1,"397":1}}],["называть",{"2":{"215":1,"449":2}}],["называют",{"2":{"178":1,"228":2,"243":1,"305":1,"325":1}}],["называются",{"2":{"125":2,"126":1,"189":1,"251":2,"283":1,"325":1}}],["называет",{"2":{"436":1}}],["называется",{"2":{"93":1,"115":1,"128":1,"140":1,"149":1,"183":2,"196":1,"202":1,"228":1,"281":1,"318":1,"420":1,"421":2,"426":1,"430":1,"448":1,"449":1,"515":1,"524":1}}],["называемая",{"2":{"329":1}}],["называемую",{"2":{"315":1,"344":1}}],["называемому",{"2":{"251":1}}],["называемой",{"2":{"125":1,"142":1}}],["называемыми",{"2":{"384":1}}],["называемых",{"2":{"228":1}}],["называемые",{"2":{"144":1,"251":1,"256":1,"283":1,"337":1,"449":1}}],["называемый",{"2":{"143":1,"283":1,"325":1,"388":1}}],["начнут",{"2":{"425":1}}],["начните",{"2":{"407":1}}],["начнете",{"2":{"194":1,"363":1}}],["начнется",{"2":{"141":1}}],["начнем",{"2":{"152":1,"212":1,"222":1,"231":1,"233":1,"235":1,"236":1,"237":2,"283":1,"289":1,"337":1,"338":1,"344":1,"345":1,"349":1,"356":1,"357":1,"390":1,"391":1,"392":1,"410":2,"411":2,"414":1,"421":1}}],["начаться",{"2":{"384":1}}],["начать",{"2":{"107":1,"139":1,"160":1,"213":1,"293":1,"372":1,"414":1,"425":1,"428":1}}],["началу",{"2":{"411":1}}],["начали",{"2":{"224":1,"334":1,"426":1}}],["начальная",{"2":{"272":1}}],["начальный",{"2":{"272":1,"475":1}}],["начальных",{"2":{"215":1,"254":1}}],["начальным",{"2":{"184":1,"212":1,"269":1,"349":1}}],["начального",{"2":{"429":1,"460":1}}],["начальной",{"2":{"215":1}}],["начальное",{"2":{"147":1}}],["начальном",{"2":{"11":1,"217":1}}],["начало",{"2":{"212":1,"398":1,"421":1}}],["началось",{"2":{"181":1}}],["началом",{"2":{"170":1,"460":1}}],["начале",{"2":{"135":1,"140":1,"196":1,"207":1,"290":1,"317":1,"384":1,"398":1}}],["начала",{"2":{"22":1,"60":1,"152":1,"163":1,"244":1,"264":1,"290":1,"384":1,"407":1,"410":1,"413":1,"461":1,"495":1,"544":1}}],["начинаниях",{"2":{"368":1}}],["начинаете",{"2":{"341":1}}],["начинает",{"2":{"290":1,"402":1}}],["начинается",{"2":{"155":1,"222":2,"239":1,"297":1,"363":1,"416":1}}],["начинаем",{"2":{"222":1,"284":1,"289":2,"331":1,"337":1,"347":1,"351":1,"352":1,"395":1,"416":1}}],["начинаешь",{"2":{"81":1}}],["начинающим",{"2":{"496":1}}],["начинающий",{"2":{"495":1}}],["начинающих",{"2":{"444":1,"485":1}}],["начинающихся",{"2":{"222":1}}],["начинающему",{"2":{"460":1}}],["начинающемся",{"2":{"222":1}}],["начинающуюся",{"2":{"144":1}}],["начинаются",{"2":{"154":2,"238":1}}],["начинаться",{"2":{"154":1}}],["начинать",{"2":{"109":1,"139":1}}],["начиная",{"2":{"76":2,"136":1,"142":1,"196":1,"215":2,"252":1,"272":1,"295":1,"297":1,"337":1,"347":1,"373":1}}],["нарезку",{"2":{"272":1}}],["наряду",{"2":{"228":1,"267":1,"450":1}}],["нарушена",{"2":{"395":1}}],["нарушению",{"2":{"67":1}}],["нарушить",{"2":{"405":1}}],["нарушит",{"2":{"299":1}}],["нарушать",{"2":{"384":1}}],["нарушает",{"2":{"191":2,"277":1,"320":1,"325":1}}],["нарушаются",{"2":{"220":1}}],["нарушают",{"2":{"186":1}}],["наращивать",{"2":{"11":1,"138":1}}],["найдете",{"2":{"218":1}}],["найдем",{"2":{"86":1,"301":1}}],["найдена",{"2":{"322":1}}],["найдены",{"2":{"320":1}}],["найденные",{"2":{"27":1,"135":1}}],["найдено",{"2":{"10":2,"355":1}}],["найти",{"2":{"61":1,"116":1,"118":1,"120":1,"132":1,"133":1,"135":1,"150":1,"151":1,"161":1,"163":1,"165":1,"169":1,"170":1,"171":1,"174":1,"175":1,"213":2,"216":1,"217":1,"218":1,"219":1,"227":1,"242":3,"245":1,"249":1,"263":1,"264":1,"269":1,"270":1,"285":1,"289":1,"297":1,"353":1,"354":1,"355":1,"395":1,"406":1,"409":1,"411":1,"415":1,"416":1,"417":1,"418":1,"423":1,"424":1}}],["наполнения",{"2":{"494":1,"496":1}}],["напомним",{"2":{"335":1,"345":1}}],["напишите",{"2":{"407":1}}],["напишем",{"2":{"150":1,"412":1,"413":1}}],["написали",{"2":{"132":1}}],["написанным",{"2":{"450":1}}],["написанный",{"2":{"10":1,"107":1,"139":1}}],["написание",{"2":{"407":1,"450":1}}],["написанию",{"2":{"218":1,"415":1}}],["написании",{"2":{"157":1,"460":1,"461":1}}],["написания",{"2":{"107":1,"138":1,"142":3,"151":1,"184":1,"256":1,"415":1,"425":1}}],["написаны",{"2":{"141":1,"411":1}}],["написано",{"2":{"139":1}}],["написан",{"2":{"50":1,"81":1,"407":1}}],["написать",{"2":{"12":1,"26":1,"41":1,"81":1,"95":1,"107":2,"222":1,"289":1,"302":1,"386":1,"408":1,"411":1,"460":1,"461":1}}],["напротив",{"2":{"242":1}}],["направленные",{"2":{"210":1}}],["направленную",{"2":{"199":1}}],["направление",{"2":{"416":1}}],["направлением",{"0":{"166":1}}],["направлению",{"2":{"194":1}}],["направлении",{"2":{"169":2,"195":1,"281":1}}],["направлений",{"2":{"169":1}}],["направляя",{"2":{"195":1}}],["направляют",{"2":{"162":1}}],["направляться",{"2":{"130":1}}],["направлять",{"2":{"125":1,"126":1,"128":1}}],["направляется",{"2":{"106":1}}],["направляет",{"2":{"106":1,"327":1,"328":1}}],["направить",{"2":{"164":1,"388":1}}],["напрямую",{"2":{"23":1,"55":1,"140":1,"143":1,"209":1,"222":1,"236":1,"264":1,"299":1,"315":1,"320":1,"329":1,"349":1,"354":1,"355":1,"384":1,"385":1,"388":1,"411":1,"443":1,"448":1,"453":1,"454":1,"461":1}}],["например",{"2":{"3":1,"12":1,"16":1,"18":1,"22":1,"41":2,"47":2,"48":1,"58":1,"83":1,"89":1,"94":1,"106":6,"107":6,"108":1,"115":2,"116":1,"117":1,"119":1,"125":4,"126":1,"127":1,"134":1,"139":3,"143":4,"145":1,"146":1,"148":1,"150":1,"151":1,"153":1,"154":4,"155":1,"156":1,"157":1,"163":2,"165":1,"167":1,"169":1,"170":1,"176":2,"177":2,"180":1,"181":2,"183":2,"186":1,"187":2,"191":3,"192":2,"195":1,"196":1,"197":1,"201":1,"204":1,"215":2,"216":1,"218":2,"219":1,"222":1,"223":1,"233":1,"239":1,"243":1,"245":2,"247":1,"248":2,"249":1,"250":4,"251":1,"256":3,"260":1,"261":1,"262":1,"263":2,"273":1,"274":1,"279":3,"281":2,"283":4,"284":1,"297":2,"301":1,"302":1,"305":1,"312":3,"316":1,"318":2,"324":1,"326":1,"327":1,"328":1,"329":3,"330":1,"331":1,"334":1,"335":1,"337":1,"344":1,"345":1,"353":1,"355":2,"384":1,"385":1,"386":1,"389":1,"397":2,"398":1,"407":1,"408":1,"411":2,"412":2,"413":1,"417":1,"422":1,"426":1,"429":2,"430":1,"433":2,"436":3,"437":2,"438":1,"440":1,"444":2,"449":5,"451":4,"453":1,"454":1,"457":1,"461":2,"492":2,"536":1}}],["намекнули",{"2":{"338":1}}],["намекает",{"2":{"290":1}}],["намеренная",{"0":{"412":1}}],["намеренное",{"2":{"207":1}}],["намеренно",{"2":{"203":1,"220":1}}],["намереваясь",{"2":{"206":1}}],["намечены",{"2":{"36":1}}],["намеченные",{"2":{"10":1}}],["нами",{"2":{"125":1,"191":1,"221":1,"233":1,"247":1,"337":1,"430":1}}],["намного",{"2":{"13":1,"23":1,"47":1,"55":1,"228":1,"444":1,"449":1,"451":2,"454":1,"459":2,"460":1,"461":3}}],["нам",{"2":{"7":1,"39":2,"41":1,"50":1,"112":1,"124":2,"125":1,"126":5,"128":4,"131":1,"132":1,"138":1,"139":1,"140":1,"141":2,"143":3,"150":1,"151":2,"162":1,"171":1,"182":1,"183":1,"214":1,"215":3,"218":1,"219":1,"220":1,"221":2,"222":5,"229":1,"236":4,"239":3,"242":1,"243":2,"245":2,"246":1,"247":2,"251":1,"256":1,"263":1,"264":1,"265":2,"273":1,"274":1,"275":3,"277":1,"278":1,"281":2,"282":1,"283":1,"284":1,"289":3,"291":1,"292":1,"298":1,"321":1,"322":2,"324":1,"329":2,"330":1,"331":1,"332":1,"337":3,"345":2,"346":1,"347":2,"349":1,"350":5,"352":2,"354":1,"360":1,"382":1,"384":1,"385":2,"387":1,"388":1,"391":1,"401":2,"402":1,"408":3,"409":3,"410":3,"411":1,"413":3,"414":4,"415":2,"416":3,"418":3,"419":1,"420":1,"425":1,"426":1}}],["нашли",{"2":{"363":1}}],["наша",{"2":{"214":1,"223":2,"231":1,"284":1,"290":1,"336":1,"344":1,"416":1}}],["нашу",{"2":{"184":1,"199":1,"218":1,"221":1,"222":1,"264":1,"284":1,"290":1,"301":1,"343":2,"344":1,"395":1,"426":1,"429":1}}],["нашей",{"2":{"214":1,"215":1,"218":1,"222":4,"223":1,"244":2,"248":1,"265":1,"290":1,"326":1,"330":1,"337":3,"344":1,"346":1,"347":1,"382":1,"390":2,"393":1,"402":1,"420":2,"421":1,"425":1,"429":1}}],["наше",{"2":{"111":1,"125":1,"126":2,"128":3,"140":2,"212":1,"215":1,"216":1,"219":1,"223":2,"224":1,"226":1,"230":1,"231":1,"233":1,"245":1,"249":1,"250":1,"251":1,"252":1,"263":1,"266":1,"267":1,"269":1,"289":1,"291":1,"292":1,"335":1,"345":1,"349":1,"387":1,"388":1,"389":1,"394":1,"397":1}}],["нашего",{"0":{"223":1,"287":1,"290":1,"291":1},"2":{"14":1,"27":1,"95":1,"111":2,"122":2,"124":2,"125":1,"126":2,"127":1,"128":3,"130":1,"131":1,"136":4,"137":1,"140":1,"141":2,"142":5,"143":1,"184":1,"212":1,"214":3,"215":5,"216":2,"217":2,"218":1,"221":1,"222":4,"230":3,"232":1,"236":3,"239":1,"242":1,"244":3,"245":1,"247":3,"248":2,"249":1,"250":4,"251":1,"258":3,"263":4,"264":1,"265":1,"277":2,"278":1,"281":1,"285":1,"289":2,"290":4,"292":1,"321":1,"340":1,"344":1,"347":1,"348":1,"355":1,"356":1,"357":2,"358":1,"359":1,"386":1,"387":2,"390":1,"395":1,"401":1,"403":3,"405":2,"410":2,"414":1,"415":2,"416":2,"417":1,"418":3,"419":1,"425":1,"426":3,"431":1}}],["нашему",{"2":{"125":1,"128":1,"132":1,"184":1,"215":1,"221":1,"223":1,"224":1,"233":2,"234":1,"245":1,"248":1,"251":1,"261":1,"264":1,"277":1,"286":1,"323":1,"350":1,"354":1,"383":1,"388":1,"421":1}}],["нашем",{"2":{"5":1,"11":1,"47":1,"115":1,"125":1,"127":1,"128":1,"143":2,"150":1,"163":1,"184":1,"214":1,"218":1,"222":1,"223":1,"230":2,"231":1,"235":2,"236":1,"243":1,"245":3,"248":1,"251":3,"258":1,"263":1,"264":1,"274":1,"275":3,"278":1,"289":8,"290":4,"321":1,"326":1,"334":1,"337":1,"344":1,"345":1,"346":1,"349":1,"350":2,"351":1,"352":1,"356":1,"357":1,"384":1,"386":1,"387":1,"388":1,"390":1,"395":1,"396":1,"407":1,"408":2,"410":2,"414":1,"416":1,"418":3,"428":1,"431":1}}],["наш",{"0":{"409":1},"2":{"4":1,"9":1,"12":1,"39":1,"41":2,"91":1,"95":1,"100":1,"127":2,"132":1,"133":1,"134":1,"141":1,"142":1,"143":2,"184":1,"213":1,"214":1,"215":2,"216":1,"218":3,"219":1,"220":2,"221":4,"222":4,"223":3,"224":1,"229":1,"231":1,"233":2,"235":2,"236":2,"239":2,"244":1,"245":2,"248":1,"249":1,"250":2,"263":3,"264":2,"266":1,"269":1,"272":1,"275":1,"278":1,"283":1,"288":1,"289":4,"290":3,"337":1,"344":2,"345":1,"347":1,"349":1,"350":2,"352":1,"354":1,"356":1,"357":3,"385":2,"386":2,"393":1,"394":2,"397":1,"398":1,"399":2,"400":1,"409":2,"410":5,"412":1,"415":3,"418":2,"426":1,"429":1,"435":1}}],["наших",{"2":{"136":1,"141":1,"163":1,"167":1,"214":1,"218":3,"221":1,"222":1,"237":1,"239":2,"243":1,"245":2,"251":2,"252":1,"258":1,"284":1,"290":1,"315":1,"330":1,"334":1,"337":1,"354":1,"355":1,"356":1,"357":1,"359":1,"386":1,"387":2,"388":1,"405":1,"408":1,"410":1,"411":1,"413":1,"415":2,"416":2,"417":3,"418":1,"421":1,"426":1,"432":1}}],["нашими",{"2":{"222":1,"230":1,"231":1,"233":1,"352":1,"359":1,"387":1}}],["нашим",{"2":{"52":1,"116":1,"130":1,"140":1,"184":1,"214":1,"215":1,"222":1,"239":2,"244":1,"269":1,"289":2,"291":1,"330":1,"348":1,"349":1,"388":1,"393":1,"405":1,"416":1}}],["наши",{"0":{"0":1},"2":{"7":1,"128":1,"133":1,"134":2,"141":2,"142":1,"143":2,"212":1,"215":1,"216":1,"223":1,"230":4,"233":1,"239":1,"244":1,"248":2,"256":1,"269":1,"287":1,"290":1,"291":1,"298":1,"340":1,"345":1,"346":1,"352":1,"382":1,"408":1,"410":1,"413":3,"414":1,"416":1}}],["надстройку",{"2":{"495":1}}],["надёжней",{"2":{"444":1}}],["наделите",{"2":{"299":1}}],["наделение",{"2":{"183":1}}],["надеюсь",{"2":{"162":1,"256":1,"329":1}}],["надежного",{"2":{"349":1,"461":1}}],["надежное",{"2":{"275":1,"387":1,"435":1}}],["надежность",{"2":{"17":1}}],["надежные",{"2":{"363":1}}],["надежных",{"2":{"269":1,"364":1,"451":1}}],["надежными",{"2":{"254":1}}],["надежный",{"2":{"106":1,"128":1}}],["надежная",{"2":{"135":1}}],["надобности",{"2":{"527":1}}],["надо",{"2":{"39":1,"41":2,"47":1,"81":2,"86":1,"96":1,"100":1,"435":1,"439":1,"449":2,"451":3,"452":3,"460":2,"527":1}}],["над",{"0":{"298":1,"454":1},"2":{"4":1,"25":1,"83":1,"96":4,"122":1,"143":2,"172":1,"177":1,"179":1,"213":1,"219":1,"265":2,"278":1,"289":2,"290":1,"292":1,"298":1,"327":1,"372":1,"391":1,"411":1,"429":2,"451":1,"461":1,"484":1}}],["наследуемая",{"2":{"298":1}}],["наследуют",{"2":{"239":1}}],["наследованием",{"0":{"298":1},"2":{"298":1,"452":2}}],["наследования",{"2":{"294":1,"298":3,"331":1,"448":1}}],["насыщенного",{"2":{"291":1}}],["насыщенные",{"2":{"228":1}}],["насколько",{"2":{"139":1,"214":1,"300":1}}],["насчет",{"2":{"23":1,"225":1,"291":1}}],["настал",{"2":{"334":1}}],["настало",{"2":{"214":1,"215":1,"263":1,"289":1,"356":1,"409":1}}],["настоятельно",{"2":{"213":1,"300":1}}],["настоящий",{"2":{"263":1}}],["настоящему",{"2":{"256":1,"334":1}}],["настоящее",{"2":{"125":2,"174":1,"187":1,"190":1,"196":1,"249":1,"251":1,"405":1}}],["настоящую",{"2":{"17":1}}],["настольная",{"2":{"263":1}}],["настольном",{"2":{"258":1}}],["настольному",{"2":{"194":1}}],["настольные",{"2":{"256":1}}],["настольных",{"2":{"186":2,"194":1,"228":1,"254":1,"256":1,"263":1}}],["настольными",{"2":{"138":1,"256":2}}],["настолько",{"2":{"128":1,"139":1,"194":1,"195":2,"285":1,"355":1,"461":1}}],["настройте",{"2":{"460":1}}],["настройку",{"2":{"289":1,"444":1,"448":2}}],["настройкой",{"2":{"289":1}}],["настройке",{"2":{"136":1,"429":1}}],["настройках",{"2":{"247":1}}],["настройками",{"2":{"184":1,"256":1}}],["настройка",{"0":{"131":1,"214":1,"287":1,"444":1,"516":1},"1":{"132":1},"2":{"112":1,"122":1,"200":1,"212":1,"256":1,"429":1,"443":2,"444":1,"495":1}}],["настройки",{"2":{"95":1,"233":1,"419":1,"437":2,"443":1,"541":1}}],["настроили",{"2":{"402":1}}],["настроить",{"2":{"11":1,"125":2,"126":1,"134":1,"430":1,"443":2,"444":1}}],["настроен",{"2":{"435":1}}],["настроена",{"2":{"134":2}}],["настроек",{"2":{"175":1,"222":1,"444":2,"448":1}}],["настраивает",{"2":{"135":1}}],["настраивается",{"2":{"108":1,"256":1}}],["настраиваемой",{"2":{"142":1}}],["настраиваемым",{"2":{"289":1}}],["настраиваемыми",{"2":{"135":1}}],["настраиваемые",{"0":{"280":1},"2":{"78":1}}],["настраиваем",{"2":{"100":1,"429":1}}],["настраивать",{"2":{"62":1,"265":1,"364":1}}],["нас",{"0":{"486":1},"2":{"3":1,"12":1,"16":1,"17":1,"29":1,"36":1,"41":1,"43":1,"48":1,"86":1,"88":1,"93":2,"100":1,"106":1,"114":1,"135":1,"142":1,"143":2,"157":1,"171":1,"184":3,"214":1,"215":1,"222":4,"237":1,"239":3,"244":1,"245":3,"263":1,"264":1,"271":1,"278":1,"280":2,"283":1,"291":1,"298":1,"330":1,"335":1,"337":2,"342":1,"344":1,"347":1,"352":1,"386":1,"390":1,"410":2,"413":1,"435":1,"452":1}}],["на",{"0":{"0":1,"4":1,"93":1,"99":1,"134":1,"362":1,"381":1,"514":1},"1":{"515":1,"516":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,"57":1,"58":1,"62":1,"66":1,"67":2,"68":1,"70":1,"71":1,"79":1,"81":3,"83":2,"86":2,"87":1,"88":1,"89":2,"90":1,"93":2,"99":1,"100":1,"102":1,"103":3,"105":4,"106":14,"107":8,"108":5,"109":11,"110":3,"112":1,"114":2,"116":6,"117":2,"121":3,"125":13,"126":4,"127":6,"128":5,"130":1,"131":3,"133":1,"134":9,"135":5,"136":2,"137":1,"138":3,"139":10,"140":8,"141":2,"142":3,"143":8,"144":1,"147":1,"148":4,"150":3,"151":6,"154":3,"157":1,"159":1,"160":3,"161":1,"162":4,"163":1,"164":3,"165":2,"166":1,"167":1,"169":4,"170":2,"171":3,"172":2,"175":2,"176":3,"177":1,"178":5,"179":2,"180":4,"181":4,"183":5,"184":8,"186":2,"187":1,"188":1,"189":4,"190":2,"191":3,"194":4,"195":4,"196":5,"197":1,"199":3,"200":2,"203":2,"205":1,"208":9,"210":2,"212":2,"213":6,"214":7,"215":5,"216":3,"217":4,"218":3,"219":6,"220":3,"221":1,"222":9,"223":1,"226":3,"227":1,"228":6,"229":1,"231":6,"233":5,"236":10,"237":1,"238":1,"239":3,"243":1,"244":5,"245":6,"246":2,"247":3,"248":5,"249":8,"250":5,"251":6,"254":3,"256":7,"257":1,"258":1,"259":1,"261":3,"262":1,"263":14,"264":3,"266":2,"267":1,"268":1,"270":1,"271":1,"272":2,"273":3,"274":5,"275":2,"278":3,"279":2,"280":3,"281":2,"283":3,"284":3,"285":3,"286":1,"289":7,"290":6,"291":1,"292":1,"293":1,"294":3,"295":2,"297":6,"298":2,"299":5,"300":2,"301":2,"302":1,"303":1,"304":2,"305":6,"306":1,"309":1,"310":1,"312":1,"315":2,"316":1,"318":1,"320":2,"321":4,"324":2,"325":5,"326":1,"327":1,"328":3,"329":3,"330":3,"331":5,"333":1,"334":2,"335":1,"336":2,"337":2,"338":3,"340":2,"342":4,"345":3,"347":4,"348":3,"350":1,"351":1,"352":2,"354":2,"355":12,"356":1,"357":2,"358":1,"365":3,"366":2,"368":1,"371":1,"375":1,"378":1,"379":1,"384":17,"385":3,"386":2,"387":2,"388":2,"389":1,"390":1,"391":5,"392":1,"393":3,"394":3,"395":3,"396":2,"397":6,"399":1,"400":1,"401":1,"402":2,"403":1,"404":1,"405":3,"407":7,"408":3,"409":2,"410":4,"411":5,"412":1,"413":3,"414":1,"416":6,"417":1,"418":2,"419":2,"421":2,"422":2,"423":1,"425":4,"427":2,"428":2,"429":5,"430":4,"431":1,"432":1,"433":2,"435":12,"436":2,"437":3,"439":4,"440":2,"443":3,"444":5,"448":7,"449":11,"450":8,"451":11,"452":8,"453":1,"454":2,"456":3,"459":5,"460":23,"461":16,"469":1,"470":1,"484":1,"486":1,"492":2,"496":3,"497":1,"500":2,"504":1,"505":1,"506":1,"507":1,"508":1,"515":2,"517":1,"524":1,"528":1,"530":2,"533":3,"534":1,"536":1,"537":1,"542":2,"543":1,"544":1}}],["пдд",{"2":{"460":1}}],["пк",{"2":{"444":2}}],["пытаются",{"2":{"330":1,"452":1}}],["пытаться",{"2":{"298":1,"299":1,"303":1,"452":1}}],["пытается",{"2":{"264":1,"417":1,"444":1}}],["птицы",{"2":{"162":1}}],["псевдонима",{"2":{"219":1}}],["псевдонимов",{"2":{"219":1}}],["псевдонимы",{"2":{"215":1}}],["псевдоним",{"2":{"125":1,"219":1,"221":1}}],["пятого",{"2":{"66":1}}],["пятью",{"2":{"180":1}}],["пять",{"2":{"36":1,"148":1}}],["песочницы",{"2":{"444":1}}],["песочнице",{"2":{"443":1}}],["пешеходного",{"2":{"256":1}}],["пейджера",{"2":{"183":2}}],["пейджером",{"2":{"183":1}}],["пейджер",{"0":{"183":1},"1":{"184":1},"2":{"183":2}}],["печатает",{"2":{"386":1}}],["печати",{"2":{"259":1}}],["печать",{"2":{"171":2}}],["печатными",{"2":{"160":1}}],["печально",{"2":{"122":1}}],["петлю",{"2":{"125":1}}],["пет",{"2":{"62":1,"435":1}}],["периодическая",{"2":{"219":1}}],["периодически",{"2":{"212":1}}],["периода",{"2":{"201":1}}],["первую",{"2":{"290":1,"337":1,"384":1,"388":1}}],["первые",{"2":{"384":1,"414":1}}],["первых",{"2":{"228":1,"382":1,"460":1,"485":1}}],["первым",{"2":{"195":1,"289":1,"291":1,"398":1}}],["первый",{"2":{"93":1,"102":1,"125":1,"143":1,"191":1,"195":1,"205":1,"213":1,"223":1,"233":1,"236":2,"238":1,"301":1,"314":1,"331":1,"337":1,"402":1,"411":2,"426":1}}],["первичный",{"2":{"164":1}}],["первая",{"2":{"114":1,"196":1,"200":1,"249":1,"263":1,"384":1,"426":2}}],["первоначальной",{"2":{"205":1}}],["первоначальном",{"2":{"145":1}}],["первоначальный",{"2":{"196":1,"244":1,"272":1}}],["первое",{"2":{"177":1,"222":1,"249":1,"257":1}}],["первоклассные",{"2":{"138":1}}],["первой",{"2":{"17":1,"184":1,"196":1,"233":1,"236":1,"251":1,"294":1,"384":3,"411":1,"425":1,"426":1,"460":1,"461":1}}],["первого",{"2":{"11":1,"17":1,"140":1,"160":1,"163":1,"173":1,"189":1,"194":1,"279":1,"320":1,"351":1,"354":1,"384":1,"411":1,"415":1,"416":2,"449":1}}],["первом",{"2":{"6":1,"7":1,"11":1,"17":2,"22":1,"47":1,"71":1,"106":2,"222":2,"315":1,"329":1,"338":1,"414":1,"461":1}}],["персонализация",{"0":{"86":1}}],["перспективе",{"2":{"68":1,"305":1}}],["переопределение",{"2":{"545":1}}],["переиспользуемые",{"2":{"496":1}}],["переиспользовать",{"2":{"436":1}}],["переименовывая",{"2":{"455":1}}],["переименовываются",{"2":{"440":1}}],["переименовываем",{"2":{"87":1}}],["переименуем",{"2":{"91":1}}],["переутомлению",{"2":{"405":1}}],["переупаковывать",{"2":{"256":1}}],["переадресация",{"2":{"247":1}}],["перезаписывание",{"2":{"489":1}}],["перезаписываем",{"2":{"420":1}}],["перезаписью",{"2":{"233":1}}],["перезагрузка",{"2":{"533":1}}],["перезагрузку",{"2":{"435":1}}],["перезагрузкой",{"2":{"215":1,"228":1}}],["перезагружается",{"2":{"236":1}}],["перечисленные",{"2":{"407":1}}],["перечисленных",{"2":{"250":1}}],["перечислены",{"2":{"239":1}}],["перечислим",{"2":{"228":1}}],["перечень",{"2":{"209":1}}],["перебирать",{"2":{"222":1}}],["перевыполняет",{"2":{"411":1}}],["перевычеслены",{"2":{"222":1}}],["перевода",{"2":{"437":1,"524":1}}],["перевод",{"0":{"362":1},"2":{"460":1,"464":1,"524":1}}],["переводчика",{"2":{"213":1}}],["перевешивают",{"2":{"256":1,"337":1}}],["перевести",{"2":{"67":1,"109":1}}],["перепишите",{"2":{"269":1}}],["переписывание",{"2":{"450":1}}],["переписываете",{"2":{"449":1}}],["переписывать",{"2":{"129":1,"331":1,"420":1}}],["переписать",{"2":{"351":1}}],["переписанный",{"2":{"111":1}}],["переполнение",{"2":{"184":1}}],["перегружена",{"2":{"226":1}}],["перегруженности",{"2":{"180":1}}],["перегруженных",{"2":{"170":1}}],["перегружать",{"2":{"170":1,"191":1}}],["перекомпоновать",{"2":{"396":1}}],["перекрывают",{"2":{"256":1}}],["перекрестного",{"2":{"108":1}}],["переключитесь",{"2":{"427":1}}],["переключателя",{"2":{"531":1}}],["переключатель",{"2":{"330":1}}],["переключать",{"2":{"186":1}}],["переключаться",{"2":{"147":1,"421":1}}],["переключения",{"2":{"176":1,"194":1}}],["переключение",{"2":{"175":1,"273":1,"531":1,"545":3}}],["перерасти",{"2":{"139":1}}],["перейдите",{"2":{"515":1}}],["перейдем",{"2":{"134":1,"163":1,"165":1,"220":1,"323":1,"344":1,"415":1,"428":1}}],["перейти",{"2":{"38":1,"180":1,"239":1,"251":1,"334":1,"358":1,"390":1,"500":1}}],["перехваченные",{"2":{"331":1}}],["перехвачена",{"2":{"330":1}}],["перехвачен",{"2":{"245":1}}],["перехватчиков",{"2":{"500":1}}],["перехватчики",{"2":{"357":1}}],["перехвата",{"2":{"357":2}}],["перехватываем",{"2":{"396":1,"416":1}}],["перехватывается",{"2":{"330":1}}],["перехватывает",{"2":{"264":1,"332":1}}],["перехватывать",{"2":{"329":1}}],["перехватываться",{"2":{"130":1}}],["перехватывая",{"2":{"264":1,"329":1,"416":1}}],["перехвате",{"2":{"263":1}}],["перехватить",{"2":{"247":1,"280":1}}],["перехвату",{"2":{"222":1}}],["переходом",{"2":{"242":1}}],["переходов",{"2":{"151":1}}],["переходе",{"2":{"208":1}}],["переходят",{"2":{"194":1}}],["переходит",{"2":{"194":1,"298":1}}],["переходить",{"2":{"110":1,"272":1,"290":1}}],["переходим",{"2":{"125":1,"249":1}}],["переход",{"2":{"109":1,"110":1,"121":3,"240":1,"290":1,"354":1,"427":1,"454":1}}],["перехода",{"2":{"23":1,"151":1,"186":1,"189":1,"229":1,"233":1,"238":1,"240":1,"433":1}}],["пересылает",{"2":{"461":1}}],["пересылаемый",{"2":{"106":1}}],["перестанет",{"2":{"453":1}}],["перестает",{"2":{"325":1,"449":1}}],["пересчитали",{"2":{"451":1}}],["пересчет",{"2":{"222":1}}],["пересчете",{"2":{"125":1}}],["пересмотреть",{"2":{"344":1}}],["пересмотрите",{"2":{"126":1}}],["пересекаться",{"2":{"242":1}}],["пересекаются",{"2":{"198":1}}],["пересечении",{"2":{"183":1}}],["перешло",{"2":{"118":1}}],["перешел",{"2":{"117":1}}],["перемещения",{"2":{"259":1,"282":1,"425":1}}],["перемещая",{"2":{"455":1}}],["перемещать",{"2":{"222":1}}],["перемещаться",{"2":{"183":1}}],["перемещается",{"2":{"194":1,"222":1}}],["перемещает",{"2":{"169":1}}],["переместившись",{"2":{"427":1}}],["переместит",{"2":{"220":1}}],["переместился",{"2":{"117":1,"215":1}}],["переменным",{"2":{"143":2}}],["переменными",{"2":{"143":1}}],["переменные",{"0":{"153":1},"2":{"140":1,"142":1,"143":4,"222":2,"276":1,"281":1,"284":1,"290":1,"301":1,"337":1,"349":1,"400":1,"449":1,"451":2,"545":1}}],["переменных",{"2":{"114":1,"139":1,"143":1,"151":1,"222":1,"263":1,"395":1,"448":1,"545":1}}],["переменная",{"2":{"139":1,"140":1,"143":1,"145":3,"146":2,"184":1,"222":1,"273":1,"280":1,"289":1,"290":2,"337":1,"451":2}}],["переменную",{"2":{"139":1,"143":2,"146":1,"150":1,"186":1,"222":2,"283":1,"284":1,"285":1,"315":1,"342":2,"343":2,"347":1,"349":1,"449":2,"451":1}}],["переменной",{"2":{"93":1,"106":1,"139":2,"140":1,"143":3,"145":2,"149":2,"151":2,"184":2,"222":1,"223":1,"233":1,"280":2,"289":1,"344":1,"347":1,"400":2,"448":2,"449":1,"451":2,"536":1}}],["перелогиниваться",{"2":{"106":1}}],["перелогин",{"2":{"106":1}}],["переделать",{"2":{"226":1}}],["передаю",{"2":{"449":1}}],["передающих",{"2":{"391":1}}],["передают",{"2":{"327":1,"342":1}}],["передаются",{"2":{"279":2,"396":1,"402":1}}],["передаст",{"2":{"249":1}}],["переданы",{"2":{"289":1}}],["переданной",{"2":{"411":1}}],["переданного",{"2":{"391":1}}],["переданное",{"2":{"357":1,"416":1}}],["переданному",{"2":{"336":1}}],["переданную",{"2":{"247":1,"322":1}}],["переданные",{"2":{"385":1,"391":1}}],["переданными",{"2":{"416":1}}],["переданным",{"2":{"147":1,"253":1}}],["переданный",{"2":{"114":1}}],["передан",{"2":{"233":1,"239":1,"283":1}}],["передадим",{"2":{"233":1}}],["передач",{"2":{"460":1}}],["передача",{"2":{"238":1,"320":1,"321":2,"438":1}}],["передаче",{"2":{"215":1}}],["передачи",{"2":{"143":1,"245":1,"279":1,"281":1,"283":1,"320":1,"342":1}}],["передачу",{"2":{"134":1}}],["передаваемых",{"2":{"397":1}}],["передаваемые",{"2":{"247":1,"333":1,"384":1}}],["передаваемой",{"2":{"400":1}}],["передаваемое",{"2":{"391":1}}],["передаваемому",{"2":{"283":1}}],["передавать",{"2":{"219":2,"239":1,"250":1,"273":1,"279":1,"281":1,"283":1,"337":1,"344":2,"345":1,"384":1,"388":1,"437":1,"451":1}}],["передаваться",{"2":{"127":1,"285":1,"342":1,"395":1}}],["передавая",{"2":{"140":1,"219":1,"233":1,"274":1,"326":1,"329":1,"392":1,"415":1,"437":1}}],["передав",{"2":{"126":1,"236":1}}],["передает",{"2":{"244":1,"283":1,"326":1,"409":1}}],["передается",{"2":{"118":1,"209":1,"318":1}}],["передаем",{"2":{"111":1,"127":1,"140":1,"184":1,"233":2,"239":2,"249":1,"265":1,"336":1,"337":1,"343":1,"347":1,"352":1,"392":1,"396":1,"400":1,"402":2,"415":2,"416":3}}],["передаёт",{"2":{"106":1}}],["передать",{"2":{"47":1,"132":1,"142":1,"184":1,"236":2,"245":1,"278":2,"280":1,"304":1,"326":1,"342":2,"395":1,"416":1,"449":2}}],["перед",{"2":{"100":1,"139":2,"143":1,"170":1,"171":1,"184":1,"187":1,"188":1,"202":1,"214":1,"215":1,"233":1,"236":1,"242":1,"251":1,"263":1,"278":1,"281":1,"301":2,"319":1,"321":1,"331":1,"337":1,"387":1,"388":1,"428":1,"430":1,"440":1,"460":1,"495":1}}],["переехать",{"2":{"39":1}}],["перенесенного",{"2":{"384":1}}],["перенесена",{"2":{"321":1}}],["перенести",{"2":{"86":1,"133":1}}],["перенаправить",{"2":{"249":1}}],["перенаправит",{"2":{"247":1}}],["перенаправлен",{"2":{"246":1}}],["перенаправления",{"2":{"246":2,"247":1}}],["перенаправлениях",{"2":{"245":1}}],["перенаправление",{"2":{"208":1,"249":1}}],["перенаправляющие",{"2":{"248":1}}],["перенаправляют",{"2":{"208":1}}],["перенаправляем",{"2":{"246":1}}],["перенаправляться",{"2":{"245":1}}],["перенасыщенности",{"2":{"180":1}}],["переноса",{"2":{"269":1}}],["переносить",{"2":{"151":1,"228":1}}],["переносится",{"2":{"30":1,"313":1,"444":1}}],["переносе",{"2":{"138":1}}],["перенос",{"0":{"134":1},"2":{"251":1}}],["перенять",{"2":{"26":1}}],["плевел",{"2":{"460":1}}],["плечах",{"2":{"167":1}}],["плохая",{"2":{"449":2}}],["плохие",{"2":{"305":1,"459":1}}],["плохую",{"2":{"305":1}}],["плохой",{"2":{"162":1,"302":1,"448":1}}],["плохо",{"2":{"64":1,"448":1,"459":1}}],["плавность",{"2":{"384":1}}],["плавающее",{"2":{"204":1}}],["плавающей",{"2":{"196":1}}],["плавающего",{"2":{"179":1}}],["плавающий",{"2":{"177":1}}],["платежей",{"2":{"452":1}}],["плату",{"2":{"429":1}}],["платформах",{"2":{"432":1}}],["платформа",{"2":{"263":3,"429":1}}],["платформы",{"2":{"256":1,"258":1,"261":1,"263":1,"267":1}}],["платных",{"2":{"248":1}}],["платные",{"2":{"39":1,"460":1}}],["платная",{"2":{"213":2}}],["платить",{"2":{"143":1}}],["плагине",{"2":{"285":1,"289":1}}],["плагину",{"2":{"265":1}}],["плагинами",{"2":{"443":1}}],["плагина",{"2":{"233":1,"264":1,"267":1,"269":1,"281":1,"288":1,"289":3,"290":1,"461":1,"503":1}}],["плагином",{"2":{"219":1,"286":1,"289":1}}],["плагинов",{"0":{"112":1},"2":{"110":1,"112":1,"116":1,"138":1,"142":1,"219":2,"265":1,"286":1,"354":1,"392":1,"443":1,"444":1}}],["плагин",{"0":{"265":1,"286":1},"1":{"287":1,"288":1,"289":1},"2":{"116":2,"213":1,"229":1,"264":1,"265":6,"269":1,"275":1,"286":1,"288":1,"289":4,"290":2,"292":1,"293":1,"402":3,"503":1}}],["плагины",{"2":{"95":1,"110":1,"111":1,"112":1,"121":1,"138":1,"215":1,"251":1,"254":1,"286":1,"287":1,"443":1,"449":1}}],["планшетов",{"2":{"506":1}}],["планшеты",{"2":{"256":1}}],["планирования",{"2":{"389":1,"390":1}}],["планирование",{"2":{"389":1}}],["планироваться",{"2":{"389":1}}],["планируется",{"2":{"63":1,"496":1}}],["планов",{"2":{"203":1}}],["планы",{"2":{"107":2}}],["план",{"0":{"65":1},"1":{"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1},"2":{"405":1,"407":2}}],["планах",{"0":{"533":1}}],["планами",{"2":{"439":1}}],["плана",{"2":{"40":1,"66":1,"390":1,"408":1}}],["плане",{"2":{"9":1,"25":1,"223":1,"448":1,"449":1,"459":1}}],["плюсы",{"2":{"449":1,"459":2}}],["плюсом",{"2":{"222":1}}],["плюс",{"2":{"25":1,"55":1,"106":1,"143":1,"220":1,"396":1,"410":1,"435":1,"449":1}}],["пищеварительной",{"2":{"297":1}}],["пикселей",{"2":{"194":1}}],["пиктограмму",{"2":{"192":1}}],["пиктограмм",{"2":{"189":1}}],["пиктограммами",{"2":{"186":2}}],["пиктограммой",{"2":{"179":1}}],["пиктограммы",{"2":{"166":1,"167":1,"171":1,"177":1,"178":1}}],["письмо",{"2":{"249":2}}],["письмом",{"2":{"201":1}}],["письмами",{"2":{"209":1}}],["писем",{"2":{"178":1,"249":1}}],["писать",{"2":{"81":1,"143":1,"157":1,"219":1,"410":1,"420":1,"449":1,"451":1,"492":1}}],["писаться",{"2":{"23":1}}],["пишут",{"2":{"304":1}}],["пишутся",{"2":{"153":1,"156":1}}],["пишет",{"2":{"461":1}}],["пишете",{"2":{"301":1,"302":1}}],["пишем",{"2":{"9":1,"142":1}}],["пиши",{"0":{"304":1},"1":{"307":1,"308":1,"309":1,"310":1},"2":{"294":1,"302":1}}],["пуша",{"2":{"435":1}}],["пули",{"2":{"275":1}}],["пулей",{"2":{"256":1}}],["пузырьком",{"2":{"178":1}}],["пузырьки",{"0":{"178":1}}],["пузыря",{"2":{"177":1}}],["публикуются",{"2":{"486":1}}],["публикуем",{"2":{"347":1,"391":1}}],["публиковаться",{"2":{"389":1}}],["публикацию",{"2":{"430":1}}],["публикации",{"2":{"122":1,"124":1,"136":1,"137":1,"325":2,"347":1}}],["публикация",{"0":{"124":1},"1":{"125":1},"2":{"122":1,"124":1}}],["публичным",{"2":{"251":1}}],["публичный",{"2":{"125":2,"215":1}}],["пупкина",{"2":{"106":1}}],["пупкин",{"2":{"106":1}}],["путаница",{"2":{"251":1}}],["путаницу",{"2":{"162":1,"180":1}}],["пути",{"2":{"126":2,"187":1,"219":2,"221":1,"233":1,"236":1,"238":1,"242":4,"252":1,"347":1}}],["путешествии",{"2":{"214":1}}],["путешествовать",{"2":{"114":1}}],["путем",{"2":{"108":1,"129":1,"131":1,"165":1,"188":1,"219":1,"239":1,"242":1,"244":1,"245":2,"289":1,"298":1,"331":1,"392":1,"421":1}}],["путей",{"2":{"86":1,"219":1}}],["путь",{"0":{"141":2},"2":{"102":1,"118":2,"124":1,"126":3,"127":2,"130":1,"131":1,"132":2,"142":1,"158":1,"162":1,"236":1,"239":1,"242":1,"259":1,"264":1,"281":1,"385":1,"425":1}}],["путях",{"2":{"100":1,"443":1}}],["путями",{"2":{"100":1,"126":1,"238":1}}],["пункте",{"2":{"515":1}}],["пункту",{"2":{"344":1}}],["пунктирными",{"2":{"272":1}}],["пункт",{"2":{"200":2,"301":1}}],["пункты",{"2":{"124":1,"220":1,"236":1,"261":1,"290":2}}],["пунктов",{"2":{"29":1,"110":1,"189":1,"220":1,"236":1}}],["пунктах",{"2":{"266":1,"390":1}}],["пункта",{"2":{"4":1,"320":1}}],["пуст",{"2":{"222":1}}],["пуста",{"2":{"222":1}}],["пустого",{"2":{"495":1,"544":1}}],["пустом",{"2":{"218":1}}],["пустой",{"2":{"7":1,"322":1,"326":1,"347":1}}],["пустым",{"2":{"125":1,"357":1}}],["пусть",{"2":{"16":1,"238":1,"452":1,"456":1}}],["падает",{"2":{"384":1}}],["пабло",{"2":{"368":1}}],["пагинации",{"2":{"183":2}}],["пагинация",{"0":{"183":1},"1":{"184":1},"2":{"183":1}}],["памятью",{"2":{"347":2}}],["память",{"2":{"171":1,"301":1}}],["памяти",{"2":{"118":1,"125":1,"171":1,"301":3,"384":1,"420":1,"444":1}}],["паттерн",{"2":{"222":1,"236":1,"448":1}}],["паттернов",{"2":{"158":1,"226":1,"252":1,"294":1,"364":1,"365":1,"380":1,"405":1}}],["паттерны",{"2":{"138":2,"216":2,"220":1,"223":2,"226":1,"377":1,"409":1,"459":1}}],["паутина",{"2":{"138":1}}],["папок",{"0":{"215":1},"2":{"128":1,"212":1}}],["папкоподобная",{"2":{"187":1}}],["папке",{"2":{"161":1,"215":1,"218":1,"230":2,"249":1,"289":1,"425":3,"440":1}}],["папка",{"2":{"126":1,"127":1,"131":1,"134":1,"215":4}}],["папки",{"2":{"117":1,"214":1,"218":1,"287":1,"440":2}}],["папку",{"2":{"117":1,"127":1,"134":1,"214":1,"215":1,"216":1,"217":1,"218":1,"287":1,"410":2,"440":3}}],["панацея",{"2":{"84":1}}],["панелей",{"2":{"189":1}}],["панели",{"0":{"181":1},"1":{"182":1},"2":{"31":1,"82":1,"178":1,"186":3,"189":1,"191":1,"196":1,"231":1,"236":1,"418":1,"515":1,"535":1}}],["панелью",{"2":{"191":1}}],["панель",{"2":{"28":1,"79":1,"128":2,"129":1,"167":1,"181":1,"194":3,"196":1,"231":1,"239":1,"419":1,"436":1}}],["палитры",{"2":{"533":1}}],["палитру",{"2":{"164":1}}],["пал",{"2":{"39":1}}],["пару",{"2":{"245":1,"444":1,"448":1,"456":1,"496":1,"524":1}}],["паролей",{"2":{"245":2,"250":1}}],["паролями",{"2":{"244":1,"245":1}}],["пароля",{"2":{"244":2,"250":1,"252":1}}],["паролю",{"0":{"244":1,"249":1},"2":{"244":1}}],["пароль",{"2":{"106":1,"245":1,"250":1,"449":1}}],["парольной",{"2":{"40":1}}],["параграфов",{"2":{"524":1}}],["параграфы",{"2":{"460":1}}],["параграфа",{"2":{"263":1}}],["параллельно",{"2":{"407":1}}],["парами",{"2":{"236":1}}],["параметре",{"2":{"328":1}}],["параметром",{"2":{"278":1,"398":1,"411":1,"524":1}}],["параметров",{"2":{"214":1,"316":1,"335":1,"342":1,"391":1,"398":1,"402":1,"416":1,"489":1}}],["параметр",{"2":{"233":1,"239":3,"321":1,"337":1,"398":1,"402":1,"411":2,"489":1,"516":1}}],["параметрам",{"2":{"253":1}}],["параметрами",{"2":{"237":1,"242":2,"435":1}}],["параметра",{"2":{"118":1,"233":1,"238":1,"240":1,"242":1,"278":2,"289":1,"318":1,"321":1,"326":1,"336":1,"385":1,"386":1,"392":1,"411":1}}],["параметры",{"2":{"95":1,"143":2,"229":1,"233":1,"236":1,"239":2,"241":1,"247":1,"286":1,"300":1,"325":1,"437":1,"496":1,"497":1,"533":1}}],["параметру",{"2":{"48":1,"336":1}}],["парадигм",{"2":{"298":1}}],["парадигму",{"2":{"138":1}}],["парадигмы",{"2":{"138":2,"298":1}}],["пара",{"2":{"11":1,"222":1}}],["паре",{"2":{"3":1}}],["пакет",{"2":{"215":2,"233":1,"278":1,"327":1,"345":2,"409":2,"410":1,"436":1,"444":1,"453":1,"492":1,"527":1}}],["пакетных",{"2":{"213":1}}],["пакетами",{"2":{"443":1}}],["пакета",{"2":{"111":1,"116":1,"118":1,"136":1,"143":1,"214":2,"229":1,"230":1,"233":3,"278":3,"351":1,"405":1,"408":1,"423":1,"445":1,"448":1}}],["пакеты",{"2":{"5":1,"228":1,"496":1}}],["пакетов",{"2":{"5":1,"214":2,"410":1,"423":1,"444":1,"492":1}}],["п",{"2":{"4":1,"38":1,"103":1,"179":1,"426":1,"450":1,"452":1,"484":1,"495":1}}],["поиграйте",{"2":{"460":1}}],["поизучайте",{"2":{"460":1}}],["поисковых",{"2":{"461":1}}],["поисковыми",{"2":{"228":1,"256":1}}],["поисковиков",{"2":{"461":1}}],["поисковик",{"2":{"461":1}}],["поисковиками",{"2":{"461":2}}],["поисковая",{"2":{"89":1}}],["поисковой",{"2":{"89":1}}],["поиск",{"0":{"48":1},"2":{"16":1,"17":2,"48":2,"79":1,"167":1,"191":1,"218":1}}],["поисках",{"2":{"392":1}}],["поискать",{"2":{"89":1,"442":1}}],["поиска",{"2":{"4":1,"29":1,"48":2,"195":2,"244":1}}],["поэкспериментируйте",{"2":{"460":1}}],["поэтапного",{"2":{"267":1}}],["поэтапно",{"2":{"60":1}}],["поэтому",{"2":{"13":1,"23":1,"44":1,"64":2,"86":1,"89":1,"102":1,"115":2,"125":1,"128":1,"134":1,"135":1,"139":1,"140":1,"141":1,"143":2,"151":2,"157":1,"158":1,"163":2,"171":1,"179":1,"181":2,"188":1,"194":1,"214":1,"216":1,"217":1,"218":2,"223":1,"237":1,"242":1,"245":2,"246":1,"250":1,"251":3,"258":1,"263":2,"264":1,"271":1,"279":1,"290":1,"296":1,"298":1,"301":1,"314":1,"321":2,"325":1,"329":1,"344":1,"345":1,"355":3,"357":1,"383":1,"384":4,"386":2,"387":1,"389":1,"391":1,"394":1,"395":2,"397":1,"402":1,"409":1,"410":1,"412":2,"413":1,"416":2,"417":1,"418":1,"423":1,"425":1,"429":1,"444":2,"448":1,"449":1,"451":1,"452":1,"461":1}}],["пояснить",{"2":{"331":1}}],["появятся",{"2":{"151":1}}],["появляются",{"2":{"215":1,"261":1,"384":1,"444":1}}],["появляется",{"2":{"33":1,"237":1,"239":1,"256":1,"290":1,"437":1,"522":1}}],["появлении",{"2":{"428":1,"504":1}}],["появление",{"2":{"228":2}}],["появлением",{"2":{"138":1,"228":1}}],["появления",{"2":{"215":1,"228":1,"461":1}}],["появлению",{"2":{"143":1,"416":1}}],["появившаяся",{"2":{"420":1}}],["появиться",{"2":{"184":1,"214":1,"272":1,"289":1,"409":1}}],["появится",{"2":{"108":1,"135":1,"146":1,"184":1,"214":1,"218":1,"263":1,"428":1}}],["появились",{"2":{"119":1,"138":1,"173":1,"294":1,"419":1,"449":1}}],["появился",{"2":{"110":1,"272":1,"280":1,"449":1,"461":1}}],["появилась",{"2":{"93":1,"115":1,"228":1,"329":1,"451":1,"495":1}}],["появилось",{"2":{"61":1,"448":1,"449":1}}],["пошагово",{"2":{"289":1}}],["пожалуй",{"2":{"256":1,"278":1,"297":1,"408":1}}],["пожалуйста",{"2":{"244":1,"321":1,"390":1}}],["побуждает",{"2":{"251":1}}],["побочных",{"2":{"284":1,"302":1}}],["побочным",{"2":{"233":1,"342":1}}],["побочные",{"2":{"180":1}}],["погрузимся",{"2":{"340":1,"348":1}}],["поговорим",{"2":{"142":1,"243":1,"426":1}}],["погуглим",{"2":{"22":1}}],["поймать",{"2":{"448":1}}],["поймете",{"2":{"165":1,"194":1,"299":1}}],["поймем",{"2":{"139":1,"160":1}}],["пойдем",{"2":{"124":1,"244":1}}],["пойдет",{"2":{"107":1,"420":1}}],["почта",{"2":{"249":1}}],["почтовые",{"2":{"228":1}}],["почти",{"2":{"218":1,"264":1,"302":1,"411":1,"423":1,"460":1}}],["почты",{"2":{"125":1,"178":1,"243":1,"249":2,"250":1,"251":1}}],["почувствовать",{"2":{"207":1}}],["почву",{"2":{"162":1}}],["почему",{"2":{"39":1,"109":1,"137":1,"159":2,"163":3,"165":1,"211":1,"225":2,"266":1,"285":1,"339":3,"384":1,"392":1,"416":1,"432":3,"451":1,"459":1,"460":1}}],["поработайте",{"2":{"460":2}}],["поработать",{"2":{"391":1}}],["поработаем",{"2":{"289":1,"327":1}}],["пора",{"2":{"272":1,"334":1}}],["порой",{"2":{"460":1}}],["порог",{"2":{"451":1}}],["порождать",{"2":{"384":1}}],["порождающие",{"0":{"307":1}}],["порождают",{"2":{"305":1}}],["порождал",{"2":{"284":1}}],["порождает",{"2":{"141":1}}],["породили",{"2":{"228":1}}],["породить",{"2":{"192":1}}],["порекомендовать",{"2":{"157":1}}],["пор",{"2":{"139":1,"141":1,"150":1,"151":1,"161":1,"188":1,"191":1,"201":1,"212":1,"228":1,"236":1,"237":1,"239":2,"249":1,"272":1,"275":1,"278":1,"304":1,"318":1,"334":1,"337":1,"349":1,"384":1,"421":1}}],["порядки",{"2":{"461":1}}],["порядковому",{"2":{"416":1}}],["порядковым",{"2":{"183":1}}],["порядке",{"2":{"141":1,"183":1,"194":1,"214":1,"215":2,"222":1,"258":1,"289":1,"290":1,"392":1}}],["порядка",{"2":{"141":1,"166":1,"183":1,"189":1}}],["порядку",{"2":{"124":1,"423":1}}],["порядок",{"2":{"109":1,"290":1}}],["портфолио",{"2":{"494":1,"495":1,"496":1}}],["порта",{"2":{"355":1}}],["порталов",{"2":{"125":1}}],["портал",{"2":{"106":1}}],["портрет",{"2":{"265":1}}],["портретная",{"2":{"260":1}}],["портретных",{"2":{"194":1}}],["порт",{"2":{"214":1,"402":1}}],["портом",{"2":{"108":1}}],["похудеет",{"2":{"448":1}}],["похвастаться",{"2":{"394":1}}],["похож",{"2":{"355":1}}],["похожем",{"2":{"542":1}}],["похожей",{"2":{"301":1,"387":1}}],["похоже",{"2":{"250":1,"254":1,"320":1}}],["похожее",{"2":{"239":1}}],["похожим",{"2":{"331":1,"352":1}}],["похожий",{"2":{"278":1}}],["похожи",{"2":{"147":1,"395":1,"398":1}}],["похожие",{"2":{"4":1,"22":1,"169":1}}],["похакать",{"2":{"107":1}}],["повысит",{"2":{"458":1}}],["повысить",{"2":{"382":1,"452":1,"544":1}}],["повышению",{"2":{"377":1}}],["повышение",{"2":{"359":1,"485":1}}],["повышения",{"2":{"228":1,"267":1,"329":1,"382":1}}],["повышается",{"2":{"452":1,"461":1}}],["повышает",{"2":{"79":1,"403":1,"429":1,"436":1}}],["повсеместно",{"2":{"334":1}}],["повседневном",{"2":{"170":1}}],["повсюду",{"2":{"194":1}}],["поводу",{"2":{"177":1,"181":1}}],["повлиять",{"2":{"404":1}}],["повлияют",{"2":{"396":1}}],["повлияет",{"2":{"169":1,"236":1,"279":1,"384":1}}],["повлияли",{"2":{"117":1}}],["повторяйтесь",{"2":{"334":1}}],["повторяйся",{"0":{"302":1}}],["повторяющегося",{"2":{"451":1}}],["повторяющееся",{"2":{"165":1,"277":1}}],["повторяющихся",{"2":{"294":1}}],["повторяемому",{"2":{"271":1}}],["повторяется",{"2":{"184":1,"407":1}}],["повторяет",{"2":{"165":1}}],["повторять",{"2":{"219":1,"344":1}}],["повторяться",{"2":{"216":1,"219":1,"294":1,"344":1}}],["повторения",{"2":{"165":2,"166":1,"284":1,"314":1,"398":1}}],["повторение",{"0":{"165":1},"2":{"165":4}}],["повторно",{"2":{"143":1,"231":1,"293":1}}],["повторного",{"2":{"143":1,"263":1,"282":1,"284":1,"295":1,"305":1,"318":1,"418":1}}],["поверх",{"2":{"139":2,"178":1,"213":1,"243":1,"244":1,"394":1,"429":1}}],["поведенческие",{"0":{"308":1}}],["поведенческих",{"2":{"68":1}}],["поведением",{"2":{"138":1}}],["поведение",{"2":{"68":1,"94":1,"138":1,"144":1,"165":1,"215":1,"222":1,"299":1,"312":1,"451":1}}],["поведения",{"2":{"67":1,"183":1,"195":1,"202":1,"384":1}}],["покрывается",{"2":{"418":1}}],["покрытии",{"2":{"418":3}}],["покрытия",{"2":{"418":2}}],["покрытие",{"0":{"418":1},"2":{"417":1,"418":1}}],["покидать",{"2":{"274":1}}],["покидают",{"2":{"250":1}}],["покупку",{"2":{"201":1}}],["покупках",{"2":{"205":1}}],["покупка",{"2":{"201":1}}],["покупке",{"2":{"136":1,"205":1}}],["покупки",{"2":{"125":1,"200":2,"366":1}}],["покупать",{"2":{"125":1}}],["покупателей",{"2":{"79":1,"461":1}}],["покупателя",{"2":{"79":1}}],["покупаем",{"2":{"125":1}}],["покупок",{"2":{"79":1,"200":1}}],["показывали",{"2":{"460":1,"461":1}}],["показывания",{"2":{"435":1}}],["показываем",{"2":{"249":1}}],["показывает",{"2":{"110":1,"146":1,"177":1,"384":1,"393":1,"420":1,"449":1}}],["показывается",{"2":{"30":2,"31":1}}],["показывать",{"2":{"177":1,"299":1,"451":1,"461":1}}],["показываться",{"2":{"147":1,"448":1}}],["показываются",{"2":{"438":1}}],["показывают",{"2":{"147":1,"189":1}}],["показывающее",{"2":{"358":1}}],["показывающие",{"2":{"262":1}}],["показывающих",{"2":{"187":1}}],["показывающим",{"2":{"93":1}}],["показывающая",{"2":{"93":1,"178":1}}],["показывая",{"2":{"147":1,"166":1,"175":1,"220":1}}],["показ",{"2":{"79":1,"452":1}}],["показав",{"2":{"384":1}}],["показателей",{"0":{"266":1}}],["показать",{"0":{"167":1},"2":{"178":1,"181":1,"191":1,"425":1}}],["показаться",{"2":{"26":1,"128":1,"142":3,"215":1,"254":1,"256":1,"301":1,"331":1,"337":1,"384":1,"416":1}}],["показана",{"2":{"416":1}}],["показанном",{"2":{"290":1}}],["показанное",{"2":{"195":1}}],["показаны",{"2":{"183":1,"283":1}}],["показано",{"2":{"125":1,"143":1,"244":1,"280":1,"327":1,"336":1,"341":1,"342":1,"343":1,"347":1,"349":1,"378":1,"390":1}}],["показа",{"2":{"47":1,"147":2,"440":1}}],["показе",{"2":{"30":1,"263":1}}],["пока",{"2":{"25":1,"34":1,"41":1,"72":1,"87":1,"88":2,"95":1,"96":1,"125":1,"138":1,"139":1,"142":1,"151":2,"183":1,"188":1,"201":1,"219":1,"231":1,"233":1,"236":1,"243":1,"249":1,"272":1,"275":1,"278":1,"289":2,"297":1,"301":1,"304":1,"316":1,"318":1,"332":1,"335":1,"337":1,"352":1,"384":1,"392":1,"426":1}}],["поняли",{"2":{"214":1,"263":1}}],["поняв",{"2":{"151":1}}],["понятен",{"2":{"195":1,"402":1}}],["понять",{"2":{"152":1,"172":1,"194":1,"223":1,"245":1,"264":1,"273":1,"312":1,"338":1,"350":1,"351":1,"391":1,"410":1,"438":1,"449":1,"460":1}}],["понятий",{"2":{"141":1,"268":1}}],["понятийном",{"2":{"67":1}}],["понятиями",{"2":{"169":1,"281":1}}],["понятия",{"2":{"139":1,"141":1,"158":1,"253":1,"302":1,"325":1,"345":1,"370":1,"380":1,"431":1,"452":1}}],["понятии",{"2":{"139":1}}],["понятие",{"2":{"106":1,"140":1,"283":1,"302":1,"419":1,"429":1,"451":1}}],["понятное",{"2":{"385":1}}],["понятно",{"2":{"281":1,"391":1,"495":1}}],["понятной",{"2":{"179":1}}],["понятна",{"2":{"194":1,"348":1}}],["понятные",{"2":{"443":1}}],["понятными",{"2":{"183":1}}],["понятным",{"2":{"109":1,"304":1,"382":1}}],["понятный",{"2":{"67":1,"77":1,"190":1,"342":1}}],["понятную",{"2":{"88":1,"459":1}}],["понадобятся",{"2":{"222":1,"255":1,"329":1}}],["понадобится",{"2":{"36":1,"72":1,"95":1,"96":1,"140":1,"222":2,"289":1,"290":1,"321":1,"443":1}}],["понадобиться",{"2":{"34":1}}],["поначалу",{"2":{"142":1}}],["понимается",{"2":{"303":1}}],["понимаете",{"2":{"239":1,"429":1}}],["понимают",{"2":{"181":1,"223":1,"302":1}}],["понимаются",{"2":{"173":1,"440":1}}],["понимании",{"2":{"340":1,"355":1}}],["пониманием",{"2":{"195":1}}],["понимание",{"0":{"142":1},"2":{"162":1,"167":1,"294":1,"342":1,"363":1,"460":1}}],["понимания",{"2":{"64":1,"67":1,"122":1,"136":1,"162":1,"191":1,"294":1,"327":1,"335":1,"337":1,"341":1,"349":1,"365":1,"379":1,"400":1}}],["понимать",{"2":{"106":1,"139":1,"245":1,"305":1,"409":1,"460":1}}],["попробуйте",{"2":{"442":1,"444":1,"460":2}}],["попробует",{"2":{"442":1}}],["попробуем",{"2":{"428":1}}],["попросите",{"2":{"165":1}}],["попап",{"2":{"448":1}}],["попасть",{"2":{"344":1}}],["попадают",{"2":{"418":1}}],["попадает",{"2":{"181":1,"249":1}}],["попадет",{"2":{"169":1,"219":1}}],["попытаемся",{"2":{"428":1}}],["попытается",{"2":{"165":1,"414":1}}],["попытаться",{"2":{"132":1,"264":2,"418":1}}],["попытался",{"2":{"61":1}}],["попытка",{"2":{"109":1,"330":1,"408":1}}],["популярности",{"2":{"444":1}}],["популярность",{"2":{"157":1}}],["популярной",{"2":{"421":1}}],["популярном",{"2":{"217":1}}],["популярного",{"2":{"216":1}}],["популярна",{"2":{"208":1,"448":1,"524":1}}],["популярными",{"2":{"251":1,"254":1,"533":1}}],["популярным",{"2":{"189":2,"407":1,"461":1}}],["популярные",{"2":{"186":1,"443":1,"496":1}}],["популярны",{"2":{"180":1,"189":1}}],["популярных",{"2":{"138":1,"213":1,"420":1}}],["популярный",{"2":{"107":1,"213":2,"435":1}}],["популярен",{"2":{"128":1,"131":1,"140":1,"175":1,"324":1,"421":1,"429":1}}],["популяризация",{"2":{"109":2}}],["попутный",{"2":{"64":1}}],["попутно",{"2":{"62":1,"138":1}}],["познавательные",{"2":{"431":1}}],["познакомившись",{"2":{"160":1}}],["познакомились",{"2":{"136":1,"210":1,"382":1,"403":1}}],["познакомился",{"2":{"61":1}}],["познакомимся",{"2":{"122":1,"138":1,"160":1,"215":1,"252":1,"254":1,"269":2}}],["позитивного",{"2":{"412":1}}],["позиционируют",{"2":{"495":1}}],["позицией",{"2":{"251":1}}],["позиции",{"2":{"186":1}}],["позора",{"0":{"207":1}}],["поздно",{"2":{"169":1,"453":1}}],["позаботится",{"2":{"143":1,"215":1,"222":1,"351":1}}],["позже",{"2":{"96":1,"125":2,"140":1,"151":1,"213":1,"218":1,"231":1,"233":1,"263":2,"273":1,"281":1,"283":1,"284":1,"289":1,"298":1,"302":1,"354":1,"391":1,"392":1,"400":1,"409":1,"426":1,"461":1}}],["позволили",{"2":{"228":1}}],["позволить",{"2":{"58":1,"320":1}}],["позволит",{"2":{"11":1,"47":1,"186":1,"215":1,"281":1,"294":1,"301":1,"338":1,"363":1,"409":1,"410":1}}],["позволял",{"2":{"284":1}}],["позволят",{"2":{"278":1,"382":1,"429":1}}],["позволяя",{"2":{"219":1,"335":1,"433":1}}],["позволяют",{"2":{"175":1,"235":1,"242":1,"256":1,"280":1,"397":1,"439":1,"443":1}}],["позволяющего",{"2":{"420":1}}],["позволяющее",{"2":{"312":1}}],["позволяющему",{"2":{"174":1}}],["позволяющая",{"2":{"252":1,"331":1,"403":1}}],["позволяющую",{"2":{"233":1}}],["позволяющим",{"2":{"249":1}}],["позволяющими",{"2":{"210":1}}],["позволяющих",{"2":{"245":1,"403":1}}],["позволяющие",{"2":{"138":1,"210":1,"251":1,"301":1,"429":1,"495":1}}],["позволяющий",{"2":{"108":1,"119":1,"129":1,"183":1,"263":1,"286":1,"355":1}}],["позволяйте",{"2":{"171":2}}],["позволяет",{"2":{"34":1,"67":1,"68":1,"83":1,"96":1,"116":1,"125":2,"129":1,"139":1,"142":1,"151":1,"181":1,"183":2,"187":1,"188":1,"190":1,"215":3,"229":1,"236":1,"239":3,"242":1,"278":1,"280":1,"297":1,"305":1,"322":1,"326":2,"337":1,"349":1,"384":1,"385":1,"390":1,"399":1,"410":1,"415":1,"421":2,"426":1,"429":1,"435":1,"436":2,"444":1,"449":1,"451":2,"452":1,"461":2,"494":1,"498":1,"500":1,"542":1,"543":1}}],["помечает",{"2":{"428":1}}],["помечаем",{"2":{"184":1}}],["помеченный",{"2":{"290":1}}],["помеченных",{"2":{"222":1}}],["поместили",{"2":{"264":1,"290":1}}],["поместим",{"2":{"215":1,"410":1}}],["поместите",{"2":{"216":1,"217":1,"428":1}}],["поместит",{"2":{"142":1,"214":1}}],["поместить",{"2":{"130":1,"264":1,"436":1}}],["помещен",{"2":{"417":1}}],["помещены",{"2":{"127":1,"426":1}}],["помещаться",{"2":{"440":1}}],["помещается",{"2":{"283":1,"536":1}}],["помещаем",{"2":{"236":1}}],["помещаются",{"2":{"200":1,"215":1,"440":1}}],["поменять",{"2":{"40":1,"41":1,"492":1}}],["помните",{"2":{"321":1,"355":1,"411":1,"428":1}}],["помнить",{"2":{"125":1,"141":1,"142":1,"218":1,"244":2,"245":1,"279":1,"301":1,"395":1,"396":1,"413":1,"429":1,"438":1,"449":1}}],["помним",{"2":{"41":1}}],["помимо",{"2":{"110":1,"181":1,"184":1,"189":1,"205":1,"215":1,"245":1,"325":1,"334":1,"363":1,"384":1,"405":1}}],["помогает",{"2":{"151":1,"190":1,"274":1,"301":1,"391":1,"460":1,"495":1}}],["помогают",{"2":{"141":1,"459":1,"460":1}}],["помогающая",{"2":{"139":1}}],["помогут",{"2":{"138":1,"152":1,"167":1,"211":1,"264":1}}],["поможет",{"2":{"110":1,"162":1,"294":2,"329":1,"363":2,"407":2,"460":1}}],["помочь",{"2":{"108":1,"159":1,"177":1,"338":1,"460":1}}],["помощь",{"2":{"262":1,"280":1,"283":1,"413":1}}],["помощью",{"0":{"135":1,"266":1,"269":1,"271":1,"281":1,"285":1,"345":1,"350":1,"373":1,"377":1,"394":1,"421":1},"1":{"270":1,"271":1,"272":2,"273":2,"274":2,"275":2,"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,"346":1,"347":1,"351":1,"352":1,"353":1,"354":1,"395":1,"396":1,"397":1,"398":1,"399":1,"400":1},"2":{"35":2,"81":2,"102":1,"107":1,"122":1,"128":1,"134":1,"135":2,"136":1,"142":2,"143":1,"150":2,"151":1,"160":1,"163":1,"175":1,"176":1,"177":1,"179":1,"180":2,"189":1,"194":2,"212":1,"214":2,"215":1,"217":2,"218":1,"220":2,"222":7,"223":1,"225":1,"226":1,"228":1,"229":2,"230":1,"231":1,"235":1,"236":2,"239":2,"243":2,"245":1,"247":1,"248":1,"249":1,"250":2,"251":2,"252":1,"254":1,"256":4,"257":1,"263":1,"264":1,"265":1,"267":2,"269":3,"271":1,"272":1,"273":2,"277":1,"278":3,"279":2,"280":1,"281":2,"283":2,"286":1,"288":2,"289":2,"290":2,"293":1,"298":1,"301":1,"323":1,"326":2,"329":2,"334":3,"336":2,"337":1,"338":1,"340":2,"344":1,"345":1,"347":1,"349":1,"350":2,"351":2,"354":1,"355":2,"356":1,"357":2,"359":1,"363":1,"377":1,"379":1,"382":1,"384":1,"386":2,"392":1,"394":1,"395":1,"397":1,"398":1,"400":2,"402":3,"405":2,"407":1,"410":1,"411":2,"413":1,"414":1,"415":1,"416":3,"419":3,"425":1,"426":3,"428":2,"430":1,"439":1,"444":1,"449":1,"496":1,"497":1,"498":1,"500":1,"507":2,"532":1}}],["помощников",{"2":{"162":1}}],["помощник",{"2":{"81":1,"214":2}}],["помощи",{"2":{"73":1,"213":1}}],["послано",{"2":{"416":1}}],["послойное",{"2":{"384":1}}],["после",{"2":{"39":1,"57":1,"71":1,"79":1,"109":1,"111":1,"112":1,"116":1,"126":1,"127":1,"136":1,"147":1,"150":1,"181":1,"191":1,"198":1,"200":1,"201":1,"209":1,"214":1,"220":1,"221":1,"222":1,"223":1,"229":1,"230":1,"233":3,"243":1,"246":2,"250":1,"251":1,"262":1,"263":2,"264":2,"265":1,"266":1,"272":1,"274":1,"277":2,"280":1,"281":1,"289":1,"290":2,"291":1,"310":1,"314":1,"320":1,"322":1,"326":2,"331":1,"332":1,"335":3,"349":2,"350":1,"384":3,"385":1,"386":1,"391":1,"392":1,"396":1,"401":2,"402":2,"405":1,"407":1,"409":2,"410":1,"411":2,"414":2,"419":1,"420":1,"422":1,"425":5,"426":2,"429":1,"433":1,"435":2,"439":1,"448":1,"449":1,"461":3,"522":1,"528":1,"544":1}}],["последствия",{"2":{"305":1}}],["последующим",{"2":{"411":1}}],["последующих",{"2":{"205":1,"315":2}}],["последующая",{"2":{"230":1}}],["последующей",{"2":{"250":1}}],["последующего",{"2":{"23":1,"254":1,"391":1,"492":1}}],["последующему",{"2":{"135":1}}],["последующем",{"2":{"17":1,"263":1}}],["последовательную",{"2":{"337":1}}],["последовательный",{"2":{"183":1}}],["последовательным",{"0":{"165":1},"2":{"281":1}}],["последовательном",{"2":{"183":1}}],["последовательного",{"2":{"180":1,"384":3}}],["последовательно",{"2":{"170":1,"335":1,"336":1,"355":1,"384":1}}],["последовательности",{"2":{"166":1,"171":1,"274":1}}],["последовательной",{"2":{"157":1}}],["последнего",{"2":{"402":1}}],["последнем",{"2":{"237":1}}],["последнее",{"2":{"177":1,"396":1}}],["последней",{"2":{"142":1,"297":1}}],["последняя",{"2":{"138":1,"363":1,"423":1,"430":1}}],["последним",{"2":{"290":1,"295":1,"337":1,"391":1}}],["последний",{"2":{"172":1,"231":1,"263":1,"320":1,"416":1,"423":1,"429":1}}],["последних",{"2":{"134":1,"216":1,"435":1}}],["последние",{"2":{"50":1,"76":1,"173":1,"448":1,"524":1}}],["последнюю",{"2":{"25":1,"213":1}}],["посещении",{"2":{"251":1}}],["посвящены",{"2":{"222":1,"305":1}}],["посвящена",{"2":{"212":1,"310":1,"377":1,"384":1}}],["посвященный",{"2":{"167":1}}],["посадочная",{"2":{"180":1}}],["посадочной",{"2":{"180":1}}],["поскольку",{"2":{"125":1,"126":2,"128":1,"139":1,"140":2,"143":1,"151":1,"152":1,"161":1,"162":1,"169":1,"175":1,"180":2,"183":1,"184":2,"191":1,"212":1,"218":2,"222":3,"223":2,"231":1,"236":1,"239":2,"242":2,"244":1,"248":2,"249":1,"251":2,"264":1,"265":1,"278":1,"290":2,"299":1,"301":1,"320":1,"325":1,"329":1,"330":3,"331":1,"332":1,"334":1,"335":1,"337":1,"342":1,"344":1,"345":1,"347":1,"349":2,"351":1,"352":1,"355":3,"356":1,"357":2,"384":2,"387":1,"388":1,"393":1,"394":1,"396":1,"397":1,"402":2,"407":3,"408":1,"411":1,"414":1,"416":1,"418":1,"419":1,"425":1,"426":1,"428":1,"429":1,"431":1}}],["посылать",{"2":{"109":1}}],["посредником",{"2":{"108":1}}],["посредством",{"2":{"40":1}}],["поступившие",{"2":{"430":1}}],["поступления",{"2":{"12":1}}],["пострадать",{"2":{"256":1}}],["построим",{"2":{"350":1,"390":1}}],["построить",{"2":{"139":1,"216":1,"223":2,"363":1,"382":1}}],["построчно",{"2":{"326":1,"328":1,"330":1}}],["построено",{"2":{"223":1,"429":1}}],["построен",{"2":{"139":1,"141":1,"220":1}}],["построенные",{"2":{"139":1,"243":1,"429":1,"449":1}}],["построены",{"2":{"126":1,"139":1}}],["построению",{"2":{"269":1,"363":1}}],["построение",{"2":{"76":1}}],["построения",{"2":{"39":1,"139":3,"333":1,"496":1,"530":1}}],["постов",{"2":{"196":1}}],["постоянный",{"2":{"263":1}}],["постоянных",{"2":{"171":1}}],["постоянными",{"2":{"394":1}}],["постоянным",{"2":{"106":1}}],["постоянной",{"2":{"382":1,"403":1}}],["постоянного",{"2":{"263":1,"359":1}}],["постоянно",{"2":{"106":1,"216":1,"277":1,"420":1,"431":1}}],["постсервисное",{"2":{"162":1}}],["постепенной",{"2":{"268":1}}],["постепенно",{"2":{"79":1,"138":1,"139":1,"254":1,"363":1}}],["постепенное",{"2":{"76":1,"256":1}}],["постановка",{"2":{"425":1,"426":1}}],["поставки",{"2":{"424":1}}],["поставлен",{"2":{"425":1}}],["поставлены",{"2":{"327":1}}],["поставленных",{"2":{"69":1}}],["поставляется",{"2":{"266":1}}],["поставляемых",{"2":{"212":1}}],["поставщиков",{"2":{"109":1}}],["поставив",{"2":{"107":1}}],["поставить",{"2":{"100":1,"107":1,"428":1,"444":1,"460":1}}],["постараемся",{"2":{"23":1}}],["посмотрели",{"2":{"359":1}}],["посмотреть",{"2":{"16":1,"103":2,"131":1,"139":1,"214":1,"236":2,"250":1,"263":1,"368":1,"443":1,"444":1,"460":1,"461":1,"496":1}}],["посмотрим",{"2":{"133":1,"172":1,"234":1,"235":1,"238":1,"245":1,"257":1,"280":1,"337":1,"342":2,"343":1,"351":2,"384":1,"392":2,"400":1}}],["посмотрите",{"2":{"22":1,"161":1,"213":1,"227":1,"255":1,"270":1,"283":1,"336":1,"341":1,"383":1,"406":1,"444":1,"460":1}}],["потратьте",{"2":{"444":1,"456":1}}],["потратит",{"2":{"410":1}}],["потребуются",{"2":{"408":1}}],["потребует",{"2":{"38":1,"139":1}}],["потребуется",{"2":{"12":1,"213":1,"219":1,"222":1,"226":1,"231":1,"245":1,"335":1,"411":1}}],["потребностей",{"2":{"338":1,"340":1,"418":1}}],["потребностями",{"2":{"215":1,"222":1}}],["потребностях",{"2":{"128":1}}],["потребляют",{"2":{"335":1}}],["потребительском",{"2":{"160":1}}],["потери",{"2":{"442":1}}],["потеряете",{"2":{"250":1}}],["потеряло",{"2":{"172":1}}],["потерять",{"2":{"106":1}}],["потенциально",{"2":{"384":1}}],["потенциал",{"2":{"228":1,"428":2}}],["потоке",{"2":{"264":1,"302":1,"335":1,"355":1,"384":2,"451":1}}],["потоках",{"2":{"384":1}}],["потоками",{"0":{"340":1,"376":1},"1":{"341":1,"342":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},"2":{"254":1,"263":1,"273":1,"283":1,"316":1,"328":1,"376":1,"389":2}}],["потока",{"0":{"273":1},"2":{"245":1,"328":1,"335":2,"336":1,"337":1,"342":1}}],["поток",{"2":{"139":1,"172":1,"245":1,"304":1,"335":2,"448":1}}],["потоком",{"2":{"118":1,"142":1,"143":1,"236":1,"310":1,"323":1,"340":1,"341":1,"347":1,"354":1,"359":1,"451":1}}],["потоков",{"2":{"11":1,"67":1}}],["поточнее",{"2":{"81":1}}],["потомок",{"2":{"449":1}}],["потомком",{"2":{"449":1}}],["потом",{"2":{"22":1,"26":1,"36":1,"39":1,"40":1,"62":1,"64":1,"90":1,"165":1,"264":1,"449":2,"461":2,"492":1}}],["потому",{"2":{"3":1,"17":1,"48":1,"86":1,"87":1,"106":1,"165":1,"219":1,"239":1,"314":1,"336":1,"402":1,"435":1,"449":1,"461":1}}],["по",{"0":{"48":1,"66":1,"244":1,"249":1,"531":1},"2":{"11":1,"12":1,"13":3,"14":1,"16":1,"17":3,"22":2,"26":2,"41":1,"47":2,"48":4,"68":1,"76":2,"79":2,"81":1,"94":1,"96":2,"100":1,"103":1,"106":4,"107":3,"108":3,"114":2,"115":4,"116":1,"120":1,"124":2,"125":2,"126":1,"127":1,"128":2,"131":1,"132":1,"133":1,"134":1,"135":5,"136":2,"138":4,"139":3,"140":1,"141":1,"143":3,"148":1,"150":1,"158":2,"161":1,"166":1,"169":1,"171":1,"174":2,"177":2,"179":1,"181":2,"183":4,"184":1,"185":1,"189":1,"191":1,"192":1,"194":2,"195":1,"198":1,"200":1,"212":3,"213":2,"214":2,"215":2,"217":1,"218":2,"219":1,"221":1,"222":1,"223":1,"224":1,"225":1,"227":1,"228":4,"229":3,"230":1,"233":1,"236":4,"238":1,"239":3,"242":5,"244":2,"245":3,"248":1,"249":1,"250":2,"251":5,"252":1,"255":1,"256":4,"257":1,"259":1,"261":1,"263":1,"265":1,"267":1,"269":1,"272":2,"273":3,"275":1,"278":4,"279":3,"280":1,"281":2,"283":9,"284":1,"285":1,"288":1,"289":4,"290":6,"291":3,"293":1,"294":2,"297":2,"298":1,"299":2,"300":1,"301":1,"303":1,"305":1,"306":1,"318":2,"320":1,"321":3,"322":4,"323":1,"325":3,"326":2,"330":1,"335":2,"337":2,"338":1,"340":1,"342":3,"343":1,"344":3,"349":2,"354":5,"355":3,"365":1,"367":1,"381":1,"382":1,"384":4,"388":1,"389":1,"390":1,"395":1,"396":2,"398":1,"402":4,"404":1,"405":2,"406":2,"407":1,"410":2,"414":1,"416":1,"420":3,"421":1,"423":1,"426":1,"428":1,"429":2,"435":2,"436":1,"439":1,"440":4,"441":1,"443":2,"444":2,"448":2,"449":6,"450":1,"452":1,"458":1,"459":1,"460":8,"461":8,"485":1,"492":1,"498":1,"500":1,"506":1,"515":1,"516":1,"524":1,"526":1,"527":1,"528":1}}],["полиморфизмом",{"2":{"452":1}}],["политика",{"2":{"106":1}}],["политиками",{"2":{"58":1}}],["политики",{"2":{"58":2}}],["политик",{"2":{"58":1,"408":1}}],["полтора",{"2":{"449":1}}],["полагаясь",{"2":{"239":1}}],["полагаться",{"2":{"135":1,"249":1}}],["половину",{"2":{"384":1}}],["полосой",{"2":{"384":1}}],["полос",{"2":{"250":1}}],["полоса",{"2":{"184":1}}],["полосу",{"2":{"181":1}}],["поломке",{"2":{"115":1}}],["положить",{"2":{"440":1}}],["положительное",{"2":{"409":1}}],["положительного",{"2":{"79":1,"210":1}}],["положительный",{"2":{"162":1}}],["положительные",{"2":{"121":1,"160":1,"242":1}}],["положено",{"2":{"421":1}}],["положение",{"2":{"111":1,"187":1,"329":1}}],["пользуется",{"2":{"449":1}}],["пользу",{"0":{"365":1},"2":{"211":1,"365":1}}],["польза",{"2":{"64":1}}],["пользоваться",{"2":{"81":1,"449":1,"451":1,"459":1,"527":1}}],["пользователем",{"2":{"162":1,"190":1,"191":1,"204":1,"205":1,"222":1,"237":1,"245":1,"249":1,"273":1,"278":1,"284":1,"356":1,"405":1,"451":1,"452":1,"545":1}}],["пользователей",{"2":{"47":1,"58":2,"138":1,"163":1,"165":1,"199":1,"206":1,"213":1,"243":2,"244":5,"245":2,"248":1,"250":2,"251":1,"253":2,"256":2,"291":1,"302":1,"347":1,"407":1,"450":1,"452":1,"461":2}}],["пользователи",{"2":{"106":1,"165":1,"180":1,"181":1,"195":2,"202":1,"213":1,"244":1,"267":1}}],["пользователю",{"2":{"67":1,"106":1,"129":1,"163":1,"165":1,"167":1,"169":1,"170":2,"172":1,"174":1,"175":2,"176":1,"177":2,"180":2,"181":2,"183":3,"185":1,"186":1,"187":1,"188":2,"189":1,"190":1,"192":1,"196":1,"202":1,"203":1,"210":1,"237":1,"244":1,"245":1,"246":1,"248":1,"249":2,"250":2,"256":1,"263":2,"274":1,"278":1,"355":1,"409":1,"428":1,"435":1,"451":1}}],["пользователями",{"2":{"173":1,"210":1,"544":1}}],["пользователям",{"2":{"73":1,"106":1,"190":1,"195":1,"213":1,"416":1}}],["пользователя",{"0":{"244":1},"2":{"47":1,"76":1,"95":1,"106":7,"160":1,"162":2,"163":1,"164":2,"165":2,"170":2,"171":3,"172":4,"174":1,"176":1,"178":2,"179":3,"180":1,"181":4,"183":1,"191":1,"192":1,"198":1,"199":2,"201":1,"202":2,"204":1,"207":1,"208":2,"209":1,"210":1,"222":1,"228":2,"244":3,"245":2,"247":2,"249":4,"250":5,"251":9,"252":1,"256":3,"263":3,"264":1,"274":1,"275":1,"290":1,"335":1,"355":2,"384":1,"416":1,"435":1,"436":1,"437":2,"449":2,"461":3,"484":1}}],["пользовательской",{"0":{"274":1},"2":{"195":1}}],["пользовательского",{"0":{"163":1,"168":1,"269":1,"272":1,"373":1},"1":{"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":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},"2":{"115":1,"142":2,"149":1,"160":2,"162":2,"163":5,"164":1,"167":3,"169":1,"176":3,"191":1,"196":1,"197":1,"220":1,"222":1,"228":1,"229":1,"231":1,"256":1,"259":1,"271":1,"275":1,"283":1,"284":1,"298":1,"299":1,"301":1,"323":2,"331":2,"332":1,"335":1,"344":2,"380":2,"388":1,"395":1,"419":1}}],["пользовательские",{"2":{"228":1,"269":3,"273":1}}],["пользовательский",{"2":{"167":1,"197":2,"210":1,"216":1,"222":1,"237":1,"263":3,"264":1,"336":1,"384":1,"461":1,"543":1}}],["пользовательским",{"2":{"162":1,"290":1,"295":1}}],["пользовательских",{"2":{"139":2,"162":1,"163":2,"214":1,"224":1,"239":1,"280":1,"334":1,"363":1,"373":1}}],["пользовательская",{"2":{"67":1}}],["пользователь",{"2":{"11":1,"106":6,"149":1,"151":1,"160":1,"169":1,"170":1,"171":2,"172":4,"177":1,"181":1,"183":2,"184":1,"195":1,"200":1,"201":2,"202":2,"203":2,"205":1,"206":2,"207":1,"208":1,"209":1,"220":2,"222":1,"239":1,"244":1,"245":2,"246":1,"249":4,"250":1,"251":1,"256":2,"261":1,"262":1,"263":4,"264":1,"273":1,"274":1,"275":1,"288":1,"384":1,"400":1,"428":1,"448":1,"449":1,"451":2,"492":1,"496":1,"522":1}}],["пользования",{"2":{"41":1}}],["полутора",{"2":{"525":1}}],["полупрозрачным",{"2":{"289":1}}],["полуготовые",{"2":{"61":1}}],["получены",{"2":{"239":1,"400":1}}],["полученном",{"2":{"402":1}}],["полученное",{"2":{"385":1}}],["полученными",{"2":{"402":1}}],["полученный",{"2":{"248":1}}],["полученные",{"2":{"226":1,"245":1,"253":1,"326":1,"386":1,"391":1,"397":1,"399":1,"402":1}}],["полученных",{"2":{"178":1}}],["полученная",{"2":{"116":1}}],["получению",{"2":{"325":1,"355":1}}],["получения",{"2":{"114":1,"119":1,"143":1,"174":1,"222":1,"275":1,"289":2,"313":1,"321":1,"335":1,"344":1,"357":1,"400":1,"420":1}}],["получении",{"2":{"106":1,"392":1}}],["получение",{"0":{"394":1},"1":{"395":1,"396":1,"397":1,"398":1,"399":1,"400":1},"2":{"73":1,"124":1,"134":1,"242":1}}],["получила",{"2":{"337":1}}],["получилось",{"2":{"214":1}}],["получил",{"2":{"143":1,"178":1}}],["получили",{"2":{"126":1,"228":1,"248":1,"285":1,"302":1,"402":1}}],["получившуюся",{"2":{"345":1}}],["получив",{"2":{"127":2,"218":1,"245":1,"251":1,"322":1,"387":1}}],["получим",{"2":{"83":1,"220":1,"231":1,"264":1,"269":1}}],["получите",{"2":{"160":1,"272":1,"411":1,"428":1}}],["получит",{"2":{"145":1,"256":1,"337":1}}],["получить",{"0":{"365":1},"2":{"67":1,"83":1,"106":1,"121":1,"136":1,"143":3,"167":1,"191":1,"222":1,"246":1,"247":1,"253":1,"266":1,"283":1,"323":1,"329":1,"337":1,"355":2,"384":1,"397":1,"411":1,"415":1,"418":1,"433":1,"439":1,"461":1,"524":1}}],["получится",{"2":{"26":1,"316":1,"425":1,"460":1}}],["получают",{"2":{"342":2}}],["получай",{"2":{"251":1}}],["получат",{"2":{"365":1}}],["получатель",{"2":{"402":1}}],["получателей",{"2":{"327":1}}],["получателе",{"2":{"281":1}}],["получателя",{"2":{"247":1,"328":3}}],["получаться",{"2":{"79":1}}],["получать",{"2":{"11":1,"103":1,"107":1,"199":2,"228":1,"256":3,"278":1,"283":1,"351":1,"389":1,"397":1,"400":1,"402":1,"416":1,"460":1,"461":1}}],["получаем",{"2":{"89":1,"100":1,"115":1,"184":1,"222":1,"228":1,"245":1,"251":1,"281":1,"330":1,"337":1,"357":1,"391":1,"416":1,"429":1}}],["получаете",{"2":{"384":1,"439":1}}],["получается",{"2":{"17":1,"143":1,"160":1,"299":1,"337":1,"435":1,"440":1,"448":1,"452":1,"461":4,"492":1}}],["получает",{"2":{"3":1,"106":1,"108":1,"125":1,"236":1,"238":1,"239":1,"242":1,"250":1,"277":1,"278":1,"289":1,"290":1,"330":1,"331":1,"335":1,"337":4,"347":1,"351":2,"355":1,"385":2,"386":1,"402":1,"409":1,"411":1,"461":1}}],["получая",{"2":{"11":1,"321":1,"417":1}}],["полем",{"2":{"222":1,"328":1}}],["полезную",{"2":{"392":1}}],["полезная",{"2":{"428":1}}],["полезна",{"2":{"258":1,"360":1}}],["полезные",{"0":{"446":1},"1":{"447":1,"448":1},"2":{"444":1,"452":1,"460":1,"467":1,"473":1,"533":1}}],["полезным",{"2":{"223":1,"233":1,"336":1,"337":1}}],["полезных",{"2":{"217":1,"258":1,"444":1}}],["полезный",{"2":{"167":1,"278":1}}],["полезны",{"2":{"162":1,"179":1,"331":1,"333":1,"364":1,"384":1,"433":1,"450":1,"461":1}}],["полезного",{"2":{"396":1,"444":1}}],["полезной",{"2":{"245":2,"390":1,"400":1,"435":1}}],["полезное",{"2":{"212":1,"527":1}}],["полезность",{"2":{"172":1,"450":1}}],["полезно",{"2":{"3":1,"4":1,"22":1,"88":1,"136":1,"249":1,"329":1,"336":1,"341":1,"426":1,"455":1}}],["полезен",{"2":{"125":1,"228":1,"315":1,"325":1,"327":1,"335":1,"349":1,"460":1,"461":1}}],["поле",{"2":{"47":1,"48":2,"143":2,"148":1,"222":1,"233":2,"236":1,"245":2,"249":3,"265":1,"385":1,"396":1,"402":1,"416":1,"449":1,"451":1}}],["полей",{"2":{"44":1,"47":2,"48":1,"140":1,"164":1,"245":1,"258":1,"261":1,"396":1}}],["полям",{"0":{"48":1},"2":{"258":1,"349":1}}],["полями",{"2":{"17":1,"142":1,"143":1,"222":1,"246":1,"258":1,"392":1,"396":2}}],["поля",{"2":{"16":1,"17":1,"18":1,"44":1,"47":2,"48":1,"140":1,"143":3,"174":1,"192":1,"233":1,"239":1,"246":1,"261":4,"322":1,"328":1,"350":1,"385":1,"396":2,"451":1}}],["полна",{"2":{"162":1}}],["полную",{"2":{"128":1,"219":1,"407":1}}],["полные",{"2":{"219":1}}],["полным",{"2":{"128":1,"242":1,"310":1,"341":1,"344":1,"390":1}}],["полный",{"2":{"120":1,"150":1,"161":1,"174":1,"233":1,"237":1,"242":3,"263":1,"269":1,"289":1,"305":1,"411":1,"415":1,"416":1,"423":1,"449":1}}],["полноты",{"2":{"375":1}}],["полноэкранном",{"2":{"259":1}}],["полного",{"2":{"259":1,"354":1,"358":1,"395":1}}],["полно",{"2":{"107":1,"459":1,"501":1}}],["полному",{"2":{"48":1,"222":1}}],["полное",{"2":{"47":1,"83":1,"125":1,"205":1,"210":1,"256":1,"259":1,"402":1}}],["полностью",{"2":{"26":1,"110":1,"118":1,"139":1,"143":1,"147":1,"160":1,"188":1,"194":1,"216":1,"228":1,"266":1,"384":1,"402":1,"405":1,"408":1,"544":1}}],["полноценную",{"2":{"492":1}}],["полноценного",{"2":{"329":1}}],["полноценное",{"2":{"107":1}}],["полноценной",{"2":{"107":1}}],["полноценным",{"2":{"76":1}}],["полноценный",{"2":{"12":1,"271":1}}],["полноценная",{"2":{"12":1,"355":1}}],["полней",{"2":{"4":1}}],["поделился",{"2":{"444":1}}],["поделиться",{"2":{"196":1,"237":1,"256":1,"273":2,"438":1}}],["подтвердили",{"2":{"416":1}}],["подтверждающих",{"2":{"407":1}}],["подтверждать",{"2":{"251":1}}],["подтверждается",{"2":{"22":1,"135":1}}],["подтвержден",{"2":{"249":1}}],["подтверждение",{"0":{"207":1}}],["подтверждения",{"2":{"171":1,"188":1,"200":1,"207":1,"249":1}}],["подтверждении",{"2":{"125":1}}],["поднимают",{"2":{"342":1}}],["подниматься",{"2":{"281":1}}],["поднабор",{"2":{"183":1}}],["подмаршрутов",{"2":{"237":1}}],["подмаршруты",{"2":{"237":1,"239":1}}],["подмена",{"0":{"206":1}}],["подумайте",{"2":{"416":1}}],["подумаем",{"2":{"272":1}}],["подумав",{"2":{"223":1}}],["подумать",{"2":{"4":1,"181":1,"198":1}}],["подводит",{"2":{"373":1}}],["подвохом",{"0":{"199":1},"2":{"199":1}}],["подвижные",{"2":{"331":1}}],["подвесить",{"2":{"336":1}}],["подвергнуть",{"2":{"223":1}}],["подведут",{"2":{"165":1}}],["подведение",{"0":{"136":1,"158":1,"210":1,"224":1,"252":1,"267":1,"292":1,"338":1,"359":1,"403":1,"431":1}}],["подгружается",{"2":{"461":1}}],["подгруппа",{"2":{"191":2}}],["подгруппе",{"2":{"183":1}}],["подготовиться",{"2":{"340":1}}],["подготовились",{"2":{"219":1}}],["подготовим",{"2":{"212":1}}],["подготовлены",{"2":{"151":1,"215":1}}],["подготовки",{"2":{"124":1,"246":1,"268":1,"460":1}}],["подготовка",{"2":{"64":1}}],["подразумевается",{"2":{"162":1,"461":1,"495":1}}],["подразумевает",{"2":{"139":1,"216":1,"297":1,"405":1,"420":1}}],["подробней",{"2":{"542":1}}],["подробнее",{"2":{"106":1,"125":1,"149":1,"243":1,"245":1,"310":1,"316":1,"443":1}}],["подробны",{"2":{"431":1}}],["подробный",{"2":{"266":1}}],["подробные",{"2":{"236":1}}],["подробную",{"2":{"118":1,"169":1,"170":1,"217":1}}],["подробному",{"2":{"275":1}}],["подробное",{"2":{"265":1}}],["подробностей",{"2":{"305":1}}],["подробности",{"2":{"251":1,"438":1}}],["подробностями",{"2":{"236":1}}],["подробной",{"2":{"119":1}}],["подробно",{"2":{"110":1,"111":1,"115":1,"142":2,"143":1,"214":1,"228":1,"242":1,"254":1,"269":1,"273":1,"280":1,"283":1,"285":1,"290":1,"292":1,"323":1,"331":1,"332":1,"355":1,"359":1,"440":1,"515":1}}],["подробная",{"2":{"108":1}}],["подчеркнуть",{"2":{"301":1}}],["подчеркивающим",{"2":{"176":1}}],["подчеркивания",{"2":{"153":1}}],["подчеркивает",{"2":{"139":1}}],["подчиняется",{"2":{"236":1}}],["подчинение",{"2":{"2":1}}],["подпапкой",{"2":{"287":1}}],["подпапка",{"2":{"126":1}}],["подписанных",{"2":{"347":1}}],["подписанным",{"2":{"201":1}}],["подписчиков",{"2":{"325":1}}],["подписывает",{"2":{"345":1}}],["подписываться",{"2":{"345":1}}],["подписываются",{"2":{"325":1}}],["подписывания",{"2":{"106":1}}],["подписи",{"2":{"245":3}}],["подпись",{"2":{"245":1}}],["подписок",{"2":{"201":1}}],["подписки",{"2":{"199":1,"201":1,"347":1}}],["поддиректории",{"2":{"436":1,"440":1}}],["поддиректориями",{"2":{"435":1}}],["поддается",{"2":{"303":1,"461":1}}],["поддавайтесь",{"2":{"298":1}}],["подделки",{"2":{"245":1}}],["поддержкой",{"2":{"443":1,"449":1}}],["поддержку",{"2":{"213":1,"299":1}}],["поддержки",{"2":{"201":1,"249":1,"349":1,"448":2,"460":1,"524":1}}],["поддержка",{"0":{"73":1},"2":{"66":1,"73":1,"162":2,"354":3,"449":2}}],["поддерживаются",{"2":{"448":1}}],["поддерживают",{"2":{"256":1,"531":1,"545":1}}],["поддерживающих",{"2":{"121":1,"251":1}}],["поддерживаемость",{"2":{"459":1}}],["поддерживаемый",{"2":{"350":1}}],["поддерживаемых",{"2":{"174":1,"245":1,"261":1}}],["поддерживает",{"2":{"298":1,"394":1}}],["поддерживается",{"2":{"142":1,"143":2,"284":1,"442":1,"543":1}}],["поддерживайте",{"2":{"171":1}}],["поддерживая",{"2":{"149":1}}],["поддерживаться",{"2":{"449":1,"453":1}}],["поддерживать",{"2":{"68":1,"116":1,"288":1,"299":1,"329":1,"384":1,"429":1,"452":1}}],["поддомена",{"2":{"135":1}}],["поддомен",{"2":{"125":2,"126":1}}],["поддомены",{"2":{"125":3,"132":1,"135":1,"439":1}}],["поддоменов",{"2":{"125":2,"137":1}}],["подарила",{"2":{"461":1}}],["подарочные",{"2":{"4":1}}],["податлив",{"2":{"394":1}}],["подает",{"2":{"279":1}}],["подавляющее",{"2":{"242":1}}],["подавление",{"2":{"180":1}}],["подальше",{"2":{"87":1}}],["подзадачи",{"2":{"79":1}}],["подключить",{"2":{"233":1,"439":1}}],["подключена",{"2":{"491":1}}],["подключены",{"2":{"267":1}}],["подключении",{"2":{"251":1}}],["подключения",{"2":{"251":1,"286":1,"398":1,"429":1,"436":1,"496":1,"530":1}}],["подключение",{"2":{"41":1,"100":1,"251":2,"492":3,"526":1}}],["подключенными",{"2":{"436":1}}],["подключенных",{"2":{"125":1}}],["подключенный",{"2":{"125":1}}],["подключаются",{"2":{"440":1}}],["подключаемый",{"2":{"286":1}}],["подключаемые",{"2":{"251":1,"531":1}}],["подключаем",{"2":{"111":1,"128":1}}],["подключать",{"2":{"12":1,"440":1,"449":1,"453":2,"527":1}}],["подскажите",{"0":{"445":1}}],["подсказку",{"2":{"263":2}}],["подсказкой",{"2":{"177":1}}],["подсказка",{"0":{"263":1},"2":{"177":1}}],["подсказками",{"2":{"89":1}}],["подсказки",{"0":{"177":1},"2":{"177":1,"263":1}}],["подсказок",{"2":{"165":1}}],["подсказать",{"2":{"81":1}}],["подсоединение",{"2":{"444":1}}],["подсоединяться",{"2":{"40":1}}],["подстановочные",{"2":{"426":1}}],["подсчет",{"2":{"273":1}}],["подсегмент",{"2":{"125":1}}],["подсвечивать",{"2":{"94":1}}],["подсистему",{"2":{"3":1,"68":1}}],["подсистем",{"2":{"3":1,"297":1,"334":1,"347":1}}],["подсистемы",{"0":{"4":1},"2":{"2":2,"3":1,"4":1,"7":1,"34":3,"41":2,"297":1}}],["подобранных",{"2":{"444":1}}],["подобную",{"2":{"215":1,"358":1}}],["подобная",{"2":{"208":1}}],["подобной",{"2":{"236":1}}],["подобно",{"2":{"148":1,"342":1,"426":1,"429":1}}],["подобному",{"2":{"347":1}}],["подобном",{"2":{"143":1}}],["подобное",{"2":{"34":1,"231":1,"301":1,"316":1,"350":1}}],["подобные",{"2":{"198":1,"395":1,"430":1,"461":1}}],["подобными",{"2":{"181":1}}],["подобный",{"2":{"107":1,"108":1,"333":1,"459":1}}],["подобных",{"2":{"81":1,"222":1,"305":1}}],["подождать",{"2":{"278":1}}],["подождите",{"2":{"143":1}}],["подойдут",{"2":{"394":1}}],["подойдет",{"2":{"128":1}}],["подойти",{"2":{"250":1,"271":1,"410":1}}],["подошли",{"2":{"224":1}}],["подошел",{"2":{"39":1}}],["подозрительные",{"2":{"106":1}}],["подходе",{"2":{"194":1,"250":1,"269":1,"278":1,"409":1}}],["подходом",{"2":{"184":1,"194":1,"291":1,"302":1,"438":1,"495":1}}],["подходов",{"2":{"139":1,"249":1,"275":1,"286":1,"334":1,"355":1,"359":1,"407":1,"413":1}}],["подходы",{"2":{"143":1,"160":1,"236":1,"340":1,"359":1,"363":1,"405":1,"420":1,"451":1}}],["подходу",{"2":{"139":1,"249":1,"271":1}}],["подходят",{"2":{"125":2,"340":1,"449":1}}],["подходящая",{"2":{"436":1}}],["подходящей",{"2":{"392":1}}],["подходящее",{"2":{"272":1,"275":1}}],["подходящем",{"2":{"107":1}}],["подходящую",{"2":{"86":1,"89":1}}],["подходящим",{"2":{"191":1,"225":1}}],["подходящие",{"2":{"89":1}}],["подходящий",{"2":{"27":1,"203":1}}],["подходящих",{"2":{"12":1}}],["подход",{"2":{"118":2,"181":1,"188":1,"194":1,"218":1,"229":1,"244":1,"269":1,"272":2,"284":1,"287":1,"292":1,"299":1,"305":1,"317":1,"320":3,"321":2,"323":1,"330":2,"334":1,"337":1,"347":2,"349":3,"352":2,"354":1,"356":2,"357":1,"363":1,"387":2,"411":1,"416":1,"420":1,"459":1,"461":1}}],["подходах",{"2":{"410":1}}],["подхода",{"2":{"96":1,"139":1,"143":1,"228":1,"250":1,"256":1,"278":2,"307":1,"318":1,"349":1,"356":1,"363":1,"412":2}}],["подходите",{"2":{"294":1}}],["подходит",{"2":{"62":1,"251":1,"271":1,"272":1,"337":1,"349":2,"397":1,"444":1,"447":1,"451":1,"452":1,"461":2}}],["подхедер",{"2":{"29":1}}],["подберем",{"2":{"27":1}}],["подбора",{"2":{"9":1}}],["под",{"2":{"4":1,"110":1,"162":1,"164":1,"171":1,"177":1,"190":1,"206":1,"208":2,"212":1,"213":1,"228":1,"256":1,"263":1,"265":1,"285":1,"289":1,"299":1,"326":1,"355":2,"408":1,"411":1,"418":1,"440":1,"450":1,"451":1,"487":1,"495":1,"496":1,"515":1}}],["прыгания",{"2":{"504":1}}],["пр",{"2":{"443":1}}],["прямая",{"2":{"342":1}}],["прямую",{"2":{"243":1}}],["прямым",{"2":{"194":1,"449":1}}],["прямых",{"2":{"184":1,"324":1,"342":1}}],["прямоугольниками",{"2":{"272":1}}],["прямого",{"2":{"261":1,"342":1}}],["прямое",{"2":{"128":1,"203":1,"321":1}}],["прямо",{"2":{"40":1,"128":1,"206":1,"444":1,"495":1}}],["прямой",{"2":{"23":1,"126":1,"196":1,"218":1,"280":1}}],["прятать",{"2":{"4":1}}],["прелоадер",{"2":{"532":1}}],["препроцессора",{"2":{"492":1}}],["преподавательской",{"2":{"64":1}}],["презентационный",{"2":{"459":1}}],["презентационного",{"2":{"388":2}}],["прекрасный",{"2":{"460":1}}],["прекрасно",{"2":{"416":1,"429":1}}],["прекратит",{"2":{"183":1}}],["прервет",{"2":{"396":1}}],["прервана",{"2":{"181":1}}],["прерывая",{"2":{"412":1}}],["прерывать",{"2":{"412":1}}],["прерывается",{"2":{"337":1}}],["прерывании",{"2":{"331":1}}],["преобладающим",{"2":{"196":1}}],["преобразуется",{"2":{"236":1,"285":1}}],["преобразует",{"2":{"114":1,"396":1}}],["преобразовать",{"2":{"395":1}}],["преобразованным",{"2":{"330":1}}],["преобразованы",{"2":{"327":1}}],["преобразовано",{"2":{"221":1}}],["преобразованию",{"2":{"292":1}}],["преобразование",{"2":{"125":2,"244":1}}],["преобразования",{"2":{"44":1,"141":1,"330":1}}],["преобразовывать",{"2":{"41":1,"329":1,"330":1}}],["преследовали",{"2":{"191":1}}],["преследуете",{"2":{"140":1}}],["пренебрегали",{"2":{"162":1}}],["превышает",{"2":{"384":1}}],["превзошла",{"2":{"284":1}}],["превзойти",{"2":{"143":1}}],["превосходящие",{"2":{"162":1}}],["превращения",{"2":{"258":1,"264":1}}],["превращает",{"2":{"254":1}}],["превращается",{"2":{"142":1}}],["превращая",{"2":{"212":1}}],["превращать",{"2":{"23":1,"267":1}}],["превратим",{"2":{"335":1}}],["превратилось",{"2":{"331":1}}],["превратился",{"2":{"302":1}}],["превратится",{"2":{"150":1}}],["превратить",{"2":{"29":1,"235":1,"256":1,"263":1,"336":1}}],["превратятся",{"2":{"143":1}}],["прежнему",{"2":{"191":1,"228":1,"256":1,"284":1,"291":2}}],["прежним",{"2":{"109":1,"138":1}}],["прежде",{"2":{"139":1,"160":1,"162":1,"171":1,"172":2,"215":1,"230":1,"234":1,"235":1,"239":1,"251":1,"278":1,"337":1,"352":1,"384":1,"396":1,"400":1,"415":1,"416":1,"426":1}}],["претенциозной",{"2":{"448":1}}],["претензий",{"2":{"9":1}}],["претерпела",{"2":{"138":1}}],["префикса",{"2":{"396":1}}],["префиксом",{"2":{"284":1}}],["префиксируем",{"2":{"283":1}}],["префикс",{"2":{"100":2,"145":1,"280":1}}],["преимуществами",{"2":{"139":2,"449":1}}],["преимущества",{"2":{"114":1,"121":1,"211":1,"228":2,"229":1,"253":1,"256":2,"268":1,"299":1,"323":1,"337":1,"403":1,"404":1,"410":1,"417":2}}],["преимущественно",{"2":{"109":1,"449":1,"451":1}}],["преимуществ",{"2":{"48":1,"139":1,"143":2,"215":1,"218":1,"228":1,"256":2,"267":1,"278":1,"348":1,"349":1,"354":2,"388":1,"408":2}}],["преимуществом",{"2":{"141":1,"142":1}}],["преимущество",{"2":{"17":1,"323":1,"384":1}}],["предназначались",{"2":{"460":1}}],["предназначена",{"2":{"364":1}}],["предназначенная",{"2":{"266":1}}],["предназначенный",{"2":{"181":1}}],["предназначенных",{"2":{"138":1}}],["предназначен",{"2":{"228":1,"337":1}}],["предназначено",{"2":{"172":1}}],["преданность",{"2":{"368":1}}],["предисловие",{"0":{"363":1,"485":1},"1":{"486":1}}],["пределами",{"2":{"355":2,"449":1,"451":1}}],["пределы",{"2":{"151":2,"184":1,"355":1}}],["предшествующий",{"2":{"236":1}}],["предвидеть",{"2":{"223":1}}],["предварительных",{"2":{"430":1}}],["предварительный",{"2":{"215":1,"460":1}}],["предварительное",{"2":{"364":1}}],["предварительного",{"2":{"214":1,"224":1}}],["предварительно",{"2":{"204":1,"460":2,"461":1}}],["предварительной",{"2":{"177":1,"183":1,"233":1}}],["предупредить",{"2":{"180":1,"299":1}}],["предусмотреть",{"2":{"244":1}}],["предусмотренный",{"2":{"278":2}}],["предусмотренные",{"2":{"174":1,"380":1}}],["предусмотрены",{"2":{"144":1}}],["предусмотрен",{"2":{"135":1,"175":1,"181":1,"283":1,"355":1}}],["предусмотрена",{"2":{"63":1,"231":1,"278":1}}],["предусматривает",{"2":{"68":1,"223":1}}],["предусматривают",{"2":{"41":1}}],["предсказания",{"2":{"168":1}}],["предстоит",{"2":{"139":1,"291":1}}],["представительное",{"2":{"289":1}}],["представить",{"2":{"141":1,"191":1,"213":1,"237":1,"250":1,"271":1,"272":1,"281":1,"288":1,"290":1,"329":1,"334":1,"345":1,"388":1,"405":1}}],["представим",{"2":{"26":1,"299":1,"331":1,"337":1,"382":2}}],["представьте",{"2":{"125":1,"160":1,"449":1}}],["представлено",{"2":{"249":1,"299":1,"381":1,"384":1}}],["представлен",{"0":{"362":1},"2":{"233":1,"374":1,"409":1}}],["представлены",{"2":{"208":1,"370":1,"375":1,"377":1,"379":1,"380":1}}],["представленная",{"2":{"188":1,"326":1}}],["представленную",{"2":{"172":1}}],["представленные",{"2":{"405":1}}],["представленных",{"2":{"163":1,"245":1,"409":1}}],["представленный",{"2":{"130":1,"184":1,"341":1}}],["представлена",{"2":{"164":1,"335":1,"376":1}}],["представлений",{"2":{"233":1,"237":1,"239":1,"245":1}}],["представлении",{"2":{"189":1,"239":1}}],["представлением",{"2":{"239":1}}],["представление",{"2":{"4":2,"11":2,"67":1,"122":1,"138":1,"141":2,"160":1,"162":1,"181":1,"183":1,"210":1,"215":1,"239":1,"245":1,"249":1,"256":1,"273":1,"281":1,"285":1,"288":1,"297":1,"299":1,"300":1,"325":1,"327":1,"330":1,"332":1,"336":1,"384":3,"388":1,"390":1,"400":1,"418":1}}],["представления",{"0":{"237":1},"1":{"238":1,"239":1},"2":{"3":2,"17":1,"162":1,"187":1,"222":1,"253":1,"258":1,"259":1,"263":1,"290":1,"384":1,"409":1,"451":1}}],["представляемых",{"2":{"274":1}}],["представляем",{"2":{"228":1}}],["представляется",{"2":{"200":1,"401":1}}],["представляет",{"2":{"125":1,"139":1,"142":1,"194":1,"199":1,"203":1,"215":2,"228":1,"245":1,"259":1,"290":1,"355":1,"363":1,"370":1,"391":1,"397":1,"401":1,"416":1,"500":1}}],["представляющая",{"2":{"233":1,"259":1,"260":2}}],["представляющий",{"2":{"215":1,"277":1,"415":1}}],["представляются",{"2":{"170":1,"175":1,"180":1,"183":1}}],["представляют",{"2":{"6":1,"141":1,"168":1,"174":1,"175":1,"186":1,"210":1,"355":1}}],["представлял",{"2":{"138":1}}],["представлять",{"2":{"22":1,"76":1,"222":1,"272":1,"331":1,"449":1}}],["предотвратить",{"2":{"263":1,"301":1}}],["предотвращает",{"2":{"263":1}}],["предотвращать",{"2":{"209":1}}],["предотвращая",{"2":{"142":1}}],["предотвращение",{"0":{"203":1}}],["предотвращения",{"2":{"181":1,"402":1}}],["предостережений",{"2":{"355":1}}],["предостережение",{"2":{"181":1,"298":1,"303":1}}],["предоставили",{"2":{"281":1}}],["предоставило",{"2":{"219":1}}],["предоставить",{"2":{"256":1,"265":1,"281":1,"320":1,"413":1,"437":1}}],["предоставит",{"2":{"220":1,"263":1,"275":1,"288":1,"345":1,"401":1,"419":1,"422":1}}],["предоставленные",{"2":{"365":1}}],["предоставленного",{"2":{"289":1}}],["предоставленное",{"2":{"283":1}}],["предоставлена",{"2":{"321":1}}],["предоставление",{"2":{"172":1,"388":1}}],["предоставления",{"2":{"108":1,"188":1,"202":1,"209":1,"210":1,"243":1,"281":1,"286":1,"407":1}}],["предоставляйте",{"2":{"437":1}}],["предоставляющая",{"2":{"429":1}}],["предоставляющую",{"2":{"243":1}}],["предоставляющие",{"2":{"248":1}}],["предоставляющий",{"2":{"243":1}}],["предоставляющих",{"2":{"157":1,"334":1}}],["предоставляются",{"2":{"144":1,"175":1,"316":1,"414":1,"429":1}}],["предоставляют",{"2":{"107":1,"125":1,"135":1,"138":1,"139":1,"216":1,"243":2,"250":1,"300":1,"309":1,"355":3,"388":1,"429":1,"439":1,"459":1}}],["предоставляя",{"2":{"128":1,"388":1,"416":1}}],["предоставляемой",{"2":{"403":1,"431":1}}],["предоставляемое",{"2":{"278":1}}],["предоставляемого",{"2":{"183":1,"281":1}}],["предоставляемым",{"2":{"388":1}}],["предоставляемыми",{"2":{"359":1,"378":1}}],["предоставляемых",{"2":{"340":1,"350":1,"355":1,"405":1,"407":1}}],["предоставляемый",{"2":{"217":1,"263":1,"396":1}}],["предоставляемые",{"2":{"216":1,"239":1,"354":1,"408":1,"431":1}}],["предоставляемую",{"2":{"135":1}}],["предоставляем",{"2":{"128":1,"281":1,"289":1,"357":1}}],["предоставляемая",{"2":{"115":1,"135":1}}],["предоставляет",{"2":{"107":4,"108":1,"125":1,"135":1,"138":1,"143":1,"150":2,"151":1,"215":1,"218":1,"234":1,"235":1,"239":3,"242":1,"243":2,"244":1,"265":1,"281":1,"285":1,"286":1,"324":1,"329":3,"337":2,"345":1,"350":2,"355":1,"356":1,"384":1,"385":2,"394":1,"397":1,"410":1,"414":1,"418":1,"429":1}}],["предоставляется",{"2":{"57":1,"108":1,"128":2,"151":1,"355":1,"395":1}}],["предоставляться",{"2":{"288":1}}],["предоставлять",{"2":{"108":1,"113":1,"188":1,"256":2,"263":1,"278":1,"281":1,"300":1,"449":1}}],["предприятий",{"2":{"228":1}}],["предписаны",{"2":{"157":1}}],["предписано",{"2":{"151":1}}],["предписанный",{"2":{"142":1}}],["предписывает",{"2":{"139":1,"141":1,"143":1,"305":1,"336":1}}],["предписывается",{"2":{"139":1}}],["предписывают",{"2":{"139":1,"215":1}}],["предположим",{"2":{"237":1,"250":1,"316":1}}],["предполагалось",{"2":{"330":1}}],["предполагают",{"2":{"258":1}}],["предполагающая",{"2":{"207":1}}],["предполагает",{"2":{"365":1,"407":1,"430":1}}],["предполагается",{"2":{"249":1,"256":2,"407":1}}],["предполагаемой",{"2":{"208":1}}],["предполагая",{"2":{"134":1}}],["предпочтительнее",{"2":{"337":1}}],["предпочтительно",{"2":{"87":1,"147":1}}],["предпочтение",{"2":{"236":1}}],["предпосылкам",{"2":{"231":1}}],["предыдущую",{"2":{"460":1}}],["предыдущая",{"2":{"218":1,"226":1}}],["предыдущее",{"2":{"412":1}}],["предыдущей",{"2":{"261":1,"265":1,"290":1,"333":1,"384":1,"418":1}}],["предыдущего",{"2":{"166":1,"194":1,"239":1,"254":1,"258":1,"350":1}}],["предыдущему",{"2":{"420":1}}],["предыдущем",{"2":{"125":1,"165":1,"183":1,"195":1,"196":1,"236":1,"238":1,"239":1,"242":1,"248":1,"249":2,"263":2,"265":1,"283":2,"320":1,"328":1,"348":1,"384":1}}],["предыдущих",{"2":{"142":1,"212":2,"215":1,"226":1,"236":1,"249":1,"250":1,"280":1,"340":1,"348":1,"354":1,"390":1}}],["предыдущими",{"2":{"215":1,"406":1}}],["предыдущим",{"2":{"125":1}}],["предыдущие",{"2":{"124":1,"150":1,"412":1,"423":1}}],["предыдущий",{"2":{"112":1,"132":1,"150":1,"263":1,"264":1,"317":1,"325":1,"331":1,"337":1,"385":1,"394":1,"416":1}}],["предмет",{"2":{"107":1,"261":1}}],["предмета",{"2":{"64":1,"165":1}}],["предъявляемых",{"2":{"68":1}}],["предложенное",{"2":{"214":1}}],["предложенных",{"2":{"81":1}}],["предложено",{"2":{"214":1,"428":1}}],["предложений",{"2":{"451":1}}],["предложением",{"2":{"209":1,"281":1,"355":1}}],["предложение",{"2":{"200":1}}],["предложения",{"2":{"147":1,"180":1,"204":1}}],["предложит",{"2":{"263":1}}],["предложите",{"2":{"165":1}}],["предложить",{"2":{"139":1,"235":1,"256":1,"334":1,"483":1}}],["предложил",{"2":{"61":1,"460":1,"461":1}}],["предлагайте",{"2":{"171":2}}],["предлагаемого",{"2":{"139":1}}],["предлагаемый",{"2":{"10":1}}],["предлагается",{"2":{"202":1,"217":1,"355":1}}],["предлагает",{"2":{"39":1,"40":1,"139":1,"141":1,"192":1,"214":1,"217":1,"219":1,"258":1,"281":1,"355":1,"388":1,"418":2,"421":1}}],["предлагающий",{"2":{"218":1}}],["предлагающих",{"2":{"107":1,"208":1}}],["предлагают",{"2":{"135":1,"174":1,"185":1,"430":1,"459":1,"460":1}}],["предлагаю",{"2":{"4":1,"109":1,"326":1}}],["прагматичный",{"2":{"302":1}}],["прайм",{"2":{"165":1}}],["практичности",{"2":{"397":1}}],["практическое",{"2":{"460":1}}],["практической",{"2":{"212":1,"294":1}}],["практического",{"2":{"171":1}}],["практическим",{"2":{"226":1}}],["практических",{"2":{"212":1,"213":1,"226":1}}],["практически",{"2":{"32":1,"116":1,"128":1,"160":2,"180":1,"201":1,"222":2,"275":1,"354":1,"408":1}}],["практикующие",{"2":{"407":1}}],["практику",{"2":{"218":1,"305":1}}],["практикой",{"2":{"152":1,"236":1,"238":1,"269":1,"281":1,"448":1,"449":1}}],["практиками",{"2":{"460":1}}],["практиках",{"2":{"438":1}}],["практика",{"2":{"142":1,"202":1,"258":1,"402":1,"428":1,"430":1,"449":1}}],["практике",{"2":{"116":1,"139":1,"142":1,"180":1,"181":1,"198":1,"214":1,"226":1,"261":1,"266":1,"295":1,"299":1,"302":1,"305":1,"321":1,"334":1,"335":1,"342":2,"354":1,"355":1,"356":1,"407":1,"409":1,"429":1}}],["практик",{"2":{"77":1,"212":1,"299":1,"304":1,"321":1,"460":1,"484":1,"495":2,"496":1}}],["практики",{"0":{"361":1,"438":1},"1":{"362":1,"363":1,"364":1,"365":1,"366":1,"367":1,"368":1},"2":{"9":1,"76":1,"106":1,"138":1,"223":2,"230":1,"301":1,"304":1,"305":1,"430":1,"459":1,"460":1,"495":1,"496":1}}],["прав",{"2":{"243":1,"425":1}}],["правительственных",{"2":{"125":1,"191":1}}],["правильных",{"2":{"460":1}}],["правильным",{"2":{"184":1,"221":1,"302":1,"342":1,"416":1}}],["правильное",{"2":{"416":1}}],["правильность",{"2":{"347":1}}],["правильном",{"2":{"191":1,"384":1}}],["правильно",{"2":{"142":1,"202":1,"223":1,"258":1,"262":2,"335":1,"385":1,"395":1,"411":1}}],["правил",{"0":{"171":1},"2":{"163":1,"171":2,"256":1}}],["правилах",{"2":{"171":1,"191":1}}],["правила",{"2":{"67":1,"138":1,"139":1,"142":1,"171":2,"216":1,"295":1,"332":1,"451":1}}],["правило",{"2":{"2":1,"23":1,"67":1,"130":1,"164":1,"180":1,"191":2,"215":1,"242":1,"302":1,"312":1,"342":1,"365":1,"407":1}}],["правая",{"2":{"444":1}}],["права",{"2":{"106":1,"125":1,"249":1}}],["правой",{"2":{"177":1,"261":1}}],["правом",{"2":{"163":1,"165":1,"169":1,"266":2}}],["право",{"2":{"106":3}}],["правками",{"2":{"83":1}}],["правда",{"2":{"22":1,"335":1,"407":1}}],["проехать",{"2":{"460":1}}],["проекты",{"2":{"231":3,"365":1,"421":2,"460":1}}],["проекту",{"2":{"212":1,"408":1,"421":1}}],["проектов",{"2":{"121":2,"213":1,"231":2,"284":1,"305":1,"354":1,"372":1,"418":1,"420":2,"421":1,"429":1,"443":1,"451":1,"459":1}}],["проектом",{"2":{"79":1,"212":1,"213":1,"372":1,"429":1,"436":1}}],["проекте",{"0":{"487":1},"2":{"61":1,"100":1,"214":1,"218":1,"219":1,"239":1,"295":2,"405":1,"407":1,"408":1,"409":1,"418":1,"421":1,"435":1,"436":1,"443":1,"449":1,"459":1,"484":1,"491":1}}],["проектированию",{"2":{"363":1}}],["проектирование",{"2":{"163":1,"167":1,"331":1}}],["проектирования",{"0":{"163":1,"168":1,"172":1,"275":1,"294":1,"295":1,"296":1,"305":1,"361":1,"371":1},"1":{"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"295":1,"296":1,"297":2,"298":2,"299":2,"300":2,"301":2,"302":2,"303":2,"304":2,"305":1,"306":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,"334":1,"335":1,"336":1,"337":1,"338":1,"339":1,"362":1,"363":1,"364":1,"365":1,"366":1,"367":1,"368":1},"2":{"41":1,"94":1,"138":2,"158":1,"160":1,"163":1,"164":1,"167":1,"171":1,"191":1,"198":1,"212":1,"216":2,"220":2,"269":3,"271":1,"272":1,"274":1,"275":1,"277":1,"280":1,"283":1,"284":1,"286":1,"292":1,"294":1,"295":1,"296":1,"304":2,"305":2,"310":1,"323":1,"325":1,"338":1,"339":1,"342":1,"345":1,"356":1,"363":3,"364":2,"365":1,"371":1,"376":1,"382":2,"387":1,"388":2,"389":2,"390":1,"403":1,"404":1,"409":1}}],["проектировании",{"2":{"2":1}}],["проект",{"0":{"60":1,"458":1},"2":{"4":1,"39":1,"57":1,"62":2,"68":1,"76":1,"212":1,"213":1,"214":8,"215":2,"216":1,"218":2,"229":1,"236":1,"290":1,"325":1,"338":1,"341":1,"350":2,"372":1,"397":1,"405":1,"409":1,"418":1,"421":2,"435":2,"436":1,"443":2,"452":1,"456":1,"489":2,"515":1}}],["проектами",{"2":{"231":1,"286":1,"291":1,"487":1}}],["проектах",{"2":{"157":1,"212":2,"218":1,"275":1,"285":1,"305":1,"417":1,"431":1,"435":1,"436":1,"450":1}}],["проекта",{"0":{"4":1,"9":1,"23":1,"57":1,"74":1,"75":1,"76":1,"98":1,"212":1,"214":1,"287":1,"372":1},"1":{"76":1,"77":1,"78":1,"79":1,"99":1,"100":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"223":1,"224":1,"225":1},"2":{"10":1,"14":1,"60":1,"63":1,"64":1,"67":3,"76":1,"100":1,"107":1,"110":1,"111":1,"117":1,"141":1,"142":1,"143":1,"161":1,"212":1,"214":8,"215":3,"216":1,"217":1,"218":1,"219":1,"230":2,"231":2,"232":1,"236":5,"269":1,"270":1,"286":1,"287":1,"292":1,"326":1,"341":1,"349":1,"350":1,"356":1,"405":1,"407":2,"410":3,"417":1,"418":1,"421":1,"425":1,"426":1,"433":1,"435":2,"436":2,"439":1,"450":1,"458":1,"460":1,"484":1,"495":1}}],["проапгрейдиться",{"2":{"459":1}}],["проанализировать",{"2":{"283":1}}],["проанализировав",{"2":{"239":1}}],["пройден",{"2":{"411":1}}],["пройти",{"2":{"160":1,"246":1,"460":1}}],["процентов",{"2":{"448":1,"524":1}}],["процентные",{"2":{"420":1}}],["процедур",{"2":{"429":1}}],["процедуры",{"2":{"408":1}}],["процессы",{"2":{"305":1,"384":1,"397":1}}],["процессу",{"2":{"271":1,"294":1,"295":1,"386":1,"392":1}}],["процессом",{"2":{"185":1,"275":1,"278":1,"342":1,"384":2}}],["процессор",{"2":{"157":1,"165":1,"444":1}}],["процессора",{"2":{"128":1}}],["процессов",{"2":{"67":1,"210":1,"245":1,"310":1}}],["процессах",{"2":{"204":1}}],["процессами",{"2":{"122":1,"384":2,"388":1}}],["процесса",{"2":{"79":1,"135":1,"140":1,"143":1,"179":1,"181":1,"195":1,"245":3,"248":1,"249":1,"250":2,"264":1,"277":1,"294":1,"336":1,"340":1,"384":2,"385":2,"390":2,"401":1,"408":1,"412":1,"420":1,"430":1,"435":1}}],["процессе",{"2":{"67":1,"68":1,"117":1,"126":1,"139":1,"141":1,"172":1,"215":1,"223":1,"244":1,"245":1,"249":1,"265":1,"289":1,"302":1,"384":1,"388":1,"397":1,"407":1,"408":1,"436":1}}],["процесс",{"2":{"60":1,"117":1,"134":1,"135":1,"141":1,"181":1,"184":1,"223":1,"225":1,"244":1,"245":1,"249":1,"250":4,"251":2,"263":2,"264":1,"271":1,"274":1,"281":1,"289":1,"302":1,"337":1,"355":1,"384":9,"388":2,"389":2,"390":1,"396":1,"407":2,"408":1,"420":1,"430":3,"432":1,"433":1,"450":1}}],["проходит",{"2":{"266":1}}],["прозрачным",{"2":{"438":1}}],["прозрачны",{"2":{"256":1}}],["прозрачный",{"2":{"106":1,"442":1}}],["прозрачное",{"2":{"435":1}}],["прозрачно",{"2":{"256":1,"331":1,"436":1}}],["проникновение",{"0":{"200":1}}],["прокручивается",{"2":{"233":1}}],["прокручиваются",{"2":{"186":1}}],["прокрутить",{"2":{"183":1,"196":1}}],["прокруткой",{"2":{"184":1}}],["прокрутка",{"2":{"183":1,"233":1}}],["прокрутку",{"2":{"183":1}}],["прокрутки",{"2":{"169":1,"183":1,"184":1,"284":2}}],["проксирования",{"2":{"329":1,"330":2}}],["прокси",{"2":{"108":1,"109":1,"131":1,"216":1,"264":1,"294":1,"305":1,"329":8,"330":6,"331":6,"333":1,"334":2,"340":1,"357":2,"388":1,"395":1,"451":1}}],["профессиональную",{"2":{"431":1}}],["профессиональные",{"2":{"405":1}}],["профессиональный",{"2":{"167":1}}],["профессионального",{"2":{"455":1}}],["профессиональной",{"2":{"368":1}}],["профессиональное",{"2":{"304":1}}],["профессор",{"2":{"171":1}}],["профилем",{"2":{"58":1}}],["профиля",{"2":{"4":1}}],["промптировании",{"2":{"263":1}}],["промптов",{"2":{"82":1}}],["промежутках",{"2":{"250":1}}],["промежутка",{"2":{"250":1}}],["промежуточным",{"2":{"398":1}}],["промежуточных",{"2":{"331":1}}],["промежуточный",{"2":{"215":1}}],["промежуточное",{"2":{"329":1}}],["промежуточного",{"2":{"290":1,"451":1}}],["промежуток",{"2":{"249":1}}],["промисная",{"2":{"500":1}}],["промисы",{"2":{"294":1,"413":1}}],["промисов",{"2":{"286":1,"460":1}}],["промиса",{"2":{"275":1,"289":1}}],["промис",{"2":{"243":1,"251":1,"278":2}}],["промышленном",{"2":{"398":1}}],["промышленной",{"2":{"216":1,"265":1}}],["промышленный",{"2":{"163":1}}],["прочную",{"2":{"431":1}}],["прочная",{"2":{"429":1}}],["прочтение",{"2":{"368":1}}],["прочим",{"2":{"452":1}}],["прочие",{"2":{"436":1,"440":1}}],["прочих",{"2":{"215":1,"461":1}}],["прочитаны",{"2":{"355":1}}],["прочитал",{"2":{"178":1}}],["прочитать",{"2":{"160":1,"354":1}}],["прочесть",{"2":{"461":1}}],["прочее",{"2":{"58":1}}],["прочего",{"2":{"36":1}}],["прояснить",{"2":{"329":1}}],["проясняться",{"2":{"143":1}}],["проявлять",{"2":{"384":1}}],["проявляться",{"2":{"295":1}}],["проявляются",{"2":{"256":1}}],["проявляется",{"2":{"201":1,"330":1,"450":1}}],["проявившиеся",{"2":{"143":1}}],["прошлый",{"2":{"304":1}}],["прошла",{"2":{"247":1,"249":1}}],["прошли",{"2":{"158":1,"266":2,"410":1,"411":1}}],["прошлой",{"2":{"81":1}}],["прошел",{"2":{"110":1}}],["пробовать",{"2":{"420":1}}],["пробегаемся",{"2":{"326":1}}],["пробелы",{"2":{"153":1}}],["пробелами",{"2":{"108":1}}],["пробная",{"2":{"213":2}}],["пробного",{"2":{"201":1}}],["проблемой",{"2":{"245":1,"384":2}}],["проблему",{"2":{"124":1,"125":1,"184":1,"305":1,"384":2,"435":1,"440":1,"449":1}}],["проблемам",{"2":{"297":1}}],["проблема",{"2":{"67":1,"113":1,"143":1,"280":1,"281":1,"301":1,"337":1,"355":1}}],["проблемы",{"2":{"61":1,"108":2,"138":1,"151":1,"245":1,"251":1,"281":1,"294":1,"305":2,"306":1,"405":1,"420":1,"449":1,"460":1,"461":1}}],["проблем",{"2":{"9":1,"107":1,"139":1,"184":1,"244":1,"284":1,"294":1,"297":1,"302":1,"336":1,"363":1,"405":1,"421":2,"533":1}}],["провайдите",{"2":{"438":1}}],["провайдеры",{"2":{"135":1,"439":2}}],["провайдерами",{"2":{"460":1,"533":1}}],["провайдерах",{"2":{"129":1}}],["провайдера",{"2":{"107":1,"128":1,"452":1}}],["провайдер",{"2":{"107":1,"129":1}}],["провайдеров",{"2":{"107":1,"135":1,"248":1}}],["провизия",{"2":{"281":1}}],["провизию",{"2":{"281":1}}],["проводить",{"2":{"451":1}}],["проводиться",{"2":{"407":2}}],["проводилось",{"2":{"407":1}}],["проводил",{"2":{"184":1}}],["проводнике",{"2":{"215":1}}],["проведения",{"2":{"432":1}}],["проведение",{"2":{"405":1}}],["проведет",{"2":{"266":1}}],["провели",{"2":{"292":1}}],["проверено",{"2":{"461":1}}],["проверена",{"2":{"249":1}}],["проверенная",{"2":{"485":1}}],["проверенное",{"2":{"139":1,"305":1}}],["проверенным",{"2":{"495":1}}],["проверенных",{"2":{"484":1}}],["проверенные",{"2":{"76":1}}],["проверенный",{"2":{"9":1}}],["проверенную",{"2":{"17":1}}],["проверке",{"2":{"411":2}}],["проверку",{"2":{"245":1,"321":1,"330":1,"407":1}}],["проверка",{"2":{"242":1,"244":1,"250":1,"289":1,"329":1,"427":1,"449":3,"533":1}}],["проверки",{"0":{"137":1,"159":1,"211":1,"225":1,"253":1,"268":1,"293":1,"339":1,"360":1,"404":1,"432":1},"2":{"174":1,"244":4,"245":3,"248":2,"250":4,"407":1,"411":1,"413":1}}],["проверит",{"2":{"410":1}}],["проверить",{"2":{"125":1,"214":1,"245":1,"248":1,"254":1,"262":1,"293":1,"336":1,"412":1,"413":1,"416":1,"417":1,"425":1,"426":1,"460":1}}],["проверили",{"2":{"403":1}}],["проверив",{"2":{"106":1}}],["проверьте",{"2":{"116":1,"222":1,"347":1,"461":1}}],["проверок",{"2":{"116":1}}],["проверяются",{"2":{"407":2}}],["проверяем",{"2":{"264":1,"315":1,"322":1,"326":1,"330":1,"337":1,"357":2,"415":1}}],["проверяет",{"2":{"106":2,"222":1,"245":1,"250":1,"435":1,"444":1}}],["проверять",{"2":{"106":1,"244":1,"411":1,"450":1}}],["провести",{"2":{"12":1,"139":1,"203":1,"402":1,"460":1}}],["протестировали",{"2":{"416":1}}],["протестированы",{"2":{"334":1,"408":1}}],["протестировать",{"2":{"107":1,"408":3,"410":1,"411":1,"413":1,"496":1}}],["проталкивает",{"2":{"240":1}}],["противном",{"2":{"222":1,"279":1,"321":1,"385":1,"393":1}}],["противоположную",{"2":{"206":1,"305":1}}],["противоположное",{"2":{"199":1}}],["противоположные",{"2":{"180":1}}],["против",{"0":{"162":1},"2":{"166":1}}],["протяжении",{"2":{"141":1,"214":1}}],["прототипа",{"2":{"293":1}}],["прототипов",{"2":{"275":1}}],["прототип",{"2":{"223":1}}],["прототипирования",{"2":{"23":1}}],["протоколирования",{"2":{"331":1}}],["протоколе",{"2":{"245":1}}],["протоколам",{"2":{"138":1}}],["протокола",{"2":{"135":2,"245":2,"355":1}}],["протоколу",{"2":{"134":1,"135":1,"136":1,"382":1,"439":1,"440":1}}],["протокол",{"2":{"125":3,"245":3,"397":2,"501":1}}],["протоколы",{"0":{"109":1},"2":{"109":1,"252":1,"460":1}}],["протоколом",{"2":{"108":1,"245":1,"247":1}}],["прогон",{"2":{"450":1}}],["проговаривание",{"2":{"64":1}}],["програмную",{"2":{"461":1}}],["програмных",{"2":{"363":1}}],["программой",{"2":{"217":1}}],["программ",{"2":{"213":1,"365":1}}],["программистов",{"2":{"451":1,"485":1}}],["программистские",{"2":{"451":1}}],["программистам",{"2":{"451":1}}],["программиста",{"2":{"294":1,"452":1}}],["программист",{"2":{"139":2,"302":1,"448":1,"451":1}}],["программировали",{"2":{"334":1}}],["программированию",{"2":{"460":2}}],["программирование",{"2":{"294":1,"339":1,"368":1,"451":1}}],["программировании",{"2":{"139":3,"299":1}}],["программирования",{"2":{"3":1,"17":1,"107":2,"138":2,"139":1,"264":1,"281":1,"298":1,"300":1,"451":2}}],["программировать",{"2":{"84":1,"452":1}}],["программы",{"2":{"126":1,"139":1,"142":1,"230":1,"283":1,"344":1,"422":1,"439":1,"444":1,"448":1,"451":2}}],["программа",{"2":{"108":1,"139":1}}],["программу",{"2":{"67":1,"139":1,"303":1,"422":1}}],["программный",{"2":{"240":1}}],["программные",{"2":{"162":1}}],["программными",{"2":{"451":1}}],["программным",{"2":{"162":1,"418":1}}],["программном",{"2":{"170":1,"297":1}}],["программному",{"2":{"128":1,"403":1,"407":1}}],["программно",{"2":{"139":1,"233":2,"250":1,"416":2,"448":1}}],["программное",{"2":{"124":1,"128":2,"160":1,"162":2,"208":1,"363":1,"365":1,"405":1,"407":2,"420":1}}],["программной",{"2":{"68":1,"138":1,"139":1,"297":1,"305":1}}],["программного",{"0":{"294":1,"295":1,"305":1,"371":1},"1":{"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"306":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,"334":1,"335":1,"336":1,"337":1,"338":1,"339":1},"2":{"60":1,"66":1,"68":1,"76":1,"109":1,"138":1,"160":1,"162":1,"168":1,"170":1,"208":1,"216":1,"220":1,"225":1,"269":1,"273":1,"277":1,"284":1,"294":1,"295":2,"303":1,"304":1,"305":1,"338":1,"345":1,"356":1,"371":2,"389":1,"405":3,"407":2,"409":1,"420":2,"430":1,"450":1}}],["программная",{"0":{"237":1},"1":{"238":1,"239":1},"2":{"2":1,"76":1,"239":1}}],["прогресса",{"0":{"181":1},"1":{"182":1},"2":{"181":1,"292":1}}],["прогресс",{"2":{"160":1,"181":3}}],["прогрессивное",{"2":{"263":1}}],["прогрессивному",{"2":{"249":1}}],["прогрессивность",{"2":{"139":1}}],["прогрессивного",{"2":{"122":1,"138":1,"261":1,"265":1,"363":1}}],["прогрессивные",{"0":{"254":1,"375":1},"1":{"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1},"2":{"228":1,"254":1}}],["прогрессивными",{"2":{"252":1}}],["прогрессивным",{"2":{"159":1}}],["прогрессивный",{"0":{"139":1},"2":{"138":1,"139":2,"256":1,"334":1,"370":1}}],["прогрессивных",{"2":{"138":1}}],["проп",{"2":{"449":1}}],["пропорционально",{"2":{"336":1}}],["проприетарных",{"2":{"256":1}}],["пропустили",{"2":{"330":1}}],["пропустить",{"2":{"218":1}}],["пропускать",{"2":{"58":1}}],["пропсом",{"2":{"289":1}}],["пропсов",{"2":{"235":1,"279":2,"280":2,"283":1,"344":1,"437":1,"449":1}}],["пропсу",{"2":{"283":1}}],["пропса",{"2":{"233":1,"239":1,"280":1,"289":1}}],["пропсами",{"2":{"236":1,"242":1}}],["пропсам",{"2":{"229":1}}],["пропс",{"2":{"182":1,"233":1,"236":1,"239":1,"283":1,"289":2,"344":1}}],["пропсы",{"0":{"153":1,"279":1},"2":{"96":1,"279":1,"280":2,"283":2,"290":1,"437":1,"438":1,"449":1}}],["прописать",{"2":{"435":1,"516":1}}],["прописан",{"2":{"527":1}}],["прописано",{"2":{"148":1}}],["прописаны",{"2":{"139":1}}],["прописывать",{"2":{"41":1}}],["проиграет",{"2":{"461":1}}],["проигнорируем",{"2":{"215":1}}],["проиндексировать",{"2":{"461":1}}],["происхождения",{"2":{"355":1}}],["происхождением",{"2":{"355":1}}],["происходят",{"2":{"256":1}}],["происходящего",{"2":{"181":1}}],["происходящим",{"2":{"172":1}}],["происходить",{"2":{"17":1,"405":1,"435":1,"449":1}}],["происходит",{"2":{"3":1,"121":1,"172":1,"184":1,"222":1,"239":1,"242":1,"244":1,"249":2,"281":1,"285":1,"288":1,"291":1,"330":2,"336":1,"349":1,"355":1,"384":4,"392":1,"396":1,"405":1,"416":1,"430":1,"432":2,"461":1}}],["проиллюстрирован",{"2":{"274":1}}],["проиллюстрировать",{"2":{"194":1}}],["произойти",{"2":{"256":1,"412":1}}],["произойдет",{"2":{"184":1,"214":1,"222":1,"250":1,"278":1,"335":1,"344":1}}],["произошла",{"2":{"229":1,"385":1,"414":1}}],["произошло",{"2":{"178":1,"449":1}}],["произвольные",{"2":{"399":1}}],["произвольный",{"2":{"183":1}}],["произвольное",{"2":{"258":1}}],["производственной",{"2":{"417":1}}],["производственных",{"2":{"218":1}}],["производственные",{"2":{"215":1}}],["производстве",{"2":{"215":1,"326":1}}],["производства",{"2":{"215":2,"219":1}}],["производству",{"2":{"136":1,"215":1}}],["производится",{"2":{"250":1,"423":1}}],["производителен",{"2":{"214":1}}],["производительней",{"2":{"444":1}}],["производительнее",{"2":{"116":1}}],["производительное",{"2":{"451":1}}],["производительной",{"2":{"384":1}}],["производительности",{"2":{"67":1,"121":1,"131":1,"139":2,"218":1,"228":1,"267":1,"329":1,"359":1,"375":1,"377":1,"384":3,"388":1,"393":1,"397":1,"448":1,"449":1,"461":1}}],["производительностью",{"2":{"384":1}}],["производительность",{"2":{"17":1,"68":2,"77":1,"147":1,"228":1,"256":2,"382":1,"384":2,"403":2,"404":1,"453":1}}],["производительных",{"2":{"364":1}}],["производительными",{"2":{"254":1}}],["производительным",{"2":{"114":1}}],["производительная",{"2":{"363":1}}],["производилась",{"2":{"214":1}}],["продвигает",{"2":{"300":1}}],["продвинулись",{"2":{"214":1}}],["продвинутые",{"2":{"276":1}}],["продвинутыми",{"2":{"382":1}}],["продвинутым",{"2":{"223":1}}],["продвинутых",{"2":{"212":1,"236":1}}],["продвинуться",{"2":{"213":1}}],["продвижение",{"2":{"162":1}}],["продвижения",{"2":{"124":1,"138":1,"150":1,"158":1,"223":1,"263":1,"338":1}}],["продуманный",{"2":{"252":1}}],["продуманных",{"2":{"250":1}}],["продуманные",{"2":{"198":1}}],["продуманного",{"2":{"194":1}}],["продуктом",{"2":{"162":1,"172":1}}],["продуктовый",{"2":{"460":1}}],["продуктовое",{"2":{"79":1}}],["продуктов",{"2":{"11":4,"38":1,"39":1}}],["продукте",{"2":{"11":1}}],["продуктами",{"2":{"88":1}}],["продуктах",{"2":{"11":1}}],["продукта",{"2":{"11":1,"13":1,"60":1,"68":1,"73":1,"76":1,"163":1,"196":1,"430":2}}],["продукты",{"2":{"11":1,"162":1}}],["продукт",{"2":{"10":1,"43":1,"64":1,"76":1,"122":1,"162":1,"220":1,"433":1}}],["продолжения",{"2":{"290":1}}],["продолжение",{"2":{"169":2}}],["продолжать",{"2":{"492":1}}],["продолжаться",{"2":{"201":1}}],["продолжает",{"2":{"336":1,"411":1,"420":1}}],["продолжаем",{"2":{"226":1}}],["продолжим",{"2":{"164":1}}],["продолжительность",{"2":{"335":1}}],["продолжить",{"2":{"197":1,"335":1,"426":1}}],["продолжит",{"2":{"116":1}}],["продлевать",{"2":{"135":1}}],["продлить",{"2":{"125":1}}],["продакшен",{"2":{"215":1}}],["продакшне",{"2":{"100":1,"450":1}}],["продает",{"2":{"125":1}}],["продаются",{"2":{"125":1,"202":1}}],["продавалось",{"2":{"160":1}}],["продавать",{"2":{"125":1}}],["продавцам",{"2":{"13":1}}],["продавцов",{"2":{"12":1}}],["проскроллит",{"2":{"522":1}}],["прослойка",{"2":{"461":1}}],["прослушивать",{"2":{"402":2}}],["прослушивания",{"2":{"301":1}}],["прослушивание",{"2":{"236":1}}],["проследим",{"2":{"218":1}}],["просмотр",{"2":{"215":1,"251":1}}],["просмотреть",{"2":{"159":1,"188":1,"218":1,"425":1}}],["просмотра",{"2":{"143":1,"183":1,"184":2,"186":1,"214":1,"224":1,"263":1,"289":1,"358":1,"394":2,"418":1,"425":1}}],["просматривать",{"2":{"11":2,"301":1,"394":1}}],["просишь",{"2":{"106":1}}],["простейший",{"2":{"331":1}}],["проставить",{"2":{"540":1}}],["проста",{"2":{"194":1,"229":1,"230":1,"244":1,"248":1,"283":1,"344":1,"348":1,"391":1,"399":1,"418":1}}],["простая",{"0":{"244":1},"2":{"110":1,"206":1,"222":1,"244":1,"263":2,"347":1,"390":1,"421":1}}],["пространства",{"2":{"164":1}}],["пространстве",{"2":{"136":1,"180":1,"355":1}}],["пространство",{"2":{"125":1,"355":1,"443":1}}],["простую",{"2":{"124":1,"131":1,"139":1,"171":1,"199":1,"231":1,"284":1,"336":1,"396":1,"397":1}}],["прост",{"2":{"110":1,"128":1,"167":1,"250":1,"263":1,"281":1,"327":1,"335":2,"386":1,"398":1}}],["просты",{"2":{"162":1,"461":1}}],["простых",{"2":{"81":1,"114":1,"135":1,"138":2,"183":1,"211":1,"215":1,"243":1,"252":1,"269":1,"290":1,"349":1,"403":1,"413":1,"426":1,"461":1}}],["простым",{"0":{"303":1},"2":{"76":1,"105":1,"172":1,"231":1,"249":1,"261":1,"292":1,"294":1,"303":1,"331":1,"334":1,"349":1,"385":1,"388":1,"414":1,"422":1,"438":1}}],["простыми",{"2":{"11":1,"135":1,"218":1,"392":1}}],["простые",{"2":{"2":1,"22":1,"41":1,"215":1,"216":1,"303":1,"332":1,"333":1,"336":1,"342":1,"393":1,"448":1,"524":1,"541":1}}],["простор",{"2":{"305":1}}],["простому",{"2":{"224":1,"433":1}}],["простом",{"2":{"151":1,"182":1,"329":1,"332":1,"451":1}}],["простого",{"2":{"138":1,"222":1,"250":1,"283":1,"329":1,"355":1,"496":1}}],["простое",{"2":{"114":1,"141":1,"214":1,"219":1,"223":1,"224":1,"280":1,"316":1,"342":1,"385":1,"461":1}}],["простота",{"2":{"39":1,"303":1,"349":1}}],["простоты",{"2":{"7":1,"191":1,"239":1,"258":1,"273":1,"397":1}}],["простой",{"0":{"401":1},"1":{"402":1},"2":{"32":1,"106":1,"140":1,"166":1,"184":1,"194":1,"220":1,"222":2,"233":1,"235":1,"244":1,"263":1,"264":1,"267":1,"272":1,"285":2,"286":1,"297":1,"314":1,"322":1,"325":1,"326":1,"330":1,"331":1,"334":1,"337":1,"342":1,"349":1,"355":1,"357":1,"358":1,"363":1,"377":1,"382":2,"384":1,"385":1,"395":1,"399":1,"400":2,"411":1,"418":2,"430":1,"460":1,"519":1,"520":1,"524":1}}],["просто",{"0":{"218":1},"2":{"2":1,"12":1,"94":1,"106":1,"112":1,"122":1,"125":2,"128":1,"129":1,"132":1,"143":1,"150":1,"171":1,"184":1,"190":1,"206":1,"214":1,"219":1,"230":1,"234":1,"236":1,"243":1,"248":1,"269":1,"283":1,"289":2,"304":1,"316":1,"321":2,"322":1,"326":1,"330":1,"331":1,"336":1,"341":1,"342":1,"343":2,"345":1,"349":1,"352":1,"355":2,"357":1,"384":1,"385":2,"386":1,"395":1,"396":1,"399":1,"400":1,"402":1,"409":1,"423":1,"439":1,"448":1,"449":3,"452":1,"459":1,"460":1,"492":1,"495":1}}],["проще",{"2":{"2":1,"38":1,"55":1,"107":1,"170":1,"191":1,"228":1,"256":1,"299":1,"350":1,"354":1,"357":1,"448":1,"459":1,"461":1}}],["приглашаем",{"2":{"487":1}}],["приглашение",{"2":{"264":1}}],["приглашения",{"2":{"263":2}}],["пригодится",{"2":{"425":1,"460":1}}],["пригодиться",{"2":{"418":1,"444":1}}],["природа",{"2":{"405":1}}],["природе",{"2":{"152":1,"337":1}}],["прирост",{"2":{"384":1,"393":1}}],["признательность",{"2":{"368":1}}],["признаку",{"2":{"290":1}}],["признания",{"2":{"278":1}}],["призывом",{"2":{"196":2}}],["призыв",{"0":{"196":1},"2":{"196":1,"208":1}}],["призывы",{"2":{"179":1}}],["призыва",{"2":{"164":1}}],["приписываются",{"2":{"251":1}}],["пришла",{"2":{"284":1}}],["пришли",{"2":{"228":1}}],["пришлось",{"2":{"165":1}}],["пришло",{"2":{"134":1,"222":1,"233":1,"236":1,"242":1,"263":1,"289":1,"290":1,"390":1,"391":1,"393":1,"396":1,"419":1}}],["придумали",{"2":{"461":1}}],["придумать",{"2":{"339":1}}],["придать",{"2":{"221":1}}],["придерживаются",{"2":{"196":1,"459":1}}],["придерживаться",{"2":{"139":1,"210":1,"335":1,"410":1,"460":1}}],["придется",{"2":{"38":1,"58":1,"139":1,"281":1,"304":1,"315":1,"384":1}}],["приобрела",{"2":{"228":1}}],["приобрести",{"2":{"213":1}}],["приобретают",{"2":{"407":1}}],["приобретаются",{"2":{"125":1}}],["приобретен",{"2":{"125":1,"135":1}}],["приемник",{"2":{"328":1}}],["приемники",{"2":{"327":1}}],["приемнику",{"2":{"327":1}}],["приемы",{"2":{"210":1}}],["приемов",{"2":{"183":1,"197":1,"218":1}}],["приборная",{"2":{"419":1}}],["приборной",{"2":{"418":1}}],["прибегая",{"2":{"187":1}}],["приблизить",{"2":{"461":1}}],["приблизительно",{"0":{"79":1}}],["приближении",{"2":{"17":1}}],["приятный",{"2":{"507":1}}],["приятные",{"2":{"215":1}}],["приятней",{"2":{"459":1}}],["приятно",{"2":{"143":1}}],["приятен",{"2":{"163":1}}],["причем",{"2":{"190":1,"329":1,"335":1,"355":1,"388":1,"413":1,"416":1,"460":2}}],["причудливо",{"2":{"139":1}}],["причина",{"2":{"417":1}}],["причинам",{"2":{"414":1}}],["причине",{"2":{"278":1}}],["причин",{"2":{"63":1,"116":1,"186":1,"329":1,"384":1}}],["причины",{"0":{"61":1},"2":{"329":1,"459":1}}],["приспособленным",{"2":{"363":1}}],["приспособить",{"2":{"136":1}}],["присутствует",{"2":{"449":1}}],["присутствию",{"2":{"125":1}}],["присущей",{"2":{"350":1}}],["приступать",{"2":{"425":1}}],["приступаем",{"2":{"415":1}}],["приступить",{"2":{"215":1,"218":1,"230":1,"234":1,"275":1,"388":1,"396":1}}],["приступили",{"2":{"212":1}}],["пристыдить",{"2":{"207":1}}],["пристальное",{"2":{"196":1,"365":1}}],["присваивание",{"2":{"330":1}}],["присваиваем",{"2":{"239":1,"283":1,"320":1,"321":1,"322":1,"330":1}}],["присваивает",{"2":{"149":1,"280":1}}],["присваивается",{"2":{"139":1,"149":1,"236":1}}],["присваивая",{"2":{"239":1,"321":1,"330":1}}],["присваивать",{"2":{"233":1}}],["присвоить",{"2":{"318":1,"319":1,"330":1}}],["присвоили",{"2":{"283":1}}],["присвоил",{"2":{"184":1}}],["присвоение",{"2":{"321":2}}],["присвоения",{"2":{"272":1}}],["присвоении",{"2":{"222":1}}],["присвоено",{"2":{"236":1}}],["присоединить",{"2":{"280":1}}],["присоединяет",{"2":{"327":1}}],["присоединяем",{"2":{"222":1}}],["присоединять",{"2":{"286":1}}],["присоединяться",{"2":{"62":1}}],["присоединении",{"2":{"149":1}}],["прим",{"2":{"213":1}}],["приманка",{"0":{"201":1,"206":1}}],["примитивах",{"2":{"448":1}}],["примитивам",{"2":{"114":2}}],["примитивов",{"2":{"448":1}}],["примитивные",{"2":{"149":1,"279":1,"449":1}}],["примите",{"2":{"143":1,"247":1}}],["примет",{"2":{"139":1,"275":1}}],["примечание",{"2":{"125":1,"269":1,"279":1}}],["примечателен",{"2":{"32":1}}],["применив",{"2":{"421":1}}],["применительно",{"2":{"256":1}}],["применить",{"2":{"223":1,"226":1,"271":1,"275":1,"282":1,"332":1,"356":1,"358":1,"388":1,"390":1,"407":1}}],["применили",{"2":{"196":1,"221":1,"223":1,"283":1,"292":1,"293":1}}],["применимы",{"2":{"304":1}}],["применим",{"2":{"216":1,"251":1,"269":1,"285":1,"289":1,"298":1,"321":1,"341":1,"395":1}}],["применима",{"2":{"166":1}}],["применимо",{"2":{"160":1}}],["применены",{"2":{"415":1}}],["применен",{"2":{"388":1,"504":1}}],["примененными",{"2":{"220":1}}],["применена",{"2":{"192":1,"217":1}}],["применено",{"2":{"164":1}}],["применений",{"2":{"280":1,"397":1}}],["применению",{"2":{"139":1}}],["применения",{"2":{"136":1,"169":1,"171":1,"194":1,"260":1,"275":1,"278":1,"301":1,"313":1,"403":1,"405":1,"435":1}}],["применении",{"2":{"114":1,"216":1,"409":1}}],["применением",{"2":{"226":1,"269":1}}],["применение",{"2":{"109":1,"170":1,"216":1,"218":1,"220":1,"256":2,"297":1,"304":1,"305":1,"310":1,"338":1,"340":1,"492":1}}],["применяют",{"2":{"395":1}}],["применяются",{"2":{"256":1}}],["применяя",{"2":{"194":1,"222":1,"387":1,"409":1}}],["применяться",{"2":{"177":1,"215":1,"294":1,"295":1,"536":1}}],["применять",{"2":{"139":1,"217":1,"223":1,"294":1,"303":1,"312":1,"338":1,"340":1,"408":1,"431":1}}],["применяет",{"2":{"195":1,"335":1}}],["применяется",{"2":{"106":1,"114":2,"143":1,"194":1,"244":1,"260":1,"304":1,"330":1,"335":1}}],["применяемая",{"2":{"283":1}}],["применяемых",{"2":{"216":1,"402":1}}],["применяем",{"2":{"41":1,"352":1,"413":1}}],["примеру",{"2":{"139":1,"222":1,"316":1,"415":1}}],["примеры",{"2":{"128":1,"133":1,"152":1,"161":1,"178":1,"181":1,"198":1,"216":1,"236":1,"240":1,"255":1,"269":1,"336":1,"338":1,"339":1,"340":2,"371":1,"378":1,"409":1,"431":1,"460":1}}],["примеров",{"0":{"367":1},"2":{"114":1,"123":1,"139":1,"141":1,"143":1,"162":1,"180":1,"208":1,"213":1,"242":1,"251":1,"255":1,"294":1,"300":1,"348":1,"353":1,"363":1,"367":1,"406":1,"409":1,"410":1}}],["примером",{"2":{"76":1,"195":1,"243":1,"272":1,"355":1,"425":1}}],["примере",{"2":{"17":1,"103":1,"112":1,"132":1,"139":1,"140":1,"143":1,"151":1,"164":1,"165":1,"196":1,"200":1,"207":1,"214":1,"216":1,"230":1,"242":1,"248":2,"251":1,"263":1,"264":1,"265":1,"280":1,"281":2,"283":1,"290":1,"301":1,"321":1,"325":1,"326":1,"329":2,"330":1,"331":1,"342":1,"345":1,"346":1,"347":2,"350":2,"351":1,"358":1,"382":1,"386":1,"394":2,"398":1,"403":1,"408":1,"418":1,"428":1}}],["примерное",{"2":{"384":1}}],["примерно",{"2":{"14":1,"17":1,"26":2,"48":1,"88":1,"105":1,"214":2,"244":1,"249":1,"266":1,"283":2,"290":1,"324":1,"348":1,"384":1,"394":1,"418":1,"425":1,"426":1,"449":1,"461":1}}],["примерный",{"2":{"5":1}}],["примерами",{"2":{"151":1,"216":1,"228":1,"233":1,"256":1,"419":1}}],["примерам",{"2":{"125":1,"226":1,"313":1,"365":1,"383":1}}],["примерах",{"2":{"113":1,"149":1,"169":1,"226":1,"228":1,"233":1,"242":1,"249":1,"258":1,"269":1,"280":1,"310":1,"315":1,"334":1,"355":1,"387":1,"496":1}}],["примера",{"2":{"4":1,"126":1,"143":1,"164":1,"194":1,"199":1,"215":1,"220":1,"233":1,"237":1,"238":1,"251":1,"255":1,"262":1,"264":1,"266":1,"297":1,"299":1,"330":1,"336":1,"337":1,"348":1,"350":1,"358":3,"385":1,"393":1,"394":1,"404":1,"411":1,"418":1,"426":1}}],["пример",{"0":{"286":1,"409":1},"1":{"287":1,"288":1,"289":1},"2":{"3":1,"14":1,"17":1,"94":1,"105":2,"108":1,"111":1,"112":2,"113":1,"115":1,"129":1,"131":1,"140":1,"143":1,"148":1,"149":1,"150":1,"151":1,"165":2,"166":2,"175":1,"177":1,"179":1,"180":1,"181":2,"183":1,"187":1,"188":1,"190":1,"194":1,"199":1,"200":1,"206":1,"207":1,"220":1,"236":1,"239":2,"242":1,"245":1,"261":3,"263":1,"264":1,"265":2,"266":1,"269":1,"278":3,"279":2,"283":2,"284":1,"285":1,"289":1,"300":1,"301":1,"318":1,"319":1,"320":1,"322":1,"328":1,"329":1,"330":1,"331":3,"335":2,"337":2,"339":1,"344":1,"347":1,"350":1,"358":1,"386":1,"393":1,"394":3,"409":1,"412":1,"415":1,"416":1,"417":1,"418":1,"427":1,"435":2,"438":1,"449":1,"526":1}}],["прикосновений",{"2":{"507":1}}],["прикосновением",{"2":{"192":1}}],["прикладном",{"2":{"501":1}}],["прикладного",{"2":{"17":1,"281":1,"300":1}}],["прикладную",{"2":{"290":1}}],["прикрыть",{"2":{"289":1}}],["прикрепить",{"2":{"350":1}}],["прикрепив",{"2":{"277":1}}],["прикрепляем",{"2":{"301":1}}],["прикрепляя",{"2":{"112":1}}],["приходила",{"2":{"461":1}}],["приходится",{"2":{"135":1,"143":2,"147":1,"214":1,"281":1,"416":1,"444":1}}],["приходит",{"2":{"128":1,"262":1,"280":1,"283":1}}],["приходите",{"2":{"26":1}}],["приходу",{"2":{"389":1}}],["приходя",{"2":{"452":1}}],["приходятся",{"2":{"449":1,"451":1}}],["приходят",{"2":{"183":1,"413":1}}],["приходящих",{"2":{"109":1}}],["привыкли",{"2":{"352":1}}],["привычный",{"2":{"387":1}}],["привычным",{"2":{"315":1,"429":1}}],["привычными",{"2":{"304":1}}],["привычнее",{"2":{"102":1}}],["привлечь",{"2":{"342":1}}],["привлекает",{"2":{"164":1}}],["приватные",{"2":{"349":1}}],["приватный",{"2":{"128":1}}],["приватному",{"2":{"321":2}}],["привяжем",{"2":{"222":1}}],["привязывайтесь",{"2":{"456":1}}],["привязывание",{"2":{"284":1}}],["привязывается",{"2":{"125":1,"355":1}}],["привязку",{"2":{"280":1}}],["привязки",{"2":{"235":1}}],["привязке",{"2":{"184":1}}],["привязанный",{"2":{"283":1}}],["привязанные",{"2":{"216":1}}],["привязанной",{"2":{"242":1}}],["привязана",{"2":{"223":1,"449":1}}],["приводящую",{"2":{"411":1}}],["приводятся",{"2":{"371":1}}],["приводят",{"2":{"172":1,"271":1,"335":1}}],["приводит",{"2":{"250":1,"411":1,"416":1}}],["приводится",{"2":{"173":1,"305":1}}],["приветствуется",{"2":{"483":1}}],["привет",{"2":{"385":1,"386":1}}],["привел",{"2":{"151":1}}],["привели",{"2":{"143":2,"338":1}}],["привело",{"2":{"138":1,"284":1}}],["приведет",{"2":{"135":1,"169":1,"335":1,"347":1,"355":1,"416":1}}],["приведем",{"2":{"113":1,"115":1,"165":1,"211":1,"261":1,"278":2,"297":1,"320":1}}],["приведена",{"2":{"290":1}}],["приведенной",{"2":{"345":1}}],["приведенном",{"2":{"264":1}}],["приведенного",{"2":{"199":1}}],["приведенным",{"2":{"287":1}}],["приведенные",{"2":{"152":1,"431":1}}],["приведенный",{"2":{"110":1,"251":1,"318":1,"326":1,"344":1,"415":1}}],["приведены",{"2":{"128":1,"178":1,"216":1,"240":1,"427":1}}],["приведен",{"2":{"108":1,"110":1,"128":1,"129":1,"176":1,"233":1,"242":1,"251":1,"301":1,"323":1}}],["привести",{"2":{"67":1,"115":1,"143":1,"180":1,"256":1,"278":1,"298":1,"299":1,"339":1,"342":1,"351":1,"405":2,"412":1}}],["прилагает",{"2":{"384":1}}],["приложить",{"2":{"256":1}}],["приложений",{"0":{"452":1},"1":{"453":1,"454":1,"455":1,"456":1,"457":1,"458":1},"2":{"106":1,"125":1,"135":1,"136":1,"138":2,"139":5,"141":2,"163":1,"202":1,"212":1,"228":2,"243":1,"244":2,"245":1,"248":1,"250":2,"252":1,"254":1,"256":7,"258":1,"267":1,"269":2,"294":2,"300":1,"302":1,"338":1,"340":2,"349":1,"354":1,"359":1,"364":2,"365":1,"374":1,"382":1,"405":1,"418":1,"426":1,"430":1,"461":1}}],["приложению",{"2":{"94":1,"125":1,"132":1,"142":1,"185":1,"215":2,"221":1,"224":1,"229":1,"233":1,"234":1,"245":1,"251":1,"264":1,"277":1,"286":1,"293":1,"349":1,"350":1,"354":1,"383":1,"388":1,"390":1,"393":1,"436":1,"449":1,"530":1}}],["приложениями",{"2":{"128":2,"138":1,"189":1,"226":1,"228":1,"251":2,"252":1,"256":3,"263":1,"266":1,"267":2,"305":1}}],["приложениям",{"2":{"116":1,"226":1,"403":1}}],["приложениях",{"2":{"113":1,"160":2,"167":1,"179":1,"181":1,"186":1,"189":1,"200":1,"217":2,"218":1,"243":1,"245":1,"252":1,"269":1,"306":1,"310":2,"337":1,"382":1,"408":1}}],["приложения",{"0":{"79":1,"111":1,"122":1,"124":1,"126":1,"135":1,"194":1,"223":1,"226":1,"254":1,"290":1,"291":1,"374":1,"375":1,"379":1,"409":1,"440":1,"443":1,"490":1,"529":1},"1":{"123":1,"124":1,"125":2,"126":1,"127":2,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":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,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"441":1,"442":1,"530":1,"531":1,"532":1,"533":1},"2":{"11":1,"58":1,"95":1,"105":1,"109":1,"110":4,"111":5,"112":3,"118":1,"122":6,"124":3,"125":1,"126":4,"127":2,"128":3,"129":1,"130":1,"134":2,"135":1,"136":3,"137":1,"138":2,"139":6,"140":5,"141":4,"142":1,"150":1,"151":1,"176":1,"179":1,"181":1,"186":2,"188":2,"191":1,"193":1,"194":1,"196":3,"210":1,"212":2,"214":1,"215":7,"216":2,"217":1,"219":1,"220":3,"221":1,"222":1,"224":3,"225":2,"226":1,"228":8,"230":3,"233":2,"236":2,"243":2,"244":1,"245":1,"246":1,"247":2,"248":2,"249":2,"250":2,"251":6,"252":1,"253":1,"254":2,"256":8,"257":2,"258":3,"259":3,"260":4,"261":4,"262":1,"263":5,"264":3,"265":1,"266":2,"268":1,"271":2,"272":2,"274":1,"275":1,"277":2,"278":2,"281":2,"285":2,"286":2,"289":4,"290":3,"291":1,"292":1,"297":2,"299":1,"301":2,"302":2,"303":1,"308":1,"309":1,"312":1,"321":1,"329":2,"334":1,"338":1,"340":3,"341":1,"342":1,"347":5,"348":1,"349":2,"350":1,"353":1,"355":5,"359":1,"363":1,"373":1,"377":1,"382":2,"383":1,"384":3,"386":1,"388":1,"390":3,"393":1,"394":1,"398":1,"401":1,"402":1,"403":3,"404":2,"405":2,"407":2,"408":3,"409":5,"419":1,"430":1,"435":1,"436":2,"437":1,"438":1,"440":2,"443":3,"448":1,"450":1,"451":1,"452":2,"453":1,"461":5,"484":1,"492":1,"494":1,"495":3,"496":4,"500":1,"530":5,"532":1,"533":3,"542":1,"543":1,"544":3}}],["приложением",{"2":{"6":1,"122":1,"134":1,"140":1,"160":1,"162":1,"172":1,"188":1,"264":1,"269":1,"363":1,"461":1,"484":2}}],["приложение",{"0":{"110":1,"220":1,"231":1,"381":1},"1":{"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"221":1,"222":1,"223":1},"2":{"6":1,"11":1,"50":1,"79":1,"86":1,"107":2,"111":1,"112":1,"116":1,"125":2,"126":4,"127":1,"128":3,"132":1,"134":3,"135":1,"138":1,"139":4,"140":2,"141":2,"142":2,"172":2,"178":1,"181":2,"196":1,"209":1,"212":2,"214":1,"215":4,"216":1,"219":1,"220":4,"222":1,"223":4,"224":2,"225":2,"226":2,"228":1,"230":1,"231":1,"233":1,"235":1,"239":1,"243":1,"245":1,"249":3,"250":1,"251":1,"252":2,"254":3,"256":9,"258":1,"259":2,"260":1,"262":1,"263":6,"266":1,"267":1,"268":1,"269":1,"275":1,"290":1,"291":1,"292":1,"297":1,"331":1,"335":1,"340":1,"345":1,"350":1,"352":1,"355":1,"379":1,"384":2,"387":1,"388":1,"390":1,"393":1,"394":2,"397":1,"401":1,"409":4,"419":1,"436":1,"440":1,"459":1,"460":1,"461":3,"492":2,"496":1,"541":1,"542":1}}],["приложении",{"0":{"140":1},"1":{"141":1},"2":{"5":1,"11":1,"93":1,"112":1,"139":1,"140":1,"143":1,"178":1,"216":1,"218":1,"220":1,"221":1,"222":1,"230":1,"231":1,"235":1,"242":1,"245":2,"248":1,"249":1,"256":1,"274":1,"275":2,"278":1,"289":3,"290":2,"302":2,"305":1,"311":1,"321":1,"322":1,"328":1,"342":1,"347":1,"348":1,"350":1,"352":1,"356":1,"376":1,"381":1,"384":1,"386":1,"387":1,"390":1,"398":1,"414":1,"440":2,"449":3,"461":1,"498":1,"504":1,"545":1}}],["приличных",{"2":{"64":1}}],["приняли",{"2":{"214":2,"391":1,"392":1}}],["принят",{"2":{"274":1,"289":1}}],["принять",{"2":{"171":1,"202":1,"203":1,"263":1,"275":2,"289":1,"331":1}}],["принятие",{"2":{"170":1}}],["принятия",{"2":{"63":1,"170":1,"188":1,"407":1}}],["принято",{"2":{"141":1,"183":1,"187":2,"215":1,"258":1,"325":1,"420":1}}],["приняты",{"2":{"138":1}}],["принести",{"2":{"211":1,"449":1}}],["принадлежность",{"2":{"249":1}}],["принадлежит",{"2":{"248":1,"302":1}}],["принадлежат",{"2":{"166":1,"449":1}}],["принадлежать",{"2":{"16":1}}],["принадлежт",{"2":{"96":1}}],["принимают",{"2":{"280":1,"283":1,"300":1}}],["принимающей",{"2":{"395":1}}],["принимающую",{"2":{"279":1,"286":1,"345":1}}],["принимающий",{"2":{"108":1,"236":1,"346":1,"402":1}}],["принимаемого",{"2":{"240":1}}],["принимает",{"2":{"240":1,"241":1,"244":1,"278":1,"279":1,"283":1,"285":1,"288":1,"289":1,"290":1,"322":1,"357":2}}],["принимается",{"2":{"115":1,"258":1}}],["принимаешь",{"2":{"81":1}}],["принимать",{"2":{"22":1,"183":1,"285":1,"294":1,"489":1}}],["принципу",{"2":{"251":1,"300":1}}],["принципа",{"2":{"166":1,"216":1,"297":1,"299":1,"301":2,"304":1,"325":1}}],["принципами",{"2":{"164":1,"168":1,"297":1}}],["принципах",{"2":{"160":1,"191":1,"196":1,"364":1}}],["принципом",{"2":{"164":1,"302":1,"339":1}}],["принципов",{"0":{"296":1},"1":{"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1},"2":{"158":1,"162":1,"294":2,"295":1,"304":1,"363":1}}],["принципы",{"0":{"163":1,"172":1,"294":1,"295":1,"371":1,"492":1},"1":{"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"306":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,"334":1,"335":1,"336":1,"337":1,"338":1,"339":1},"2":{"163":2,"167":2,"171":1,"172":1,"216":1,"220":2,"223":1,"269":1,"277":1,"284":1,"294":2,"295":2,"296":2,"304":1,"338":1,"345":1,"356":1,"371":1,"388":1,"389":1,"408":1,"409":1}}],["принципе",{"2":{"96":1,"223":1,"304":1,"451":1}}],["принцип",{"0":{"299":1},"2":{"2":1,"108":1,"164":1,"165":1,"167":1,"171":1,"172":1,"219":1,"277":1,"284":2,"297":3,"298":3,"299":2,"300":2,"301":1,"302":1,"303":3,"304":2,"320":1,"326":1,"342":1}}],["при",{"0":{"428":1,"529":1},"1":{"530":1,"531":1,"532":1,"533":1},"2":{"2":1,"22":1,"30":1,"39":2,"40":1,"41":5,"47":1,"58":2,"61":1,"68":1,"76":1,"88":1,"93":2,"96":2,"100":1,"106":4,"107":1,"108":2,"109":1,"113":2,"114":3,"121":1,"125":1,"127":2,"132":1,"134":1,"136":2,"137":1,"138":1,"139":6,"140":1,"141":2,"143":1,"145":1,"147":2,"149":1,"151":3,"157":1,"159":1,"162":1,"165":1,"166":2,"167":1,"169":1,"171":1,"176":1,"177":3,"178":1,"180":1,"181":2,"183":2,"184":1,"189":1,"190":1,"191":1,"192":1,"195":1,"196":3,"200":1,"202":1,"205":3,"207":1,"208":2,"214":2,"215":4,"217":1,"218":4,"219":1,"220":1,"221":1,"222":3,"229":3,"230":1,"231":2,"233":1,"236":4,"237":3,"242":1,"244":2,"245":3,"247":1,"250":1,"251":4,"253":1,"254":1,"256":2,"258":2,"260":1,"263":3,"264":1,"265":1,"269":1,"277":1,"278":4,"279":1,"280":1,"281":1,"283":1,"285":1,"288":2,"290":1,"294":1,"295":1,"300":1,"305":2,"315":2,"325":1,"329":1,"331":3,"334":1,"335":1,"336":2,"337":1,"338":1,"342":2,"347":1,"350":1,"355":3,"356":1,"358":2,"359":1,"364":1,"384":2,"385":1,"386":2,"387":1,"392":1,"393":1,"394":1,"407":2,"408":1,"409":2,"410":1,"411":3,"412":1,"414":1,"415":1,"417":2,"418":2,"425":1,"428":2,"429":1,"430":1,"435":4,"438":1,"440":2,"444":2,"448":1,"450":2,"451":3,"459":1,"460":1,"461":8,"484":2,"489":1,"491":1,"492":1,"495":1,"496":3,"498":1,"500":1,"504":1,"533":1,"534":1,"536":1,"543":1,"544":1}}],["чрезвычайно",{"2":{"315":1,"334":1}}],["чрезмерного",{"2":{"303":1,"438":1}}],["чужих",{"2":{"459":1}}],["чужим",{"2":{"429":1}}],["чужие",{"2":{"334":1}}],["чувствительный",{"2":{"249":1}}],["чувствительна",{"2":{"170":1}}],["чувствует",{"2":{"172":1}}],["чувствовать",{"2":{"171":1,"172":1}}],["чувство",{"2":{"171":1,"181":1}}],["чуть",{"2":{"12":1,"461":1}}],["члену",{"2":{"330":1}}],["членов",{"2":{"143":1}}],["член",{"2":{"143":1,"351":1}}],["члены",{"2":{"113":1,"349":1,"351":1}}],["членами",{"2":{"252":1,"342":1,"351":2}}],["членам",{"2":{"143":1,"349":1,"429":1}}],["члена",{"2":{"93":1,"400":1}}],["чаще",{"2":{"145":1,"150":1,"173":1,"200":1,"242":1,"294":1,"302":1,"304":1,"306":1,"411":1,"430":1}}],["чате",{"2":{"485":1}}],["чата",{"2":{"178":1}}],["чат",{"0":{"82":1},"2":{"82":1}}],["частях",{"2":{"183":1,"294":1,"338":2,"390":1,"395":1}}],["частями",{"2":{"188":1,"275":1,"327":1}}],["частям",{"2":{"26":1}}],["частным",{"2":{"356":1}}],["частных",{"2":{"131":1}}],["частной",{"2":{"128":1}}],["частности",{"2":{"14":1,"168":1,"256":1,"269":1,"340":1,"348":1,"397":1,"420":1,"524":1}}],["части",{"2":{"106":1,"125":1,"165":1,"174":1,"183":1,"184":1,"186":2,"187":1,"194":1,"195":1,"196":1,"214":1,"219":1,"245":1,"263":2,"273":1,"283":1,"294":1,"297":4,"303":1,"316":1,"331":2,"347":1,"383":1,"426":1,"460":1,"500":1}}],["частичной",{"2":{"329":1}}],["частичном",{"2":{"329":1}}],["частичного",{"2":{"269":1}}],["частично",{"2":{"39":1,"194":1,"217":1,"254":1,"449":3,"451":2}}],["часто",{"2":{"50":1,"125":5,"139":2,"143":1,"144":1,"147":2,"151":1,"159":1,"162":1,"172":1,"175":3,"179":1,"186":2,"187":1,"190":1,"191":1,"198":2,"200":2,"201":2,"204":2,"207":1,"208":1,"212":1,"214":1,"216":1,"222":1,"239":1,"242":3,"243":1,"250":1,"258":1,"259":1,"294":1,"300":1,"305":5,"313":1,"315":2,"325":1,"327":1,"329":1,"344":1,"364":1,"405":1,"407":1,"440":1,"448":1,"460":1,"485":2,"524":1}}],["частей",{"2":{"28":1,"303":1,"334":1,"351":1,"384":1,"402":1,"403":1,"533":1}}],["частью",{"2":{"87":1,"118":1,"128":1,"140":1,"146":1,"165":1,"179":1,"196":1,"251":1,"258":1,"277":1,"289":1,"301":1,"304":1,"305":1,"334":1,"336":1,"357":1,"391":1,"426":1,"449":1,"460":1}}],["часть",{"2":{"2":1,"6":1,"109":2,"116":1,"139":1,"142":1,"164":1,"196":1,"221":1,"222":2,"228":1,"245":1,"248":1,"294":1,"301":1,"343":1,"400":1,"407":1,"418":1,"430":1,"444":1,"448":1,"530":2}}],["чёткого",{"2":{"67":1}}],["чтению",{"2":{"174":1}}],["чтения",{"2":{"143":2,"301":1,"355":1,"357":1,"394":1}}],["чтение",{"2":{"58":1}}],["что",{"0":{"63":1,"124":1,"228":1,"305":1,"369":1,"407":1,"408":1,"420":1},"1":{"125":1,"370":1,"371":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"381":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,"61":2,"62":1,"67":1,"81":1,"84":1,"86":2,"87":1,"88":1,"93":2,"96":1,"100":1,"106":9,"107":2,"108":1,"109":2,"113":1,"115":1,"116":3,"122":1,"125":4,"126":2,"127":2,"128":3,"134":1,"135":1,"137":5,"139":14,"140":3,"141":5,"142":6,"143":12,"146":2,"147":2,"148":1,"149":1,"150":2,"151":1,"159":2,"160":3,"162":3,"163":3,"164":4,"165":4,"166":2,"167":1,"169":2,"170":1,"171":1,"172":4,"177":2,"178":3,"179":1,"180":2,"181":4,"183":1,"184":2,"189":2,"190":1,"191":1,"194":2,"195":3,"196":1,"198":1,"199":1,"200":1,"201":2,"202":2,"203":1,"207":1,"208":1,"210":1,"211":3,"213":3,"214":6,"215":7,"216":2,"217":1,"218":6,"219":4,"221":3,"222":9,"223":5,"226":1,"228":6,"229":2,"230":1,"233":7,"236":4,"238":1,"239":5,"241":1,"242":1,"243":1,"244":5,"245":4,"247":1,"248":2,"249":3,"250":4,"251":2,"254":2,"256":5,"258":3,"262":2,"263":5,"264":1,"266":1,"268":2,"271":1,"273":3,"274":1,"278":2,"279":2,"280":3,"281":1,"283":4,"284":1,"285":1,"289":2,"290":3,"293":2,"294":1,"297":2,"298":1,"299":3,"300":1,"301":4,"302":2,"304":3,"305":2,"310":1,"311":1,"312":1,"314":2,"315":2,"316":3,"318":2,"320":1,"321":4,"323":3,"324":1,"325":1,"326":1,"328":1,"329":8,"330":4,"331":10,"333":2,"334":2,"335":2,"336":3,"337":10,"338":1,"339":1,"342":4,"344":3,"345":1,"347":1,"348":1,"349":1,"350":2,"351":2,"355":6,"356":1,"357":1,"358":1,"360":3,"365":1,"370":1,"384":10,"385":2,"386":1,"389":3,"390":2,"391":1,"392":1,"393":1,"395":4,"396":2,"397":2,"398":2,"402":4,"404":2,"405":2,"407":6,"408":2,"409":2,"410":3,"411":8,"412":2,"413":1,"414":2,"415":1,"416":7,"417":2,"418":1,"420":3,"421":2,"425":2,"426":4,"428":4,"429":4,"432":4,"433":1,"435":3,"436":2,"440":1,"443":2,"448":1,"449":16,"450":3,"451":3,"452":2,"453":1,"459":3,"460":4,"461":4,"495":3,"515":1,"527":1,"545":1}}],["чтобы",{"0":{"167":1,"365":1},"2":{"2":1,"7":1,"16":1,"21":1,"55":1,"67":1,"81":1,"94":2,"95":1,"106":1,"117":1,"125":1,"127":1,"129":1,"140":1,"142":2,"143":4,"146":1,"150":1,"151":1,"157":2,"159":2,"161":1,"164":2,"165":1,"170":2,"171":1,"175":1,"177":2,"178":2,"182":1,"184":1,"188":1,"191":2,"194":1,"196":3,"199":1,"201":2,"207":1,"213":1,"214":5,"215":1,"216":1,"217":1,"218":2,"219":3,"220":2,"221":1,"222":4,"223":3,"224":1,"226":2,"227":1,"228":1,"230":1,"231":1,"232":1,"233":1,"235":1,"236":3,"237":3,"239":1,"242":1,"244":1,"245":1,"247":1,"249":1,"251":3,"253":1,"254":2,"255":1,"256":3,"262":1,"263":2,"264":2,"266":1,"268":1,"269":1,"270":1,"271":2,"272":1,"275":3,"277":1,"278":1,"280":1,"281":1,"283":1,"285":1,"287":1,"289":6,"291":1,"292":1,"293":1,"298":1,"304":1,"314":1,"315":3,"317":1,"322":2,"326":3,"327":1,"329":1,"330":1,"331":1,"332":1,"334":2,"336":3,"338":1,"341":1,"342":2,"343":1,"344":2,"348":1,"350":2,"354":1,"355":2,"356":2,"357":1,"380":1,"383":2,"384":4,"388":2,"389":1,"390":1,"391":1,"392":1,"395":1,"396":1,"398":2,"402":3,"404":1,"406":1,"410":2,"411":1,"412":3,"413":2,"414":2,"416":1,"417":2,"419":2,"421":1,"425":3,"428":1,"431":1,"435":1,"438":1,"439":2,"440":1,"443":2,"449":1,"451":2,"460":2,"461":5,"492":1,"495":2,"503":1,"516":1}}],["чипом",{"2":{"250":1}}],["чипы",{"0":{"176":1}}],["читать",{"2":{"460":1}}],["читателя",{"2":{"249":2}}],["читателю",{"2":{"4":1,"265":1}}],["читают",{"2":{"202":1}}],["читаемая",{"2":{"460":1}}],["читаемом",{"2":{"448":1}}],["читаем",{"2":{"411":1}}],["читаемым",{"2":{"157":1,"304":1}}],["читается",{"2":{"219":1}}],["читает",{"2":{"199":1}}],["читабельней",{"2":{"96":1}}],["чисел",{"2":{"125":2,"174":1,"184":1,"337":2,"412":1,"448":1,"524":1}}],["чистого",{"2":{"492":1}}],["чистоте",{"2":{"304":1}}],["чистоту",{"2":{"190":1,"216":1}}],["чистом",{"2":{"251":1,"290":1,"384":1,"385":1,"459":1,"492":1}}],["чисто",{"2":{"228":1}}],["чистым",{"2":{"294":1,"304":1,"342":1}}],["чистые",{"2":{"173":1}}],["чистый",{"2":{"77":1,"298":1,"320":1,"456":1}}],["чистая",{"2":{"149":1,"342":1,"525":1}}],["чистую",{"2":{"124":1}}],["чистим",{"2":{"87":1}}],["числовом",{"2":{"411":1}}],["число",{"2":{"93":1,"102":1,"242":1,"355":1,"409":1,"452":1}}],["числом",{"2":{"47":1,"96":1,"336":1}}],["числа",{"2":{"88":1,"140":1,"149":1,"181":1,"184":1,"242":1,"335":1,"409":1,"533":1}}],["числе",{"2":{"7":1,"13":1,"22":1,"25":1,"116":1,"239":1,"336":1,"496":1}}],["честь",{"2":{"202":1}}],["чекбокс",{"2":{"175":1,"176":1}}],["чекбоксы",{"0":{"175":1},"2":{"175":1}}],["человеческий",{"2":{"297":1}}],["человеческой",{"2":{"125":1}}],["человеку",{"2":{"125":1}}],["человекоемкая",{"2":{"420":1}}],["человекоемкой",{"2":{"294":1}}],["человеком",{"2":{"162":1,"407":1}}],["человеко",{"2":{"88":1,"160":1}}],["человека",{"2":{"76":1}}],["человек",{"2":{"26":1,"296":1,"304":1,"444":1,"460":2}}],["черной",{"2":{"384":1}}],["черные",{"2":{"300":1}}],["черед",{"2":{"334":1}}],["через",{"0":{"489":1},"1":{"490":1},"2":{"2":1,"22":1,"34":2,"35":1,"36":1,"40":1,"41":1,"52":1,"55":1,"58":2,"95":1,"96":1,"105":1,"106":5,"107":1,"109":1,"110":1,"125":1,"126":1,"127":1,"128":2,"129":1,"134":1,"135":1,"165":2,"192":1,"213":1,"238":1,"242":1,"249":2,"251":1,"256":1,"263":3,"264":1,"265":1,"266":1,"274":1,"280":1,"281":1,"289":1,"290":2,"302":1,"304":1,"311":1,"312":1,"314":1,"316":1,"324":2,"326":1,"346":1,"349":1,"350":1,"351":2,"386":1,"388":1,"393":2,"394":1,"397":1,"409":1,"422":1,"423":1,"435":1,"437":1,"438":1,"440":1,"443":1,"444":1,"448":2,"449":1,"459":1,"492":1,"497":1,"503":1,"535":1,"545":2}}],["черты",{"2":{"238":1,"298":1}}],["чертой",{"2":{"126":1}}],["чертежа",{"2":{"68":1}}],["чего",{"0":{"64":1},"2":{"40":1,"106":1,"172":1,"184":1,"203":1,"207":1,"230":1,"245":1,"448":1,"449":1,"451":1,"524":1}}],["четкая",{"2":{"438":1}}],["четких",{"2":{"188":1}}],["четкий",{"2":{"174":1}}],["четкую",{"2":{"121":1}}],["четкого",{"2":{"384":1}}],["четкое",{"2":{"138":1,"215":1}}],["четкость",{"2":{"109":1}}],["четко",{"2":{"9":1,"142":1,"163":1,"164":2,"245":1,"264":1,"271":1,"300":1,"350":1}}],["четырех",{"2":{"28":1,"125":1}}],["четыре",{"2":{"23":1,"96":1,"106":1,"125":1,"497":1}}],["чему",{"2":{"191":1,"280":1,"292":1,"347":1}}],["чем",{"2":{"2":1,"47":1,"96":1,"105":1,"137":1,"139":1,"143":1,"150":1,"159":1,"160":1,"163":1,"169":1,"171":3,"192":1,"205":1,"214":1,"215":1,"223":1,"226":1,"228":2,"234":1,"235":1,"236":1,"237":1,"239":1,"245":1,"250":1,"251":1,"256":3,"263":1,"268":1,"273":1,"278":1,"281":1,"292":1,"303":2,"305":1,"321":1,"336":2,"337":1,"339":1,"352":1,"360":1,"384":4,"396":1,"398":1,"400":1,"407":2,"408":1,"420":1,"426":1,"428":1,"432":1,"439":1,"443":2,"448":1,"449":1,"451":1,"456":1,"459":1}}],["кб",{"2":{"528":1}}],["киты",{"2":{"495":1}}],["кстати",{"2":{"319":1}}],["квадрат",{"2":{"297":1}}],["квадратов",{"2":{"189":1}}],["кебаба",{"2":{"189":1}}],["кем",{"2":{"139":1}}],["кэша",{"2":{"543":1}}],["кэширующий",{"2":{"449":1}}],["кэшированный",{"2":{"264":1}}],["кэширования",{"2":{"256":1,"263":1,"264":1,"435":1,"543":1}}],["кэшированием",{"2":{"263":1}}],["кэширование",{"2":{"100":1,"228":1,"461":1,"543":1}}],["кэшировать",{"2":{"256":1,"263":1,"264":2}}],["кэшу",{"2":{"264":1}}],["кэш",{"2":{"264":8,"329":1,"543":1}}],["кэшем",{"2":{"533":1}}],["кэше",{"2":{"151":1,"264":1}}],["книжка",{"2":{"460":1}}],["книга",{"0":{"364":1,"369":1},"1":{"370":1,"371":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"381":1},"2":{"251":1,"363":2,"364":1,"365":1,"366":1,"460":2,"485":1}}],["книгами",{"2":{"165":1}}],["книгу",{"0":{"366":1},"2":{"171":1}}],["книг",{"2":{"165":1}}],["книги",{"0":{"362":1,"365":1},"2":{"123":1,"134":1,"141":1,"144":1,"161":1,"162":1,"165":1,"191":1,"194":1,"214":1,"216":1,"218":1,"242":1,"244":1,"248":1,"251":2,"265":1,"269":1,"271":1,"289":1,"290":1,"294":2,"301":1,"305":2,"338":2,"365":1,"367":1,"368":2,"383":1,"406":1,"429":1,"460":2,"464":1}}],["книге",{"0":{"152":1},"1":{"153":1,"154":1,"155":1,"156":1,"157":1},"2":{"115":1,"136":1,"138":3,"139":1,"143":2,"150":1,"152":2,"158":1,"161":1,"213":2,"218":1,"236":1,"281":1,"283":2,"284":1,"300":1,"302":1,"306":1,"324":1,"326":1,"331":2,"341":1,"365":3}}],["кнопок",{"2":{"164":1,"207":1,"208":2,"289":1}}],["кнопки",{"2":{"164":2,"169":1,"175":1,"177":1,"208":2,"249":1,"289":1}}],["кнопку",{"2":{"151":1,"192":1,"214":1,"222":1,"263":2,"264":1,"342":1,"393":1,"416":3,"452":1}}],["кнопкам",{"2":{"452":1}}],["кнопками",{"2":{"289":1}}],["кнопка",{"2":{"150":1,"163":1,"169":2,"206":1,"223":1,"263":4}}],["кнопке",{"2":{"150":1,"187":1,"343":1}}],["кнопкой",{"2":{"142":1,"261":1,"347":1}}],["кучу",{"2":{"451":1}}],["куча",{"2":{"449":1}}],["кучи",{"2":{"448":1,"524":1}}],["кулер",{"2":{"444":1}}],["кулисами",{"2":{"330":1}}],["куда",{"2":{"165":1,"245":1,"246":1,"290":1,"444":1,"451":1}}],["купить",{"0":{"366":1},"2":{"135":2,"439":1}}],["куку",{"2":{"106":1}}],["курсы",{"2":{"160":1,"460":1}}],["курсор",{"2":{"83":1,"169":1}}],["курсов",{"2":{"63":1,"460":1}}],["курс",{"2":{"2":1,"452":1,"460":1}}],["кто",{"2":{"39":1,"67":1,"162":1,"298":1,"329":1,"420":1,"450":1,"451":1,"461":1}}],["креативности",{"2":{"192":1,"420":1}}],["креативность",{"2":{"172":1}}],["крутятся",{"2":{"444":1}}],["крутится",{"2":{"181":1}}],["кругозор",{"2":{"460":1}}],["круговой",{"2":{"290":2}}],["круга",{"2":{"209":1,"495":1}}],["круглой",{"2":{"176":1}}],["кружок",{"2":{"178":1,"181":1}}],["крупнейший",{"2":{"251":1}}],["крупные",{"2":{"198":1}}],["крупных",{"2":{"107":1,"212":1,"407":1}}],["крупномасштабного",{"2":{"377":1}}],["крупного",{"2":{"140":1,"178":1}}],["крупной",{"2":{"128":1}}],["криптовалюты",{"2":{"251":3}}],["криптографическими",{"2":{"251":1}}],["криптографические",{"2":{"251":1}}],["криптографическую",{"2":{"245":1}}],["криптографии",{"2":{"250":1}}],["криптография",{"2":{"106":1}}],["критериям",{"2":{"263":1,"266":1}}],["критериями",{"2":{"39":1}}],["критике",{"2":{"223":1}}],["критика",{"0":{"223":1,"291":1},"2":{"223":1}}],["критически",{"2":{"224":1,"290":1}}],["критической",{"2":{"179":1}}],["критичных",{"2":{"106":1}}],["кроулером",{"2":{"461":1}}],["кровеносной",{"2":{"297":1}}],["кровлю",{"2":{"26":1}}],["кроссплатформенными",{"2":{"213":1}}],["крошкам",{"2":{"187":1}}],["крошки",{"0":{"187":1},"2":{"187":2}}],["кроче",{"2":{"165":1}}],["кроме",{"2":{"68":1,"93":1,"109":1,"143":3,"150":1,"183":1,"191":1,"200":1,"214":1,"219":1,"238":1,"243":1,"256":3,"261":1,"263":1,"292":1,"303":1,"304":1,"320":1,"331":1,"382":1,"387":1,"393":1,"402":1,"422":1,"435":3,"436":1,"443":1,"449":2,"451":1,"453":1,"460":1,"461":2}}],["кроется",{"2":{"67":1}}],["крайний",{"2":{"285":1}}],["крайние",{"2":{"283":1,"398":1}}],["крайних",{"2":{"269":1,"326":2,"408":1}}],["крайними",{"2":{"219":1,"242":1}}],["крайней",{"2":{"212":1,"318":1,"330":1,"335":1,"365":1}}],["красное",{"2":{"410":1}}],["красным",{"2":{"266":1,"411":1}}],["красивую",{"2":{"459":1}}],["красиво",{"2":{"402":1,"461":1}}],["красивые",{"2":{"61":1}}],["красивый",{"2":{"26":1}}],["красе",{"2":{"245":1}}],["красочный",{"2":{"196":1}}],["края",{"2":{"169":1}}],["кражей",{"2":{"106":1}}],["краткий",{"0":{"306":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,"334":1,"335":1,"336":1,"337":1},"2":{"176":1,"331":1,"354":1}}],["кратким",{"2":{"110":1,"173":1,"261":1}}],["краткосрочной",{"2":{"305":1}}],["краткости",{"2":{"248":1,"273":1,"280":1,"289":2}}],["кратковременной",{"2":{"171":1}}],["кратковременную",{"2":{"171":1}}],["кратко",{"2":{"140":1,"159":1,"345":1}}],["краткого",{"2":{"125":1}}],["краткое",{"0":{"494":1},"2":{"103":1,"220":1,"312":1}}],["краткая",{"0":{"223":1},"2":{"47":1}}],["клонирования",{"2":{"421":1}}],["клонируемого",{"2":{"395":1}}],["клонируем",{"2":{"99":1,"395":1}}],["клон",{"2":{"395":1}}],["клетки",{"2":{"297":1}}],["класть",{"2":{"440":1,"449":1}}],["классе",{"2":{"320":1}}],["классом",{"2":{"221":1,"387":1,"544":1}}],["классов",{"0":{"155":1},"2":{"22":1,"139":2,"151":1,"216":1,"217":1,"284":1,"290":1,"298":1,"300":1,"307":1,"414":1,"449":1,"452":1,"459":1,"496":1}}],["классы",{"2":{"216":1,"217":1,"218":1,"222":1,"283":2,"289":1,"331":1,"449":1}}],["класс",{"2":{"182":1,"222":1,"299":1,"302":1,"315":2,"316":2,"318":1,"321":2,"440":1}}],["классифицируются",{"2":{"306":1}}],["классификаций",{"2":{"310":1}}],["классификация",{"2":{"258":1,"259":1,"260":1,"261":1}}],["классификаторов",{"2":{"176":1}}],["классической",{"2":{"171":1}}],["классический",{"2":{"143":1,"206":1,"284":1,"460":1}}],["классически",{"2":{"66":1}}],["классических",{"2":{"47":1}}],["классическим",{"2":{"6":1}}],["классу",{"2":{"143":1,"321":1}}],["классами",{"2":{"348":1,"452":1}}],["классах",{"2":{"302":1}}],["класса",{"2":{"23":1,"290":1,"315":3,"316":1,"324":1,"327":1,"395":1,"449":1,"497":1}}],["кладем",{"2":{"326":1}}],["кладет",{"2":{"106":1}}],["кладется",{"2":{"93":1}}],["клавиатуры",{"2":{"444":1}}],["клавиатуру",{"2":{"444":1}}],["клавиатурой",{"2":{"183":1}}],["клавиатура",{"2":{"171":1}}],["клавишу",{"2":{"220":1,"222":1}}],["клавиши",{"2":{"175":1,"214":1}}],["клавиш",{"2":{"81":1,"171":1,"214":1}}],["клавишей",{"2":{"81":1}}],["ключу",{"2":{"281":1,"448":1,"524":1}}],["ключ",{"2":{"58":2,"236":1,"245":4,"330":1,"394":1,"435":1}}],["ключом",{"2":{"58":1,"281":1,"330":1,"355":1}}],["ключей",{"2":{"251":2,"279":1}}],["ключевая",{"2":{"250":1,"374":1}}],["ключевую",{"2":{"228":1}}],["ключевое",{"2":{"143":2,"337":1,"351":1}}],["ключевой",{"2":{"139":1}}],["ключевые",{"2":{"226":1,"370":1,"390":1,"408":1}}],["ключевыми",{"2":{"376":1}}],["ключевым",{"2":{"128":1,"329":1,"337":1,"342":1,"389":1}}],["ключевых",{"2":{"63":1,"124":1,"228":1,"355":1,"407":1,"408":1}}],["ключе",{"2":{"57":1}}],["ключа",{"2":{"57":1,"58":1,"245":1,"281":1}}],["климов",{"2":{"460":1}}],["клише",{"2":{"302":1}}],["клиентской",{"2":{"391":1}}],["клиентское",{"2":{"390":1}}],["клиентского",{"2":{"331":1}}],["клиентском",{"2":{"328":1}}],["клиенту",{"2":{"244":1,"327":1,"392":1,"399":1,"402":1}}],["клиенты",{"2":{"228":1,"327":1}}],["клиентов",{"2":{"162":1,"327":2}}],["клиентом",{"2":{"135":1,"330":1,"334":1,"402":1,"461":1}}],["клиентами",{"2":{"391":1}}],["клиентам",{"2":{"108":1,"430":1}}],["клиента",{"2":{"108":3,"246":1,"329":3,"334":1,"388":2,"391":1,"461":1,"500":1,"543":2}}],["клиент",{"0":{"6":1},"2":{"9":1,"67":1,"109":2,"245":1,"329":2,"331":1,"392":1,"444":2}}],["клику",{"2":{"506":1}}],["клике",{"2":{"93":1}}],["клик",{"2":{"3":1,"222":1}}],["казаться",{"2":{"461":1}}],["казалось",{"2":{"181":1}}],["капот",{"2":{"460":1}}],["капотом",{"2":{"110":1,"265":1,"411":1,"451":1}}],["калькулятором",{"2":{"409":1}}],["калькулятор",{"2":{"409":1}}],["кадров",{"2":{"384":2}}],["кадрами",{"2":{"384":1}}],["каркас",{"2":{"492":1,"494":1,"495":1,"496":1,"533":1}}],["каркаса",{"2":{"212":1,"214":2,"224":1,"496":2}}],["кардинально",{"2":{"403":1}}],["кардинальность",{"2":{"325":1}}],["карьере",{"2":{"368":1}}],["каруселей",{"2":{"180":1}}],["карусели",{"2":{"180":2}}],["каруселью",{"2":{"196":1}}],["карусель",{"0":{"180":1,"447":1},"2":{"180":3}}],["карты",{"2":{"250":1}}],["карточкой",{"2":{"371":1}}],["карточка",{"2":{"165":1}}],["карточках",{"2":{"103":1}}],["карточками",{"2":{"93":1}}],["карточки",{"2":{"102":3,"165":2,"166":1,"290":1}}],["карточке",{"0":{"93":1},"2":{"93":1}}],["картинками",{"2":{"461":1}}],["картинка",{"2":{"442":1}}],["картинки",{"2":{"440":6,"461":2}}],["картинке",{"2":{"145":1,"461":1}}],["картинок",{"2":{"103":1,"442":1}}],["картины",{"2":{"26":1,"297":1}}],["картину",{"2":{"26":1}}],["канал",{"0":{"486":1}}],["канала",{"0":{"104":1},"1":{"105":1},"2":{"236":1}}],["кандидатов",{"2":{"451":1}}],["кануть",{"2":{"162":1}}],["камне",{"2":{"139":1}}],["каскадно",{"2":{"250":1}}],["каскадные",{"2":{"138":1}}],["касались",{"2":{"340":1}}],["касающиеся",{"2":{"431":1}}],["касающимися",{"2":{"281":1}}],["касаются",{"2":{"67":1,"307":1,"308":1}}],["касается",{"2":{"236":1,"396":1,"449":1}}],["кастомные",{"2":{"459":1}}],["кастомных",{"2":{"452":1}}],["кастомными",{"2":{"443":1}}],["кастомный",{"2":{"439":1,"516":2}}],["кастомную",{"2":{"107":1}}],["кастомизированный",{"2":{"91":1}}],["кастомизировать",{"2":{"62":1}}],["кастомизацию",{"2":{"90":1,"96":1}}],["кастомизация",{"0":{"85":1},"1":{"86":1,"87":1,"88":1,"89":1,"90":1,"91":1},"2":{"492":1,"496":1,"545":1}}],["кастомизации",{"2":{"76":1,"492":1,"494":1,"533":1}}],["качество",{"2":{"68":1,"403":1,"459":1,"484":2}}],["качества",{"2":{"64":1,"68":1,"405":1,"407":1,"442":1,"460":1}}],["качественные",{"2":{"460":2}}],["качественный",{"2":{"444":1}}],["качественно",{"2":{"460":1}}],["качественного",{"2":{"405":1}}],["качественное",{"2":{"162":1}}],["качестве",{"2":{"17":1,"39":1,"113":1,"114":1,"118":1,"123":1,"125":1,"140":1,"143":1,"164":1,"184":1,"194":1,"213":1,"214":3,"220":1,"221":1,"222":1,"223":1,"230":1,"233":3,"236":2,"237":1,"238":1,"242":1,"247":1,"248":1,"250":1,"251":2,"252":1,"256":1,"268":1,"278":2,"279":3,"283":1,"284":1,"286":1,"297":1,"299":1,"301":2,"311":1,"316":1,"318":1,"322":3,"323":1,"326":2,"330":2,"335":1,"336":1,"343":1,"351":2,"355":1,"372":1,"385":1,"386":1,"388":3,"390":1,"391":1,"392":1,"393":1,"395":1,"396":2,"397":1,"400":2,"402":1,"409":2,"410":1,"411":2,"415":2,"431":1,"437":1,"449":1,"461":1,"485":1,"492":2,"500":1,"516":1}}],["кабинетом",{"2":{"58":1}}],["кабинета",{"2":{"36":1,"436":1}}],["кабинет",{"2":{"29":1,"33":1,"79":1}}],["катастрофы",{"2":{"172":1}}],["каталоги",{"2":{"230":1,"426":1}}],["каталогов",{"0":{"117":1},"2":{"110":1,"117":1,"126":3,"214":1,"215":3,"230":1,"425":1}}],["каталогом",{"2":{"11":1,"29":1,"89":1}}],["каталогу",{"2":{"86":1}}],["каталогах",{"2":{"287":1}}],["каталога",{"2":{"16":1,"79":1,"436":1}}],["каталоге",{"2":{"11":1,"102":1,"128":1,"129":1,"131":1,"214":2,"217":1,"221":1,"230":1,"232":1,"287":1,"350":1,"391":1,"414":1,"415":1,"425":1}}],["каталог",{"2":{"11":3,"33":2,"86":2,"131":1,"132":1,"214":3,"215":2,"230":1,"264":1,"410":1,"425":1}}],["категорией",{"2":{"449":1}}],["категорически",{"2":{"284":1}}],["категоризации",{"2":{"191":1}}],["категорию",{"2":{"22":1,"43":1,"88":1,"181":1}}],["категорий",{"2":{"3":2,"4":1,"11":3,"22":1,"38":1,"79":1,"90":1,"176":1}}],["категории",{"2":{"3":2,"4":1,"7":1,"11":2,"16":2,"22":1,"30":1,"31":1,"47":1,"88":1,"102":3,"128":1,"198":1,"228":1,"243":1,"266":1}}],["категориям",{"2":{"86":1,"128":1,"185":1,"301":1}}],["категориями",{"2":{"43":1,"89":1,"452":1}}],["категориях",{"2":{"43":1,"267":1}}],["категория",{"0":{"16":1,"101":1},"1":{"102":1,"103":1},"2":{"3":1,"16":1,"93":1,"266":1}}],["каждым",{"2":{"214":1,"223":1,"245":1,"251":1,"392":1,"461":1}}],["каждый",{"2":{"9":2,"41":1,"106":2,"110":1,"114":2,"124":1,"125":2,"130":1,"135":1,"139":1,"143":2,"151":1,"163":2,"173":1,"183":1,"184":1,"215":1,"222":1,"228":1,"233":1,"236":1,"243":1,"245":1,"250":1,"251":1,"259":2,"261":1,"266":1,"290":1,"297":1,"299":1,"302":1,"315":1,"326":2,"329":1,"331":2,"342":1,"343":1,"345":2,"346":1,"347":2,"350":3,"351":1,"354":1,"355":3,"384":4,"392":1,"397":1,"398":1,"410":1,"420":1,"436":1,"443":1,"449":3,"451":1,"500":1}}],["каждая",{"2":{"134":1,"148":1,"164":1,"165":1,"187":1,"221":1,"245":2,"263":1,"264":1,"284":1,"289":1,"331":1,"337":2,"402":1,"411":1,"420":1,"449":1}}],["каждую",{"2":{"66":1,"142":1,"236":1,"321":1,"322":1,"326":1,"340":1,"411":1}}],["каждой",{"2":{"83":1,"93":1,"128":1,"131":1,"135":1,"162":1,"165":1,"183":1,"187":1,"212":1,"220":1,"221":1,"222":1,"245":1,"251":1,"256":1,"265":1,"266":1,"331":1,"337":1,"391":1,"395":1,"396":1,"405":1,"411":2,"426":1}}],["каждому",{"2":{"48":1,"106":1,"212":1,"233":1,"236":1,"238":1,"243":1,"283":2,"343":1,"435":1}}],["каждом",{"2":{"41":1,"106":1,"139":1,"175":1,"216":1,"231":1,"239":1,"245":1,"290":1,"294":2,"295":1,"302":1,"349":1,"355":2,"384":1,"398":1,"436":2,"451":1}}],["каждого",{"2":{"13":1,"22":1,"78":1,"79":1,"110":1,"131":1,"135":3,"139":1,"142":1,"151":1,"160":1,"165":1,"183":1,"184":1,"191":1,"196":1,"219":1,"222":3,"236":2,"239":1,"240":1,"261":1,"264":1,"265":1,"273":3,"277":2,"290":1,"315":1,"343":1,"347":1,"355":3,"359":1,"363":1,"397":1,"410":1,"417":1,"421":1,"435":2,"443":1,"497":1,"543":1}}],["каждое",{"2":{"3":1,"68":1,"143":1,"145":1,"155":1,"290":1,"325":1,"329":1,"355":1,"390":1,"397":1,"416":3}}],["кажется",{"2":{"3":1,"143":1,"200":1,"349":1,"384":1}}],["какая",{"2":{"360":1,"418":2,"444":1}}],["какими",{"2":{"293":1}}],["каким",{"2":{"181":1,"209":1,"268":1,"328":2,"414":1}}],["каких",{"2":{"139":1,"160":1,"210":1,"230":1,"336":1,"351":1,"404":1,"461":1,"492":1,"525":1}}],["какие",{"2":{"4":1,"16":2,"22":1,"67":2,"137":3,"138":1,"141":1,"159":1,"160":1,"234":1,"245":1,"254":2,"264":1,"268":1,"271":3,"273":1,"274":2,"275":2,"285":1,"293":1,"325":1,"327":1,"339":1,"360":1,"404":2,"438":1,"446":1,"448":1,"451":1,"460":2,"489":1}}],["какую",{"2":{"23":1,"140":1,"211":1,"273":1,"384":1,"432":1,"495":1}}],["каковы",{"0":{"295":1},"2":{"160":1,"225":2,"253":3,"268":2,"404":1}}],["каком",{"2":{"107":1,"126":1,"181":1}}],["какого",{"2":{"60":1,"177":1,"189":1,"213":1,"384":1}}],["какое",{"2":{"12":1,"138":1,"349":1}}],["какой",{"2":{"3":1,"23":1,"114":1,"139":1,"140":1,"181":1,"219":1,"250":1,"272":1,"278":1,"290":1,"297":1,"320":1,"321":1,"330":1,"425":2,"442":1,"444":1,"453":1,"454":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":1,"67":5,"68":1,"78":1,"93":1,"94":1,"96":1,"102":1,"103":1,"106":5,"107":3,"108":1,"109":4,"110":1,"112":2,"113":1,"115":3,"118":1,"119":1,"125":4,"126":1,"128":1,"131":1,"132":1,"133":1,"134":2,"136":1,"138":1,"139":8,"140":2,"141":6,"142":4,"143":13,"146":1,"147":2,"149":2,"151":1,"157":1,"160":3,"162":7,"163":4,"165":1,"166":2,"167":1,"168":2,"169":2,"170":1,"171":2,"174":1,"176":1,"177":1,"180":4,"181":1,"184":4,"185":1,"189":1,"191":4,"192":1,"194":3,"195":4,"196":2,"197":1,"198":1,"199":1,"200":3,"202":1,"207":1,"209":1,"212":2,"213":1,"214":5,"215":4,"216":6,"217":1,"218":5,"219":1,"220":1,"221":1,"222":9,"223":5,"224":2,"225":1,"226":4,"228":8,"229":1,"230":3,"231":3,"233":9,"235":1,"236":8,"237":1,"238":2,"239":2,"242":4,"243":2,"244":2,"245":10,"248":2,"249":2,"250":5,"251":8,"252":3,"253":2,"254":4,"256":5,"257":2,"258":2,"259":2,"260":1,"261":2,"262":2,"263":6,"264":5,"265":1,"266":1,"267":2,"269":3,"270":1,"271":3,"272":3,"273":2,"274":2,"276":1,"277":1,"278":4,"279":4,"280":3,"281":5,"282":1,"283":5,"284":1,"285":1,"288":1,"289":4,"290":9,"291":1,"292":1,"293":3,"294":2,"295":1,"297":3,"298":2,"299":3,"300":2,"301":4,"302":3,"304":2,"305":2,"315":1,"318":1,"319":1,"320":1,"321":2,"322":2,"323":2,"325":1,"326":3,"327":1,"329":5,"330":6,"331":3,"332":1,"334":1,"335":2,"336":6,"337":6,"338":2,"339":1,"340":2,"341":1,"342":4,"343":2,"344":1,"347":1,"348":3,"349":9,"350":7,"351":3,"352":2,"354":5,"355":3,"356":1,"357":3,"358":3,"360":2,"363":1,"364":1,"365":4,"372":1,"376":1,"378":1,"379":2,"382":4,"384":9,"386":4,"388":6,"390":2,"391":5,"392":2,"393":4,"395":2,"396":2,"397":5,"398":2,"400":3,"402":3,"403":1,"404":2,"405":2,"407":6,"408":1,"409":2,"410":1,"411":4,"412":1,"413":3,"415":1,"416":8,"420":3,"421":1,"425":1,"426":4,"428":2,"429":4,"430":1,"431":2,"435":2,"436":3,"438":2,"440":3,"442":1,"443":3,"444":3,"448":5,"449":8,"450":1,"451":1,"458":2,"459":4,"460":6,"461":10,"465":1,"467":1,"485":2,"495":2,"496":2,"497":1,"498":1,"522":1,"533":1}}],["коврике",{"2":{"461":1}}],["кого",{"0":{"364":1},"2":{"304":3,"329":1}}],["когда",{"0":{"312":1},"2":{"3":1,"30":1,"41":1,"61":1,"93":1,"106":4,"107":1,"108":1,"114":4,"117":1,"125":1,"128":1,"134":1,"136":1,"138":1,"139":7,"140":1,"143":3,"146":1,"147":1,"149":2,"150":1,"151":4,"165":1,"171":1,"172":1,"173":1,"174":1,"175":4,"177":1,"183":2,"184":3,"191":1,"192":1,"195":1,"196":1,"206":1,"215":2,"219":1,"222":2,"225":2,"228":3,"233":1,"235":1,"236":2,"242":1,"243":1,"248":1,"249":2,"253":1,"256":1,"259":1,"261":1,"262":1,"263":6,"269":1,"272":1,"274":2,"275":1,"280":4,"281":1,"282":1,"285":2,"288":1,"289":1,"291":1,"294":1,"298":2,"299":3,"301":4,"304":2,"312":4,"317":1,"320":1,"325":1,"326":1,"330":4,"331":1,"335":1,"336":2,"337":1,"338":2,"340":1,"342":1,"347":1,"349":2,"352":2,"354":1,"355":1,"357":1,"360":1,"384":5,"385":1,"390":1,"392":1,"393":1,"395":2,"398":1,"400":1,"407":1,"408":1,"412":1,"416":1,"417":1,"420":2,"425":1,"429":1,"432":1,"436":1,"438":1,"440":1,"448":2,"449":3,"459":1,"460":1,"461":3}}],["кошелек",{"2":{"251":3}}],["кошельки",{"2":{"251":2}}],["кошелька",{"2":{"251":6}}],["кошельками",{"2":{"251":1}}],["кошельках",{"2":{"251":1}}],["кошельков",{"2":{"251":2}}],["кошельком",{"2":{"251":2}}],["кошмар",{"2":{"23":1}}],["коем",{"2":{"244":1,"310":1,"355":1}}],["координирует",{"2":{"273":1}}],["координировать",{"2":{"139":1}}],["координация",{"2":{"139":1}}],["координации",{"2":{"139":1}}],["ко",{"2":{"128":2,"170":1,"215":1,"295":1,"304":1,"350":1,"413":1,"449":1,"452":1}}],["косой",{"2":{"126":1,"238":1}}],["коридоре",{"2":{"461":1}}],["коричневый",{"2":{"164":1}}],["корпоративном",{"2":{"421":1}}],["корпоративных",{"2":{"125":1,"160":1}}],["корня",{"2":{"238":1}}],["корневую",{"2":{"117":1}}],["корневом",{"2":{"129":1,"281":2,"350":1,"386":1,"437":2}}],["корневому",{"2":{"112":1}}],["корневого",{"2":{"113":1,"119":1,"272":1}}],["корневой",{"2":{"113":1,"126":1,"215":1,"281":1,"410":1,"425":2}}],["корне",{"2":{"111":1,"126":1,"130":1,"132":1,"215":1,"217":1,"258":1,"264":1,"418":1}}],["корень",{"2":{"215":1,"264":1,"290":1,"435":1}}],["коренится",{"2":{"163":1}}],["коробкой",{"2":{"460":1}}],["коробки",{"2":{"216":1,"265":1,"410":1,"414":1}}],["короче",{"2":{"180":1,"392":1}}],["коротким",{"0":{"303":1}}],["короткий",{"2":{"176":1,"179":1,"219":1,"392":1,"415":1,"460":1}}],["короткое",{"2":{"179":1,"259":1}}],["короткоживущий",{"2":{"106":1}}],["корректировку",{"2":{"483":1}}],["корректировки",{"2":{"66":1}}],["корректно",{"2":{"411":1}}],["корректном",{"2":{"215":1}}],["корректный",{"2":{"132":1,"320":1}}],["корзину",{"0":{"200":1},"2":{"200":3}}],["корзины",{"2":{"12":1,"89":1,"197":1,"204":1,"207":1}}],["корзина",{"2":{"4":1,"29":1,"33":1,"79":1}}],["коллеги",{"2":{"460":1}}],["коллекцию",{"2":{"396":2}}],["коллекций",{"2":{"148":1,"218":1,"396":1}}],["коллекция",{"2":{"139":1,"216":1,"284":1}}],["коллекции",{"2":{"16":1,"316":1,"396":1}}],["коллизий",{"2":{"281":1}}],["коллизия",{"2":{"277":1}}],["коллизии",{"2":{"184":1}}],["коллоцированный",{"2":{"128":1}}],["количеством",{"2":{"121":1,"128":1,"228":1,"251":1,"448":1,"450":1}}],["количество",{"2":{"114":1,"137":1,"138":1,"163":1,"164":1,"170":2,"171":1,"184":1,"191":2,"202":1,"216":1,"219":1,"222":2,"239":1,"244":1,"245":1,"248":2,"252":1,"272":1,"278":1,"303":1,"326":1,"355":2,"384":1,"411":2,"416":1}}],["количества",{"2":{"106":1,"170":1,"248":1,"302":1}}],["колоночным",{"2":{"456":1}}],["колоночной",{"2":{"194":1,"459":1}}],["колонок",{"2":{"47":1,"102":1,"194":1}}],["колонки",{"2":{"194":2,"272":1}}],["колонка",{"2":{"102":1}}],["колонками",{"2":{"102":1}}],["колонтитуле",{"2":{"196":1}}],["колонтитул",{"2":{"166":1,"289":1}}],["комфорту",{"2":{"461":1}}],["комфортней",{"2":{"444":1}}],["комфортное",{"2":{"272":1}}],["комфортно",{"2":{"50":1,"68":1,"436":1,"449":1}}],["комиксах",{"2":{"177":1}}],["комбинацию",{"2":{"496":1}}],["комбинация",{"2":{"128":1,"355":1}}],["комбинаций",{"2":{"81":1}}],["коммита",{"2":{"426":1}}],["коммит",{"2":{"425":1,"428":1,"429":1,"430":1}}],["коммиты",{"2":{"134":1}}],["коммуникационного",{"2":{"302":1,"390":1}}],["коммуникация",{"2":{"384":1}}],["коммуникациями",{"2":{"256":1}}],["коммуникациях",{"2":{"243":1}}],["коммуникации",{"2":{"228":1,"244":1,"250":1,"337":1,"382":1}}],["коммуникаций",{"2":{"109":1,"245":1,"382":1}}],["комментирование",{"2":{"484":1}}],["комментарию",{"2":{"322":1}}],["комментарием",{"2":{"290":1}}],["комментариев",{"2":{"187":1,"301":1}}],["комментарии",{"2":{"264":1,"304":2}}],["комментариями",{"2":{"106":1,"492":1}}],["комментариях",{"2":{"63":1}}],["комментарий",{"2":{"81":1,"416":1}}],["коммерческий",{"2":{"460":1}}],["коммерческих",{"2":{"125":1,"435":1}}],["коммерческого",{"2":{"135":1}}],["компетентные",{"2":{"460":1}}],["компилирует",{"2":{"430":1}}],["компиляции",{"2":{"429":1,"430":1}}],["компиляция",{"2":{"140":1}}],["комплект",{"2":{"424":1}}],["комплексное",{"2":{"106":1}}],["компаниях",{"2":{"407":1,"460":1}}],["компания",{"2":{"202":1}}],["компаниям",{"2":{"202":1}}],["компанией",{"2":{"167":1}}],["компании",{"2":{"106":1,"162":2,"195":1,"198":1,"199":1,"201":1,"202":1,"204":1}}],["компромиссов",{"0":{"275":1},"2":{"275":1}}],["компромиссы",{"2":{"139":1,"228":2,"271":1,"363":1,"417":1,"420":1}}],["компромисс",{"2":{"139":2,"218":1}}],["компромиссами",{"2":{"139":1}}],["компьютере",{"2":{"365":1,"443":1,"461":1}}],["компьютера",{"2":{"444":1}}],["компьютерам",{"2":{"303":1}}],["компьютерах",{"2":{"256":1,"263":1}}],["компьютером",{"2":{"162":1,"302":1}}],["компьютеров",{"2":{"125":3,"186":1,"194":1,"251":1,"365":1}}],["компьютеры",{"2":{"160":1}}],["компьютерного",{"2":{"160":1}}],["компьютерное",{"2":{"160":1}}],["компьютеру",{"2":{"125":1}}],["компьютер",{"2":{"125":1,"181":1,"213":1}}],["композитных",{"2":{"340":1,"349":1}}],["композитные",{"2":{"298":1}}],["композиции",{"2":{"298":1}}],["композицию",{"2":{"269":1}}],["композиция",{"0":{"269":1,"298":1,"373":1},"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},"2":{"115":1,"141":1,"142":2,"149":1,"167":1,"220":1,"229":1,"294":1,"298":1,"299":1,"301":1,"323":1,"331":1,"332":1,"344":1}}],["композаблом",{"2":{"449":1}}],["композабле",{"2":{"94":1,"449":1}}],["композабл",{"0":{"94":1,"284":1},"1":{"285":1},"2":{"284":9,"436":1,"448":1,"449":4,"452":1}}],["композаблы",{"2":{"86":1,"452":1}}],["компонуемый",{"2":{"301":1}}],["компоновкой",{"2":{"193":1}}],["компоновки",{"2":{"117":1,"253":1}}],["компоновка",{"2":{"26":1}}],["компонентно",{"2":{"451":1}}],["компонентного",{"2":{"394":1}}],["компонентом",{"2":{"229":1,"233":1,"273":1,"274":1,"283":1,"288":1,"289":1,"290":1,"342":1,"355":1,"415":1,"416":2,"449":2}}],["компонентов",{"0":{"112":1,"142":1,"155":1,"269":1,"271":1,"342":1,"373":1},"1":{"270":1,"271":1,"272":2,"273":2,"274":2,"275":2,"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,"343":1,"344":1},"2":{"110":1,"112":2,"113":1,"119":1,"136":1,"138":1,"140":1,"141":2,"142":2,"143":2,"150":2,"151":5,"158":1,"167":1,"216":1,"219":2,"220":2,"223":2,"224":1,"229":1,"239":1,"265":1,"269":4,"271":1,"272":5,"273":1,"275":2,"277":2,"278":1,"281":2,"282":1,"285":1,"286":1,"290":1,"293":1,"298":2,"299":4,"300":1,"301":1,"340":1,"342":1,"344":2,"345":1,"347":2,"348":2,"349":1,"356":1,"373":1,"378":1,"391":1,"403":1,"405":1,"408":1,"409":1,"414":2,"416":1,"432":1,"445":1,"449":1,"533":1}}],["компоненту",{"2":{"111":1,"143":1,"223":1,"233":1,"240":1,"273":1,"280":1,"283":1,"285":1,"289":1,"333":1,"343":1,"415":1}}],["компоненте",{"2":{"41":1,"105":1,"115":1,"182":1,"220":1,"222":1,"223":1,"236":2,"238":3,"239":1,"243":1,"249":1,"277":1,"279":2,"280":1,"281":5,"283":3,"284":1,"289":1,"290":2,"302":1,"332":1,"343":1,"349":1,"358":1,"393":1,"396":1,"400":1,"416":1,"449":3,"526":1}}],["компоненты",{"0":{"28":1,"119":1,"151":1,"235":1,"276":1,"277":1,"282":1,"285":1},"1":{"29":1,"30":1,"31":1,"32":1,"277":1,"278":1,"279":1,"280":1,"281":1,"283":1},"2":{"23":2,"26":1,"41":1,"68":1,"86":1,"111":1,"112":1,"113":2,"119":2,"138":1,"141":2,"142":3,"143":2,"149":1,"151":2,"159":1,"215":3,"218":1,"229":1,"230":4,"231":1,"234":2,"235":2,"239":4,"269":2,"271":2,"272":4,"273":3,"276":1,"277":2,"278":2,"280":1,"283":1,"286":1,"288":2,"290":1,"292":2,"293":1,"298":1,"299":2,"300":3,"331":2,"333":1,"340":1,"342":4,"344":1,"345":1,"346":1,"349":1,"387":1,"407":1,"408":3,"409":1,"413":3,"414":1,"436":1,"437":2,"438":2,"449":2,"451":2,"452":1,"454":2,"455":1,"459":3,"496":1,"531":1,"545":1}}],["компонент",{"2":{"23":1,"36":1,"81":1,"89":1,"91":1,"96":4,"102":1,"112":1,"113":1,"119":1,"140":2,"141":1,"142":3,"143":4,"151":7,"175":1,"184":2,"215":3,"220":2,"221":5,"223":1,"231":1,"233":4,"235":2,"236":6,"239":4,"241":1,"247":1,"249":1,"272":2,"273":2,"274":4,"277":5,"278":7,"279":2,"281":2,"283":10,"284":1,"285":5,"288":1,"289":6,"290":4,"299":9,"301":2,"302":1,"331":1,"332":1,"342":7,"344":2,"345":3,"346":1,"347":2,"349":2,"358":1,"399":3,"407":1,"409":2,"415":3,"437":2,"440":1,"442":1,"448":1,"449":7,"451":3,"454":1,"459":2,"491":1,"496":1,"531":2,"533":1,"545":1}}],["компонентам",{"2":{"118":1,"219":1,"229":1,"239":1,"272":1,"273":1,"280":1,"290":1,"299":1,"342":1,"437":1}}],["компонентами",{"0":{"454":1},"2":{"115":1,"142":1,"143":2,"149":1,"167":1,"221":1,"229":2,"230":1,"231":1,"236":1,"269":1,"273":1,"276":1,"277":2,"280":1,"281":1,"284":2,"285":1,"308":1,"309":1,"323":2,"331":1,"332":1,"341":1,"345":1,"348":1,"350":2,"352":2,"354":1,"359":1,"360":1,"391":1,"410":1,"419":1,"438":1,"489":1}}],["компонентах",{"2":{"23":1,"41":1,"105":1,"113":1,"119":1,"142":1,"143":1,"167":1,"211":1,"236":2,"274":2,"277":1,"284":1,"285":1,"292":1,"293":1,"302":1,"331":1,"353":1,"356":1,"357":1,"386":1,"408":1,"417":1,"431":1}}],["компонента",{"2":{"22":1,"113":1,"141":1,"142":4,"143":7,"151":4,"181":1,"183":1,"215":1,"216":2,"217":1,"221":2,"222":3,"225":1,"235":1,"236":2,"239":3,"242":1,"244":1,"263":4,"269":1,"272":1,"273":1,"275":1,"277":4,"278":1,"279":3,"280":7,"282":1,"283":3,"284":1,"285":4,"289":7,"290":1,"297":1,"299":1,"301":4,"323":1,"329":1,"332":3,"333":1,"342":1,"343":1,"347":2,"351":1,"409":1,"410":2,"414":1,"415":3,"416":3,"437":1,"449":4,"452":1,"459":2,"498":1,"507":1}}],["кому",{"2":{"106":1}}],["командную",{"2":{"423":1}}],["командного",{"2":{"327":1}}],["командной",{"2":{"212":1,"214":1,"215":1,"224":1,"401":1,"410":1,"419":1,"421":1,"422":1,"443":1}}],["команд",{"2":{"215":2,"327":1,"328":1,"423":1,"435":1,"451":1}}],["командой",{"2":{"167":1,"315":1,"378":1,"405":1,"407":1,"408":1,"414":1,"428":1,"429":1,"461":1}}],["командами",{"2":{"410":1}}],["командах",{"2":{"407":1}}],["команда",{"0":{"327":1},"1":{"328":1},"2":{"157":1,"230":1,"281":1,"294":1,"327":1,"354":1,"421":1,"489":1}}],["команде",{"2":{"139":1,"157":1,"162":1,"167":1,"281":1,"327":1,"390":1}}],["команды",{"2":{"93":1,"139":1,"215":1,"217":1,"243":1,"252":1,"265":1,"277":1,"279":1,"296":1,"327":2,"328":1,"345":1,"350":1,"392":1,"400":1,"410":2,"414":1,"418":2,"423":2,"425":2,"426":2,"427":2,"428":1,"429":1,"432":1}}],["команду",{"2":{"34":1,"83":1,"127":1,"214":3,"222":1,"230":1,"328":1,"354":1,"393":1,"397":1,"401":2,"409":1,"414":1,"418":2,"424":2,"425":2,"428":1}}],["коп",{"2":{"451":1}}],["копейкой",{"2":{"200":1}}],["копейку",{"2":{"200":1}}],["копируются",{"2":{"384":1}}],["копирование",{"2":{"347":1}}],["копирования",{"2":{"136":1,"443":1}}],["копировать",{"2":{"22":1}}],["копии",{"2":{"342":1,"421":1}}],["копия",{"2":{"176":1,"290":1}}],["копию",{"2":{"176":1,"222":1,"274":2,"347":2,"395":1,"421":1,"426":1}}],["копий",{"2":{"148":1,"348":1}}],["копонент",{"2":{"32":1}}],["кот",{"2":{"18":1}}],["которой",{"2":{"131":1,"140":1,"162":1,"165":1,"171":1,"184":1,"194":1,"210":1,"215":1,"231":2,"233":1,"248":1,"265":1,"296":1,"329":1,"334":1,"374":1,"385":1,"388":1,"411":2,"430":1,"496":1}}],["которого",{"2":{"113":1,"143":4,"259":1,"279":2,"285":1,"289":1,"301":1,"351":2,"384":1,"410":1}}],["которое",{"2":{"113":1,"114":1,"115":1,"134":1,"135":1,"150":1,"163":1,"164":2,"170":1,"184":1,"188":1,"213":1,"221":1,"222":1,"223":1,"230":2,"236":1,"245":1,"249":1,"273":1,"278":1,"281":1,"283":1,"289":1,"330":1,"337":1,"347":1,"349":1,"354":1,"355":2,"384":1,"385":2,"408":2,"409":1,"415":1,"416":2,"418":1,"428":1,"429":1,"450":1}}],["котором",{"2":{"58":1,"125":1,"138":2,"142":1,"214":1,"215":1,"222":1,"236":2,"244":1,"245":1,"251":1,"257":1,"264":1,"265":1,"278":2,"285":1,"290":1,"299":1,"328":1,"330":1,"384":1,"397":1,"399":1,"405":1,"413":1,"414":1,"439":1,"448":1,"449":1}}],["которому",{"2":{"48":1,"148":1,"242":1,"352":1,"356":1,"402":1,"412":1,"415":1,"437":1}}],["которая",{"2":{"43":1,"61":1,"68":1,"93":1,"109":1,"116":2,"125":1,"128":1,"134":1,"139":1,"140":1,"143":1,"146":1,"181":1,"196":1,"215":1,"222":4,"233":1,"236":1,"243":2,"251":1,"273":1,"278":1,"284":3,"285":1,"290":2,"297":1,"321":1,"324":1,"329":1,"335":2,"337":1,"347":1,"352":1,"355":5,"357":1,"388":1,"392":1,"397":1,"401":1,"407":1,"410":2,"411":1,"415":1,"416":2,"418":1,"426":1,"449":2,"451":1,"459":1,"460":1,"461":1}}],["которым",{"2":{"16":1,"17":1,"108":1,"143":1,"157":1,"163":1,"215":1,"233":1,"236":1,"278":1,"284":1,"288":1,"355":1,"394":1,"437":3,"459":1}}],["которыми",{"2":{"3":1,"4":1,"123":1,"157":1,"170":1,"215":1,"290":1,"329":1,"382":1,"449":1}}],["которые",{"2":{"16":1,"22":1,"36":1,"47":1,"106":1,"108":1,"110":1,"114":1,"121":1,"132":1,"133":2,"136":1,"137":1,"138":5,"140":2,"141":3,"142":1,"143":4,"144":1,"147":1,"150":3,"151":3,"152":1,"162":2,"163":1,"167":2,"168":1,"172":3,"175":1,"181":1,"183":1,"184":1,"189":3,"191":1,"197":1,"200":1,"204":1,"210":2,"211":1,"212":1,"215":4,"216":3,"217":1,"218":3,"220":1,"223":1,"228":1,"231":1,"234":1,"238":1,"239":2,"242":1,"244":1,"245":1,"246":1,"247":1,"248":1,"251":2,"252":1,"254":2,"256":2,"258":2,"261":1,"263":1,"264":1,"266":1,"272":1,"273":1,"274":1,"277":2,"278":3,"279":1,"280":3,"281":1,"283":2,"284":1,"294":2,"295":2,"297":2,"300":1,"301":3,"302":2,"303":1,"305":3,"306":2,"309":1,"326":2,"331":1,"334":1,"338":1,"342":1,"345":1,"347":1,"349":1,"351":1,"354":2,"355":2,"356":1,"363":2,"364":1,"382":3,"384":2,"388":1,"390":1,"396":1,"400":1,"401":1,"407":1,"408":2,"411":2,"415":1,"416":3,"426":1,"428":1,"436":2,"438":1,"439":1,"440":1,"459":1,"460":1,"461":2,"495":1,"496":1,"545":1}}],["которых",{"2":{"12":1,"40":1,"68":1,"110":1,"121":1,"138":1,"139":1,"141":1,"143":1,"148":1,"218":1,"230":1,"234":1,"237":1,"239":1,"243":1,"244":1,"248":1,"250":1,"259":1,"284":1,"289":1,"305":1,"325":1,"331":2,"357":1,"405":1,"429":1,"449":1,"451":1,"461":1}}],["который",{"2":{"3":1,"10":1,"13":1,"35":1,"41":1,"48":1,"62":1,"83":1,"107":2,"108":2,"110":1,"125":4,"128":1,"135":3,"138":1,"139":2,"140":2,"141":1,"142":4,"143":4,"151":2,"152":1,"163":1,"166":1,"181":2,"183":1,"184":1,"186":1,"190":1,"194":2,"195":1,"199":2,"202":1,"204":1,"212":1,"213":1,"214":1,"215":3,"220":2,"221":1,"222":2,"223":1,"228":1,"229":2,"233":5,"236":2,"238":1,"239":3,"244":1,"245":1,"246":1,"247":1,"249":1,"250":1,"251":3,"256":1,"258":1,"262":1,"264":3,"265":1,"271":1,"273":1,"275":1,"278":5,"282":1,"283":1,"284":1,"285":2,"288":1,"289":3,"290":2,"292":1,"299":2,"304":1,"314":1,"316":1,"324":1,"327":1,"329":2,"330":3,"331":3,"332":1,"333":2,"336":1,"337":1,"340":1,"345":3,"350":3,"352":1,"353":1,"357":2,"372":1,"385":2,"387":1,"388":1,"389":1,"390":1,"391":2,"396":1,"397":1,"401":1,"402":1,"407":1,"411":2,"413":1,"415":1,"416":1,"417":2,"421":1,"426":1,"437":1,"440":1,"443":1,"449":3,"450":1,"451":1,"461":2}}],["которую",{"2":{"2":1,"22":1,"81":1,"140":1,"167":1,"177":1,"183":1,"205":1,"206":1,"215":1,"219":1,"233":1,"239":1,"243":1,"245":1,"247":1,"248":1,"249":1,"260":1,"262":1,"290":1,"306":1,"347":1,"384":1,"393":1,"395":2,"411":1,"435":1,"449":1,"460":1}}],["конвейера",{"0":{"390":1},"1":{"391":1,"392":1,"393":1}}],["конвейеров",{"2":{"334":1}}],["конгруэнтным",{"2":{"292":1}}],["конфликтуют",{"2":{"444":1}}],["конфликта",{"2":{"428":1}}],["конфликт",{"2":{"428":1}}],["конфликты",{"0":{"428":1},"2":{"429":1}}],["конфликтов",{"2":{"221":1,"429":1}}],["конфигом",{"2":{"444":1}}],["конфиге",{"0":{"516":1},"2":{"443":1}}],["конфигурирование",{"2":{"212":1,"530":1}}],["конфигурацией",{"2":{"265":1}}],["конфигурационного",{"2":{"435":1,"489":1}}],["конфигурационному",{"2":{"219":1}}],["конфигурационные",{"2":{"497":1}}],["конфигурационный",{"2":{"215":1,"219":1,"414":2,"503":1}}],["конфигурационных",{"2":{"123":1}}],["конфигураций",{"2":{"133":1}}],["конфигурации",{"0":{"128":1,"219":1},"1":{"129":1,"130":1,"131":1,"132":1,"133":1},"2":{"118":1,"126":1,"128":2,"131":1,"214":1,"215":1,"219":2,"233":1,"265":1,"299":1,"417":2,"437":2}}],["конфигурацию",{"2":{"118":1,"127":1,"128":2,"129":1,"132":1,"136":1,"218":1,"219":2,"410":1}}],["конфигурациях",{"2":{"461":1}}],["конфигурация",{"0":{"129":1},"1":{"130":1},"2":{"23":1,"134":1,"444":1}}],["конфиденциальности",{"2":{"210":1,"243":1}}],["конец",{"2":{"214":1,"417":2}}],["конечная",{"2":{"398":1,"402":1}}],["конечную",{"2":{"244":1,"246":1,"247":1,"250":1}}],["конечных",{"2":{"245":1,"355":1,"401":1}}],["конечными",{"2":{"397":1}}],["конечным",{"2":{"245":1}}],["конечные",{"2":{"215":1,"290":1,"402":1}}],["конечный",{"2":{"122":1,"143":1,"215":1,"220":1,"235":1,"283":2,"290":2}}],["конечной",{"2":{"200":1,"397":1}}],["конечному",{"2":{"163":1,"250":1,"263":1}}],["конечном",{"2":{"157":1,"278":1,"430":1}}],["конечного",{"2":{"68":1,"76":1,"125":1,"228":1,"430":2}}],["конечно",{"2":{"17":1,"109":1,"127":1,"220":1,"248":1,"251":1,"254":1,"266":1,"331":1,"337":1,"342":1,"347":1,"407":1,"452":1,"461":1}}],["консистентности",{"2":{"449":1}}],["консоли",{"2":{"448":1}}],["консоль",{"2":{"213":1,"330":2,"336":1,"386":1}}],["константные",{"2":{"154":1}}],["константе",{"2":{"143":1}}],["константа",{"2":{"143":2}}],["константы",{"0":{"154":1},"2":{"143":2,"222":1}}],["константу",{"2":{"143":2,"284":2,"290":1,"349":2}}],["конструкция",{"0":{"288":1},"2":{"290":1}}],["конструкциями",{"2":{"39":1}}],["конструкции",{"2":{"272":1,"449":1}}],["конструкторе",{"2":{"315":1,"320":1,"321":1,"326":1}}],["конструктору",{"2":{"233":1,"385":1}}],["конструктором",{"2":{"233":1}}],["конструкторов",{"2":{"222":1,"233":1,"352":1}}],["конструктора",{"2":{"143":1,"239":1,"284":1,"289":1,"337":1,"351":1,"357":2,"391":1,"496":2}}],["конструкторы",{"2":{"118":1,"154":1,"239":1,"242":1}}],["конструктор",{"2":{"111":2,"118":1,"127":1,"140":1,"143":3,"233":1,"290":1,"329":1,"330":1,"337":1,"348":1,"349":1,"351":2,"352":1,"354":1,"385":2,"387":1,"396":1,"402":1}}],["кончается",{"2":{"106":2}}],["кончился",{"2":{"106":1}}],["контакты",{"2":{"483":1}}],["контактов",{"2":{"209":1}}],["контактам",{"2":{"209":1}}],["контрагентами",{"2":{"451":1}}],["контрастно",{"2":{"196":1}}],["контрастах",{"2":{"196":1}}],["контраста",{"2":{"166":1}}],["контраст",{"0":{"164":1},"2":{"164":3}}],["контролируется",{"2":{"544":1}}],["контролирует",{"2":{"448":1,"451":1}}],["контролировать",{"2":{"2":1,"215":1,"235":1,"323":1}}],["контроллеров",{"2":{"280":1}}],["контроллеры",{"0":{"280":1}}],["контроля",{"0":{"405":1},"1":{"406":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,"419":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},"2":{"171":2,"172":1,"181":1,"213":2,"215":1,"223":1,"233":1,"299":1,"378":1,"421":1}}],["контроль",{"0":{"378":1},"2":{"134":1,"143":2,"172":1,"213":1,"215":1,"219":1,"228":1,"265":1,"278":1,"336":1,"419":1}}],["контейнер",{"2":{"235":1}}],["контейнера",{"2":{"184":1}}],["контенту",{"2":{"196":1}}],["контент",{"2":{"194":2,"208":1,"256":1,"461":1}}],["контентом",{"2":{"180":1,"191":1,"196":1,"291":1,"461":2,"494":1,"496":1}}],["контента",{"0":{"193":1},"1":{"194":1,"195":1,"196":1,"197":1},"2":{"138":1,"140":1,"151":1,"164":1,"180":1,"187":1,"272":1,"461":1}}],["контекстов",{"2":{"265":1}}],["контексту",{"2":{"243":1,"272":1}}],["контекст",{"2":{"219":1,"281":1,"414":1}}],["контексте",{"2":{"219":1,"228":1,"294":1}}],["контекстном",{"2":{"261":1}}],["контекстного",{"2":{"177":1,"341":1}}],["контекстные",{"2":{"177":1}}],["контекстным",{"2":{"177":1}}],["контекстных",{"2":{"177":1}}],["контекстах",{"2":{"228":1,"259":1}}],["контекста",{"2":{"81":1,"143":1,"244":1,"254":1,"261":1,"277":1,"296":1,"306":1,"310":1,"328":1,"340":1,"495":1}}],["концом",{"2":{"331":1}}],["концов",{"2":{"264":1,"334":1}}],["концу",{"2":{"138":1,"160":1,"226":1,"254":2,"340":1,"382":1,"384":1}}],["концептуально",{"2":{"387":1}}],["концептуального",{"2":{"373":1}}],["концептуальной",{"2":{"275":1}}],["концептуальных",{"2":{"382":1}}],["концептуальные",{"2":{"295":1}}],["концептуальный",{"2":{"251":1}}],["концепцией",{"2":{"139":1,"183":1,"350":1,"373":1}}],["концепций",{"2":{"138":1,"334":1,"363":1,"403":1}}],["концепция",{"2":{"138":1,"139":1,"143":1,"160":1,"166":1,"177":1,"178":1,"183":1,"191":1,"192":2,"194":1,"201":1,"213":1,"218":1,"250":1,"252":1,"283":1,"299":1,"300":1,"311":1,"327":1,"330":1,"405":1,"418":1}}],["концепциями",{"2":{"136":1,"269":1,"376":1,"389":1}}],["концепции",{"2":{"126":1,"141":1,"163":1,"165":1,"212":1,"294":1,"340":1,"341":1,"355":1,"363":1,"379":1,"382":1,"390":1,"403":1,"405":1,"430":1,"431":1,"452":1}}],["концепцию",{"2":{"125":1,"143":1,"167":1,"192":1,"196":1,"228":1,"245":1,"254":1,"275":1,"345":1}}],["конце",{"2":{"140":1,"196":1,"199":1,"215":1,"264":1,"290":1,"334":1,"384":1,"407":1}}],["концентрируемся",{"2":{"41":1}}],["конца",{"2":{"60":1,"183":1,"184":1,"244":1,"402":1}}],["конкретика",{"2":{"299":1}}],["конкретную",{"2":{"299":1,"496":1}}],["конкретная",{"2":{"192":1}}],["конкретным",{"2":{"305":1}}],["конкретных",{"2":{"256":1,"265":1,"290":1,"357":1,"496":1}}],["конкретные",{"2":{"139":1}}],["конкретный",{"2":{"43":1,"398":1,"492":1}}],["конкретного",{"2":{"110":1,"170":1,"250":1,"275":1,"411":1,"438":1}}],["конкретное",{"2":{"108":1,"143":1}}],["конкретно",{"2":{"41":1}}],["конкретном",{"2":{"11":1,"139":1,"239":1,"388":1}}],["конкатенируются",{"2":{"245":1}}],["конкатенированы",{"2":{"238":1}}],["конкатенировать",{"2":{"112":1}}],["конкатенации",{"2":{"245":1}}],["конкурируют",{"2":{"176":1}}],["конкурировать",{"2":{"138":1}}],["конкурировали",{"2":{"138":1}}],["конкурентов",{"0":{"21":1},"2":{"22":1,"162":1}}],["кодироваться",{"2":{"440":1}}],["кодирование",{"2":{"292":1,"318":1}}],["кодирования",{"2":{"245":2,"263":1,"337":1,"363":1,"407":1}}],["кодированию",{"2":{"194":1}}],["кодировке",{"2":{"245":1}}],["кодирует",{"2":{"245":1}}],["кодовой",{"2":{"321":1,"426":1,"429":1}}],["кодовая",{"2":{"256":1,"290":1}}],["кодов",{"2":{"250":1}}],["кодовых",{"2":{"152":1,"158":1,"301":1}}],["кодовые",{"0":{"152":1},"1":{"153":1,"154":1,"155":1,"156":1,"157":1},"2":{"157":1}}],["кодом",{"2":{"76":1,"107":1,"158":1,"213":1,"222":2,"234":1,"249":1,"250":1,"251":1,"284":1,"289":1,"334":1,"341":1,"390":1,"401":1,"405":1,"410":1,"414":1,"417":1,"420":1,"421":1,"426":1,"428":1}}],["кодера",{"2":{"444":1}}],["коде",{"2":{"143":3,"157":1,"159":1,"219":1,"222":2,"229":1,"236":1,"239":1,"249":1,"263":3,"264":1,"275":1,"281":1,"284":1,"301":2,"317":1,"328":1,"331":1,"333":1,"337":2,"395":1,"404":1,"407":1,"410":1,"411":1,"416":1,"417":1,"420":1,"431":2,"451":1,"452":1,"459":1,"492":1,"497":1,"500":1,"501":1,"527":1}}],["коду",{"2":{"41":1,"220":1,"236":1,"245":1,"289":1,"304":1,"345":1,"390":1,"396":1,"420":1}}],["кода",{"0":{"367":1,"503":1},"2":{"40":1,"63":1,"105":2,"107":1,"115":1,"116":1,"134":2,"139":2,"140":1,"141":1,"142":2,"143":6,"157":1,"213":3,"218":1,"219":1,"222":2,"223":1,"226":1,"228":1,"229":1,"238":1,"239":2,"242":1,"243":1,"244":1,"245":2,"247":1,"248":1,"249":3,"250":2,"255":3,"258":2,"263":2,"266":2,"269":3,"270":1,"282":1,"284":1,"285":1,"288":1,"289":1,"290":2,"295":1,"299":1,"301":2,"302":2,"303":1,"304":1,"305":1,"320":1,"331":1,"335":2,"340":1,"350":1,"351":1,"355":1,"358":1,"365":2,"367":1,"378":1,"383":2,"384":5,"388":1,"390":1,"392":1,"393":1,"394":1,"395":1,"400":1,"402":1,"403":1,"405":3,"406":1,"407":1,"411":2,"418":2,"419":2,"420":2,"421":2,"422":1,"426":3,"428":2,"431":1,"433":2,"435":1,"444":1,"449":1,"451":3,"453":1,"455":2,"459":2,"460":1,"461":2,"484":1,"495":1,"496":2,"500":1,"503":2}}],["код",{"0":{"304":1,"368":1,"413":1},"1":{"307":1,"308":1,"309":1,"310":1},"2":{"9":1,"22":1,"77":1,"81":1,"94":1,"96":1,"105":2,"108":1,"109":1,"127":1,"128":1,"132":1,"137":1,"139":1,"140":2,"141":2,"143":5,"152":1,"157":1,"161":2,"175":1,"183":1,"188":1,"194":1,"213":1,"214":1,"215":5,"216":1,"218":1,"222":4,"223":1,"224":1,"227":2,"235":1,"236":3,"239":1,"244":1,"246":1,"247":1,"248":2,"249":5,"250":3,"251":3,"255":1,"263":1,"264":2,"269":1,"270":1,"278":2,"280":1,"284":1,"289":3,"293":1,"294":1,"301":3,"302":2,"304":6,"305":2,"314":1,"315":2,"317":2,"320":2,"330":1,"331":1,"336":1,"337":2,"341":2,"347":1,"348":1,"349":1,"359":1,"383":1,"384":1,"385":1,"390":1,"392":1,"393":1,"406":2,"407":5,"409":1,"410":2,"413":1,"415":1,"417":3,"420":2,"426":1,"428":1,"429":2,"430":1,"435":1,"444":1,"448":1,"455":1,"460":2,"517":1,"530":1,"544":1}}],["к",{"0":{"196":1,"263":1,"394":1},"1":{"395":1,"396":1,"397":1,"398":1,"399":1,"400":1},"2":{"2":1,"11":1,"16":1,"23":1,"26":1,"38":1,"40":2,"41":4,"52":2,"57":1,"58":2,"62":1,"67":1,"68":1,"86":1,"100":1,"102":1,"105":1,"106":4,"107":7,"108":6,"110":1,"111":1,"112":1,"114":6,"115":1,"118":3,"119":1,"122":2,"125":7,"126":1,"127":1,"128":4,"130":1,"132":1,"134":1,"135":4,"136":1,"138":3,"139":1,"143":19,"145":1,"149":1,"151":3,"159":1,"160":1,"162":2,"163":1,"164":1,"165":2,"166":3,"167":1,"169":1,"170":1,"171":1,"172":2,"174":1,"175":1,"179":1,"180":2,"183":1,"184":2,"185":1,"186":1,"187":2,"194":6,"195":1,"196":5,"198":3,"200":1,"208":1,"209":1,"212":1,"213":1,"215":4,"216":2,"217":1,"218":1,"219":1,"220":1,"222":3,"223":1,"224":1,"225":1,"226":2,"228":3,"229":3,"230":1,"231":1,"233":2,"234":1,"235":1,"236":4,"237":1,"238":1,"239":1,"240":1,"242":3,"243":1,"244":1,"245":1,"249":3,"250":1,"251":8,"253":1,"254":3,"256":5,"258":2,"259":1,"261":1,"263":5,"264":6,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":4,"272":2,"273":1,"275":2,"277":2,"278":2,"279":1,"280":1,"283":4,"284":2,"286":3,"289":2,"290":1,"292":1,"293":1,"294":1,"298":1,"299":2,"301":3,"302":1,"304":1,"305":1,"307":1,"311":1,"312":3,"316":1,"323":2,"327":1,"329":1,"330":1,"331":2,"334":5,"335":2,"337":5,"338":1,"340":2,"341":1,"342":4,"344":2,"345":1,"347":2,"349":2,"350":1,"351":3,"352":1,"354":3,"355":7,"356":1,"357":2,"358":1,"363":4,"365":2,"373":1,"382":3,"383":2,"384":7,"385":2,"386":1,"387":1,"388":5,"390":2,"391":2,"392":2,"393":2,"394":1,"395":1,"396":1,"397":1,"398":1,"402":3,"403":3,"405":3,"407":1,"408":1,"409":1,"410":1,"411":3,"412":1,"413":2,"415":6,"416":5,"420":3,"421":1,"425":1,"427":1,"429":1,"437":1,"439":2,"440":1,"444":5,"448":1,"449":2,"452":1,"456":1,"460":3,"461":3,"486":1,"487":1,"495":1,"498":1,"500":2,"501":1,"530":1}}],["вкратце",{"2":{"340":1}}],["вкладок",{"2":{"355":1}}],["вкладка",{"2":{"206":1}}],["вкладки",{"2":{"166":1,"167":1,"355":2}}],["вклад",{"2":{"160":1,"304":1}}],["включенные",{"2":{"296":1}}],["включенное",{"2":{"175":1}}],["включением",{"2":{"233":1,"399":1}}],["включение",{"2":{"218":1,"251":1,"410":1}}],["включения",{"2":{"216":1,"230":1,"238":1,"353":1,"387":1,"392":1,"405":1,"425":1,"426":1,"448":1}}],["включен",{"2":{"215":1,"233":1,"277":1,"425":1}}],["включено",{"2":{"175":2}}],["включены",{"2":{"163":1,"239":1}}],["включена",{"2":{"135":1,"194":1}}],["включив",{"2":{"414":1,"417":1}}],["включите",{"2":{"216":1,"352":1}}],["включить",{"2":{"128":1,"129":1,"215":1,"218":3,"230":1,"299":1,"350":1,"398":1,"402":1,"418":1}}],["включили",{"2":{"218":1,"233":1,"239":1,"396":1,"402":1}}],["включил",{"2":{"129":1,"492":1}}],["включим",{"2":{"100":1,"216":1,"392":1,"394":1}}],["включать",{"2":{"138":1,"216":1,"218":1,"239":1,"263":1,"280":1,"389":1,"390":1,"417":1,"429":1,"430":1,"444":1}}],["включающий",{"2":{"116":1}}],["включают",{"2":{"68":1,"228":1,"278":1,"429":1,"533":1}}],["включаем",{"2":{"235":1,"236":1}}],["включаемые",{"2":{"115":1}}],["включается",{"2":{"106":1,"335":1,"444":1}}],["включает",{"0":{"124":1,"369":1},"1":{"125":1,"370":1,"371":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"381":1},"2":{"68":1,"69":1,"73":1,"116":1,"122":1,"128":1,"162":3,"176":1,"179":1,"189":1,"301":1,"302":1,"325":1,"388":1,"397":1,"407":2,"425":1,"429":1}}],["включая",{"2":{"47":1,"138":1,"298":1,"348":1,"443":1,"444":1,"448":1,"459":1,"533":1}}],["вмешательства",{"2":{"264":1}}],["вместе",{"2":{"109":1,"114":1,"151":1,"160":1,"186":1,"207":1,"212":1,"228":1,"235":1,"239":1,"250":1,"266":1,"294":1,"303":1,"382":1,"402":1,"407":1,"428":1,"453":1}}],["вместо",{"2":{"23":1,"108":1,"112":1,"115":1,"127":2,"141":1,"142":1,"143":1,"196":1,"218":1,"236":1,"239":1,"253":1,"256":1,"264":1,"277":1,"283":1,"284":1,"294":1,"298":1,"326":1,"327":1,"331":1,"336":1,"344":1,"348":1,"352":1,"354":1,"355":2,"387":1,"389":1,"408":1,"410":1,"413":1,"424":1,"443":1,"448":1,"461":1,"501":2,"544":1}}],["втянуть",{"2":{"198":1}}],["вторых",{"2":{"460":1}}],["вторым",{"2":{"411":1}}],["вторично",{"2":{"444":1}}],["вторичным",{"2":{"177":1}}],["вторичный",{"2":{"164":1,"250":1}}],["вторую",{"2":{"402":1}}],["вторая",{"2":{"114":1,"301":1,"384":1}}],["второго",{"2":{"252":1,"415":1}}],["второе",{"2":{"222":1,"249":1,"250":1}}],["втором",{"2":{"106":2,"233":1,"329":1}}],["второстепенных",{"2":{"17":1}}],["второй",{"2":{"17":1,"55":1,"57":1,"66":1,"233":1,"250":1,"263":1,"279":1,"315":1,"398":1,"405":1,"411":2,"444":3,"522":1}}],["впрочем",{"2":{"527":1}}],["впредь",{"2":{"267":1}}],["впечатляющей",{"2":{"394":1}}],["впечатляющее",{"2":{"239":1}}],["впечатление",{"2":{"181":1,"183":1,"484":1,"495":1}}],["впервые",{"2":{"429":1}}],["вперёд",{"2":{"228":1}}],["вперед",{"2":{"150":1,"223":1,"242":1,"248":1,"259":1,"264":1,"338":1,"349":1,"427":1}}],["вплоть",{"2":{"139":1,"283":1,"297":1,"414":1,"419":1}}],["вполне",{"2":{"4":1,"58":1,"106":1,"121":1,"214":1,"243":1,"244":1,"245":1,"347":1,"397":1,"429":1,"449":1,"451":1,"460":1,"495":1}}],["входе",{"2":{"461":1}}],["входы",{"2":{"332":1,"408":1}}],["входной",{"2":{"332":1}}],["входного",{"2":{"278":1,"409":1}}],["входных",{"2":{"316":1,"324":1,"407":1}}],["входные",{"2":{"273":1,"329":1}}],["входными",{"2":{"223":1}}],["входным",{"2":{"115":1}}],["входов",{"0":{"274":1},"2":{"407":1}}],["входящего",{"2":{"388":1,"409":1}}],["входящих",{"2":{"391":1,"392":1,"411":1}}],["входящий",{"2":{"130":1}}],["входящие",{"2":{"129":1,"300":1}}],["входят",{"2":{"261":1}}],["вход",{"2":{"247":2,"331":1}}],["входить",{"2":{"271":1,"331":1}}],["входит",{"2":{"108":1,"134":1,"167":1,"248":1,"424":1,"484":1}}],["входа",{"2":{"29":1,"128":1,"142":1,"248":1,"299":4,"327":1,"388":1,"390":1,"451":1,"461":1}}],["вузах",{"2":{"64":1}}],["владельцем",{"2":{"342":1}}],["властвуй",{"2":{"2":1}}],["вложенном",{"2":{"281":1}}],["вложенному",{"2":{"280":1}}],["вложенного",{"2":{"187":1}}],["вложенных",{"0":{"238":1},"2":{"239":1,"438":1}}],["вложенные",{"0":{"237":1},"1":{"238":1,"239":1},"2":{"242":1}}],["вложены",{"2":{"198":1}}],["вложений",{"2":{"61":1}}],["влиять",{"2":{"295":1}}],["влияющий",{"2":{"336":1}}],["влияющее",{"2":{"178":1}}],["влияют",{"2":{"162":1,"301":1,"309":1}}],["влияет",{"2":{"144":1,"175":1,"384":1,"453":1}}],["влияние",{"2":{"68":1,"197":1}}],["вязала",{"2":{"61":1}}],["вновь",{"2":{"385":1,"459":1}}],["вносит",{"2":{"459":1}}],["вносится",{"2":{"405":1}}],["вносите",{"2":{"304":1}}],["вносить",{"2":{"219":1}}],["вносят",{"2":{"138":1}}],["внуку",{"2":{"344":1}}],["внушительная",{"2":{"284":1}}],["внушительное",{"2":{"191":1}}],["внучатому",{"2":{"280":1}}],["внутрь",{"2":{"239":1,"444":1}}],["внутренняя",{"2":{"331":1}}],["внутреннюю",{"2":{"284":1,"347":1}}],["внутренне",{"2":{"331":1}}],["внутреннего",{"2":{"321":1,"326":1,"357":1,"460":1}}],["внутреннее",{"2":{"288":1,"289":2,"354":1}}],["внутренней",{"2":{"151":1,"214":1,"267":1,"329":1,"347":1}}],["внутреннему",{"2":{"245":1,"318":1,"321":1}}],["внутреннем",{"2":{"143":1,"357":1}}],["внутренним",{"2":{"251":1,"300":1,"331":1,"356":1}}],["внутренними",{"2":{"114":1}}],["внутренний",{"2":{"249":1,"301":1,"357":1,"438":1}}],["внутренних",{"2":{"151":1,"160":1,"279":1,"395":1,"408":1}}],["внутренние",{"2":{"116":1,"349":1,"451":1}}],["внутри",{"2":{"48":1,"119":1,"126":1,"139":3,"140":2,"148":1,"175":1,"176":1,"189":1,"194":2,"215":2,"219":2,"221":1,"222":4,"225":1,"244":1,"247":1,"248":1,"256":1,"263":1,"278":1,"280":1,"283":2,"287":1,"297":1,"323":1,"332":1,"336":1,"337":2,"351":1,"352":1,"357":1,"382":1,"386":1,"411":3,"437":1,"440":1,"448":3,"449":1,"530":1,"537":1}}],["вниз",{"2":{"183":1,"196":1,"335":1,"344":1,"485":1,"522":1}}],["внизу",{"2":{"33":1,"179":1,"184":1}}],["внимательно",{"0":{"166":1}}],["вниманию",{"2":{"179":1}}],["внимания",{"2":{"122":2,"178":1,"179":1,"208":1,"321":1}}],["внимание",{"2":{"96":1,"113":1,"114":1,"127":1,"130":1,"138":1,"139":1,"140":3,"142":1,"143":1,"164":2,"166":1,"167":1,"178":1,"191":1,"194":1,"196":2,"199":1,"215":1,"221":2,"222":3,"233":2,"236":1,"239":1,"245":1,"249":1,"256":1,"267":1,"280":1,"289":1,"290":3,"315":1,"325":1,"330":2,"335":1,"337":1,"342":1,"344":1,"347":1,"351":1,"354":1,"365":1,"384":2,"386":1,"395":1,"398":1,"411":1,"413":1,"416":3,"426":1}}],["внедрена",{"2":{"281":1}}],["внедрения",{"2":{"212":1,"254":1,"265":1,"385":1}}],["внедрении",{"2":{"208":1}}],["внедрить",{"2":{"233":1,"264":1,"437":1}}],["внедряйте",{"2":{"437":1}}],["внедряют",{"2":{"215":1,"251":1}}],["внедрять",{"2":{"55":1,"184":1,"216":1}}],["внесите",{"0":{"483":1}}],["внесения",{"2":{"483":1}}],["внесение",{"2":{"420":1}}],["внесенных",{"2":{"139":1}}],["внесем",{"2":{"214":1}}],["внесли",{"2":{"160":1,"349":1}}],["внести",{"2":{"40":1,"137":1,"303":1,"405":1}}],["внешней",{"2":{"449":1}}],["внешнего",{"2":{"138":1,"216":1,"331":1}}],["внешних",{"2":{"408":1}}],["внешние",{"2":{"299":1}}],["внешний",{"2":{"138":1,"217":1,"235":1,"249":1,"256":1,"438":1}}],["вне",{"2":{"119":1,"213":1,"256":1,"282":1,"335":1}}],["вредными",{"2":{"460":1}}],["вредоносные",{"2":{"198":1}}],["времена",{"2":{"459":1}}],["временами",{"2":{"138":1}}],["временных",{"2":{"408":1}}],["временным",{"2":{"195":1}}],["временно",{"2":{"448":1,"449":1}}],["временной",{"2":{"384":1}}],["временное",{"2":{"108":1}}],["временная",{"2":{"245":1}}],["временем",{"2":{"143":1,"325":1,"435":1}}],["времени",{"2":{"61":1,"84":1,"116":1,"125":1,"143":1,"170":2,"174":1,"181":2,"220":1,"228":3,"249":6,"250":1,"284":1,"330":1,"334":1,"335":1,"336":1,"355":1,"384":4,"419":1,"450":1,"455":1,"459":1,"460":1}}],["время",{"0":{"448":1},"2":{"96":1,"100":1,"113":1,"118":1,"125":3,"128":1,"134":1,"139":2,"140":2,"141":1,"143":1,"151":1,"169":1,"170":3,"171":1,"174":1,"179":1,"187":1,"190":1,"196":1,"202":1,"214":1,"215":3,"218":1,"222":1,"223":1,"233":1,"236":2,"242":1,"249":1,"251":1,"252":1,"263":3,"272":1,"275":1,"278":3,"283":1,"289":2,"290":1,"292":1,"304":1,"318":1,"329":1,"331":1,"332":1,"336":1,"337":2,"345":1,"356":1,"359":2,"363":1,"390":1,"391":1,"393":1,"396":1,"405":2,"407":1,"409":1,"410":1,"411":1,"419":1,"420":1,"429":1,"444":1,"448":1,"449":1,"450":5,"452":1,"453":1,"455":1,"460":1,"495":1,"524":1,"530":1}}],["вращение",{"2":{"182":1}}],["вращающихся",{"2":{"182":1,"444":1}}],["вроде",{"2":{"61":1,"103":1,"449":1,"461":1}}],["вручную",{"2":{"38":1,"135":1,"254":1,"264":1,"267":1,"301":2,"407":1,"414":1}}],["вряд",{"2":{"26":1,"405":1,"460":1}}],["взяли",{"2":{"452":1}}],["взяв",{"2":{"451":1}}],["взята",{"2":{"218":1}}],["взять",{"2":{"4":1,"134":1,"139":1,"228":1,"272":1,"409":1,"442":1,"495":1}}],["взлетевших",{"2":{"451":1}}],["взлететь",{"2":{"444":1}}],["взломают",{"2":{"250":1}}],["взглянув",{"2":{"292":1}}],["взглянуть",{"2":{"27":1,"109":1,"290":1}}],["взгляда",{"2":{"160":1,"163":1,"173":1,"189":1}}],["взгляд",{"2":{"143":1,"162":1,"191":1,"195":1,"238":1,"305":1,"331":1,"337":1}}],["взвесить",{"2":{"139":1}}],["взаимоотношения",{"2":{"309":1}}],["взаимопониманием",{"2":{"210":1}}],["взаимозаменяемые",{"2":{"139":1,"336":1}}],["взаимодействуют",{"2":{"340":1,"382":1,"438":1}}],["взаимодействуем",{"2":{"228":1}}],["взаимодействует",{"2":{"34":1,"162":1,"172":1}}],["взаимодействовать",{"2":{"188":1,"251":1,"267":1,"271":1,"273":2,"275":1,"289":1,"292":1,"293":1,"404":1,"416":1}}],["взаимодействии",{"2":{"342":1,"407":1}}],["взаимодействию",{"2":{"334":1}}],["взаимодействие",{"0":{"342":1},"1":{"343":1,"344":1},"2":{"162":1,"222":2,"251":1,"273":1,"274":2,"278":1,"288":1,"289":1,"312":1,"334":3,"382":1,"389":1,"397":1,"407":2,"416":1}}],["взаимодействием",{"2":{"68":1,"185":1,"223":1,"264":1,"273":1,"274":1}}],["взаимодействий",{"0":{"273":1},"2":{"138":1,"172":1,"228":1,"243":2,"334":1,"401":1,"408":2}}],["взаимодействия",{"0":{"185":1,"390":1},"1":{"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1,"391":1,"392":1,"393":1},"2":{"68":1,"160":2,"162":2,"172":1,"189":1,"195":1,"198":1,"226":1,"243":1,"250":1,"251":1,"269":1,"273":1,"284":1,"302":1,"305":1,"308":1,"342":2,"385":1,"389":1,"390":1,"399":1,"405":1,"416":1,"418":1,"419":1,"452":1}}],["взаимосвязаны",{"2":{"339":1}}],["взаимосвязь",{"2":{"329":1}}],["взаимосвязи",{"2":{"68":1,"405":1}}],["взаимосвязей",{"2":{"67":1,"419":1}}],["вентиляторов",{"2":{"444":1}}],["вело",{"2":{"254":1}}],["велосипед",{"2":{"216":1,"294":1,"326":1,"334":1}}],["великолепным",{"2":{"142":1}}],["ведение",{"2":{"244":1}}],["ведется",{"2":{"202":1,"251":1}}],["ведет",{"2":{"150":1,"233":1,"329":1,"363":1}}],["ведь",{"2":{"236":1,"410":1}}],["ведома",{"2":{"202":1}}],["ведут",{"2":{"147":1,"148":1,"176":1,"242":1,"283":1}}],["ведущие",{"2":{"125":1,"141":1}}],["веток",{"2":{"428":1}}],["ветвью",{"2":{"461":1}}],["ветвей",{"2":{"427":1}}],["ветвями",{"0":{"427":1},"2":{"427":1,"428":1}}],["ветвление",{"2":{"426":1}}],["ветви",{"2":{"121":1}}],["ветки",{"2":{"426":1,"427":4,"428":1,"435":2,"515":1}}],["веткой",{"2":{"426":1,"428":1}}],["ветке",{"2":{"426":2,"427":1,"428":1,"432":1,"515":1}}],["ветку",{"2":{"134":1,"427":3,"428":2,"429":2,"435":2,"515":2}}],["ветках",{"2":{"432":1,"449":1}}],["ветка",{"2":{"100":1,"426":2}}],["вещах",{"2":{"140":1,"384":1}}],["вещи",{"2":{"107":1,"163":1,"415":1,"448":1,"524":1}}],["вещь",{"2":{"25":1,"216":1,"218":1}}],["везде",{"2":{"86":1}}],["веса",{"2":{"459":1}}],["вести",{"2":{"356":1,"461":1}}],["вестись",{"2":{"60":1,"79":1}}],["веских",{"2":{"329":1}}],["весомых",{"2":{"186":1}}],["вес",{"2":{"103":1,"166":1}}],["весьма",{"2":{"89":1,"139":1,"207":1,"251":1,"347":1,"403":1,"527":1}}],["весь",{"2":{"50":1,"114":1,"141":1,"143":1,"183":1,"209":1,"228":2,"264":1,"284":1,"302":1,"334":1,"390":1,"428":1,"543":1}}],["верен",{"2":{"461":1}}],["вероятно",{"2":{"428":1}}],["вероятность",{"2":{"79":1,"139":1,"256":1,"436":1,"450":1}}],["верстку",{"2":{"459":1}}],["верстки",{"2":{"290":1,"492":1}}],["верстать",{"2":{"456":1,"459":1}}],["версионность",{"2":{"436":1,"543":1}}],["версионности",{"2":{"70":1}}],["версией",{"2":{"425":1}}],["версию",{"2":{"213":1,"215":1,"226":1,"396":1,"422":1,"425":1,"435":1,"460":1,"461":1,"533":1}}],["версий",{"0":{"405":1},"1":{"406":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,"419":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},"2":{"35":1,"125":1,"213":2,"378":1,"430":2}}],["версиях",{"2":{"215":1}}],["версиями",{"2":{"110":1}}],["версия",{"0":{"33":1},"2":{"74":1,"118":1,"138":1,"213":3,"291":1,"363":1,"423":1,"500":1}}],["версии",{"2":{"29":1,"30":1,"33":2,"47":1,"215":1,"285":1,"329":1,"354":1,"413":1,"435":2,"543":1}}],["вертикали",{"2":{"273":1}}],["вертикальный",{"2":{"284":1}}],["вертикальные",{"2":{"165":1,"189":1}}],["вертикального",{"2":{"194":1}}],["вертикальной",{"2":{"194":1,"284":1}}],["верхняя",{"2":{"530":1}}],["верхний",{"2":{"497":1}}],["верхнее",{"2":{"194":1}}],["верхней",{"2":{"165":1,"183":1,"186":1,"187":1,"194":1,"195":1}}],["верхнем",{"2":{"163":2,"191":1,"195":1,"266":2}}],["верхнего",{"2":{"111":1,"125":3,"137":1,"155":1,"230":1,"231":1,"272":1,"283":1}}],["верха",{"2":{"196":1,"215":1,"233":1}}],["вернулся",{"2":{"459":1}}],["вернуть",{"2":{"143":1,"251":1,"336":1,"337":1,"396":1}}],["вернуться",{"2":{"66":1,"187":1,"231":1,"264":2,"420":2}}],["верно",{"2":{"222":1}}],["верное",{"2":{"139":1}}],["вернемся",{"2":{"289":2,"331":1}}],["вернетесь",{"2":{"304":1}}],["вернет",{"2":{"108":1,"290":1,"352":1,"415":1}}],["вернее",{"2":{"25":1}}],["вебприложения",{"2":{"495":1,"496":1}}],["вебприложение",{"2":{"492":1}}],["веба",{"2":{"459":1}}],["вебсервер",{"2":{"439":1,"444":1,"461":1}}],["вебсервере",{"2":{"439":1}}],["вебсервера",{"2":{"108":1,"444":1}}],["вебсайта",{"2":{"435":1,"484":1,"495":1,"496":1}}],["вебсайт",{"2":{"435":1,"494":1}}],["вебсайты",{"2":{"21":1}}],["веб",{"0":{"124":1,"128":1,"135":1,"140":1,"254":1,"375":1,"390":1,"490":1},"1":{"125":1,"129":1,"130":1,"131":1,"132":1,"133":1,"141":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"391":1,"392":1,"393":1},"2":{"3":1,"11":2,"108":2,"122":5,"124":2,"125":3,"126":3,"127":2,"128":10,"129":1,"130":1,"134":1,"135":5,"136":1,"137":4,"138":4,"139":2,"140":2,"141":2,"142":1,"145":1,"148":1,"160":2,"162":1,"163":1,"179":1,"181":1,"183":1,"184":1,"187":1,"191":1,"210":1,"212":2,"213":2,"214":1,"215":5,"216":1,"218":3,"223":2,"228":8,"233":1,"240":1,"243":2,"249":1,"251":2,"252":2,"254":3,"256":13,"261":1,"262":1,"263":1,"265":3,"266":1,"267":1,"268":2,"269":3,"271":1,"290":1,"297":2,"299":1,"301":1,"302":2,"303":2,"310":1,"328":1,"334":3,"340":1,"354":1,"355":2,"364":1,"365":3,"373":1,"374":1,"382":3,"384":5,"389":1,"393":1,"397":2,"401":1,"403":2,"404":1,"418":1,"419":1,"429":1,"430":1,"436":1,"444":1,"450":1,"452":1,"461":3,"492":1,"494":1,"495":1,"496":2}}],["вдохновения",{"2":{"22":1}}],["вводе",{"2":{"451":1}}],["вводя",{"2":{"416":1}}],["вводом",{"2":{"280":1}}],["вводились",{"2":{"451":1}}],["вводился",{"2":{"344":1}}],["вводим",{"2":{"228":1}}],["вводимых",{"2":{"222":1}}],["вводит",{"2":{"149":1,"249":1}}],["вводить",{"2":{"2":1,"174":1,"218":1,"220":1,"453":1}}],["ввод",{"2":{"222":1,"273":2,"416":1}}],["вводы",{"2":{"176":1}}],["ввода",{"0":{"174":1,"280":1},"1":{"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1},"2":{"149":1,"174":1,"176":1,"220":2,"222":7,"223":1,"231":1,"249":6,"275":1,"280":3,"285":1,"290":1,"358":1,"489":1}}],["вверх",{"2":{"281":1,"318":1,"342":1,"344":1}}],["вверху",{"2":{"179":1}}],["ввели",{"2":{"214":2,"253":1,"275":1,"416":1}}],["введи",{"2":{"452":1}}],["введите",{"2":{"214":5,"410":1,"483":1}}],["введём",{"2":{"428":1}}],["введет",{"2":{"249":1}}],["введенный",{"2":{"448":1}}],["введенных",{"2":{"356":1}}],["введенная",{"2":{"167":1}}],["введен",{"2":{"303":1}}],["введении",{"2":{"407":1}}],["введением",{"2":{"405":1}}],["введение",{"0":{"384":1},"1":{"385":1,"386":1,"387":1},"2":{"300":1,"429":1}}],["введения",{"2":{"125":1,"171":1}}],["введем",{"2":{"140":1,"401":1}}],["ввести",{"2":{"16":1,"174":1,"214":1,"220":1,"249":1,"410":1}}],["ввиду",{"2":{"4":1}}],["валидаций",{"2":{"411":1}}],["валидацией",{"2":{"251":1}}],["валидация",{"2":{"249":2,"329":1,"449":1}}],["валиден",{"2":{"106":1}}],["важен",{"2":{"172":1,"215":1,"300":1,"303":1,"304":1,"323":1,"339":1}}],["важнейших",{"2":{"408":1}}],["важнее",{"2":{"192":1,"228":1}}],["важна",{"2":{"162":1}}],["важная",{"2":{"40":1,"121":1,"252":1,"396":1}}],["важный",{"2":{"240":1,"289":1,"297":1,"311":1,"337":1,"340":1}}],["важны",{"2":{"159":1,"181":1,"450":1}}],["важные",{"2":{"136":1,"139":1,"210":1,"242":1,"338":1,"370":1,"382":1,"405":1,"431":1,"458":1}}],["важными",{"2":{"136":1,"169":1,"210":1,"244":1}}],["важных",{"2":{"68":1,"140":1,"215":1,"239":1,"311":1,"335":1,"403":1}}],["важной",{"2":{"183":1,"196":1,"214":1,"420":1,"426":1}}],["важного",{"2":{"179":1}}],["важное",{"2":{"175":1,"289":1}}],["важность",{"2":{"166":1}}],["важно",{"2":{"135":1,"141":1,"142":1,"143":1,"146":1,"157":2,"165":2,"184":1,"186":1,"190":1,"196":1,"222":1,"228":1,"244":1,"245":1,"256":1,"263":1,"284":1,"301":1,"304":1,"325":1,"328":1,"335":1,"339":1,"396":1,"402":1,"420":1,"429":1,"432":1}}],["ванильному",{"2":{"143":1}}],["варьироваться",{"2":{"207":1}}],["варьируются",{"2":{"125":1}}],["вариаций",{"2":{"325":1}}],["вариациями",{"2":{"305":1}}],["вариации",{"2":{"176":1}}],["вариантом",{"2":{"134":1,"187":1,"191":1,"225":1,"243":1}}],["вариантов",{"2":{"106":1,"128":2,"134":2,"139":1,"140":1,"170":2,"174":1,"175":1,"187":1,"188":1,"189":1,"191":1,"213":1,"219":1,"443":1,"496":2,"532":1,"533":2}}],["варианте",{"2":{"102":1,"221":1,"366":1}}],["варианту",{"2":{"96":1}}],["вариантам",{"2":{"381":1}}],["вариантами",{"2":{"214":1,"218":1,"356":1}}],["вариантах",{"2":{"136":1,"175":1,"186":1,"248":1}}],["варианта",{"2":{"58":1,"96":1,"114":1,"135":2,"269":1,"460":1,"496":2}}],["варианты",{"0":{"107":1,"143":1},"2":{"16":1,"106":1,"110":1,"128":1,"137":1,"138":1,"185":1,"204":1,"263":1,"329":1,"349":1,"355":1,"394":1,"416":1,"439":1,"533":1}}],["вариант",{"2":{"4":2,"17":1,"109":1,"139":2,"175":2,"203":2,"204":1,"213":2,"214":1,"215":1,"233":1,"263":1,"277":1,"315":1,"388":1,"448":1,"460":1}}],["вами",{"2":{"214":2,"222":1}}],["вам",{"2":{"110":2,"114":1,"116":3,"122":1,"126":1,"136":1,"139":4,"140":1,"142":1,"143":2,"152":1,"159":2,"163":1,"167":1,"197":1,"210":1,"211":1,"213":1,"214":1,"226":1,"255":1,"283":1,"290":2,"294":3,"301":2,"304":2,"329":4,"338":2,"341":1,"344":1,"355":1,"363":3,"368":2,"394":1,"422":1,"423":1,"425":1,"438":1,"439":1,"440":1,"443":1,"453":1,"459":1,"460":1,"461":1}}],["вас",{"2":{"110":1,"142":1,"159":1,"171":1,"195":1,"285":1,"287":1,"301":1,"304":1,"337":1,"398":1,"410":1,"411":1,"424":2,"429":1,"448":1,"449":1,"516":2}}],["васи",{"2":{"106":1}}],["вася",{"2":{"106":1}}],["ваши",{"2":{"230":1,"449":1}}],["ваших",{"2":{"167":1,"394":1}}],["ваша",{"2":{"157":1}}],["ваше",{"2":{"139":1,"304":1,"363":1,"384":1,"440":1,"453":1,"483":1,"517":1}}],["вашей",{"2":{"125":1,"139":1,"214":1,"315":1,"321":1,"347":1,"426":1}}],["вашего",{"2":{"108":1,"110":2,"115":1,"125":2,"139":1,"151":1,"214":2,"215":1,"216":1,"264":1,"305":1,"309":1,"338":1,"340":2,"355":1,"384":1,"435":2,"437":1,"438":1,"439":1,"453":2,"455":1,"461":1,"515":1,"516":1,"542":1,"544":2}}],["вашему",{"2":{"105":1,"214":1,"251":1,"404":1,"439":2,"449":1}}],["вашем",{"2":{"105":1,"305":1,"365":1,"429":1,"440":1,"461":1}}],["вашу",{"2":{"105":1,"139":1,"422":1,"423":1}}],["ваш",{"2":{"4":1,"107":1,"125":1,"139":1,"140":1,"157":1,"215":1,"216":1,"425":1,"435":2,"440":1,"448":1,"458":1,"460":1,"461":2,"515":1}}],["всплывающем",{"2":{"189":1,"206":1}}],["всплывающего",{"2":{"189":2}}],["всплывающей",{"2":{"177":2}}],["всплывающее",{"2":{"177":1}}],["всплывающая",{"2":{"177":1}}],["вспомним",{"2":{"335":1}}],["вспомнить",{"2":{"216":1}}],["вспомните",{"2":{"162":1,"250":1}}],["вспоминать",{"2":{"315":1}}],["вспомогательный",{"2":{"348":1}}],["вспомогательные",{"2":{"4":1,"330":1}}],["вспомогательная",{"2":{"222":1,"273":1,"290":2}}],["вскоре",{"2":{"138":1,"167":1,"214":1,"229":1,"384":1}}],["всю",{"2":{"134":1,"186":1,"207":1,"218":1,"222":1,"244":1,"251":1,"269":1,"289":1,"305":1,"384":1,"408":1,"410":1}}],["встающих",{"2":{"495":1}}],["вставке",{"2":{"151":1}}],["вставать",{"2":{"4":1}}],["вступает",{"2":{"141":1}}],["встретит",{"2":{"410":1}}],["встретить",{"2":{"152":1,"157":1,"189":1,"208":1,"299":1,"350":1}}],["встречал",{"2":{"460":1}}],["встречали",{"2":{"237":1}}],["встречающихся",{"2":{"364":1}}],["встречающиеся",{"2":{"125":1,"305":1}}],["встречаются",{"2":{"294":1,"305":1,"306":1}}],["встречается",{"2":{"187":1,"200":1,"201":1,"212":1,"299":1,"334":1}}],["встречавшейся",{"2":{"161":1}}],["встроенную",{"2":{"394":1}}],["встроенная",{"2":{"382":1}}],["встроенным",{"2":{"277":1}}],["встроенный",{"2":{"213":1,"329":1}}],["встроенные",{"0":{"151":1}}],["встроенных",{"0":{"144":1},"1":{"145":1,"146":1,"147":1,"148":1,"149":1,"150":1},"2":{"150":1,"151":1,"245":1}}],["встроенного",{"2":{"138":1}}],["всячески",{"2":{"483":1}}],["всяких",{"2":{"461":1}}],["вся",{"2":{"105":1,"127":1,"135":1,"233":1,"250":1,"410":1,"459":1,"491":1,"536":1}}],["всевозможных",{"2":{"460":1}}],["всей",{"2":{"128":1,"141":1,"207":1,"214":1,"228":1,"245":1,"251":1,"281":2,"321":1,"413":1,"544":1}}],["всеми",{"2":{"215":1,"218":1,"222":1,"231":1,"245":1,"350":1,"354":1,"429":1,"461":3}}],["всемирная",{"2":{"138":1}}],["всем",{"2":{"68":1,"108":2,"128":1,"264":1,"281":1,"302":1,"311":1,"322":1,"348":1,"365":1,"448":1,"452":1}}],["всему",{"2":{"41":1,"94":1,"142":1,"215":1,"233":1,"290":1,"295":1,"301":1,"349":1,"350":1,"354":1,"420":1,"436":1,"449":2}}],["всех",{"2":{"38":1,"108":1,"110":2,"113":1,"157":1,"165":1,"222":2,"245":1,"248":1,"250":1,"256":1,"264":1,"277":1,"279":1,"321":1,"334":1,"336":1,"348":1,"355":1,"365":1,"384":2,"398":1,"402":1,"410":1,"411":2,"421":1,"423":1,"432":2,"442":1,"451":2,"461":1,"487":1,"491":1}}],["все",{"2":{"36":1,"47":1,"58":1,"86":1,"91":1,"93":1,"100":1,"106":1,"113":2,"116":1,"122":1,"124":1,"125":2,"126":1,"128":3,"135":2,"138":3,"139":1,"140":1,"141":1,"142":2,"143":5,"146":1,"150":1,"151":1,"152":1,"157":2,"158":1,"163":2,"165":1,"167":1,"169":1,"171":1,"180":1,"184":1,"191":1,"196":1,"198":1,"210":1,"213":3,"218":4,"220":1,"222":6,"223":3,"228":2,"233":1,"239":1,"244":4,"251":4,"252":1,"256":3,"258":2,"259":1,"263":2,"264":1,"266":1,"278":3,"280":1,"290":1,"291":1,"299":1,"303":1,"311":1,"321":1,"323":2,"331":1,"337":1,"342":2,"343":1,"347":1,"350":1,"354":1,"355":4,"357":1,"359":1,"363":1,"384":3,"388":1,"393":1,"394":1,"396":1,"407":1,"408":1,"410":1,"411":2,"412":1,"413":1,"414":1,"416":1,"425":4,"427":1,"428":1,"429":1,"431":2,"436":1,"448":1,"449":2,"451":1,"459":1,"460":1,"461":1,"498":1,"518":1,"531":1,"545":1}}],["всего",{"2":{"29":1,"34":1,"79":1,"106":1,"107":1,"112":1,"125":1,"127":1,"128":1,"145":1,"162":1,"172":2,"173":1,"180":1,"200":1,"222":1,"242":1,"244":1,"256":1,"272":1,"289":1,"290":1,"294":1,"301":2,"302":2,"304":2,"306":1,"353":1,"383":1,"384":2,"391":1,"398":1,"409":1,"411":1,"448":2,"449":1,"460":1,"524":2}}],["всегда",{"0":{"113":1},"2":{"25":1,"113":1,"135":1,"139":2,"142":1,"153":1,"157":1,"194":2,"218":1,"221":1,"249":1,"256":1,"314":1,"358":1,"391":1,"396":1,"398":1,"437":2,"440":1,"449":1,"453":1,"506":1}}],["всём",{"2":{"449":1}}],["всё",{"2":{"2":1,"35":1,"40":1,"50":1,"58":1,"86":1,"108":1,"136":1,"355":1,"444":1,"451":2,"452":1,"460":1,"461":1,"484":1,"491":1}}],["выезжает",{"2":{"534":1,"536":1}}],["выезжающий",{"2":{"33":1}}],["выучить",{"2":{"460":1}}],["выложить",{"2":{"429":1}}],["вылиться",{"2":{"44":1}}],["выясним",{"2":{"392":1}}],["выявлении",{"2":{"461":1}}],["выявления",{"2":{"405":1,"407":1}}],["выявление",{"0":{"275":1}}],["выявить",{"2":{"272":1,"274":1,"297":1}}],["выигрывает",{"2":{"297":1}}],["выигрыш",{"2":{"139":1,"397":1,"403":1}}],["выгоде",{"2":{"461":1}}],["выгодно",{"2":{"417":1}}],["выгодные",{"2":{"204":1}}],["выгоды",{"2":{"256":1}}],["выглядело",{"2":{"398":1}}],["выглядел",{"2":{"289":1,"318":1,"414":1}}],["выглядела",{"2":{"219":1,"410":1}}],["выглядеть",{"2":{"14":1,"105":1,"183":2,"217":1,"220":1,"221":1,"231":1,"233":1,"237":1,"239":1,"244":1,"249":1,"266":1,"272":2,"283":1,"319":1,"321":1,"322":1,"331":1,"345":1,"346":1,"350":1,"385":1,"394":1,"399":1,"418":1,"426":1}}],["выглядящий",{"2":{"214":1}}],["выглядят",{"2":{"21":1,"125":2,"170":1,"445":1,"449":1,"500":1}}],["выглядит",{"2":{"88":1,"96":1,"102":1,"112":1,"143":1,"148":1,"251":1,"263":1,"289":1,"336":1,"358":1,"418":1,"419":1,"428":1,"449":1,"461":2}}],["выключен",{"2":{"175":1}}],["выключено",{"2":{"175":2}}],["выключенное",{"2":{"175":1}}],["выровнены",{"2":{"166":1}}],["выражаю",{"2":{"368":1}}],["выражения",{"2":{"285":2}}],["выражение",{"2":{"150":1}}],["выражением",{"2":{"147":1}}],["выраженных",{"2":{"245":1}}],["вырастает",{"2":{"355":1}}],["выравнивания",{"2":{"166":2}}],["выравниванию",{"2":{"166":1,"167":1}}],["выравнивание",{"2":{"166":2,"167":1}}],["выравниванием",{"0":{"166":1},"2":{"166":1}}],["выработаете",{"2":{"160":1}}],["выработайте",{"2":{"143":1}}],["выработки",{"2":{"139":1}}],["вычисление",{"2":{"411":1,"412":1}}],["вычисления",{"2":{"335":1,"336":1,"409":1,"451":1,"452":1}}],["вычислений",{"2":{"228":1}}],["вычислять",{"2":{"335":1}}],["вычисляем",{"2":{"330":1}}],["вычисляемыми",{"2":{"349":1,"351":1}}],["вычисляемых",{"2":{"222":2,"290":1,"351":1}}],["вычисляемые",{"2":{"143":1,"222":1,"223":1,"350":2,"352":2}}],["вычисляемое",{"2":{"222":1}}],["вычислительных",{"2":{"384":1}}],["вычислительные",{"2":{"254":1}}],["вычислительноемкие",{"2":{"388":1}}],["вычислительной",{"2":{"228":1,"335":1,"382":1,"393":1}}],["вычислительном",{"2":{"147":1}}],["вычислительная",{"2":{"128":1,"251":1}}],["выходе",{"2":{"492":1}}],["выходов",{"2":{"407":1}}],["выходом",{"2":{"175":1,"411":1}}],["выходных",{"2":{"407":1}}],["выходные",{"2":{"329":1,"421":1}}],["выходным",{"2":{"115":1}}],["выходят",{"2":{"301":1,"304":1}}],["выходящие",{"2":{"138":1}}],["выход",{"2":{"273":1}}],["выходить",{"2":{"271":1,"274":1,"299":1}}],["выходит",{"2":{"194":1,"216":1,"244":1,"248":1,"251":2,"265":1,"271":1,"299":1,"302":1,"429":2}}],["выхода",{"2":{"191":1}}],["выходы",{"2":{"143":1,"332":1,"408":1}}],["вытекает",{"2":{"329":1}}],["вытеснены",{"2":{"138":1}}],["выталкивая",{"2":{"184":1}}],["вытащить",{"2":{"58":1}}],["выведет",{"2":{"336":1}}],["выведена",{"2":{"336":1}}],["выведено",{"2":{"336":3,"337":1}}],["выведены",{"2":{"168":1}}],["выведенных",{"2":{"108":1}}],["вывести",{"2":{"151":1,"254":1,"405":1}}],["выводимый",{"2":{"415":1}}],["выводим",{"2":{"290":1,"330":1}}],["выводится",{"2":{"283":1,"330":1}}],["выводит",{"2":{"195":1,"336":1,"337":1}}],["выводе",{"2":{"236":1,"285":1}}],["вывода",{"2":{"151":1,"336":1}}],["вывод",{"0":{"36":1,"84":1},"2":{"273":1,"408":1,"416":2,"444":1,"461":1}}],["выдать",{"2":{"416":1}}],["выдаст",{"2":{"395":1}}],["выдавать",{"2":{"320":1,"411":1,"412":1}}],["выдает",{"2":{"280":1,"325":2,"411":1}}],["выдан",{"2":{"418":1}}],["выдана",{"2":{"251":1}}],["выданный",{"2":{"246":1}}],["выдачи",{"2":{"4":1}}],["выделяет",{"2":{"451":1}}],["выделять",{"2":{"394":1}}],["выделяют",{"2":{"331":1}}],["выделяются",{"2":{"168":1}}],["выделена",{"2":{"411":1}}],["выделенная",{"2":{"251":1}}],["выделенные",{"2":{"222":1,"352":1}}],["выделенный",{"2":{"199":1,"384":1}}],["выделениями",{"2":{"239":1}}],["выделение",{"2":{"177":1}}],["выделении",{"2":{"176":1,"177":1}}],["выделить",{"2":{"105":1,"436":1}}],["выделим",{"2":{"89":1}}],["выдвигающемся",{"2":{"90":1}}],["вышедшая",{"2":{"460":1}}],["вышеперечисленные",{"2":{"355":2}}],["вышеперечисленных",{"2":{"248":1}}],["вышеизложенными",{"2":{"222":1}}],["вышеуказанного",{"2":{"525":1}}],["вышеуказанной",{"2":{"516":1}}],["вышеуказанных",{"2":{"94":1}}],["вышеупомянутого",{"2":{"279":1}}],["вышеупомянутой",{"2":{"258":1}}],["вышеупомянутые",{"2":{"275":1}}],["вышеупомянутымипротоколами",{"2":{"134":1}}],["выше",{"2":{"79":1,"205":1,"246":1,"266":1,"354":1,"395":1,"461":1}}],["выйти",{"2":{"62":1}}],["выпуске",{"2":{"543":1}}],["выпуска",{"2":{"430":1}}],["выпущенного",{"2":{"430":1}}],["выписан",{"2":{"106":2}}],["выпадающих",{"2":{"192":1}}],["выпадающие",{"0":{"192":1},"2":{"192":1}}],["выпадающим",{"2":{"89":1}}],["выпадающее",{"2":{"183":1}}],["выпало",{"2":{"22":1}}],["выполнено",{"2":{"223":1}}],["выполненные",{"2":{"220":1}}],["выполненных",{"2":{"220":1,"222":3,"411":1}}],["выполнена",{"2":{"150":1,"176":1,"220":1,"222":2,"335":1}}],["выполнению",{"2":{"270":1}}],["выполнении",{"2":{"251":1,"256":1,"337":1,"394":1,"415":1,"418":1}}],["выполнение",{"2":{"248":1,"327":1,"328":1,"335":1,"336":2,"337":2,"384":1,"388":1,"389":1,"396":1,"407":1,"411":2,"412":3}}],["выполнением",{"2":{"141":1,"171":1,"181":1}}],["выполнения",{"2":{"68":1,"135":1,"140":1,"141":3,"150":1,"151":1,"171":1,"179":1,"181":6,"213":1,"236":1,"246":1,"251":1,"256":1,"263":1,"269":1,"275":1,"278":1,"283":1,"285":1,"290":1,"305":1,"327":2,"328":1,"331":2,"332":1,"336":1,"337":1,"384":4,"389":1,"394":1,"400":1,"403":1,"405":1,"408":2,"410":2,"411":1,"415":1,"418":1,"422":1,"425":2,"429":2,"431":1,"435":1,"448":1}}],["выполним",{"2":{"217":1,"336":1}}],["выполнить",{"2":{"230":1,"245":1,"257":1,"278":1,"289":1,"321":1,"330":1,"335":1,"337":1,"341":1,"354":1,"393":1,"397":1,"409":2,"418":1,"452":1}}],["выполните",{"2":{"214":1,"230":1,"266":1,"401":1,"414":1,"423":1,"424":2,"425":3,"428":3}}],["выполнит",{"2":{"141":2}}],["выполнив",{"2":{"127":1,"222":1,"333":1,"418":1}}],["выполняющих",{"2":{"408":1}}],["выполняющиеся",{"2":{"384":1}}],["выполняющимся",{"2":{"355":1}}],["выполняющий",{"2":{"299":2,"302":1}}],["выполняют",{"2":{"251":1,"408":1,"449":1,"451":1,"460":1}}],["выполняются",{"2":{"140":1,"335":2,"355":1,"407":1,"413":1,"415":1}}],["выполняемых",{"2":{"407":1}}],["выполняемой",{"2":{"384":1}}],["выполняемая",{"2":{"165":1}}],["выполняем",{"2":{"128":1,"326":1,"330":1,"354":1,"392":1,"411":1}}],["выполняется",{"2":{"107":1,"113":1,"143":2,"148":1,"181":1,"219":1,"236":1,"244":1,"264":1,"278":1,"337":1}}],["выполняет",{"2":{"68":1,"244":1,"284":1,"325":1,"328":1,"331":2,"342":1,"384":1,"392":1,"397":1,"411":1,"461":1}}],["выполняться",{"2":{"384":2,"394":1,"397":1,"413":1,"417":1}}],["выполнять",{"2":{"58":1,"67":1,"131":1,"147":1,"171":1,"213":1,"286":1,"289":2,"299":1,"327":2,"336":2,"342":1,"384":2,"388":1,"397":2,"427":1,"496":1}}],["выносить",{"2":{"325":1}}],["выносятся",{"2":{"41":1}}],["вынужден",{"2":{"203":1}}],["вынести",{"2":{"3":1,"96":1,"299":1}}],["высмеять",{"2":{"207":1}}],["высоту",{"2":{"186":1}}],["высоким",{"2":{"492":1}}],["высокий",{"2":{"77":1,"164":2}}],["высокая",{"2":{"228":1,"492":1}}],["высокой",{"2":{"138":1,"382":1}}],["высокого",{"2":{"64":1,"295":1,"408":1}}],["высокоуровневыми",{"2":{"39":1}}],["выступать",{"2":{"311":1,"357":1}}],["выступает",{"2":{"283":1,"388":1}}],["выстроить",{"2":{"322":1,"337":1}}],["выстроив",{"2":{"172":1}}],["выстраиваем",{"2":{"337":1}}],["выстраиваемой",{"2":{"40":1}}],["выстраивать",{"2":{"336":1}}],["выстраивания",{"2":{"164":1}}],["выставочную",{"2":{"61":1}}],["вызван",{"2":{"331":1}}],["вызвало",{"2":{"143":1}}],["вызвать",{"2":{"34":1,"107":1,"180":1,"208":2,"263":1,"330":1}}],["вызывая",{"2":{"290":1}}],["вызывающих",{"2":{"290":1}}],["вызывающим",{"2":{"186":1}}],["вызывающего",{"2":{"183":1}}],["вызываются",{"2":{"301":1}}],["вызывают",{"2":{"160":1,"426":1}}],["вызывать",{"2":{"165":1,"181":1,"219":1,"233":1,"271":1,"273":1,"274":1,"315":1,"390":1,"429":1}}],["вызываться",{"2":{"107":1}}],["вызываем",{"2":{"140":1,"236":1,"328":3,"416":1}}],["вызывается",{"2":{"347":1}}],["вызывает",{"2":{"3":1,"150":1,"171":1,"206":1,"274":1}}],["вызову",{"2":{"337":2}}],["вызове",{"2":{"336":1,"398":1}}],["вызовет",{"2":{"109":1,"184":1,"222":2,"239":1,"247":1}}],["вызовом",{"2":{"319":1,"337":1}}],["вызовов",{"2":{"105":1,"264":1,"322":1,"336":1,"337":1,"397":1,"398":1,"408":1}}],["вызовами",{"2":{"337":1,"397":1}}],["вызовах",{"2":{"315":1}}],["вызова",{"2":{"279":1,"331":2,"335":5,"336":2,"337":4,"386":1,"402":1}}],["вызов",{"0":{"335":1},"1":{"336":1},"2":{"41":1,"140":1,"244":1,"329":1,"331":1,"335":3,"337":3,"357":1,"397":2,"500":1}}],["вызовы",{"2":{"41":1,"228":1,"264":1,"294":1,"311":1,"331":1,"332":1,"337":1,"388":1,"397":1,"402":2,"413":1,"500":1,"501":1}}],["вы",{"2":{"26":2,"67":1,"114":2,"116":2,"125":2,"134":2,"138":1,"139":7,"140":1,"141":2,"142":4,"143":3,"152":1,"157":3,"159":3,"160":2,"165":3,"167":3,"171":2,"175":1,"188":1,"194":4,"197":1,"199":1,"211":2,"213":1,"214":9,"215":5,"216":2,"218":1,"222":1,"225":1,"226":1,"230":2,"231":1,"236":1,"237":1,"239":2,"243":1,"250":1,"254":1,"256":3,"262":2,"281":1,"293":1,"294":1,"297":1,"299":2,"300":1,"301":5,"302":2,"304":5,"305":1,"314":1,"320":1,"321":3,"329":3,"331":1,"334":3,"336":1,"339":2,"340":2,"341":2,"355":1,"358":1,"360":1,"363":1,"364":1,"365":1,"372":1,"382":1,"384":7,"387":1,"393":1,"395":1,"411":5,"421":1,"422":1,"424":1,"425":4,"426":2,"427":1,"428":2,"429":2,"430":1,"432":1,"437":3,"438":1,"439":2,"440":1,"442":1,"443":1,"449":4,"454":1,"456":1,"460":1,"483":1}}],["выброшенной",{"2":{"412":1}}],["выбрасывать",{"2":{"411":1}}],["выбрасывает",{"2":{"337":1}}],["выбрасываем",{"2":{"321":1}}],["выбрав",{"2":{"410":1}}],["выбрано",{"2":{"256":1}}],["выбранная",{"2":{"545":1}}],["выбранными",{"2":{"489":1}}],["выбранных",{"2":{"214":1}}],["выбранные",{"2":{"204":1}}],["выбранного",{"2":{"134":1,"233":1,"251":1,"400":1}}],["выбранному",{"2":{"125":1}}],["выбранной",{"2":{"11":1,"31":1}}],["выбрали",{"2":{"230":1}}],["выбрал",{"2":{"200":1}}],["выбрать",{"2":{"125":1,"175":2,"203":1,"204":1,"214":1,"237":1,"354":1,"399":1,"400":1,"410":1,"444":1,"489":1,"505":1,"537":1}}],["выбирать",{"2":{"203":1}}],["выбирает",{"2":{"140":1}}],["выбираешь",{"2":{"81":1}}],["выбирая",{"2":{"139":2}}],["выберите",{"2":{"135":2,"214":3,"266":2,"422":1,"515":2}}],["выбором",{"2":{"264":1}}],["выбору",{"2":{"114":1,"214":1,"435":1}}],["выбор",{"0":{"37":1,"39":1},"1":{"38":1,"39":1,"40":1,"41":1},"2":{"39":1,"68":1,"128":1,"170":1,"174":1,"323":1,"400":1,"500":1}}],["выборе",{"2":{"22":1,"39":1,"177":2,"190":1,"205":1,"213":1,"231":1,"237":3,"460":1}}],["выборка",{"2":{"13":1,"237":1}}],["выбора",{"2":{"4":1,"176":1,"189":1,"191":1,"192":2,"494":1,"496":1}}],["визитку",{"2":{"495":1}}],["визитной",{"2":{"371":1}}],["визуализацию",{"2":{"449":1,"451":1}}],["визуализация",{"2":{"250":1}}],["визуализации",{"2":{"176":1,"459":1}}],["визуальные",{"2":{"429":1}}],["визуальный",{"2":{"162":1,"332":1}}],["визуальным",{"2":{"162":1}}],["визуальных",{"2":{"162":1,"163":1,"164":1,"165":2,"451":1}}],["визуальной",{"2":{"484":1}}],["визуальное",{"2":{"249":1,"332":1}}],["визуально",{"2":{"11":1,"191":1,"281":1,"345":1}}],["визуального",{"2":{"3":1,"25":1,"162":1,"165":1,"293":1,"373":1}}],["википедии",{"2":{"169":1,"170":1,"171":1,"303":1}}],["виртуальных",{"2":{"129":1}}],["виртуальный",{"2":{"107":1,"439":1,"460":1}}],["виртуального",{"2":{"131":1}}],["виртуальном",{"2":{"128":1,"137":1}}],["виртуальное",{"2":{"48":1}}],["виртуальная",{"2":{"128":1}}],["витрины",{"2":{"39":1,"76":1,"496":1}}],["витрину",{"2":{"22":1,"61":1,"62":1}}],["витрина",{"0":{"11":1},"2":{"9":1,"12":1,"58":1,"60":1,"79":1,"533":1}}],["видов",{"2":{"505":1,"537":1}}],["виды",{"2":{"407":1,"408":1}}],["видны",{"2":{"250":1}}],["видно",{"2":{"106":1,"181":1,"194":1,"199":1,"231":1,"237":1,"250":1,"323":1,"325":1,"333":1,"336":1,"345":1,"348":1,"384":1}}],["видимые",{"2":{"384":1}}],["видимое",{"2":{"384":1}}],["видимостью",{"2":{"289":1}}],["видимость",{"2":{"273":1}}],["видимости",{"2":{"235":1,"251":1,"264":2}}],["видимой",{"2":{"196":1,"442":1}}],["видим",{"2":{"196":1,"219":1,"238":1,"262":1,"264":1,"280":1,"305":1,"330":1,"397":1,"420":1}}],["видит",{"2":{"106":1}}],["видите",{"2":{"26":1,"191":1,"228":1,"236":1,"244":1,"245":1,"248":1,"261":1,"263":1,"278":1,"279":1,"281":1,"283":1,"289":1,"302":1,"318":1,"323":1,"329":1,"334":1,"336":1,"337":1}}],["виджеты",{"2":{"174":1}}],["виджетов",{"2":{"26":1,"449":1}}],["виду",{"2":{"146":1,"164":1,"167":1,"191":1,"194":1,"243":1,"244":1,"305":1}}],["виден",{"2":{"166":1,"222":1,"534":1}}],["видение",{"2":{"67":1}}],["видеть",{"2":{"163":1,"194":1,"320":1}}],["видеоролики",{"2":{"368":1}}],["видеоигры",{"2":{"186":1}}],["видео",{"2":{"161":1,"191":1,"213":1,"227":1,"255":1,"270":1,"341":1,"383":1,"406":1,"440":1,"460":4,"461":1}}],["видели",{"2":{"150":1,"167":1,"282":1,"334":2,"342":1,"344":1,"389":1}}],["виде",{"2":{"17":1,"60":1,"93":1,"107":2,"138":1,"139":2,"142":1,"177":1,"190":1,"195":1,"196":1,"214":1,"228":1,"231":1,"243":1,"244":1,"275":1,"279":2,"281":1,"286":1,"290":1,"300":1,"305":1,"316":1,"330":1,"342":1,"351":1,"388":1,"395":1,"396":2,"400":1,"402":2,"414":1,"418":2,"448":1}}],["вид",{"2":{"5":1,"18":1,"138":1,"217":1,"235":1,"250":1,"256":1,"297":1,"332":1,"345":1,"384":1}}],["вида",{"2":{"3":1,"4":1,"138":1,"216":1,"331":1,"408":1,"409":1,"413":1}}],["воды",{"2":{"460":1}}],["водителем",{"2":{"460":2}}],["вождению",{"2":{"460":1}}],["вождения",{"2":{"460":3}}],["вовлеченности",{"2":{"420":1}}],["вовсе",{"2":{"297":1}}],["военно",{"2":{"303":1}}],["военного",{"2":{"125":1}}],["воплотить",{"2":{"271":1}}],["вопросом",{"2":{"450":1}}],["вопросов",{"2":{"211":1,"215":1,"245":1,"401":1,"460":1,"485":1}}],["вопросительный",{"2":{"426":1}}],["вопроса",{"2":{"275":1,"408":1}}],["вопросах",{"2":{"216":1,"226":1,"485":1}}],["вопросами",{"2":{"159":1}}],["вопросе",{"2":{"187":1,"460":1}}],["вопросу",{"2":{"125":1,"310":1}}],["вопрос",{"2":{"4":2,"139":2,"199":1,"207":1,"272":1,"273":1,"274":1,"275":1,"285":1,"407":1,"418":2,"460":1,"483":1}}],["вопросы",{"0":{"137":1,"159":1,"199":1,"211":1,"225":1,"253":1,"268":1,"293":1,"339":1,"360":1,"404":1,"432":1},"2":{"4":1,"63":1,"122":1,"159":1,"163":1,"190":1,"253":1,"268":1,"271":2,"293":1,"360":1,"485":1}}],["воркер",{"2":{"484":1}}],["воркером",{"2":{"393":1}}],["воркеры",{"2":{"264":1}}],["воровство",{"2":{"26":1}}],["воровством",{"2":{"26":1}}],["войдите",{"2":{"214":1}}],["волшебству",{"2":{"334":1}}],["волшебство",{"2":{"184":1,"289":1}}],["волшебства",{"2":{"139":1}}],["волнуйтесь",{"2":{"141":1}}],["воссоздающих",{"2":{"394":1}}],["восстановления",{"2":{"250":1,"251":1}}],["восстановлено",{"2":{"151":1}}],["восклицательных",{"2":{"333":1}}],["восемь",{"0":{"171":1},"2":{"171":1}}],["восьми",{"2":{"125":1}}],["воспользуйтесь",{"2":{"515":1}}],["воспользуемся",{"2":{"389":1}}],["воспользоваться",{"2":{"16":1,"159":1,"245":1,"298":1,"419":1,"444":1,"461":1}}],["воспроизведенные",{"2":{"198":1}}],["воспринимается",{"2":{"345":1}}],["воспринимаются",{"2":{"256":1}}],["воспринимайте",{"2":{"139":1}}],["восприятия",{"2":{"337":1,"338":1,"384":1}}],["восприятие",{"2":{"162":1,"172":1,"544":1}}],["восприятии",{"2":{"67":1}}],["вокруг",{"2":{"105":1,"416":1,"449":1}}],["вот",{"2":{"14":1,"16":1,"61":1,"108":1,"109":1,"111":1,"112":2,"114":2,"131":1,"142":1,"143":2,"148":1,"149":1,"167":1,"171":1,"175":1,"177":1,"179":1,"180":1,"181":2,"183":2,"187":1,"188":1,"189":2,"190":1,"194":1,"199":1,"200":1,"201":1,"207":1,"208":1,"213":1,"218":1,"222":1,"223":1,"236":1,"237":1,"242":1,"250":1,"251":1,"258":1,"278":1,"279":2,"283":1,"285":1,"289":1,"306":1,"312":1,"315":1,"319":1,"322":1,"325":1,"327":1,"330":1,"331":1,"334":1,"337":2,"354":1,"358":1,"384":1,"390":1,"392":1,"411":1,"444":1,"445":1,"449":2,"452":1,"460":1,"525":1,"527":1}}],["возлагает",{"2":{"407":1}}],["воздействия",{"2":{"334":1}}],["возврата",{"2":{"327":1,"335":1,"337":2}}],["возврат",{"2":{"264":1}}],["возвращайтесь",{"2":{"460":1}}],["возвращают",{"2":{"408":1}}],["возвращающая",{"2":{"351":1,"448":1}}],["возвращающие",{"2":{"337":1}}],["возвращающей",{"2":{"113":1,"143":1,"279":1}}],["возвращающую",{"2":{"113":1,"278":2,"500":1}}],["возвращать",{"2":{"195":1,"228":1,"288":1,"392":1,"412":1}}],["возвращаться",{"2":{"183":1,"338":1}}],["возвращаемый",{"2":{"416":1}}],["возвращаем",{"2":{"284":1,"315":1,"322":2,"330":1,"337":1,"349":1,"357":2}}],["возвращаемся",{"2":{"264":1}}],["возвращаемое",{"2":{"149":1,"330":1}}],["возвращается",{"2":{"195":1,"242":1,"244":1,"440":1}}],["возвращает",{"2":{"106":2,"107":1,"114":2,"140":2,"143":1,"236":1,"242":4,"243":1,"278":1,"279":1,"284":1,"289":1,"324":1,"327":1,"337":2,"357":1,"391":1,"393":1,"396":1,"412":1}}],["возвращения",{"2":{"41":1}}],["вознаграждения",{"2":{"251":1}}],["возникшая",{"2":{"416":1}}],["возникла",{"2":{"411":1}}],["возникли",{"2":{"61":1}}],["возникновения",{"2":{"411":1}}],["возникновении",{"2":{"171":1,"385":1,"412":1}}],["возникнет",{"2":{"411":1}}],["возникнуть",{"2":{"108":1,"177":1,"199":1,"285":1,"384":1,"495":1}}],["возникающими",{"2":{"242":1}}],["возникают",{"2":{"67":1}}],["возникает",{"2":{"139":1,"165":1,"243":1,"280":1,"407":1,"420":1}}],["возрастающей",{"2":{"194":1}}],["возрасти",{"2":{"139":1}}],["возьмет",{"2":{"134":1,"140":1}}],["возьмем",{"2":{"12":1,"139":1,"220":1,"229":1,"272":1,"301":1,"316":1,"409":1}}],["возможна",{"2":{"277":1,"545":1}}],["возможную",{"2":{"250":1}}],["возможны",{"2":{"279":1}}],["возможными",{"2":{"356":1}}],["возможным",{"2":{"194":1,"228":2,"449":1}}],["возможные",{"2":{"135":1}}],["возможных",{"2":{"133":1,"233":1,"275":1,"281":1,"290":1,"384":1,"407":1,"411":1}}],["возможной",{"2":{"339":1}}],["возможное",{"2":{"249":1}}],["возможного",{"2":{"135":1}}],["возможностях",{"2":{"408":1,"461":1}}],["возможностям",{"2":{"174":1,"355":1}}],["возможностями",{"2":{"122":2,"354":1,"429":1}}],["возможности",{"0":{"457":1},"2":{"138":3,"175":1,"200":1,"215":1,"223":2,"243":1,"251":1,"263":1,"276":1,"279":1,"282":1,"283":1,"286":1,"291":1,"292":1,"299":1,"355":1,"384":1,"394":1,"408":1,"419":2,"421":1,"435":1,"443":1,"448":1,"451":1,"496":2}}],["возможностей",{"0":{"114":1},"2":{"138":1,"167":1,"216":1,"239":1,"243":1,"316":1,"337":1,"408":1,"444":1,"445":1,"448":2,"461":1,"524":1}}],["возможностью",{"2":{"12":1,"107":1,"419":1,"439":1,"442":1,"494":1,"496":3,"531":1}}],["возможность",{"2":{"2":1,"11":2,"12":1,"17":1,"39":1,"64":1,"94":1,"96":1,"106":2,"107":3,"115":1,"125":2,"139":1,"143":1,"172":1,"180":1,"186":1,"189":1,"200":1,"216":2,"219":1,"228":1,"230":1,"231":1,"245":1,"250":1,"256":1,"263":1,"264":1,"275":1,"295":1,"302":1,"345":1,"356":1,"402":1,"438":1,"450":1,"451":1,"453":1,"496":2,"533":1}}],["возможно",{"2":{"40":1,"48":1,"58":1,"95":1,"102":1,"107":1,"143":1,"159":1,"194":1,"225":1,"237":1,"281":1,"311":1,"334":1,"347":1,"411":1,"418":1,"428":1,"435":1,"436":1,"449":1,"451":3,"489":1}}],["возможен",{"2":{"16":1}}],["во",{"0":{"449":1},"2":{"3":1,"17":1,"100":1,"106":2,"113":1,"140":3,"141":1,"143":1,"151":1,"157":1,"160":1,"170":2,"179":1,"189":1,"192":1,"198":1,"200":1,"206":1,"215":1,"217":1,"218":1,"221":1,"233":2,"236":1,"239":1,"245":1,"249":1,"273":1,"278":2,"281":1,"283":2,"284":1,"294":1,"299":1,"302":1,"311":1,"321":1,"322":1,"329":1,"331":1,"332":1,"336":1,"337":1,"382":1,"384":1,"388":1,"405":1,"407":2,"411":2,"425":1,"429":1,"432":1,"444":2,"448":5,"449":7,"450":1,"451":3,"459":1,"460":2,"461":1,"530":1}}],["вообще",{"2":{"3":1,"35":1,"96":1,"202":1,"264":1,"440":1,"442":1,"444":2,"461":1}}],["в",{"0":{"42":1,"115":1,"117":1,"118":1,"124":1,"140":1,"144":1,"152":1,"200":1,"276":1,"368":1,"369":1,"384":1,"394":1,"422":1,"423":1,"424":1,"483":1,"487":1,"503":1,"516":1,"528":1,"532":1,"533":1},"1":{"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"125":1,"141":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"153":1,"154":1,"155":1,"156":1,"157":1,"277":1,"278":1,"279":1,"280":1,"281":1,"370":1,"371":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"381":1,"385":1,"386":1,"387":1,"395":1,"396":1,"397":1,"398":1,"399":1,"400":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":3,"50":1,"57":1,"58":5,"60":1,"61":1,"63":3,"64":1,"67":4,"68":5,"69":2,"73":1,"76":2,"81":1,"82":1,"83":1,"86":11,"87":1,"88":3,"89":2,"90":2,"91":2,"93":7,"94":3,"95":5,"96":6,"97":1,"100":7,"102":2,"103":2,"105":5,"106":20,"107":9,"108":8,"109":1,"110":8,"111":5,"112":5,"113":7,"114":5,"115":7,"116":4,"117":5,"118":9,"119":3,"120":1,"122":4,"123":3,"124":2,"125":20,"126":11,"127":8,"128":9,"129":3,"130":2,"131":6,"132":8,"133":1,"134":5,"135":8,"136":5,"137":4,"138":13,"139":34,"140":13,"141":12,"142":13,"143":37,"144":4,"145":1,"146":1,"147":6,"148":4,"149":5,"150":6,"151":12,"152":3,"153":1,"154":1,"155":1,"156":1,"157":5,"158":2,"159":3,"160":5,"161":6,"162":7,"163":7,"164":5,"165":3,"166":1,"167":7,"168":3,"169":9,"170":5,"171":7,"172":3,"173":2,"174":4,"175":7,"176":8,"177":8,"178":6,"179":6,"180":4,"181":10,"182":1,"183":6,"184":14,"186":8,"187":7,"188":2,"189":5,"190":4,"191":6,"194":9,"195":5,"196":9,"198":2,"199":1,"200":7,"201":3,"202":5,"203":2,"204":2,"205":2,"206":1,"207":2,"208":1,"209":2,"210":3,"211":2,"212":8,"213":13,"214":27,"215":32,"216":26,"217":7,"218":17,"219":10,"220":13,"221":10,"222":40,"223":12,"224":3,"225":1,"226":4,"227":1,"228":19,"229":2,"230":13,"231":5,"232":2,"233":22,"235":5,"236":28,"237":6,"238":7,"239":17,"240":1,"242":16,"243":11,"244":16,"245":22,"246":1,"247":6,"248":11,"249":18,"250":13,"251":19,"252":5,"253":4,"254":5,"255":3,"256":15,"257":1,"258":8,"259":5,"260":3,"261":2,"262":4,"263":20,"264":18,"265":11,"266":8,"267":6,"268":3,"269":9,"270":2,"271":1,"272":5,"273":5,"274":6,"275":6,"276":2,"277":7,"278":13,"279":14,"280":9,"281":16,"283":16,"284":14,"285":6,"286":4,"287":3,"288":1,"289":31,"290":23,"292":4,"293":2,"294":4,"295":2,"296":4,"297":8,"298":3,"299":9,"300":6,"301":13,"302":17,"303":5,"304":6,"305":12,"306":4,"310":5,"311":2,"312":1,"313":4,"314":3,"315":6,"316":3,"317":2,"318":3,"319":1,"320":4,"321":10,"322":5,"323":9,"324":2,"325":4,"326":13,"327":5,"328":14,"329":6,"330":14,"331":21,"332":5,"333":5,"334":13,"335":7,"336":6,"337":20,"338":5,"339":1,"340":5,"341":6,"342":4,"343":4,"344":7,"345":5,"346":1,"347":11,"348":6,"349":4,"350":7,"351":8,"352":7,"353":3,"354":12,"355":24,"356":8,"357":10,"358":6,"359":2,"360":3,"363":1,"365":4,"366":1,"368":2,"370":1,"371":1,"372":3,"374":1,"375":1,"376":2,"377":3,"378":2,"379":1,"380":1,"381":1,"382":7,"383":2,"384":24,"385":5,"386":6,"387":4,"388":13,"389":2,"390":6,"391":14,"392":8,"393":4,"394":7,"395":11,"396":14,"397":17,"398":7,"399":1,"400":10,"401":1,"402":12,"403":3,"404":2,"405":10,"406":2,"407":13,"408":6,"409":10,"410":15,"411":18,"412":5,"413":5,"414":5,"415":13,"416":28,"417":13,"418":13,"419":4,"420":9,"421":8,"422":1,"423":6,"424":5,"425":11,"426":9,"427":2,"428":12,"429":9,"430":6,"431":5,"432":3,"433":2,"435":15,"436":7,"437":3,"438":3,"439":3,"440":15,"442":2,"443":14,"444":13,"445":2,"448":17,"449":39,"450":5,"451":16,"452":5,"453":2,"459":11,"460":11,"461":22,"470":1,"485":3,"486":1,"489":1,"490":1,"491":1,"492":7,"495":5,"496":1,"497":4,"498":1,"500":4,"501":1,"503":2,"504":1,"515":6,"516":2,"520":1,"521":1,"524":4,"525":1,"526":3,"527":3,"530":2,"533":1,"534":4,"536":4,"541":1,"542":2,"543":2,"544":2,"545":4}}],["рисованиями",{"2":{"384":1}}],["рисуйте",{"2":{"458":1}}],["рисует",{"2":{"324":1,"384":1}}],["рисунки",{"2":{"195":1}}],["рисунка",{"2":{"166":1,"194":2,"325":1}}],["рисунке",{"2":{"125":1,"169":1,"183":1,"184":1,"195":1,"231":1,"244":1,"290":1,"342":1}}],["рисунок",{"2":{"125":1,"135":1,"141":1,"164":1,"165":1,"166":1,"167":1,"175":2,"176":1,"177":2,"179":1,"180":2,"181":2,"183":3,"188":1,"189":1,"190":1,"191":2,"194":1,"195":2,"196":1,"199":1,"200":1,"207":1,"208":1,"214":2,"215":1,"217":1,"218":1,"220":1,"231":2,"237":1,"239":1,"244":1,"245":1,"249":1,"250":1,"262":1,"263":4,"264":1,"266":2,"272":2,"273":1,"274":1,"281":1,"283":1,"288":1,"290":2,"297":1,"299":1,"325":2,"327":1,"329":1,"331":1,"334":1,"342":1,"345":1,"348":1,"350":1,"358":2,"384":3,"388":1,"390":1,"393":1,"394":1,"399":1,"409":2,"418":3,"419":1,"422":1,"425":1,"426":2,"428":1}}],["риски",{"2":{"301":1}}],["рынке",{"2":{"160":1}}],["рынка",{"0":{"20":1},"1":{"21":1,"22":1},"2":{"39":1,"116":1}}],["рывка",{"2":{"139":1}}],["ряду",{"2":{"407":1,"411":1}}],["ряде",{"2":{"168":1}}],["ряда",{"2":{"141":1,"331":1,"335":1}}],["рядами",{"2":{"102":1}}],["ряд",{"2":{"135":1,"143":2,"183":1,"189":1,"244":1,"256":1,"266":1,"278":1,"284":1,"354":1,"412":1}}],["рядом",{"2":{"130":1,"167":1,"169":1,"189":1,"222":1,"256":2,"263":1,"301":1,"337":1,"340":1,"410":2,"417":1}}],["рядового",{"2":{"93":1}}],["родился",{"2":{"461":1}}],["родители",{"2":{"342":1}}],["родителем",{"2":{"289":1}}],["родителей",{"2":{"238":2}}],["родительским",{"2":{"283":1,"288":1,"342":1,"384":1}}],["родительскими",{"2":{"280":1}}],["родительские",{"2":{"281":1}}],["родительский",{"2":{"274":2,"281":1,"283":5,"290":1,"299":1,"322":1,"342":5,"358":1,"384":2,"388":1,"389":1,"396":1}}],["родительской",{"2":{"280":1,"343":1}}],["родительском",{"2":{"238":1,"279":2,"281":3,"283":3,"388":1,"397":1}}],["родительскому",{"2":{"143":1,"279":1,"283":1,"386":1,"392":1}}],["родительского",{"2":{"142":1,"143":1,"239":2,"280":5,"289":1,"384":1,"385":2}}],["родитель",{"2":{"273":1,"274":1,"280":2,"344":1,"390":2}}],["родителю",{"2":{"239":1,"279":1,"283":1,"344":1}}],["родителями",{"2":{"340":1}}],["родителя",{"2":{"236":1,"273":1,"342":3,"344":1}}],["родственными",{"2":{"360":1}}],["родного",{"2":{"387":1}}],["родное",{"2":{"179":1,"256":1}}],["родными",{"2":{"256":1,"267":1}}],["рода",{"2":{"189":1,"199":1,"330":1,"342":1}}],["робот",{"2":{"135":1}}],["ростом",{"2":{"421":1}}],["роста",{"2":{"143":1,"405":1,"455":1}}],["рост",{"2":{"121":1}}],["росте",{"2":{"88":1}}],["роли",{"2":{"357":1,"451":1}}],["ролям",{"2":{"106":1}}],["ролью",{"2":{"106":1}}],["роль",{"2":{"68":1,"162":1,"392":1,"449":1,"451":1,"460":1,"496":1}}],["роутами",{"2":{"438":1}}],["роутера",{"2":{"126":1,"229":1,"235":1}}],["роутере",{"0":{"118":1},"2":{"127":1}}],["роутер",{"0":{"229":1},"1":{"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"242":1},"2":{"110":1,"126":1,"230":1,"235":1}}],["роуты",{"2":{"88":1}}],["роутинг",{"2":{"7":1}}],["русском",{"2":{"460":2}}],["русский",{"0":{"362":1},"2":{"460":1}}],["рутинного",{"2":{"451":1}}],["рутовский",{"2":{"57":1}}],["рука",{"2":{"444":1}}],["руководящие",{"2":{"294":1}}],["руководствами",{"2":{"160":1}}],["руководствуясь",{"2":{"213":1}}],["руководству",{"2":{"139":1}}],["руководство",{"2":{"68":1,"72":1,"114":1,"160":1,"354":1,"381":1}}],["рублей",{"2":{"439":1}}],["ручная",{"2":{"264":1}}],["ручную",{"2":{"256":1}}],["ручном",{"2":{"435":1,"444":1}}],["ручной",{"2":{"264":1}}],["ручного",{"2":{"135":1,"432":1,"489":1}}],["ручное",{"2":{"71":1,"407":1}}],["рефы",{"2":{"449":2}}],["рефакторите",{"2":{"304":1}}],["рефакторить",{"2":{"22":1}}],["рефакторинга",{"2":{"407":1,"411":1,"420":1}}],["рефакторингуйте",{"2":{"407":1}}],["рефакторинг",{"0":{"91":1,"455":1},"2":{"292":1,"455":1}}],["репликацию",{"2":{"394":1}}],["репозиторием",{"2":{"421":1,"429":6}}],["репозиториев",{"2":{"405":1,"421":1}}],["репозиториями",{"0":{"429":1},"2":{"431":1}}],["репозиториях",{"2":{"216":1}}],["репозитория",{"0":{"491":1},"2":{"134":1,"236":1,"255":1,"290":1,"390":1,"421":1,"425":1,"429":1,"435":4,"515":2,"516":1}}],["репозитории",{"2":{"63":1,"134":1,"161":1,"175":1,"222":1,"236":1,"242":1,"255":1,"263":1,"269":1,"289":1,"341":1,"358":1,"383":1,"406":1,"409":1,"429":2,"430":1,"433":1,"515":1}}],["репозиторий",{"0":{"74":1,"99":1},"2":{"60":1,"74":1,"91":1,"97":1,"99":1,"123":1,"353":1,"421":1,"423":1,"425":2,"428":1,"429":5,"430":1,"436":1,"444":1,"515":1}}],["ребенок",{"2":{"342":1,"343":1}}],["ребенку",{"2":{"342":1}}],["ребенка",{"2":{"250":1}}],["рендер",{"2":{"283":1}}],["рендерится",{"2":{"282":1}}],["рендеринг",{"2":{"242":1,"283":1,"384":3}}],["рендеринга",{"2":{"233":1,"235":1,"335":1,"355":1,"384":4}}],["рендерингу",{"2":{"151":1}}],["рендеринге",{"2":{"145":1,"384":1}}],["реорганизация",{"2":{"219":1}}],["редакция",{"2":{"428":1}}],["редактировать",{"2":{"427":1,"428":1}}],["редактирование",{"2":{"273":2,"274":1}}],["редактирования",{"2":{"223":1,"290":1}}],["редактируемых",{"2":{"290":1}}],["редактируем",{"2":{"218":1}}],["редакторы",{"2":{"228":1}}],["редактор",{"2":{"213":2,"422":1,"444":1}}],["редакторе",{"2":{"177":1,"444":1}}],["редких",{"2":{"300":1}}],["редкая",{"2":{"285":1}}],["редко",{"2":{"106":1,"278":2,"299":1,"315":1,"355":1}}],["речевого",{"2":{"177":1}}],["речь",{"2":{"10":1,"171":1,"256":1,"408":1,"420":1}}],["резюме",{"2":{"460":1}}],["резервировать",{"2":{"301":1}}],["резервировании",{"2":{"136":1}}],["резервируем",{"2":{"289":1}}],["результирующее",{"2":{"139":1}}],["результатом",{"2":{"251":1,"290":1,"411":1}}],["результатов",{"2":{"222":1,"291":1}}],["результаты",{"2":{"121":1,"195":1,"198":1,"214":1,"275":1,"350":1,"384":1,"426":2}}],["результат",{"2":{"107":1,"143":1,"169":1,"172":1,"195":1,"214":1,"220":1,"243":1,"244":2,"337":1,"392":1,"393":1,"395":1,"396":1,"416":1,"490":1}}],["результате",{"2":{"106":1,"135":1,"169":1,"179":1,"184":1,"203":1,"231":1,"245":2,"256":1,"272":1,"331":1,"402":1,"416":1,"417":1,"418":1,"495":1}}],["результата",{"2":{"67":1,"231":1,"247":1,"285":1,"336":2,"391":1,"396":1}}],["рейтинг",{"2":{"103":1,"266":2}}],["рейтинги",{"2":{"79":1}}],["реагирования",{"2":{"264":1}}],["реагировать",{"2":{"236":1,"345":1,"347":1,"389":1}}],["реакции",{"2":{"114":1}}],["реактивную",{"2":{"138":1,"143":2,"222":2,"284":3,"342":2,"343":2,"347":1,"349":3,"394":1,"449":1,"451":1}}],["реактивная",{"2":{"114":1,"143":1,"145":2,"289":1,"290":2,"349":1,"448":1,"451":1}}],["реактивные",{"2":{"119":1,"140":1,"143":2,"154":1,"222":2,"236":1,"276":1,"281":1,"284":1,"290":1,"349":1,"350":1,"352":3,"400":1,"448":1,"449":3,"451":2}}],["реактивный",{"2":{"114":1,"222":1,"342":1,"348":2,"350":1,"351":1,"354":1,"356":1,"358":1,"449":2,"451":2}}],["реактивных",{"0":{"114":1},"2":{"114":2,"143":1,"222":1,"263":1,"350":1,"354":1,"363":1,"395":1,"448":1,"451":1}}],["реактивным",{"2":{"113":1,"114":1,"143":2,"348":1,"356":1}}],["реактивными",{"2":{"94":1,"113":1,"114":2,"143":1,"220":1,"329":1,"352":1,"355":1,"395":1}}],["реактивного",{"0":{"348":1,"350":1},"1":{"349":1,"351":1,"352":1,"353":1,"354":1},"2":{"284":1,"325":1,"340":1,"347":1,"357":1,"358":1,"359":1,"496":1}}],["реактивное",{"2":{"273":1,"288":1,"289":1,"350":1,"357":1,"395":1}}],["реактивно",{"2":{"237":1,"350":1}}],["реактивному",{"2":{"283":1}}],["реактивном",{"2":{"139":2,"289":1,"350":1,"451":1}}],["реактивностью",{"2":{"340":1,"395":1,"451":2}}],["реактивность",{"2":{"139":1,"214":1,"274":1,"286":1,"290":1,"330":2,"331":1,"339":1,"342":2,"347":1,"451":2}}],["реактивности",{"2":{"110":1,"114":1,"116":1,"138":1,"329":2,"330":1,"348":1,"451":2,"524":1}}],["реактивной",{"2":{"93":1,"114":1,"143":1,"145":1,"184":2,"233":1,"351":1}}],["реально",{"2":{"352":1,"453":1}}],["реальности",{"2":{"250":1,"305":1}}],["реальном",{"2":{"220":1,"228":1,"239":1,"330":1,"331":1,"409":1,"419":1}}],["реальному",{"2":{"212":1}}],["реальное",{"2":{"128":1,"186":1,"199":1}}],["реальные",{"2":{"224":1,"450":1}}],["реальный",{"0":{"286":1},"1":{"287":1,"288":1,"289":1},"2":{"208":1,"407":1,"460":2}}],["реальным",{"2":{"158":1}}],["реальными",{"2":{"107":1}}],["реальных",{"2":{"139":1,"407":2,"408":1,"421":1}}],["реализовывать",{"2":{"251":1,"288":1,"292":1,"338":1,"388":1}}],["реализовывали",{"2":{"188":1}}],["реализовали",{"2":{"290":1,"328":1,"358":2}}],["реализовано",{"2":{"330":1,"342":1,"398":1,"545":1}}],["реализованного",{"2":{"254":1}}],["реализованный",{"2":{"188":1}}],["реализованные",{"2":{"161":1}}],["реализована",{"2":{"244":1,"497":1,"500":1,"507":1}}],["реализованы",{"2":{"138":1,"139":1,"251":1,"252":1,"254":1,"303":1,"349":1}}],["реализован",{"2":{"118":1,"318":1,"323":1,"328":1,"329":1,"357":1,"400":1}}],["реализовать",{"2":{"12":1,"35":1,"36":1,"40":1,"96":1,"179":1,"190":1,"226":1,"228":1,"237":1,"245":2,"248":1,"254":2,"275":1,"278":1,"321":2,"325":1,"326":1,"328":1,"329":1,"337":1,"352":1,"360":1,"382":2,"384":1,"385":1,"387":1,"401":1}}],["реализуя",{"2":{"340":1}}],["реализует",{"2":{"280":1,"327":1,"331":1,"343":1,"350":1,"501":1}}],["реализуемая",{"2":{"430":1}}],["реализуемого",{"2":{"392":1}}],["реализуемые",{"2":{"331":1}}],["реализуем",{"2":{"183":1,"284":1,"344":1,"382":2,"397":1,"399":1}}],["реализующая",{"2":{"394":2}}],["реализующих",{"2":{"216":1,"390":1,"395":1}}],["реализующий",{"2":{"175":1,"286":1,"330":1,"492":1}}],["реализуют",{"2":{"251":1,"324":1,"354":1}}],["реализуются",{"2":{"180":1}}],["реализацией",{"2":{"171":1,"244":1,"248":1,"249":1,"250":2,"290":1,"327":1,"330":1,"358":1,"527":1}}],["реализациями",{"2":{"406":1}}],["реализациях",{"2":{"236":1}}],["реализация",{"0":{"289":1,"290":1,"313":1,"345":1,"348":1,"350":1,"385":1},"1":{"314":1,"315":1,"346":1,"347":1,"349":1,"351":1,"352":1,"353":1,"354":1,"386":1,"387":1,"391":1,"392":1,"393":1,"395":1,"396":1,"397":1,"398":1,"399":1,"400":1,"402":1},"2":{"116":1,"134":1,"176":1,"181":1,"183":1,"192":1,"229":1,"239":1,"244":1,"250":1,"263":1,"290":1,"303":1,"305":1,"313":1,"314":1,"325":1,"326":3,"327":1,"328":1,"329":1,"337":1,"340":3,"344":1,"345":1,"347":1,"348":1,"355":1,"389":1,"390":1,"391":1,"394":2,"395":1,"397":1,"399":1,"448":1,"525":1}}],["реализаций",{"2":{"114":1,"183":1,"265":1,"315":1,"316":1,"334":2}}],["реализации",{"0":{"502":1},"1":{"503":1,"504":1},"2":{"39":1,"76":1,"109":1,"111":1,"116":1,"151":1,"158":1,"167":1,"180":1,"184":1,"192":1,"210":1,"212":1,"237":1,"242":1,"244":1,"245":2,"248":1,"251":1,"258":1,"264":2,"269":1,"271":1,"272":1,"274":1,"275":1,"281":1,"290":3,"293":1,"294":2,"305":1,"310":1,"313":1,"314":1,"318":1,"320":2,"321":1,"322":1,"323":1,"324":1,"325":2,"327":1,"329":1,"340":2,"342":1,"345":1,"347":1,"349":1,"350":1,"355":2,"359":1,"371":1,"373":1,"377":1,"384":1,"388":2,"390":1,"397":2,"401":1,"403":1,"408":1,"420":1,"430":2,"448":2,"458":1,"543":1}}],["реализацию",{"2":{"16":1,"41":1,"69":1,"114":1,"180":1,"218":1,"244":1,"248":1,"281":1,"289":1,"293":1,"302":1,"305":1,"315":1,"321":2,"326":1,"328":1,"338":1,"343":1,"355":1,"357":1,"387":1,"403":1,"453":1}}],["релевантные",{"2":{"107":1}}],["релиз",{"2":{"86":1,"423":1}}],["реляционных",{"2":{"43":1,"44":1,"47":1,"48":1}}],["реляционные",{"2":{"17":2}}],["реляционную",{"2":{"39":1}}],["ресурсе",{"2":{"486":1}}],["ресурсом",{"2":{"329":1,"384":1}}],["ресурсов",{"2":{"108":2,"210":1,"218":1,"286":1,"387":1,"436":1,"440":1,"461":1,"543":1,"544":1}}],["ресурсу",{"2":{"106":1,"108":2,"312":1}}],["ресурса",{"0":{"483":1},"2":{"440":1}}],["ресурсами",{"2":{"107":1,"245":1,"384":1,"440":1,"461":2}}],["ресурсам",{"2":{"106":1,"128":2,"311":1,"440":1}}],["ресурсах",{"0":{"0":1}}],["ресурс",{"2":{"106":2,"108":2,"281":1,"286":1,"289":3,"460":1}}],["ресурсы",{"0":{"440":1},"1":{"441":1,"442":1},"2":{"86":1,"128":2,"215":2,"301":1,"335":1,"384":1,"408":1,"414":1,"436":4,"440":4,"443":1,"460":1,"527":1}}],["режимы",{"2":{"256":1}}],["режим",{"2":{"118":2,"127":3,"128":1,"132":1,"233":1}}],["режимов",{"2":{"118":1}}],["режима",{"2":{"108":1,"126":1,"127":1,"136":1,"219":1,"497":1}}],["режимах",{"2":{"86":1,"534":3,"536":2}}],["режиме",{"2":{"12":1,"86":1,"118":1,"126":1,"127":2,"130":1,"137":1,"177":1,"181":1,"215":1,"259":1,"265":1,"337":1,"435":1,"444":2,"449":2,"450":1,"542":1}}],["регулярный",{"0":{"455":1}}],["регулярных",{"2":{"242":1}}],["регулировать",{"2":{"438":1}}],["регулирования",{"2":{"251":1}}],["регулируется",{"2":{"58":1,"125":1}}],["регистрируя",{"2":{"325":1}}],["регистрирует",{"2":{"451":1}}],["регистрируется",{"2":{"326":1}}],["регистрируете",{"2":{"301":1}}],["регистрируем",{"2":{"112":1,"236":1,"263":2,"264":2,"289":1,"301":1,"347":1}}],["регистрировать",{"2":{"277":1,"286":2,"331":1}}],["регистре",{"2":{"153":1,"154":1,"221":1}}],["регистра",{"2":{"155":1}}],["регистраторе",{"2":{"125":1}}],["регистратора",{"2":{"125":3}}],["регистраторы",{"2":{"125":2}}],["регистратором",{"2":{"125":1}}],["регистрацию",{"2":{"301":1}}],["регистрация",{"0":{"112":1},"2":{"277":1}}],["регистрации",{"2":{"57":1,"110":1,"122":1,"197":2,"236":1,"264":1,"277":1,"289":1,"290":1,"299":4,"301":1,"321":2,"323":1,"325":1,"326":1,"533":1}}],["регистр",{"2":{"44":1,"221":3}}],["решил",{"2":{"421":1}}],["решили",{"2":{"278":1,"391":1,"452":3}}],["решит",{"2":{"384":1}}],["решить",{"2":{"126":1,"177":1,"228":1,"242":1,"251":1,"340":1,"384":1,"435":1,"440":1}}],["решетку",{"2":{"236":1}}],["решетки",{"2":{"233":1}}],["решен",{"2":{"384":1}}],["решена",{"2":{"12":1,"113":1,"188":1}}],["решении",{"2":{"495":1}}],["решению",{"2":{"349":1,"363":1}}],["решением",{"2":{"76":1,"79":1,"107":1,"249":1,"354":1,"405":1,"413":1,"420":1,"438":1,"444":1}}],["решение",{"2":{"12":2,"13":1,"58":1,"61":1,"68":1,"81":1,"107":1,"108":2,"109":1,"118":1,"139":1,"163":1,"192":1,"203":1,"236":1,"249":1,"251":1,"275":5,"284":1,"305":1,"331":1,"342":1,"363":1,"389":1,"408":1,"451":1,"460":1,"495":1}}],["решений",{"2":{"10":1,"12":1,"22":1,"39":1,"41":1,"63":1,"68":3,"275":1,"435":1,"461":1}}],["решениями",{"2":{"183":1}}],["решениях",{"2":{"16":1}}],["решения",{"0":{"10":1,"436":1},"1":{"437":1,"438":1},"2":{"9":1,"10":1,"14":1,"39":1,"61":2,"68":1,"151":1,"170":2,"172":1,"184":1,"188":1,"189":1,"245":1,"251":2,"273":1,"281":1,"282":1,"294":4,"299":1,"305":1,"326":1,"336":1,"391":1,"392":1,"407":1,"420":1,"421":1,"461":1,"495":2}}],["решётки",{"2":{"140":1}}],["решат",{"2":{"384":1}}],["решать",{"2":{"320":1,"398":1}}],["решают",{"2":{"306":1,"449":1}}],["решали",{"2":{"138":1}}],["решает",{"2":{"106":1,"139":1,"184":1,"260":1,"299":1,"449":1}}],["решаем",{"2":{"12":1,"273":1}}],["реквизите",{"2":{"239":1}}],["реквизиты",{"2":{"115":1}}],["рекламных",{"2":{"453":1}}],["рекламные",{"2":{"4":1,"208":1}}],["рекламодателям",{"2":{"209":1}}],["рекламодателями",{"2":{"206":1}}],["рекламы",{"2":{"208":2}}],["реклама",{"0":{"208":1}}],["рекламируемым",{"2":{"206":1}}],["рекомендовал",{"2":{"261":1}}],["рекомендует",{"2":{"444":1}}],["рекомендуется",{"0":{"260":1},"2":{"114":1,"134":1,"135":1,"180":1,"181":1,"213":1,"215":1,"221":1,"245":1,"263":1,"277":1,"284":1,"300":1,"320":3,"355":1,"365":1,"384":3,"394":1,"397":1,"425":1,"439":1,"443":1,"501":1,"545":1}}],["рекомендуемые",{"2":{"261":1}}],["рекомендуемым",{"2":{"258":1,"422":1}}],["рекомендуемой",{"2":{"213":1}}],["рекомендуются",{"2":{"448":1}}],["рекомендую",{"2":{"197":1,"213":2,"242":1,"283":1,"344":1,"354":1,"357":1,"527":1}}],["рекомендацией",{"2":{"408":1}}],["рекомендациям",{"2":{"217":1,"289":1}}],["рекомендациях",{"2":{"136":1}}],["рекомендации",{"2":{"133":1,"216":1,"224":1,"294":1,"295":1}}],["рекомендаций",{"2":{"4":1,"152":1}}],["реконнект",{"2":{"109":1}}],["равенства",{"2":{"411":1}}],["равным",{"2":{"239":1}}],["равных",{"2":{"210":1}}],["равна",{"2":{"146":1}}],["равно",{"2":{"143":1,"146":1,"169":1,"259":1,"321":1,"335":1,"460":1}}],["рамок",{"2":{"256":1}}],["рамками",{"2":{"142":1,"272":1}}],["рамках",{"2":{"139":1,"144":1,"220":1,"264":1,"281":1,"286":1,"292":1,"397":1,"408":1}}],["рамки",{"2":{"134":1,"138":1,"139":1,"176":1,"194":1,"216":1,"244":1,"248":1,"251":2,"265":1,"271":1,"299":1,"301":1,"302":1,"304":1,"429":2}}],["радужно",{"2":{"218":1,"228":1}}],["радует",{"2":{"191":1}}],["ради",{"2":{"213":1}}],["радиус",{"2":{"182":1}}],["радиокнопки",{"0":{"175":1},"2":{"175":2}}],["ранней",{"2":{"420":1}}],["ранних",{"2":{"407":1}}],["рано",{"2":{"169":1,"453":1}}],["ранее",{"2":{"132":1,"142":1,"217":1,"222":1,"236":1,"248":1,"250":2,"256":1,"290":1,"292":1,"326":1,"331":1,"340":2,"342":1,"382":1,"389":1,"390":2,"394":1,"398":1,"415":1,"430":1,"435":1}}],["раньше",{"2":{"12":1,"214":1,"231":1,"336":3,"337":1,"348":1,"384":1,"407":1,"444":1}}],["рабочая",{"2":{"342":1}}],["рабочим",{"0":{"390":1},"1":{"391":1,"392":1,"393":1},"2":{"342":1,"397":1}}],["рабочие",{"2":{"297":1}}],["рабочих",{"2":{"204":1,"210":1,"245":1,"264":1}}],["рабочий",{"2":{"117":1,"127":1,"136":1,"141":1,"250":1,"251":2,"263":1,"264":2,"289":1,"372":1,"389":1,"390":1,"430":1,"432":1,"433":2}}],["рабочей",{"2":{"212":1}}],["рабочему",{"2":{"302":1,"393":1,"400":1}}],["рабочем",{"2":{"179":1,"181":1,"244":1,"245":1,"259":1,"379":1,"407":1,"408":1}}],["рабочего",{"0":{"212":1,"372":1},"1":{"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"223":1,"224":1,"225":1},"2":{"110":1,"111":1,"117":1,"140":1,"141":1,"142":1,"143":1,"179":1,"181":1,"245":2,"248":1,"249":1,"250":1,"264":1,"265":3,"269":1,"270":1,"277":1,"287":1,"326":1,"336":1,"340":1,"341":1,"408":1,"430":2}}],["рабочее",{"2":{"79":1}}],["работник",{"2":{"390":2}}],["работнику",{"2":{"264":1}}],["работника",{"2":{"264":3}}],["работоспособного",{"2":{"495":1}}],["работоспособный",{"2":{"245":1}}],["работоспособен",{"2":{"214":1}}],["работе",{"2":{"41":2,"93":1,"96":1,"114":1,"151":1,"159":1,"166":1,"213":1,"218":1,"234":1,"245":1,"264":1,"268":1,"290":1,"305":1,"347":1,"444":2,"451":2,"495":1}}],["работала",{"2":{"326":1}}],["работало",{"2":{"223":1,"315":1}}],["работали",{"2":{"143":1,"299":1,"301":1}}],["работающую",{"2":{"492":1}}],["работающее",{"2":{"409":1}}],["работающего",{"2":{"255":1,"496":1}}],["работающей",{"2":{"202":1,"225":1}}],["работающими",{"2":{"267":1}}],["работающий",{"2":{"213":1,"216":1,"316":1}}],["работающих",{"2":{"209":1,"228":1,"236":1,"303":1}}],["работают",{"2":{"107":1,"142":1,"163":1,"213":1,"235":1,"251":1,"252":1,"301":1,"303":1,"310":1,"331":1,"335":1,"382":1,"384":1,"391":1,"416":1,"449":1,"541":1}}],["работаем",{"2":{"94":1,"429":1}}],["работаете",{"2":{"167":2,"425":1}}],["работает",{"2":{"50":1,"67":1,"100":1,"106":2,"121":1,"134":1,"181":1,"214":2,"222":2,"223":1,"233":1,"245":1,"251":1,"285":1,"290":1,"296":1,"314":1,"324":1,"328":1,"329":1,"330":2,"342":2,"345":1,"347":1,"392":1,"393":2,"410":1,"411":2,"429":1,"444":1,"448":3,"451":1,"453":1,"460":1,"461":2,"527":1}}],["работа",{"0":{"50":1,"429":1},"2":{"38":1,"122":1,"323":1,"397":1,"425":1,"428":1,"429":2}}],["работать",{"2":{"2":1,"25":1,"50":1,"58":1,"93":1,"107":1,"109":1,"139":1,"141":1,"151":1,"215":2,"218":1,"220":1,"231":1,"242":1,"256":3,"263":1,"264":1,"276":1,"285":1,"292":1,"324":1,"329":1,"338":1,"349":1,"355":1,"365":1,"384":1,"394":2,"402":1,"429":2,"436":1,"444":2,"449":1,"461":1}}],["работу",{"2":{"23":1,"47":1,"68":1,"213":1,"251":2,"252":1,"289":1,"290":1,"347":2,"349":1,"355":1,"372":1,"382":1,"383":1,"384":1,"387":2,"420":1,"426":1,"438":1,"450":1}}],["работы",{"0":{"65":1,"173":1},"1":{"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1},"2":{"12":1,"17":1,"23":1,"50":1,"62":1,"67":1,"93":1,"106":1,"107":1,"108":1,"134":1,"139":1,"142":1,"150":1,"158":1,"159":1,"184":1,"210":1,"213":2,"214":2,"217":1,"220":2,"222":1,"226":1,"244":1,"249":1,"250":1,"255":1,"256":1,"264":4,"289":1,"290":1,"291":1,"302":1,"304":1,"334":1,"337":2,"343":1,"355":1,"382":1,"384":3,"385":1,"389":1,"395":3,"404":1,"410":1,"411":1,"425":1,"429":1,"440":1,"445":1,"446":1,"461":2,"484":3,"544":1}}],["расшаривать",{"2":{"449":1}}],["расшифровывается",{"2":{"243":1,"274":1}}],["расширим",{"2":{"388":1,"394":1}}],["расширили",{"2":{"292":1}}],["расширить",{"2":{"22":1,"291":1,"460":1}}],["расширено",{"2":{"355":1}}],["расширенные",{"2":{"283":1}}],["расширенными",{"2":{"269":1}}],["расширений",{"2":{"444":1}}],["расширении",{"2":{"365":1,"451":1}}],["расширениями",{"2":{"498":1}}],["расширения",{"0":{"527":1},"2":{"108":1,"209":1,"298":1,"331":1,"354":1,"444":2,"448":1,"527":1}}],["расширением",{"2":{"142":1,"215":1}}],["расширение",{"2":{"81":1,"96":1,"258":1,"355":2,"410":1,"527":2,"533":1}}],["расширяет",{"2":{"331":1,"380":1}}],["расширяемость",{"2":{"77":1,"459":1}}],["расширять",{"2":{"18":1,"139":1,"286":1,"431":1,"443":1}}],["расхождения",{"2":{"428":1}}],["расходов",{"2":{"205":1}}],["расходы",{"0":{"205":1},"2":{"348":1}}],["расчеты",{"2":{"355":1}}],["расчетом",{"2":{"12":1}}],["растут",{"2":{"420":1}}],["растущая",{"2":{"216":1}}],["растущим",{"2":{"125":1}}],["растет",{"2":{"290":1}}],["раскрывающимся",{"2":{"515":1}}],["раскрывая",{"2":{"415":1}}],["раскрывается",{"2":{"205":1,"245":1,"328":1}}],["раскрывает",{"2":{"140":1,"329":1,"397":1}}],["раскадровки",{"2":{"167":1}}],["рассказывали",{"2":{"398":1}}],["рассказывается",{"2":{"371":1}}],["рассказано",{"2":{"149":1}}],["рассказать",{"2":{"139":1,"216":1}}],["рассуждений",{"2":{"305":1}}],["рассчитывал",{"2":{"205":1}}],["рассчитать",{"2":{"181":1}}],["рассылку",{"2":{"199":3}}],["расстояния",{"2":{"169":1}}],["расстояние",{"0":{"167":1},"2":{"169":2}}],["рассматривали",{"2":{"196":1,"220":1,"345":1,"356":1,"389":1}}],["рассматривается",{"2":{"363":1,"400":1}}],["рассматривает",{"2":{"297":1,"461":1}}],["рассматриваете",{"2":{"26":1}}],["рассматриваемое",{"2":{"365":1}}],["рассматриваем",{"2":{"248":1,"321":1}}],["рассматриваемый",{"2":{"184":1}}],["рассматриваются",{"2":{"113":1,"115":1,"133":1,"138":1,"161":1,"394":1}}],["рассматриваться",{"2":{"140":1}}],["рассматривать",{"2":{"43":1,"131":1,"141":1,"143":1,"163":1,"191":1,"192":1,"228":1,"242":1,"272":1,"283":1,"284":1,"290":1,"297":1,"298":1,"300":1,"331":1,"349":1,"384":1,"388":2,"389":1}}],["рассмотрите",{"2":{"216":1,"438":1}}],["рассмотрим",{"2":{"10":1,"66":1,"110":1,"124":1,"125":1,"126":1,"132":1,"138":1,"139":1,"140":1,"142":2,"143":1,"144":1,"149":1,"151":2,"160":1,"163":1,"164":1,"166":1,"172":1,"191":1,"194":1,"198":1,"214":1,"215":2,"219":1,"223":1,"224":1,"226":1,"228":2,"230":1,"233":1,"236":2,"239":2,"244":1,"245":4,"249":1,"250":1,"251":2,"257":1,"262":1,"263":3,"264":1,"269":2,"273":1,"276":1,"278":1,"280":3,"283":4,"285":1,"290":1,"294":1,"297":1,"301":1,"302":1,"305":2,"310":1,"313":1,"322":1,"323":1,"324":1,"325":1,"326":2,"329":2,"330":1,"331":2,"332":1,"335":1,"336":2,"340":1,"341":1,"348":1,"354":1,"355":1,"359":1,"382":2,"397":1,"400":1,"403":1,"405":1,"407":1,"408":2,"415":1,"416":1,"417":1,"418":1,"429":1}}],["рассмотренные",{"2":{"349":1,"390":1}}],["рассмотренными",{"2":{"337":1}}],["рассмотренных",{"2":{"191":1,"216":1,"388":1,"430":1}}],["рассмотрении",{"2":{"264":1,"325":1}}],["рассмотрению",{"2":{"213":1,"251":1}}],["рассмотрение",{"2":{"163":1,"265":1,"267":1}}],["рассмотрены",{"2":{"39":1,"331":1}}],["рассмотрели",{"2":{"136":2,"210":2,"253":1,"264":1,"267":2,"276":1,"279":1,"286":1,"290":1,"292":2,"326":1,"329":1,"338":1,"354":1,"359":1,"390":1,"403":1,"413":1,"431":1}}],["рассмотреть",{"2":{"133":1,"215":1,"242":1,"243":1,"251":1,"262":1,"263":1,"290":1,"388":1,"419":1}}],["распознаваемых",{"2":{"238":1}}],["расползлись",{"2":{"449":1}}],["располнела",{"2":{"448":1,"524":1}}],["распологаются",{"2":{"215":1}}],["расположены",{"2":{"503":1}}],["расположенных",{"2":{"281":1}}],["расположенные",{"2":{"255":1}}],["расположенное",{"2":{"196":1}}],["расположена",{"2":{"163":1}}],["расположению",{"2":{"186":1}}],["расположении",{"2":{"171":1}}],["расположения",{"2":{"131":1,"132":1,"165":1,"194":1}}],["расположение",{"2":{"36":1,"131":1,"195":1,"217":1}}],["расположить",{"2":{"36":1}}],["располагались",{"2":{"459":1}}],["располагать",{"2":{"417":1}}],["располагаться",{"2":{"126":1,"128":1,"169":1,"258":1}}],["располагает",{"2":{"218":1}}],["располагается",{"2":{"111":1,"131":1,"169":1,"334":1}}],["располагаются",{"2":{"194":1,"290":1}}],["распределение",{"2":{"461":1}}],["распределения",{"2":{"215":1,"322":1}}],["распределенная",{"2":{"421":1,"428":1}}],["распределенности",{"2":{"421":1}}],["распределенными",{"2":{"251":1}}],["распределенные",{"2":{"251":1}}],["распределенных",{"2":{"228":1,"251":2,"303":1}}],["распределяются",{"2":{"106":1}}],["распространяемы",{"2":{"496":1}}],["распространяется",{"2":{"300":1,"349":1}}],["распространяться",{"2":{"350":1}}],["распространять",{"2":{"256":1}}],["распространяются",{"2":{"172":1}}],["распространяющихся",{"2":{"142":1}}],["распространены",{"2":{"460":1}}],["распространенного",{"2":{"459":1}}],["распространенность",{"2":{"451":1}}],["распространенной",{"2":{"249":1,"378":1}}],["распространенными",{"2":{"138":1,"160":1,"244":1,"248":1,"256":1,"264":1}}],["распространенных",{"2":{"128":1,"210":1,"215":1,"258":1,"397":2,"409":1,"496":1}}],["распространенные",{"2":{"125":1,"128":1,"137":1,"160":1,"176":1,"354":1,"427":1,"451":1}}],["распространенный",{"2":{"9":1,"106":1,"311":1,"429":1}}],["распространение",{"2":{"228":1,"256":1,"347":1}}],["распространения",{"2":{"140":1,"342":1}}],["распространен",{"2":{"140":1,"195":2,"333":1}}],["раза",{"2":{"449":1}}],["разумеется",{"2":{"389":1}}],["разумными",{"2":{"265":1}}],["разумным",{"2":{"194":1}}],["разграничению",{"2":{"359":1}}],["разгрузки",{"2":{"328":1}}],["разговаривать",{"2":{"210":1}}],["разочаровавшись",{"2":{"421":1}}],["разочарованию",{"2":{"250":1}}],["разобщенности",{"2":{"382":1}}],["разобрались",{"2":{"391":1}}],["разобрать",{"2":{"278":1,"396":1}}],["разобраться",{"2":{"226":1}}],["разобран",{"2":{"215":1}}],["разобьем",{"2":{"88":1,"222":1}}],["разбора",{"2":{"392":1}}],["разбрасывать",{"2":{"301":1}}],["разбросаны",{"2":{"290":1}}],["разблокировав",{"2":{"244":1}}],["разберет",{"2":{"214":1}}],["разбиения",{"2":{"451":2}}],["разбиение",{"0":{"4":1},"2":{"2":1,"41":1,"79":1,"278":1}}],["разбили",{"2":{"290":1}}],["разбираться",{"2":{"235":1,"236":1,"461":1}}],["разбивается",{"2":{"436":1}}],["разбивает",{"2":{"297":1}}],["разбивайте",{"2":{"170":1}}],["разбивать",{"2":{"2":1,"3":1}}],["разбивка",{"2":{"14":1,"272":1}}],["разбитым",{"2":{"460":1}}],["разбить",{"2":{"4":1}}],["разбита",{"2":{"2":1}}],["размонтированием",{"2":{"236":1,"301":1}}],["размонтировании",{"2":{"151":1}}],["размышления",{"0":{"126":1},"1":{"127":1},"2":{"304":1}}],["разместили",{"2":{"165":1}}],["разместим",{"2":{"142":1,"221":1,"222":1,"410":2}}],["разместить",{"2":{"102":1,"236":1,"301":1,"417":1,"439":3}}],["разметки",{"2":{"138":1}}],["размеров",{"2":{"162":1,"284":1}}],["размер",{"2":{"143":1,"169":1,"218":1,"229":1,"233":1,"278":1,"355":1,"440":2,"453":1}}],["размеру",{"2":{"125":1,"194":1}}],["размерам",{"2":{"256":1}}],["размерами",{"2":{"194":1,"259":1,"261":1}}],["размера",{"2":{"116":1,"121":1,"139":3,"164":1,"169":1,"183":1,"189":1,"194":1,"278":1,"301":2,"354":1,"440":1}}],["размещали",{"2":{"215":1}}],["размещает",{"2":{"208":1}}],["размещается",{"2":{"194":1,"195":1,"196":2,"258":1,"263":1}}],["размещаем",{"2":{"132":2,"222":1,"290":1}}],["размещаемый",{"2":{"128":1}}],["размещаются",{"2":{"186":1,"215":1}}],["размещайте",{"2":{"167":1}}],["размещать",{"2":{"58":1,"119":1,"125":1,"183":1,"187":1,"215":2,"222":1,"287":1,"410":1}}],["размещена",{"2":{"410":1}}],["размещенный",{"2":{"264":1,"418":1}}],["размещенное",{"2":{"186":1}}],["размещены",{"2":{"216":1,"230":1,"273":1}}],["размещению",{"2":{"410":1}}],["размещение",{"0":{"186":1},"2":{"165":1,"186":1,"195":1,"196":1,"208":1,"416":1}}],["размещении",{"2":{"132":1,"196":1}}],["размещения",{"2":{"107":1,"122":1,"129":1,"140":1,"196":1,"214":1,"429":1,"430":1,"439":1,"461":1,"515":1}}],["размещен",{"2":{"127":1,"214":1,"215":1,"263":2,"357":1,"428":1}}],["размещено",{"2":{"125":2,"126":2,"130":1,"140":1}}],["разная",{"2":{"402":1}}],["разному",{"2":{"278":1,"461":1}}],["разнообразные",{"2":{"228":1}}],["разного",{"2":{"189":1,"451":1}}],["разным",{"2":{"421":1,"428":1}}],["разными",{"2":{"328":1,"420":1}}],["разных",{"2":{"108":1,"183":1,"213":1,"256":1,"302":1,"310":1,"417":1,"437":1,"449":1,"452":1,"470":1,"522":1,"543":1}}],["разный",{"2":{"106":1}}],["разные",{"0":{"143":1},"2":{"106":1,"165":1,"195":1,"239":1,"265":1,"275":1,"347":1,"420":2,"421":1,"443":1,"452":1,"461":1,"533":1}}],["разницей",{"2":{"147":1,"331":1}}],["разницу",{"2":{"114":1,"336":1}}],["разницы",{"2":{"106":1}}],["разница",{"2":{"22":1,"139":1,"159":1,"268":1,"339":1,"360":1,"402":1,"415":1,"460":1}}],["раздувать",{"2":{"503":1}}],["раздутому",{"2":{"67":1}}],["раздаются",{"2":{"461":1}}],["раздражения",{"2":{"207":1}}],["разделить",{"2":{"278":1,"297":2,"299":1}}],["разделив",{"2":{"139":1}}],["разделяемые",{"2":{"350":1}}],["разделяет",{"2":{"274":1,"331":1,"342":1}}],["разделяется",{"2":{"245":1,"350":1}}],["разделять",{"2":{"292":1,"449":1}}],["разделяй",{"2":{"2":1}}],["разделу",{"2":{"239":1}}],["разделом",{"2":{"194":1,"290":1}}],["разделов",{"2":{"180":1,"191":1}}],["разделами",{"2":{"354":1}}],["разделам",{"2":{"186":1}}],["разделах",{"2":{"142":1,"198":1,"233":1,"470":1}}],["раздела",{"2":{"142":1,"164":1,"196":2,"289":1,"350":1}}],["раздел",{"2":{"127":1,"194":1,"196":4,"216":1,"218":1,"222":1,"258":1,"289":1,"358":1,"515":1}}],["разделенной",{"2":{"396":1}}],["разделенные",{"2":{"125":1,"221":1,"245":1}}],["разделенных",{"2":{"108":1,"125":2,"126":1}}],["разделена",{"2":{"297":1}}],["разделению",{"2":{"229":1}}],["разделения",{"2":{"142":1,"187":1,"297":2,"303":1}}],["разделение",{"0":{"297":1},"2":{"34":1,"183":1,"294":1,"297":2,"299":1,"325":1,"388":1,"459":1}}],["разделе",{"2":{"108":1,"140":1,"150":1,"214":1,"221":1,"236":1,"242":1,"255":1,"264":1,"276":1,"280":1,"286":1,"301":1,"408":1,"418":1,"448":1,"515":3}}],["разделы",{"2":{"106":1,"180":1,"194":1,"272":1}}],["различающихся",{"2":{"449":1}}],["различаются",{"2":{"296":1}}],["различают",{"2":{"44":1}}],["различать",{"2":{"335":1}}],["различается",{"2":{"283":1}}],["различия",{"2":{"160":1,"242":1,"428":1}}],["различие",{"0":{"164":1},"2":{"138":1,"139":1,"175":1}}],["различный",{"2":{"142":1}}],["различные",{"2":{"138":2,"183":1,"219":1,"226":1,"242":1,"251":1,"256":3,"336":1,"359":1,"398":1,"405":1,"424":1,"533":2}}],["различных",{"2":{"136":1,"138":1,"180":1,"219":1,"226":1,"231":1,"244":1,"245":1,"253":1,"256":3,"259":1,"265":1,"275":1,"279":1,"315":1,"329":1,"355":1,"384":1,"407":2,"411":1,"420":1,"460":1,"532":1,"533":1}}],["различным",{"2":{"35":1,"41":1,"186":1,"256":1,"304":1}}],["различными",{"2":{"30":1,"107":1,"189":1,"194":1,"218":1,"226":1,"245":1,"269":1,"290":1,"297":1,"328":1,"411":1,"451":1}}],["различного",{"2":{"79":1}}],["развертываемого",{"2":{"496":1}}],["развертывании",{"2":{"217":1}}],["развертыванию",{"2":{"127":1}}],["развертывания",{"0":{"126":1,"514":1},"1":{"127":1,"515":1,"516":1},"2":{"76":1,"118":1,"122":1,"136":1,"219":1,"254":1,"433":1,"435":1}}],["развертыванием",{"2":{"215":1,"435":1}}],["развертывание",{"0":{"70":1,"122":1,"379":1},"1":{"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1},"2":{"66":1,"70":1,"219":1,"233":1,"257":1,"430":1}}],["разветвление",{"2":{"421":1}}],["разветвлять",{"2":{"421":1}}],["разве",{"2":{"384":1}}],["разворачивать",{"2":{"301":1}}],["разворачивание",{"2":{"40":1}}],["развивается",{"2":{"451":1}}],["развиваться",{"2":{"272":1,"299":1}}],["развиваются",{"2":{"212":1}}],["развитие",{"0":{"483":1},"2":{"304":1,"388":1}}],["развитием",{"2":{"228":1}}],["развитии",{"2":{"228":1}}],["развития",{"0":{"79":1},"2":{"10":1,"62":1,"138":1,"256":1,"495":1}}],["развитый",{"2":{"228":1}}],["раз",{"0":{"283":1},"2":{"27":1,"106":3,"136":1,"139":1,"143":1,"145":1,"184":1,"205":1,"218":1,"236":1,"263":1,"277":1,"303":1,"311":1,"314":1,"315":1,"320":1,"340":1,"352":1,"411":2,"416":1,"443":2,"449":1,"461":1}}],["разряда",{"2":{"456":1}}],["разрядной",{"2":{"213":1}}],["разрывные",{"2":{"405":1}}],["разрушить",{"2":{"340":1}}],["разрешив",{"2":{"392":1}}],["разрешили",{"2":{"461":1}}],["разрешил",{"2":{"129":1}}],["разрешить",{"2":{"58":1,"244":1,"391":1,"402":1}}],["разрешающийся",{"2":{"243":1}}],["разрешается",{"2":{"278":1,"288":1,"400":1}}],["разрешает",{"2":{"108":1,"238":1}}],["разрешаться",{"2":{"396":1}}],["разрешать",{"2":{"106":1,"429":1}}],["разрешено",{"2":{"337":1,"428":1}}],["разрешен",{"2":{"108":3}}],["разрешений",{"2":{"452":1,"506":1}}],["разрешение",{"2":{"106":2,"179":1,"251":1,"289":1,"335":1,"393":1,"428":1}}],["разрешениях",{"2":{"504":1}}],["разрешениям",{"2":{"194":1}}],["разрешения",{"2":{"23":1,"106":1,"251":1,"289":2,"391":1,"396":1,"413":1,"429":1}}],["разрабатываешь",{"2":{"452":1}}],["разрабатывается",{"2":{"194":1}}],["разрабатываемые",{"2":{"436":1}}],["разрабатываемого",{"2":{"433":1}}],["разрабатываем",{"2":{"6":1}}],["разрабатывать",{"2":{"68":1,"162":1,"436":1,"451":1,"461":1}}],["разработаем",{"2":{"220":1}}],["разработать",{"2":{"220":1}}],["разработанный",{"2":{"410":1}}],["разработанной",{"2":{"405":1}}],["разработан",{"2":{"139":1}}],["разработана",{"2":{"118":1}}],["разработчику",{"2":{"420":1,"459":1,"460":1,"492":1,"495":1}}],["разработчики",{"2":{"304":1,"334":1,"365":1,"430":1,"459":2}}],["разработчиком",{"2":{"259":1,"380":1,"460":3}}],["разработчиков",{"2":{"2":1,"152":1,"213":1,"218":1,"219":1,"251":1,"252":1,"281":1,"315":1,"364":1,"381":1,"420":3,"421":1,"450":1,"460":1,"485":1}}],["разработчик",{"2":{"67":1,"107":1,"139":1,"197":1,"210":1,"294":1,"449":1,"495":1}}],["разработчиками",{"2":{"160":1}}],["разработчикам",{"2":{"67":1,"407":3,"438":1,"496":2}}],["разработчика",{"2":{"23":1,"140":1,"214":1,"215":1,"251":1,"262":2,"265":1,"266":3,"334":1,"349":1,"354":2,"358":1,"365":1,"384":2,"405":2,"411":2,"420":1,"431":1,"449":2,"458":1,"460":1,"484":1,"500":1}}],["разработкой",{"2":{"68":1,"407":1,"427":1,"450":1}}],["разработка",{"0":{"69":1},"2":{"60":1,"66":2,"69":1,"79":1,"219":1,"225":1,"244":1,"256":1,"294":1,"420":1,"450":1,"467":1,"470":1,"472":1,"473":1}}],["разработки",{"0":{"66":1},"2":{"17":1,"60":1,"68":2,"100":1,"117":1,"139":2,"143":1,"212":1,"213":1,"214":4,"215":3,"217":1,"218":1,"219":3,"222":1,"264":1,"277":1,"294":1,"300":1,"301":1,"303":1,"304":1,"305":1,"334":1,"338":1,"373":1,"405":2,"407":1,"408":1,"410":1,"419":2,"421":1,"436":1,"439":1,"444":3,"448":1,"449":1,"450":1,"451":1,"452":1,"460":1,"495":1}}],["разработку",{"2":{"3":1,"68":1,"139":1,"162":1,"252":1,"294":1,"451":1,"459":2}}],["разработке",{"0":{"532":1},"2":{"3":1,"62":1,"76":3,"108":1,"159":1,"167":1,"213":1,"214":1,"218":1,"225":1,"228":1,"294":1,"295":1,"303":1,"305":1,"359":1,"364":1,"397":1,"408":1,"444":1,"461":1}}],["геттеров",{"2":{"449":1}}],["геттерами",{"2":{"352":1,"449":1}}],["геймификации",{"2":{"197":1}}],["героической",{"2":{"196":1}}],["героический",{"2":{"196":1}}],["герой",{"2":{"196":1}}],["генерация",{"2":{"443":1,"461":1}}],["генерации",{"2":{"184":1,"228":1,"265":1,"461":1}}],["генерируется",{"2":{"249":1,"396":1,"461":1}}],["генерируемые",{"2":{"228":1}}],["генерируемыми",{"2":{"228":1}}],["генерируют",{"2":{"215":1}}],["генерировать",{"2":{"183":1,"265":1,"435":1}}],["генерить",{"2":{"461":1}}],["генерит",{"2":{"52":1,"81":2,"106":2}}],["гениальное",{"2":{"2":1}}],["гигантский",{"2":{"349":1}}],["гибче",{"2":{"449":1}}],["гибки",{"2":{"451":1}}],["гибкая",{"2":{"349":1,"355":1}}],["гибкой",{"2":{"345":1}}],["гибкости",{"2":{"131":1,"282":1}}],["гибкость",{"2":{"40":1,"109":1,"139":1,"219":1,"336":1,"449":1}}],["гибридных",{"2":{"233":1,"245":1,"355":1}}],["гибридные",{"2":{"228":1}}],["гипертекста",{"2":{"138":1}}],["гуглить",{"2":{"107":2,"460":1}}],["греется",{"2":{"444":1}}],["громоздка",{"2":{"397":1}}],["громоздким",{"2":{"151":1,"264":1,"355":1}}],["грязно",{"2":{"344":1}}],["грубый",{"2":{"271":1}}],["грубое",{"2":{"297":1}}],["грубого",{"2":{"292":1}}],["грубо",{"2":{"106":1,"108":1,"452":1}}],["групповой",{"2":{"304":1}}],["группу",{"2":{"220":1,"411":1}}],["группах",{"2":{"304":1}}],["группами",{"2":{"222":1}}],["группа",{"2":{"190":1,"191":1,"222":1}}],["группировки",{"2":{"190":1,"272":2,"301":1}}],["группе",{"2":{"166":2,"220":1,"254":1,"411":1}}],["группы",{"0":{"167":1},"2":{"125":1,"170":1,"175":1,"222":1,"243":1,"407":1,"411":1,"415":1}}],["групп",{"2":{"125":1,"166":1,"411":1}}],["грузить",{"2":{"107":1,"461":1}}],["грамотная",{"2":{"484":1}}],["грамотно",{"2":{"460":1}}],["грамотному",{"2":{"173":1}}],["грамотной",{"2":{"76":1}}],["градусов",{"2":{"330":1}}],["градусах",{"2":{"330":1}}],["градусы",{"2":{"329":2,"331":1}}],["графическая",{"2":{"327":1}}],["графические",{"2":{"429":1}}],["графический",{"2":{"271":1,"422":1}}],["графически",{"2":{"244":1,"329":1,"331":1}}],["графических",{"2":{"216":1}}],["графическим",{"2":{"166":1}}],["графического",{"2":{"216":1,"228":1,"419":1}}],["графическое",{"2":{"183":1,"297":1,"299":1,"325":1,"327":1}}],["графики",{"2":{"166":1,"256":1}}],["грань",{"2":{"256":1}}],["гранулировано",{"2":{"106":1}}],["границу",{"2":{"183":1,"184":1}}],["границах",{"2":{"139":1,"384":1}}],["границы",{"0":{"9":1},"2":{"67":1,"331":1,"355":1}}],["границ",{"2":{"3":1,"182":1}}],["гарагусо",{"2":{"368":1}}],["гарантирует",{"2":{"195":1,"357":1}}],["гамбургера",{"2":{"189":1,"506":1}}],["гамбургер",{"2":{"186":1,"534":1,"536":1}}],["гамме",{"2":{"175":1}}],["гаммы",{"2":{"26":1}}],["галочка",{"2":{"178":1}}],["гаснет",{"2":{"93":1}}],["где",{"2":{"86":1,"106":1,"107":1,"125":1,"127":1,"128":1,"139":1,"140":1,"142":1,"143":1,"165":1,"170":1,"172":1,"180":1,"186":1,"194":1,"196":2,"208":1,"214":1,"222":1,"231":1,"235":1,"243":1,"245":2,"251":1,"289":1,"290":3,"303":1,"328":1,"350":1,"382":1,"384":1,"396":1,"399":1,"413":1,"416":2,"420":1,"421":1,"430":1,"439":1,"442":1,"449":1,"450":1,"451":2,"455":1}}],["готова",{"2":{"320":1}}],["готовности",{"2":{"266":1}}],["готовность",{"2":{"254":1}}],["готового",{"2":{"495":1,"496":1}}],["готовое",{"2":{"492":1}}],["готово",{"2":{"393":1}}],["готовом",{"2":{"231":1}}],["готовой",{"2":{"215":1}}],["готов",{"2":{"222":1,"263":1,"264":1,"357":1,"399":1,"409":1}}],["готовую",{"2":{"215":1}}],["готовый",{"2":{"495":1}}],["готовым",{"2":{"444":1}}],["готовых",{"2":{"136":1,"150":1,"212":1,"496":1}}],["готовы",{"2":{"127":1,"151":1,"158":1,"159":1,"174":1,"213":2,"217":1,"218":1,"230":1,"243":1,"244":1,"275":1,"414":1,"417":1}}],["готовые",{"2":{"61":1,"127":1,"326":1}}],["год",{"2":{"304":1,"439":1}}],["года",{"2":{"460":1,"485":1}}],["годах",{"2":{"303":1}}],["годами",{"2":{"294":1}}],["году",{"2":{"171":1}}],["годы",{"2":{"50":1,"125":1,"173":1,"448":1,"524":1}}],["городов",{"2":{"237":1}}],["город",{"2":{"237":1}}],["города",{"2":{"191":2,"237":1}}],["горизонтальную",{"2":{"194":1}}],["горизонтальному",{"2":{"194":1}}],["горизонтальные",{"2":{"186":2,"189":2,"194":1}}],["гораздо",{"2":{"128":1,"180":1,"212":1,"256":2,"297":1,"310":1,"336":1,"355":1,"429":1,"448":1}}],["гордо",{"2":{"93":1}}],["гостинице",{"2":{"461":1}}],["гостиниц",{"2":{"204":1}}],["гостей",{"2":{"106":1}}],["государство",{"2":{"2":1,"239":1}}],["говорю",{"2":{"330":1,"336":1}}],["говорит",{"2":{"452":1}}],["говорить",{"2":{"57":1,"355":1}}],["говорили",{"2":{"196":1,"236":2,"265":1}}],["говорилось",{"2":{"157":1,"242":1,"248":1,"257":1,"274":1,"407":1,"426":1}}],["говорил",{"2":{"143":1,"326":1}}],["говоря",{"2":{"106":1,"108":1,"165":1,"170":1,"198":1,"231":1,"299":1,"451":1,"452":1,"461":1}}],["глоссарий",{"0":{"484":1}}],["глобален",{"2":{"449":1}}],["глобального",{"2":{"496":1}}],["глобальное",{"2":{"449":1}}],["глобальному",{"2":{"312":1}}],["глобально",{"2":{"275":1,"277":1,"288":1}}],["глобальную",{"2":{"215":1,"235":1,"392":1}}],["глобальная",{"2":{"140":1,"277":1}}],["глобальные",{"0":{"277":1},"2":{"215":1,"216":1,"286":1,"437":1}}],["глобальный",{"2":{"112":1,"277":1,"289":1,"449":1,"532":1}}],["глобальными",{"2":{"449":1}}],["глобальным",{"2":{"34":1,"355":1,"449":2,"452":1}}],["глобальных",{"0":{"112":1},"2":{"23":1,"110":1,"277":1,"286":1}}],["глючит",{"2":{"444":1}}],["глубокий",{"2":{"354":1}}],["глубоких",{"2":{"237":1}}],["глубоким",{"2":{"198":1}}],["глубокой",{"2":{"533":1}}],["глубокое",{"2":{"285":1}}],["глубоко",{"2":{"78":1,"280":1,"281":1,"340":1}}],["глубокого",{"2":{"64":1,"337":1}}],["глубины",{"2":{"191":1}}],["глазах",{"2":{"330":1}}],["глаза",{"2":{"195":1}}],["глаз",{"2":{"191":1}}],["гласит",{"2":{"164":1,"170":1,"298":1,"299":1,"304":1,"421":1}}],["главой",{"2":{"255":1,"294":1}}],["глав",{"2":{"212":1,"254":1}}],["главу",{"2":{"126":1,"159":1,"277":1,"296":1,"400":1}}],["главах",{"2":{"139":1,"212":1,"226":1,"334":1,"340":1}}],["глава",{"0":{"160":1,"370":1,"371":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1},"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,"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},"2":{"123":1,"161":1,"210":1,"212":1,"226":1,"242":1,"249":1,"261":1,"265":1,"294":1,"305":1,"338":1,"373":1,"374":1,"376":1,"377":1,"380":1,"383":1,"406":1}}],["главы",{"2":{"122":1,"138":1,"159":1,"160":1,"161":1,"188":1,"213":1,"214":1,"226":1,"227":1,"229":1,"254":1,"266":1,"269":1,"270":2,"284":1,"290":1,"340":1,"341":1,"355":2,"382":1,"383":1,"388":1,"418":1,"421":1,"429":1}}],["главе",{"2":{"81":1,"111":1,"115":1,"117":1,"118":2,"122":1,"124":1,"126":1,"134":1,"136":1,"138":1,"141":1,"142":3,"143":2,"149":1,"158":2,"160":1,"167":1,"172":1,"175":1,"186":1,"195":1,"196":1,"210":1,"211":1,"213":2,"215":3,"216":1,"219":1,"220":2,"223":1,"224":2,"226":1,"228":2,"233":1,"236":1,"243":1,"252":2,"253":1,"254":3,"257":1,"263":1,"265":1,"267":2,"268":1,"269":4,"270":1,"273":3,"276":1,"278":1,"281":1,"283":1,"285":1,"287":1,"292":2,"293":1,"294":1,"297":1,"298":1,"301":1,"302":1,"316":1,"323":2,"326":2,"328":1,"329":1,"331":1,"332":1,"334":1,"338":2,"340":1,"341":2,"344":1,"345":1,"355":1,"356":2,"359":2,"360":1,"370":1,"371":1,"372":1,"375":1,"378":2,"379":1,"382":3,"388":1,"389":1,"398":1,"403":2,"405":3,"409":2,"415":1,"431":1}}],["главным",{"2":{"301":1,"436":1,"460":1}}],["главных",{"2":{"142":1,"348":1,"408":1}}],["главный",{"2":{"26":1,"195":2,"215":1,"220":1,"277":1}}],["главной",{"2":{"191":1,"196":3}}],["главного",{"2":{"141":1,"189":1,"196":1,"215":1,"263":1,"328":1,"504":1}}],["главном",{"2":{"88":1,"93":1,"191":1,"263":2,"388":1}}],["главное",{"2":{"2":1,"187":1,"196":1,"245":1,"281":1}}],["главную",{"2":{"7":1,"87":1,"195":1}}],["главная",{"0":{"196":1},"2":{"7":1,"33":1,"164":1,"195":2,"196":1,"284":1}}],["бюджетных",{"2":{"408":1}}],["бюджету",{"2":{"67":1}}],["бумажном",{"2":{"366":1}}],["булевские",{"2":{"263":1}}],["булево",{"2":{"146":2,"222":1,"289":1}}],["бухгалтерская",{"2":{"251":1}}],["буквы",{"2":{"155":1}}],["буквами",{"2":{"154":1,"157":1}}],["буква",{"2":{"135":1}}],["будто",{"2":{"304":2,"459":1}}],["будь",{"2":{"171":1,"256":1,"271":1}}],["будем",{"2":{"18":1,"22":1,"25":1,"41":1,"55":1,"57":1,"64":1,"86":1,"103":1,"131":1,"135":1,"138":1,"139":1,"140":1,"141":2,"142":2,"143":3,"150":1,"152":1,"157":1,"158":1,"163":1,"184":1,"212":3,"213":2,"214":1,"215":1,"217":1,"218":3,"222":1,"223":1,"230":1,"231":1,"242":2,"243":1,"251":1,"258":4,"264":2,"267":1,"271":1,"283":1,"284":2,"285":1,"286":1,"288":1,"289":1,"297":1,"305":1,"306":1,"315":1,"326":1,"331":1,"334":3,"335":1,"337":2,"338":3,"340":1,"344":3,"346":1,"351":1,"355":2,"357":2,"387":2,"388":3,"389":1,"390":1,"391":1,"394":1,"395":1,"410":1,"411":2,"416":2,"435":2}}],["будете",{"2":{"138":1,"216":1,"226":1,"254":1,"334":1,"382":1,"443":1,"460":1}}],["будет",{"0":{"63":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,"58":1,"60":2,"62":1,"63":1,"64":1,"67":1,"72":1,"79":1,"86":1,"88":1,"95":1,"96":1,"100":1,"105":1,"107":2,"108":1,"109":1,"114":1,"125":5,"126":4,"127":2,"128":4,"130":1,"134":2,"136":1,"139":2,"140":3,"141":2,"143":2,"145":2,"146":3,"147":1,"148":1,"149":1,"150":1,"151":1,"163":2,"183":3,"184":3,"188":1,"191":1,"195":1,"201":1,"212":1,"213":1,"214":5,"215":6,"217":1,"218":2,"219":1,"220":2,"221":3,"222":8,"230":1,"231":4,"233":9,"236":4,"237":1,"238":1,"239":1,"243":1,"244":2,"245":5,"246":1,"249":3,"250":2,"251":4,"256":4,"263":5,"264":2,"265":1,"266":2,"272":1,"273":5,"277":2,"278":3,"279":1,"280":2,"281":1,"283":3,"285":1,"288":4,"289":3,"299":1,"314":1,"315":1,"319":1,"324":2,"325":1,"327":1,"330":2,"331":2,"335":2,"336":4,"337":3,"338":1,"341":1,"342":2,"345":1,"346":1,"347":1,"349":1,"350":5,"354":1,"355":1,"356":1,"357":3,"358":1,"372":1,"382":1,"384":6,"385":1,"387":1,"388":2,"390":2,"391":3,"392":1,"394":1,"395":2,"396":1,"397":2,"398":1,"399":3,"400":1,"402":3,"408":1,"409":1,"410":1,"411":2,"415":1,"417":1,"418":2,"425":7,"426":1,"428":1,"429":2,"435":1,"440":1,"444":1,"449":2,"450":3,"459":1,"460":2,"491":2,"527":1}}],["будучи",{"2":{"329":1,"335":1,"336":1}}],["будущим",{"2":{"363":1}}],["будущими",{"2":{"221":1}}],["будущих",{"2":{"5":1,"372":1}}],["будущего",{"2":{"494":1}}],["будущее",{"2":{"151":1}}],["будущем",{"2":{"22":1,"139":1,"178":1}}],["буду",{"2":{"4":1,"213":1}}],["будут",{"2":{"2":1,"4":1,"11":1,"16":2,"44":1,"47":1,"63":1,"86":1,"103":1,"113":1,"127":1,"132":1,"140":1,"143":1,"147":1,"151":1,"154":1,"157":1,"165":1,"170":1,"189":1,"212":1,"215":2,"216":1,"218":2,"222":2,"230":2,"231":2,"233":1,"235":1,"237":1,"238":2,"239":3,"244":1,"247":1,"256":2,"259":1,"263":1,"264":2,"265":1,"271":3,"273":2,"274":2,"278":1,"283":1,"285":1,"288":1,"289":1,"295":1,"302":1,"328":1,"331":1,"346":1,"347":1,"355":1,"364":1,"394":2,"396":2,"405":1,"408":2,"413":1,"414":1,"415":1,"422":1,"426":1,"428":2,"435":1,"448":1,"489":1}}],["бэджем",{"2":{"96":1}}],["бэдж",{"2":{"96":1}}],["бэджик",{"0":{"96":1},"2":{"96":1}}],["бэджиком",{"2":{"93":1}}],["бэкэнд",{"2":{"251":2}}],["бэке",{"2":{"109":1,"451":2}}],["бэкендов",{"2":{"41":1}}],["бэкендом",{"0":{"104":1},"1":{"105":1},"2":{"41":1,"76":1,"105":2,"108":1,"249":1,"467":1,"501":1}}],["бэкенду",{"2":{"11":1,"38":1,"105":1,"500":2}}],["бэкенде",{"2":{"10":1,"44":1,"103":1,"109":1,"249":1,"250":1,"460":2}}],["бэкенд",{"0":{"107":1},"2":{"6":2,"11":1,"12":2,"17":1,"41":2,"47":1,"58":1,"79":1,"106":5,"107":5,"108":2,"244":1,"248":1,"249":1,"250":1,"382":1,"439":1,"450":1,"451":1,"495":1,"501":1,"530":1}}],["бэкенда",{"2":{"3":1,"13":1,"40":1,"41":1,"58":1,"107":1,"108":2,"245":1,"250":1,"461":1}}],["бэком",{"2":{"109":1}}],["бэкапов",{"2":{"435":1}}],["бэкапить",{"2":{"435":1}}],["бэкапа",{"2":{"70":1}}],["бэка",{"2":{"106":1,"107":1,"451":1}}],["бэк",{"2":{"105":1,"106":2,"107":1,"444":1}}],["боялся",{"2":{"460":1}}],["бояться",{"2":{"116":1}}],["бо́льшая",{"2":{"451":1}}],["бойскаута",{"2":{"304":1}}],["бойлерплейтов",{"2":{"495":1}}],["бойлерплейта",{"2":{"451":1}}],["бойлерплейт",{"2":{"44":1}}],["боковую",{"2":{"194":1,"231":1,"239":1}}],["боковым",{"2":{"436":1,"438":2}}],["боковых",{"2":{"189":1,"190":1}}],["боковые",{"2":{"186":1}}],["боковой",{"2":{"189":1,"191":2,"196":1,"231":1,"236":1,"515":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,"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},"2":{"380":1}}],["бонусами",{"2":{"106":1}}],["бороться",{"2":{"106":1}}],["бота",{"2":{"461":2}}],["ботов",{"2":{"461":1}}],["бот",{"0":{"82":1},"2":{"82":1}}],["большая",{"2":{"128":1,"139":1,"164":1,"460":1}}],["большом",{"2":{"219":1,"336":1}}],["большому",{"2":{"125":1}}],["большого",{"2":{"139":1,"213":1,"248":1,"272":1}}],["большое",{"2":{"114":1,"115":1,"163":1,"170":1,"171":1,"191":2,"202":1,"248":2,"252":1,"298":1,"303":1,"326":1,"355":1}}],["большой",{"2":{"79":1,"143":1,"160":1,"218":2,"228":1,"297":1,"305":1}}],["большую",{"2":{"68":1,"116":1,"219":1,"228":1,"303":1,"334":1,"336":1,"451":1}}],["больших",{"2":{"143":1,"147":2,"340":1,"384":1,"418":1,"435":1,"450":1,"451":3,"504":1}}],["большинства",{"2":{"194":1,"321":1,"334":1}}],["большинстве",{"2":{"139":1,"216":1,"243":1,"244":1,"251":1,"256":1,"278":1,"336":2,"448":1,"461":1,"524":1}}],["большинством",{"2":{"420":1}}],["большинство",{"2":{"39":1,"47":1,"107":2,"138":1,"163":2,"165":2,"191":2,"196":1,"199":1,"213":1,"228":1,"242":1,"244":1,"251":1,"285":1,"302":1,"413":1,"460":1}}],["больший",{"2":{"135":1,"278":1}}],["большим",{"2":{"128":1,"142":1,"191":1,"194":1,"251":1,"448":1,"450":2}}],["большими",{"2":{"107":1,"180":1,"196":1,"312":1,"451":1}}],["большие",{"2":{"40":1,"106":1}}],["большей",{"2":{"139":1,"143":1,"174":1,"273":1,"294":1}}],["большее",{"2":{"125":1,"245":1}}],["больше",{"0":{"114":1},"2":{"10":1,"47":1,"115":1,"134":1,"140":1,"147":1,"151":1,"152":1,"162":1,"169":2,"170":1,"171":1,"184":1,"187":1,"189":1,"226":1,"237":1,"245":1,"250":1,"256":3,"263":1,"282":1,"297":1,"301":1,"305":1,"310":1,"326":1,"336":2,"340":1,"355":2,"365":1,"384":2,"387":1,"389":1,"444":2,"448":1,"451":2,"460":2,"461":2}}],["более",{"2":{"2":2,"13":1,"14":1,"39":1,"41":1,"64":1,"67":1,"90":1,"96":2,"106":1,"108":2,"109":1,"110":1,"111":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":2,"128":1,"139":1,"140":2,"142":1,"143":3,"148":1,"149":1,"157":1,"162":2,"165":2,"169":1,"170":2,"174":1,"176":1,"178":1,"191":2,"204":1,"210":1,"212":2,"214":2,"215":2,"217":1,"218":1,"219":1,"223":4,"228":4,"236":2,"237":2,"243":2,"250":2,"252":1,"256":2,"264":2,"265":2,"275":2,"276":1,"278":1,"279":1,"280":1,"281":1,"283":1,"285":1,"292":2,"294":1,"297":1,"302":1,"313":1,"315":1,"323":1,"328":1,"329":1,"330":1,"331":2,"334":2,"337":5,"344":1,"349":1,"352":1,"354":1,"355":3,"363":2,"387":2,"388":1,"393":1,"405":3,"408":2,"411":2,"415":1,"428":1,"429":1,"435":1,"436":1,"438":1,"440":1,"443":1,"448":2,"449":1,"451":3,"452":1,"460":2,"515":1}}],["бешено",{"2":{"444":1}}],["бета",{"2":{"430":1}}],["берем",{"2":{"357":1}}],["берет",{"2":{"229":1}}],["беглый",{"2":{"195":1}}],["бегло",{"2":{"141":1}}],["бене",{"2":{"171":1}}],["бен",{"2":{"171":1}}],["бена",{"0":{"171":1}}],["бесконечна",{"2":{"183":1}}],["бесконечного",{"2":{"183":3}}],["бесконечный",{"0":{"183":1},"1":{"184":1},"2":{"183":2,"184":1}}],["бесконечными",{"2":{"169":1}}],["бесполезное",{"2":{"527":1}}],["бесполезно",{"2":{"460":1}}],["бесполезными",{"2":{"460":1}}],["беспокоиться",{"2":{"215":1,"332":1,"402":1,"425":1}}],["беспокойство",{"2":{"181":1}}],["беспарольными",{"2":{"250":1}}],["беспарольный",{"2":{"249":1}}],["беспарольная",{"0":{"249":1},"2":{"249":1}}],["бесплатными",{"2":{"439":1}}],["бесплатных",{"2":{"202":1,"208":1,"248":1}}],["бесплатный",{"2":{"135":1,"213":1,"217":1,"218":1,"257":1}}],["бесплатные",{"2":{"107":3,"439":1,"460":2}}],["бесплатная",{"2":{"81":1,"135":1,"213":2}}],["бесплатно",{"2":{"213":2,"335":1,"460":1}}],["бесплатное",{"2":{"208":1}}],["бесплатной",{"2":{"140":1}}],["бесплатного",{"2":{"40":1,"136":1,"201":1}}],["бесплатность",{"2":{"39":1}}],["белое",{"2":{"164":1}}],["белого",{"2":{"164":1}}],["безвозвратно",{"2":{"445":1,"448":1}}],["безусловно",{"2":{"337":1}}],["безымянном",{"2":{"283":1}}],["безопасен",{"2":{"172":1}}],["безопасны",{"2":{"334":1}}],["безопасные",{"2":{"256":1}}],["безопасным",{"2":{"135":1,"228":1,"250":1}}],["безопасной",{"2":{"278":1}}],["безопасного",{"2":{"245":1}}],["безопасности",{"2":{"58":1,"67":1,"106":2,"124":1,"135":3,"245":1,"249":1,"250":2,"252":1,"253":1,"291":1,"301":1,"397":1,"402":1,"452":1}}],["безопасностью",{"2":{"302":1}}],["безопасность",{"0":{"58":1},"2":{"68":1,"77":1,"106":3,"244":1,"249":1}}],["безопасную",{"2":{"134":1}}],["безболезненного",{"2":{"23":1}}],["без",{"2":{"12":1,"23":2,"61":1,"107":2,"116":1,"125":1,"139":1,"162":1,"165":1,"171":1,"181":1,"202":1,"213":3,"217":1,"219":1,"222":1,"228":2,"229":1,"233":1,"239":1,"245":3,"247":1,"255":1,"259":1,"263":1,"264":1,"265":1,"290":1,"297":1,"316":1,"324":1,"331":1,"334":1,"336":1,"355":1,"428":1,"429":1,"433":1,"437":1,"438":2,"442":1,"444":1,"449":1,"450":1,"451":2,"459":1,"460":2,"461":1,"489":1,"492":2,"495":1,"500":1,"525":1,"536":1,"541":1,"542":1}}],["брейкпойнт",{"2":{"497":1}}],["бремя",{"2":{"265":1,"407":1}}],["брендом",{"2":{"172":1}}],["бренда",{"2":{"162":1,"544":1}}],["бренды",{"2":{"16":1}}],["брали",{"2":{"435":1}}],["брату",{"2":{"344":1}}],["братья",{"2":{"273":1}}],["братьями",{"2":{"236":1,"340":1}}],["брать",{"2":{"264":1,"451":1}}],["браузеру",{"2":{"258":1,"278":1,"384":1,"443":1}}],["браузеры",{"2":{"116":2,"121":1,"174":1,"314":1,"355":3,"384":1,"439":1,"448":1,"461":1}}],["браузерные",{"2":{"228":1,"254":1}}],["браузерных",{"2":{"116":1,"251":1,"382":1}}],["браузерными",{"2":{"95":1}}],["браузеров",{"2":{"116":1,"243":1,"251":1}}],["браузером",{"2":{"106":1,"403":1,"435":1,"461":1}}],["браузере",{"2":{"114":1,"116":1,"140":1,"141":1,"196":1,"214":4,"222":1,"228":1,"231":2,"233":1,"245":1,"251":1,"259":1,"262":2,"263":1,"264":1,"266":1,"334":1,"355":3,"384":1,"397":1,"409":1,"413":1,"419":1,"440":1,"461":3,"490":1,"543":1}}],["браузер",{"2":{"106":1,"108":3,"141":4,"142":1,"213":1,"219":1,"228":1,"256":1,"278":1,"291":1,"336":1,"355":2,"365":1,"384":3,"450":1}}],["браузерах",{"2":{"116":1,"214":1,"266":1,"354":1,"355":1}}],["браузерами",{"0":{"116":1},"2":{"110":1,"116":2,"138":1,"174":1,"183":1,"256":1,"340":1,"359":1}}],["браузера",{"0":{"355":1},"2":{"50":1,"108":2,"138":1,"141":1,"179":1,"187":1,"213":1,"242":1,"251":1,"254":1,"256":2,"259":2,"263":1,"264":1,"266":1,"316":1,"334":1,"335":2,"355":2,"358":1,"382":1,"384":1,"413":1,"414":1,"415":1,"416":1,"461":1,"533":1,"542":1}}],["бросают",{"2":{"195":1}}],["бригаду",{"2":{"26":1}}],["билдом",{"2":{"450":1}}],["билдер",{"0":{"493":1},"1":{"494":1,"495":1},"2":{"494":1}}],["билде",{"2":{"440":1}}],["билда",{"2":{"70":1,"433":1,"435":2,"439":1,"443":1,"496":1,"528":1,"530":1}}],["бинарные",{"2":{"426":1}}],["битная",{"2":{"422":1}}],["библиотекой",{"2":{"159":1,"216":1,"449":1,"453":1}}],["библиотеками",{"2":{"495":1}}],["библиотекам",{"2":{"311":1}}],["библиотеках",{"2":{"174":1,"350":1}}],["библиотека",{"2":{"139":4,"243":2,"310":1,"394":1,"397":2,"448":1,"449":4,"453":1,"524":1}}],["библиотеку",{"0":{"445":1},"2":{"23":1,"105":1,"139":2,"216":1,"243":3,"251":1,"264":1,"364":1,"394":1,"397":1,"449":1,"452":1,"454":1,"459":1,"492":1}}],["библиотеки",{"0":{"459":1},"2":{"23":1,"138":1,"139":3,"141":1,"142":1,"215":1,"216":1,"218":1,"222":1,"224":1,"225":2,"251":1,"256":1,"334":2,"382":1,"394":1,"397":1,"398":1,"408":2,"415":1,"436":1,"443":1,"446":1,"451":1,"454":1,"459":4,"492":2,"543":1}}],["библиотек",{"0":{"454":1},"2":{"23":2,"138":1,"139":2,"158":1,"216":4,"220":1,"224":1,"247":1,"248":1,"251":1,"300":1,"334":1,"355":3,"363":1,"394":2,"442":1,"445":1,"456":1,"459":7,"492":1,"496":1,"532":1}}],["бизнесом",{"2":{"495":1}}],["бизнеса",{"2":{"67":2}}],["бизнес",{"0":{"8":1,"67":1},"1":{"9":1,"10":1,"11":1,"12":1,"13":1,"14":1},"2":{"6":1,"14":1,"16":1,"66":1,"68":1,"107":1,"223":1,"284":1,"290":3,"302":1,"350":1,"384":1,"388":3,"408":1,"449":5,"451":1,"494":1,"495":1,"496":1,"500":1}}],["бд",{"2":{"17":2,"39":1,"44":1,"449":1}}],["бывают",{"2":{"254":1,"299":1,"301":1,"450":1}}],["бывает",{"2":{"50":1,"109":1,"185":1,"198":1,"299":1,"305":1,"449":1}}],["быстрей",{"2":{"443":1,"444":1,"451":1,"456":1}}],["быстрее",{"2":{"116":1,"256":1,"443":1}}],["быстр",{"2":{"394":1}}],["быстрая",{"2":{"183":1,"228":1,"355":1,"394":1}}],["быстрые",{"2":{"256":1}}],["быстрым",{"2":{"191":1,"214":1,"228":1}}],["быстрых",{"2":{"171":1}}],["быстрый",{"2":{"48":1,"128":2,"142":1,"384":1,"444":1}}],["быстрой",{"2":{"179":1,"384":1}}],["быстро",{"2":{"121":2,"139":1,"159":1,"171":1,"183":1,"214":1,"299":2,"301":1,"418":1,"420":1,"452":1,"459":1,"495":3,"496":1}}],["быстрого",{"2":{"17":1,"23":1,"450":1}}],["была",{"2":{"113":1,"116":1,"118":1,"164":1,"215":2,"217":1,"222":1,"226":1,"287":1,"330":1,"336":1,"428":1,"448":1,"459":1,"461":1}}],["были",{"2":{"39":2,"61":1,"117":1,"119":1,"138":3,"163":1,"168":1,"180":1,"239":1,"242":1,"248":1,"263":1,"274":1,"278":1,"289":1,"354":1,"411":1,"412":1}}],["было",{"2":{"9":1,"10":2,"12":2,"47":2,"123":1,"125":1,"151":1,"160":1,"178":1,"182":1,"228":2,"237":1,"250":1,"251":1,"263":1,"281":1,"297":1,"322":1,"329":1,"330":1,"331":1,"335":4,"338":1,"349":1,"410":1,"413":2,"416":1,"418":1,"419":1,"420":1,"421":1,"426":1,"428":2,"429":1,"438":1,"448":2,"449":1,"451":3,"492":1}}],["был",{"2":{"9":1,"12":1,"61":1,"81":1,"94":1,"116":1,"118":1,"125":1,"139":1,"157":1,"200":1,"214":1,"215":1,"219":1,"239":1,"249":1,"303":1,"314":1,"318":1,"344":1,"357":1,"393":1,"395":1,"421":1,"428":1,"439":2,"449":2,"461":1,"516":1}}],["бы",{"2":{"9":2,"12":3,"22":1,"96":1,"106":1,"122":2,"125":1,"132":1,"136":1,"165":2,"181":1,"209":1,"213":2,"223":1,"229":1,"242":1,"243":1,"250":1,"261":1,"269":1,"285":1,"291":1,"293":1,"297":1,"302":3,"318":2,"321":3,"329":1,"330":3,"334":1,"335":4,"350":1,"354":1,"356":1,"384":1,"385":1,"393":1,"405":1,"409":1,"411":1,"413":3,"416":1,"418":1,"429":1,"449":1,"460":2}}],["быть",{"0":{"165":1},"2":{"2":2,"3":1,"17":1,"44":1,"47":1,"48":1,"66":1,"76":2,"86":1,"87":1,"89":1,"96":1,"103":1,"106":1,"110":1,"113":1,"114":2,"115":1,"116":2,"125":3,"135":1,"139":3,"141":1,"142":1,"143":3,"146":1,"147":1,"150":1,"151":3,"164":1,"167":1,"169":1,"172":2,"176":1,"178":1,"179":1,"180":2,"181":1,"185":1,"191":2,"192":1,"198":1,"209":1,"218":1,"219":1,"228":1,"230":1,"239":1,"244":1,"245":3,"249":1,"250":1,"251":1,"252":1,"254":1,"255":1,"258":4,"262":1,"263":6,"264":1,"269":1,"273":1,"275":1,"278":1,"279":2,"280":1,"281":3,"285":1,"290":2,"297":3,"300":2,"302":1,"303":1,"315":1,"323":1,"327":1,"328":2,"329":2,"331":2,"335":1,"337":1,"338":1,"341":1,"345":1,"349":2,"351":1,"352":1,"355":4,"356":1,"357":1,"363":1,"384":5,"385":4,"388":1,"395":1,"400":2,"402":1,"407":2,"408":1,"410":3,"411":1,"417":1,"420":1,"423":1,"428":1,"435":4,"436":1,"438":4,"440":1,"448":1,"450":1,"455":1,"460":3,"461":3,"485":1,"495":1,"496":1,"542":1}}],["блестящих",{"2":{"368":1}}],["близка",{"2":{"334":1}}],["близко",{"2":{"167":1,"461":1}}],["близость",{"0":{"167":1}}],["близости",{"2":{"166":1,"167":1}}],["ближе",{"2":{"143":1}}],["блогов",{"2":{"228":2}}],["блог",{"2":{"106":1,"494":1,"495":1,"496":1}}],["блок",{"2":{"337":1}}],["блокчейне",{"2":{"251":1}}],["блокчейном",{"2":{"251":3}}],["блокчейнов",{"2":{"228":1,"251":1}}],["блокчейнами",{"2":{"251":1}}],["блокчейна",{"2":{"251":2}}],["блокчейну",{"2":{"251":2}}],["блокчейны",{"2":{"251":2}}],["блокчейн",{"2":{"251":3}}],["блоков",{"2":{"222":1,"496":1}}],["блоком",{"2":{"132":1}}],["блока",{"2":{"222":2,"239":1,"407":1,"412":1,"444":1}}],["блоке",{"2":{"22":1,"222":1,"250":1}}],["блокирующими",{"2":{"384":1}}],["блокируют",{"2":{"335":1}}],["блокировка",{"2":{"355":1}}],["блокировать",{"2":{"355":1}}],["блоки",{"2":{"4":1,"141":1,"276":1,"496":1}}],["благополучия",{"2":{"368":1}}],["благодарю",{"2":{"368":1}}],["благодаря",{"2":{"125":1,"131":1,"171":1,"173":1,"174":1,"189":1,"191":1,"222":1,"228":1,"280":1,"334":1,"396":1,"461":1}}],["благо",{"2":{"93":1}}],["благозвучно",{"2":{"2":1}}],["багов",{"2":{"407":2}}],["баги",{"2":{"2":1,"452":1}}],["байт",{"2":{"355":1}}],["бара",{"2":{"181":1}}],["бары",{"2":{"181":1}}],["балансировщика",{"2":{"131":1}}],["баннер",{"2":{"263":2}}],["баннеры",{"2":{"4":1}}],["банк",{"2":{"250":1}}],["бандла",{"2":{"440":1,"453":1}}],["бандл",{"2":{"107":1,"440":1,"448":1,"459":1,"528":1}}],["бандлер",{"2":{"314":1}}],["бандлеры",{"2":{"314":1}}],["бандле",{"2":{"58":1,"443":1}}],["базой",{"2":{"316":1,"382":1,"396":1,"429":1}}],["базовая",{"2":{"342":1}}],["базовую",{"2":{"216":1,"325":1,"452":1}}],["базовые",{"2":{"285":1,"364":1,"409":1}}],["базовым",{"2":{"215":1,"392":1,"409":1}}],["базовых",{"2":{"141":1,"213":1,"264":1,"280":1,"363":1}}],["базовый",{"0":{"409":1},"2":{"126":1,"127":1,"214":1,"265":1,"348":1}}],["базового",{"0":{"348":1},"1":{"349":1},"2":{"212":1,"220":1,"340":1,"347":1,"415":1}}],["базовой",{"2":{"174":1,"259":1,"273":1,"372":1}}],["базовом",{"2":{"139":1,"243":1,"342":1,"350":1,"460":1}}],["базовое",{"2":{"138":1}}],["базе",{"0":{"42":1},"1":{"43":1,"44":1,"45":1,"46":1,"47":1,"48":1},"2":{"40":1,"58":1,"107":3,"116":2,"244":2,"321":1,"334":1,"393":1,"403":1,"449":1}}],["базы",{"2":{"17":2,"39":1,"107":1,"195":1,"239":1,"244":1,"355":3,"394":2,"395":1,"396":1,"426":1}}],["базу",{"2":{"17":2,"40":2,"58":1,"107":1,"256":1,"355":2,"394":1,"396":1}}],["баз",{"0":{"17":1},"1":{"18":1,"19":1},"2":{"17":1,"48":1,"355":1,"408":1}}],["базам",{"2":{"444":1}}],["базами",{"2":{"382":1,"407":1}}],["базах",{"2":{"43":1,"44":1,"47":1}}],["база",{"2":{"6":2,"41":1,"79":1,"256":1,"290":1,"355":1,"382":1,"390":1,"394":3,"444":1,"449":1}}],["synctex",{"2":{"444":1}}],["system",{"2":{"420":2}}],["sans",{"2":{"545":1}}],["sass",{"2":{"444":1}}],["savenote",{"2":{"395":3}}],["save",{"2":{"265":1,"444":1}}],["saveprompt",{"2":{"263":2}}],["savedposition",{"2":{"233":1}}],["sftp",{"2":{"444":1}}],["sfc",{"2":{"142":3,"150":1,"151":1,"215":1,"413":1,"444":2,"451":1}}],["s3",{"2":{"439":1}}],["snickerbockers",{"2":{"435":2}}],["snake",{"2":{"44":1,"154":1}}],["square",{"2":{"324":4}}],["sql",{"2":{"17":3,"39":1,"58":1,"109":1,"394":1,"435":1,"444":1,"449":2,"460":1}}],["slidingheader",{"0":{"522":1}}],["slider",{"2":{"447":1}}],["sln",{"2":{"426":1}}],["slots",{"2":{"283":1}}],["slot=",{"2":{"283":4}}],["slot",{"2":{"283":8}}],["slot>",{"2":{"283":5,"289":2}}],["slug",{"2":{"88":1}}],["smoothscrolling",{"2":{"444":1}}],["smart",{"2":{"251":1}}],["sms",{"2":{"250":2}}],["smith",{"2":{"114":1}}],["svelte",{"2":{"228":1,"444":3,"451":2}}],["svgo",{"2":{"444":10}}],["svgresources",{"2":{"442":4}}],["svg",{"2":{"215":1,"265":1,"441":2,"442":3,"443":1,"444":2,"498":1}}],["skeuomorphism",{"2":{"216":1}}],["ssg",{"0":{"461":1},"2":{"461":3}}],["ssd",{"2":{"444":1}}],["ss06",{"2":{"444":1}}],["ss03",{"2":{"444":1}}],["ss02",{"2":{"444":1}}],["ss01",{"2":{"444":1}}],["ssl",{"2":{"244":1,"257":1,"439":2}}],["ssr",{"0":{"461":1},"2":{"233":1,"426":1,"444":1,"449":2,"461":9}}],["ssh",{"2":{"134":1,"135":2,"435":14,"444":2}}],["sso",{"2":{"106":2}}],["s",{"0":{"135":1},"2":{"122":1,"134":1,"135":4,"136":1,"169":1,"257":1,"379":1,"435":1,"440":1,"443":1,"449":1,"500":1}}],["swagger",{"2":{"460":1}}],["swiper",{"2":{"447":1}}],["switch",{"2":{"175":1,"290":2,"324":1,"328":1,"330":1}}],["sw",{"2":{"100":2,"426":1,"461":1,"484":1}}],["scs",{"2":{"420":1,"421":2}}],["scss",{"2":{"23":1,"441":1,"444":1,"492":1,"497":2,"545":1}}],["sc",{"2":{"420":1}}],["scope",{"2":{"246":2,"542":1}}],["scoped",{"2":{"142":2}}],["scoped>",{"2":{"142":1,"182":1,"221":1,"332":1,"354":1,"441":1}}],["scmitem",{"2":{"444":1}}],["scmgroupinline",{"2":{"444":1}}],["scmgroup",{"2":{"444":1}}],["scms",{"2":{"420":1}}],["scm",{"2":{"213":1,"444":2}}],["scaffolding",{"2":{"100":1,"215":1,"489":1}}],["scrolly",{"2":{"284":2}}],["scrollbehavior",{"2":{"233":1}}],["scroll",{"2":{"184":6,"284":2,"448":1}}],["scroller",{"2":{"183":1}}],["screenwidthfactor",{"2":{"497":1}}],["screenshots",{"2":{"261":1}}],["screen",{"0":{"544":1},"2":{"100":2,"194":1,"489":1,"494":2,"496":1,"503":1,"530":1}}],["scripts",{"2":{"215":1,"410":2,"435":1}}],["script>",{"2":{"94":1,"114":1,"140":3,"142":1,"143":5,"151":1,"182":1,"184":1,"221":1,"236":1,"285":1,"289":1,"301":1,"332":1,"333":1,"343":1,"344":1,"347":1,"349":1,"354":1,"358":1,"395":1,"400":1,"441":1,"497":1,"498":1,"517":3,"526":1}}],["script",{"0":{"143":1},"2":{"94":1,"113":1,"114":1,"116":1,"121":1,"140":3,"142":2,"143":4,"151":1,"182":1,"184":1,"215":1,"216":3,"220":1,"221":3,"222":2,"236":3,"242":1,"263":1,"277":1,"279":2,"280":1,"284":1,"285":1,"289":2,"301":2,"332":1,"333":1,"343":1,"344":1,"347":1,"349":1,"352":1,"354":1,"358":1,"395":1,"400":1,"428":1,"435":2,"441":1,"444":1,"448":1,"492":1,"497":1,"498":1,"517":1,"526":1}}],["src=",{"2":{"140":1,"145":1,"440":3,"441":1,"517":1}}],["src",{"0":{"127":1,"184":1,"233":1,"234":1,"239":1,"395":1,"396":1,"397":1,"400":1,"411":1,"415":1,"416":1},"2":{"86":1,"94":1,"127":1,"145":1,"215":2,"219":2,"221":1,"230":1,"236":1,"259":1,"261":1,"265":3,"287":1,"289":5,"290":2,"409":1,"410":5,"417":1,"440":1,"443":2,"503":1,"526":1}}],["srs",{"2":{"9":1,"68":1}}],["sdlc",{"2":{"66":1}}],["sdk",{"0":{"52":1},"1":{"53":1,"54":1},"2":{"52":1,"251":1}}],["social",{"2":{"440":1}}],["sockets",{"2":{"244":1}}],["solvery",{"2":{"460":1}}],["solana",{"2":{"251":1}}],["solid",{"2":{"182":1,"218":2,"222":3,"497":1}}],["software",{"0":{"77":1},"2":{"66":1,"68":1}}],["somearr",{"2":{"451":4}}],["someimage",{"2":{"440":1}}],["someid",{"2":{"184":1}}],["somecomponent",{"2":{"284":1}}],["somefunc",{"2":{"107":1}}],["somevalue",{"2":{"54":2,"55":2}}],["some",{"2":{"54":2,"55":2,"278":1,"279":2,"283":2}}],["source",{"0":{"417":1,"420":1},"2":{"12":1,"39":1,"61":1,"334":1,"410":1,"420":3,"432":1,"435":1,"444":3,"487":1,"515":1}}],["seed",{"2":{"501":1}}],["sentry",{"2":{"444":2}}],["senddata",{"2":{"400":2}}],["send",{"2":{"393":1,"400":3}}],["sendrequest",{"2":{"392":4}}],["sendmessage",{"2":{"347":2}}],["sendtoserver",{"2":{"247":1,"248":2}}],["semi",{"2":{"444":1}}],["separate",{"2":{"444":1}}],["separation",{"0":{"297":1},"2":{"294":1}}],["serif",{"2":{"545":1}}],["series",{"2":{"411":3}}],["servers",{"2":{"365":1}}],["server",{"0":{"402":1},"2":{"108":3,"128":1,"132":1,"244":1,"402":1,"435":3,"444":5,"461":1}}],["serviceworker",{"2":{"264":2}}],["services",{"0":{"346":1,"357":1,"391":1,"393":1,"396":1,"398":1},"2":{"105":1,"290":1,"347":1,"349":1,"358":1,"388":1,"392":4,"393":1,"395":1,"397":2,"398":1,"399":2,"400":1,"409":1,"411":1,"500":1}}],["service",{"0":{"264":1,"349":1,"543":1},"2":{"39":1,"79":1,"100":2,"107":1,"157":1,"245":1,"254":1,"256":1,"263":1,"264":5,"265":1,"268":1,"281":2,"357":1,"391":8,"392":3,"393":2,"396":2,"398":2,"444":1,"461":3,"484":1,"489":1,"494":1,"503":1,"530":1,"541":1,"543":2}}],["session",{"0":{"358":1}}],["sessionstorage",{"0":{"357":1},"2":{"355":6,"356":2,"357":4,"358":3,"360":2}}],["sessionstore",{"2":{"355":1}}],["self",{"2":{"264":1,"386":4,"387":1,"392":2}}],["selected=ref",{"2":{"395":1}}],["selected",{"2":{"239":1,"395":4}}],["select=",{"2":{"55":1}}],["select",{"2":{"54":2,"58":1,"100":5,"149":1,"192":1,"459":2,"489":5}}],["search",{"2":{"236":1,"444":1}}],["second",{"2":{"522":1}}],["seconds",{"2":{"249":3}}],["seconds=ref",{"2":{"249":1}}],["security",{"2":{"444":1}}],["secure",{"2":{"134":1,"135":1,"244":1}}],["section>",{"2":{"283":2,"343":2,"395":6,"400":4}}],["section",{"2":{"194":2,"457":1}}],["secrets",{"2":{"435":2}}],["secret",{"2":{"57":1,"245":3}}],["setlocale",{"2":{"526":2}}],["setlogoutcallback",{"2":{"105":1}}],["setoptions",{"2":{"501":1}}],["setsomearr",{"2":{"451":1}}],["setvalue",{"2":{"416":2}}],["setting",{"2":{"435":1,"444":1}}],["settings",{"2":{"435":1,"444":1,"515":1}}],["settimeout",{"2":{"386":2,"393":1}}],["settokencallback",{"2":{"105":1}}],["setimmediate",{"2":{"336":2,"337":1}}],["setitem",{"2":{"95":1,"355":2,"357":1,"435":1}}],["setdbmanager",{"2":{"321":1}}],["setbaseurl",{"2":{"105":1}}],["setup>",{"2":{"114":1,"142":1,"143":1,"151":1,"182":1,"184":1,"221":1,"236":1,"285":1,"289":1,"301":1,"332":1,"333":1,"343":1,"344":1,"347":1,"349":1,"354":1,"358":1,"395":1,"400":1,"441":1}}],["setup",{"0":{"143":1},"2":{"94":1,"113":1,"116":1,"121":1,"142":1,"143":5,"220":1,"236":1,"242":1,"279":2,"280":1,"284":1,"289":1,"301":1,"352":1,"435":4,"444":1,"448":1,"449":1,"492":1,"497":1,"498":1,"526":1}}],["set",{"2":{"94":2,"95":2,"105":1,"330":2,"331":1,"357":2,"429":1,"442":2}}],["seo",{"0":{"461":1},"2":{"79":1,"88":1,"461":1}}],["sponsors",{"2":{"444":1}}],["splide",{"2":{"447":1}}],["splice",{"2":{"326":1}}],["splashscreen",{"2":{"489":1}}],["splash",{"0":{"544":1},"2":{"100":2,"489":1,"494":2,"496":1,"503":1,"530":1,"544":1}}],["sp",{"2":{"245":1}}],["spec",{"2":{"410":1,"444":1}}],["specs",{"2":{"245":1}}],["special",{"2":{"151":1,"285":1}}],["specification",{"2":{"68":1}}],["spinnercomponent",{"2":{"278":2}}],["spinner",{"0":{"182":1},"2":{"182":2}}],["spree",{"2":{"41":1}}],["span>post",{"2":{"400":1}}],["span>get",{"2":{"400":1}}],["span>",{"2":{"94":1,"148":1,"182":1,"222":2,"343":2,"344":1,"400":2}}],["span",{"2":{"94":1,"148":2,"176":1,"182":1,"222":4,"344":1}}],["spa",{"0":{"127":1,"228":1,"256":1,"257":1,"461":1},"1":{"258":1,"259":1,"260":1,"261":1,"262":1,"263":1},"2":{"6":1,"106":1,"122":2,"126":1,"226":3,"228":12,"229":1,"242":1,"243":1,"244":3,"245":2,"248":1,"250":4,"251":2,"252":1,"253":3,"254":3,"256":5,"261":1,"263":1,"264":3,"267":1,"268":1,"292":1,"375":1,"461":11,"496":1}}],["sum",{"2":{"444":2}}],["suggestselection",{"2":{"444":1}}],["suo",{"2":{"426":1}}],["sudo",{"2":{"423":4,"424":1,"435":3}}],["success=false",{"2":{"392":1}}],["success",{"2":{"391":3,"392":2}}],["substring",{"2":{"442":2}}],["submodules",{"2":{"435":4,"436":1}}],["submit",{"2":{"249":1}}],["subversion",{"2":{"420":1}}],["sub",{"2":{"236":2,"237":1,"245":2,"325":1,"329":1}}],["sublime",{"2":{"213":1}}],["subtitle",{"2":{"17":1,"18":1}}],["suspense",{"2":{"151":1}}],["sue",{"2":{"114":1}}],["surname",{"2":{"114":6}}],["supabase",{"0":{"40":1,"51":1,"52":1,"55":1,"56":1},"1":{"52":1,"53":2,"54":2,"55":1,"57":1,"58":1},"2":{"39":2,"40":2,"41":4,"52":2,"53":2,"54":8,"55":9,"57":1,"58":2,"107":2,"460":1}}],["side",{"2":{"461":1}}],["sidebarlayout",{"2":{"438":2}}],["sidebar>",{"2":{"236":2,"283":1}}],["sidebars",{"2":{"186":1}}],["sidebar",{"0":{"30":1,"90":1},"2":{"28":1,"236":8,"239":2,"283":2}}],["siblings",{"2":{"340":1}}],["size",{"2":{"441":5}}],["sizes",{"2":{"259":1,"261":1,"265":3}}],["size=",{"2":{"96":1,"440":1}}],["siri",{"2":{"162":1}}],["sites",{"0":{"132":1},"2":{"131":1}}],["site",{"2":{"108":3,"435":14,"461":1}}],["signinuser",{"2":{"249":2}}],["signature",{"2":{"245":2}}],["sign",{"2":{"106":1}}],["singlequote",{"2":{"444":1}}],["singleclick",{"2":{"444":1}}],["singleton",{"0":{"311":1,"345":1},"1":{"312":1,"313":1,"314":1,"315":1,"346":1,"347":1},"2":{"94":1,"294":1,"307":1,"314":2,"315":6,"321":1,"326":2,"339":1,"340":1,"345":1,"348":1}}],["single",{"0":{"299":1},"2":{"54":1,"106":1,"294":1,"461":1}}],["simplenavbar",{"0":{"538":1}}],["simpleheader",{"0":{"519":1}}],["simplefooter",{"0":{"509":1}}],["simpledrawer",{"0":{"506":1},"2":{"489":2,"507":1}}],["simpledialog",{"2":{"444":1}}],["simplestate",{"0":{"349":1},"2":{"349":1}}],["simple",{"0":{"303":1},"2":{"2":1,"294":1,"349":1,"444":4}}],["shims",{"2":{"444":1}}],["shrinkwrap",{"2":{"444":2}}],["shnpx",{"2":{"443":1}}],["shpnpm",{"2":{"443":1}}],["shortcuts",{"2":{"261":1}}],["short",{"0":{"303":1},"2":{"259":1,"261":1,"265":1,"542":1}}],["showdocumentation",{"2":{"444":1}}],["showsuggestionsassnippets",{"2":{"444":1}}],["showmessage",{"2":{"347":3}}],["showmodal",{"2":{"290":1}}],["show=",{"2":{"146":1,"222":2,"263":2}}],["show",{"0":{"146":1},"2":{"146":1,"147":3,"151":1,"169":1,"249":2,"285":1,"289":6}}],["shopping",{"2":{"12":1}}],["shallowref",{"2":{"448":2}}],["shaking",{"2":{"442":1,"453":1}}],["shape2",{"2":{"324":2}}],["shape1",{"2":{"324":2}}],["shaming",{"0":{"207":1}}],["sha",{"2":{"139":1}}],["shared",{"2":{"128":1}}],["sharing",{"2":{"108":1,"402":1}}],["shell",{"2":{"134":1,"436":1,"444":1}}],["sheet",{"0":{"476":1},"1":{"477":1,"478":1,"479":1,"480":1,"481":1,"482":1},"2":{"17":1,"477":1,"478":1,"479":1,"480":4}}],["sh$",{"2":{"99":1,"100":2,"127":1,"214":3,"222":1,"230":1,"265":1,"394":1,"397":1,"401":2,"409":2,"410":2,"411":1,"414":2,"418":1,"419":2,"423":2,"425":4,"426":2,"429":4,"489":1,"490":1,"491":1,"494":1}}],["shcurl",{"2":{"55":1}}],["sh",{"2":{"53":1,"345":1,"350":1,"444":2}}],["stylus",{"2":{"448":1}}],["stylelint",{"2":{"444":4}}],["styleci",{"2":{"444":2}}],["style=",{"2":{"333":1,"441":2}}],["stylesheet",{"2":{"217":1,"218":3}}],["styles",{"2":{"215":1,"217":1,"234":2}}],["style>",{"2":{"142":1,"182":1,"221":1,"332":1,"354":1,"441":1}}],["style",{"2":{"68":1,"142":2,"182":1,"221":2,"222":1,"332":1,"354":1,"441":1,"444":1,"460":2}}],["steps",{"2":{"435":2}}],["storage",{"0":{"358":1},"2":{"358":1}}],["story",{"2":{"273":1,"444":1}}],["stores",{"0":{"352":1},"2":{"354":1,"396":1}}],["store",{"0":{"351":1},"2":{"14":1,"126":1,"213":1,"256":4,"340":1,"426":1,"449":4}}],["storefront",{"2":{"10":1,"41":1,"495":1}}],["study",{"2":{"256":1}}],["studio",{"2":{"213":1,"365":1,"422":1,"429":1}}],["stupid",{"2":{"2":1,"294":1}}],["stickyscroll",{"2":{"444":1}}],["sticky",{"2":{"186":1,"444":1,"519":1,"520":1,"521":1}}],["stackblitz",{"2":{"444":3}}],["stackable",{"2":{"331":1}}],["stash",{"2":{"444":3}}],["staging",{"2":{"426":1,"435":5}}],["staged",{"2":{"444":2}}],["stage",{"2":{"425":1,"426":1,"428":2}}],["standalone",{"2":{"259":2,"261":1,"265":1,"542":1}}],["starbucks",{"2":{"256":1}}],["started",{"2":{"290":2}}],["startotptimer",{"2":{"249":2}}],["start",{"2":{"163":1,"164":1,"169":1,"259":1,"261":1,"265":1,"409":1,"410":1,"542":1}}],["status>=200",{"2":{"398":2}}],["status>200",{"2":{"249":1}}],["status",{"2":{"244":1,"249":1,"290":2,"398":2,"426":1}}],["static",{"2":{"233":1,"440":1,"461":1}}],["stateful",{"2":{"284":1,"449":1}}],["states",{"2":{"237":1,"239":2}}],["state",{"0":{"118":1,"449":1},"2":{"93":2,"110":1,"237":2,"239":3,"243":1,"246":1,"247":1,"349":2,"351":7,"356":1,"397":1,"444":1,"449":5}}],["stringhelpers",{"2":{"436":1}}],["string",{"2":{"246":2,"277":1,"279":3,"289":2,"411":2,"440":1,"441":6}}],["strings",{"2":{"240":1}}],["stringify",{"2":{"95":1,"355":1,"395":3}}],["strategies",{"2":{"171":1}}],["strong>child",{"2":{"358":1}}],["strong>counter",{"2":{"343":1}}],["strong>state",{"2":{"349":1}}],["strong>received",{"2":{"347":1}}],["strong>",{"2":{"114":4,"343":1,"347":1,"349":1,"358":1,"395":2}}],["strongly",{"2":{"83":1}}],["karma",{"2":{"444":10}}],["known",{"2":{"411":1}}],["komodo",{"2":{"213":1}}],["kobold",{"2":{"196":2}}],["keen",{"2":{"447":1}}],["keepalive",{"2":{"151":2}}],["keep",{"0":{"301":1,"303":1},"2":{"2":1,"294":2,"301":1,"326":1}}],["kebab",{"2":{"221":2}}],["keys",{"2":{"449":1}}],["keyup",{"2":{"222":2}}],["keyframes",{"2":{"182":1}}],["key=",{"2":{"148":1,"184":1,"222":2,"236":1,"239":1,"395":1}}],["key",{"0":{"148":1},"2":{"54":1,"55":6,"148":1,"151":1,"222":1,"240":2,"245":4,"281":3,"330":5,"435":9}}],["kic",{"0":{"301":1},"2":{"294":1,"301":1}}],["kit",{"2":{"23":1}}],["kiss",{"0":{"303":1},"2":{"2":1,"294":1,"303":2}}],["сэкономит",{"2":{"453":1}}],["сэкономить",{"2":{"363":1,"459":1}}],["сжатие",{"2":{"442":1}}],["сдвигает",{"2":{"384":1}}],["сдерживающим",{"2":{"244":1}}],["сделки",{"2":{"207":1}}],["сделав",{"2":{"397":1,"453":1}}],["сделанный",{"2":{"461":1}}],["сделана",{"2":{"428":1}}],["сделаны",{"2":{"412":1}}],["сделан",{"2":{"395":1}}],["сделано",{"2":{"223":1,"263":1,"426":1,"428":1}}],["сделал",{"2":{"304":1,"456":1}}],["сделали",{"2":{"223":2,"228":1,"230":1,"269":1,"425":1,"461":1}}],["сделайте",{"2":{"216":1,"247":1,"454":1,"460":2}}],["сделает",{"2":{"142":1,"157":1,"416":1}}],["сделаем",{"2":{"64":1,"88":1,"160":2,"269":1}}],["сделать",{"2":{"7":1,"11":1,"12":1,"25":1,"35":1,"61":1,"62":1,"106":2,"107":3,"126":1,"134":1,"136":1,"170":1,"199":1,"207":1,"214":1,"216":1,"218":2,"219":1,"223":3,"229":1,"233":1,"236":1,"247":1,"248":1,"251":1,"257":1,"264":1,"275":1,"289":1,"290":1,"291":1,"292":1,"304":2,"334":1,"340":1,"355":1,"363":1,"384":3,"393":1,"426":1,"428":2,"429":1,"439":1,"448":2,"449":1,"451":1,"452":1,"461":1,"543":1}}],["сша",{"2":{"303":1}}],["сферы",{"2":{"303":1}}],["сформировать",{"2":{"236":1}}],["сформулировал",{"2":{"171":1}}],["сцену",{"2":{"274":1}}],["сцены",{"2":{"271":1}}],["сценарием",{"2":{"391":1}}],["сценариев",{"2":{"219":1,"252":1,"363":1}}],["сценариям",{"2":{"304":1}}],["сценариях",{"2":{"236":1,"239":1,"256":1}}],["сценария",{"2":{"112":1,"140":1,"225":1,"271":1,"385":1,"412":1,"438":1}}],["сценарий",{"0":{"514":1},"1":{"515":1,"516":1},"2":{"106":1,"264":1,"530":1}}],["сценарии",{"2":{"67":1,"225":1,"249":1,"256":2,"407":1,"533":1}}],["сюда",{"2":{"215":1,"484":1}}],["сбить",{"2":{"410":1}}],["сбивать",{"2":{"336":1}}],["сбивают",{"2":{"204":1}}],["сброса",{"2":{"222":1}}],["сбоя",{"2":{"264":1}}],["сбоку",{"2":{"177":1}}],["сбор",{"2":{"496":1}}],["сборник",{"2":{"442":1}}],["сборок",{"2":{"218":1,"430":1,"443":1}}],["сбора",{"2":{"162":1,"176":1,"231":1}}],["сборку",{"2":{"277":1,"430":1}}],["сборке",{"2":{"215":1,"216":1,"265":1,"355":1}}],["сборки",{"2":{"126":1,"140":1,"213":1,"219":1,"224":1,"265":1,"417":1}}],["сборка",{"0":{"443":1},"2":{"116":1,"140":1,"219":1,"435":1,"443":1}}],["сборщиков",{"2":{"215":1,"278":1}}],["сборщиком",{"2":{"115":1,"141":1,"142":1,"215":1,"219":1}}],["сборщики",{"2":{"141":1,"278":1}}],["сборщика",{"0":{"141":1},"2":{"118":1,"141":2,"142":1,"143":1,"212":2,"214":1,"265":1,"443":3,"492":1}}],["сборщик",{"2":{"110":1,"117":1,"140":1,"141":2,"142":1,"143":1,"215":2,"301":1,"364":1,"443":3}}],["схожих",{"2":{"408":1}}],["схожи",{"2":{"408":1,"451":1}}],["схожести",{"2":{"167":1}}],["схеме",{"2":{"327":1}}],["схема",{"2":{"103":1,"202":1,"206":1,"207":1,"208":1}}],["схемы",{"2":{"38":1,"196":1,"226":1,"239":1,"355":1}}],["схему",{"2":{"17":1,"131":1,"396":1}}],["сне",{"2":{"448":1}}],["снять",{"2":{"264":1,"301":1,"326":1,"461":1}}],["снятие",{"2":{"321":1}}],["снятии",{"2":{"222":1}}],["снятия",{"2":{"197":1}}],["сняты",{"2":{"119":1}}],["снова",{"2":{"151":1,"184":2,"245":1,"249":1,"327":1,"330":1,"414":1}}],["сначала",{"2":{"138":1,"140":1,"141":1,"142":1,"143":1,"194":1,"214":1,"223":1,"228":1,"232":1,"246":1,"249":1,"264":6,"331":1,"335":1,"348":1,"350":1,"396":1,"409":1}}],["сниппетов",{"2":{"530":1}}],["сниппет",{"2":{"336":2}}],["снизить",{"2":{"245":1,"334":1,"459":1}}],["снизу",{"2":{"29":1,"89":1}}],["снимку",{"2":{"426":1}}],["снимке",{"2":{"164":1,"348":1}}],["снимок",{"2":{"239":1}}],["снимаем",{"2":{"236":1,"265":1,"301":1}}],["снимать",{"2":{"106":1}}],["снимаются",{"2":{"106":1}}],["снижает",{"2":{"461":1}}],["снижают",{"2":{"450":1}}],["снижаться",{"2":{"116":1}}],["снижением",{"2":{"139":1}}],["считывать",{"2":{"449":1}}],["считывателем",{"2":{"250":1}}],["считывает",{"2":{"284":1,"498":1}}],["считая",{"2":{"337":1}}],["считает",{"2":{"449":1}}],["считается",{"2":{"108":1,"135":1,"194":1,"196":1,"239":1,"245":1,"250":1,"251":1,"355":1,"460":1}}],["считаем",{"2":{"280":1,"402":1}}],["считаться",{"2":{"268":1}}],["считать",{"2":{"258":1,"271":1,"382":1,"389":1,"452":1}}],["считаются",{"2":{"258":1}}],["счастливо",{"2":{"218":1}}],["счастью",{"2":{"135":1,"337":1}}],["счетчики",{"2":{"273":1}}],["счетчика",{"2":{"223":1,"342":1}}],["счетчик",{"2":{"214":1,"342":1,"344":1}}],["счет",{"2":{"114":1,"139":1,"166":1,"254":1}}],["сгенеренные",{"2":{"461":1}}],["сгенерировавшего",{"2":{"385":1}}],["сгенерированные",{"2":{"265":1}}],["сгенерированный",{"2":{"215":1}}],["сгенерировать",{"2":{"264":1,"439":1}}],["сгенерился",{"2":{"83":1}}],["сгенерить",{"2":{"81":1}}],["сгорания",{"2":{"460":1}}],["сгруппированы",{"2":{"327":1}}],["сгруппированные",{"2":{"297":1}}],["сгруппированных",{"2":{"297":1}}],["сгруппировать",{"2":{"114":1}}],["сгиба",{"2":{"196":1}}],["ссылок",{"2":{"187":1,"196":2,"236":1,"239":1,"301":2,"321":1}}],["ссылаясь",{"2":{"416":1}}],["ссылается",{"2":{"357":1,"386":1}}],["ссылаемся",{"2":{"236":1}}],["ссылаемой",{"2":{"149":1}}],["ссылаются",{"2":{"330":1}}],["ссылающийся",{"2":{"216":1}}],["ссылаться",{"2":{"112":1,"143":2,"148":1,"215":2,"219":1,"222":1,"280":1,"326":1,"338":1,"416":1}}],["ссылкой",{"2":{"195":1,"196":1}}],["ссылки",{"2":{"154":3,"195":1,"196":1,"212":1,"236":1,"239":1,"242":1,"256":1,"279":1,"281":1,"289":1,"298":1,"311":1,"351":1,"384":1,"391":2,"443":1}}],["ссылке",{"2":{"133":1,"143":1,"342":1,"384":1,"516":1}}],["ссылку",{"2":{"88":1,"127":1,"133":1,"184":3,"217":1,"236":1,"263":1,"315":2,"326":1,"355":1,"391":1}}],["ссылками",{"2":{"29":1,"33":1,"196":1,"281":1}}],["ссылка",{"0":{"195":1},"2":{"22":1,"88":1,"93":1,"114":1,"187":1,"195":2,"196":2,"231":1,"279":1,"391":1}}],["смартфоне",{"2":{"461":1}}],["смартфона",{"2":{"461":1}}],["смарт",{"2":{"251":1}}],["смешивает",{"2":{"305":1,"451":1}}],["смешиваясь",{"2":{"167":1}}],["смена",{"2":{"524":1,"535":1}}],["смену",{"2":{"284":1,"451":1}}],["смене",{"2":{"41":1}}],["смесь",{"2":{"228":1}}],["смог",{"2":{"417":1}}],["смогли",{"2":{"122":1,"165":1,"171":1}}],["смогло",{"2":{"61":1}}],["сможет",{"2":{"337":1,"384":1,"496":1}}],["сможете",{"2":{"213":1,"340":2,"456":1}}],["сможем",{"2":{"218":1,"297":1,"337":1,"352":1,"396":1,"422":1}}],["смонтируем",{"2":{"216":1}}],["смонтирован",{"2":{"143":1}}],["смонтировать",{"2":{"140":1,"415":1}}],["см",{"2":{"116":1,"151":1,"186":1,"246":1,"258":1,"273":1,"277":1,"290":1,"326":1,"345":1,"355":1,"428":1}}],["смысле",{"2":{"147":1,"250":1,"303":1,"449":1}}],["смысл",{"2":{"115":1,"181":1,"236":1,"461":1}}],["смысла",{"2":{"38":1,"200":1}}],["смыслом",{"2":{"16":1}}],["сродни",{"2":{"389":1}}],["срочным",{"2":{"178":2}}],["срока",{"2":{"125":1,"135":1}}],["срок",{"2":{"106":3,"135":1}}],["сроком",{"2":{"106":1}}],["сроков",{"2":{"67":1}}],["средних",{"2":{"349":1}}],["средним",{"2":{"325":1}}],["средний",{"2":{"325":3}}],["среднем",{"2":{"460":1}}],["средней",{"2":{"303":1}}],["среднего",{"2":{"139":2,"354":1,"460":1}}],["среда",{"2":{"214":1,"444":1}}],["средам",{"2":{"162":1,"303":1}}],["среде",{"2":{"210":1,"415":1}}],["среды",{"2":{"175":1,"189":1,"212":2,"284":1,"301":1,"335":1}}],["средствами",{"2":{"448":1,"459":1}}],["средствах",{"2":{"429":1}}],["средства",{"2":{"344":1,"429":3,"448":1,"450":1,"459":1}}],["средство",{"2":{"245":1,"443":1,"495":1}}],["средством",{"2":{"209":1}}],["средств",{"2":{"61":1,"128":1,"163":1,"201":1,"250":1,"279":1,"407":1}}],["среди",{"2":{"39":1,"213":2,"256":1,"351":1,"394":1,"450":1}}],["сработает",{"2":{"412":2}}],["срабатывание",{"2":{"411":1}}],["срабатывания",{"2":{"263":1}}],["срабатывает",{"2":{"263":1,"289":1,"337":1,"385":2}}],["срабатывают",{"2":{"233":1}}],["сравнится",{"2":{"461":1}}],["сравниваются",{"2":{"459":1}}],["сравним",{"2":{"111":1,"143":2}}],["сравнений",{"2":{"411":1}}],["сравнения",{"0":{"203":1},"2":{"289":1}}],["сравнении",{"2":{"139":1}}],["сравнению",{"2":{"115":1,"138":1,"200":1,"215":1,"228":1,"267":1,"290":1,"291":1,"354":1,"406":1,"528":1}}],["сравнение",{"2":{"4":1,"114":1,"203":1}}],["сразу",{"2":{"33":1,"61":1,"64":1,"89":1,"106":1,"149":1,"150":1,"327":1,"337":1,"345":1,"382":1,"440":1,"461":2,"496":1,"541":1}}],["скилл",{"2":{"460":1}}],["скидка",{"2":{"103":1}}],["склонений",{"2":{"448":1,"524":1}}],["сквозные",{"2":{"416":1}}],["сквозном",{"2":{"416":1}}],["скажется",{"2":{"218":1}}],["скажем",{"2":{"58":1}}],["скачивает",{"2":{"435":1}}],["скачивания",{"2":{"208":1}}],["скачок",{"2":{"349":1}}],["скачайте",{"2":{"217":1,"218":1}}],["скачает",{"2":{"214":1}}],["скачать",{"0":{"367":1},"2":{"208":2,"218":1,"460":1}}],["сканируют",{"2":{"195":1}}],["сказать",{"2":{"165":1,"242":1,"273":1,"384":1,"451":1}}],["сказано",{"2":{"125":1,"251":1,"349":1}}],["скриншоты",{"2":{"384":1}}],["скриншота",{"2":{"237":1}}],["скриншот",{"2":{"231":1,"358":1}}],["скриншоте",{"2":{"208":1,"384":1}}],["скриптов",{"2":{"418":1}}],["скриптом",{"2":{"355":1}}],["скрипту",{"2":{"355":1}}],["скрипте",{"2":{"289":2}}],["скрипты",{"2":{"228":1,"384":1,"386":1,"387":1}}],["скриптами",{"2":{"461":1}}],["скриптам",{"2":{"450":1}}],["скрипта",{"2":{"215":1,"222":1,"247":1,"265":2,"289":1,"385":1,"386":1,"411":1,"461":1}}],["скрипт",{"2":{"107":2,"265":1,"385":1,"386":1}}],["скрытых",{"2":{"425":1}}],["скрытый",{"2":{"425":1}}],["скрытым",{"2":{"342":1}}],["скрытые",{"0":{"205":1},"2":{"425":1}}],["скрытие",{"2":{"334":1}}],["скрытия",{"2":{"147":1,"192":1}}],["скрыта",{"2":{"203":1}}],["скрыть",{"2":{"191":1,"334":1,"388":1}}],["скрыто",{"2":{"147":1}}],["скрывать",{"2":{"299":1}}],["скрываться",{"2":{"147":1}}],["скрываем",{"2":{"249":1}}],["скрывается",{"2":{"534":1}}],["скрывает",{"2":{"146":1,"203":1,"342":1}}],["скрываются",{"2":{"189":1}}],["скрывают",{"2":{"147":1,"204":1}}],["скрывая",{"2":{"147":1}}],["скролбара",{"2":{"504":1}}],["скролл",{"2":{"284":1}}],["скроллера",{"2":{"183":3}}],["скроллер",{"0":{"183":1},"1":{"184":1},"2":{"183":2,"184":1}}],["скромный",{"2":{"331":1}}],["скромного",{"2":{"331":1}}],["скромное",{"2":{"140":1,"421":1}}],["скроем",{"2":{"86":1}}],["скомпрометирован",{"2":{"245":1}}],["скомпоновать",{"2":{"223":1}}],["скомпилированным",{"2":{"134":1}}],["скомпилировать",{"2":{"134":1}}],["скобок",{"2":{"222":1}}],["скобки",{"2":{"140":1}}],["скопировано",{"2":{"280":1}}],["скопированы",{"2":{"215":1}}],["скопировать",{"2":{"218":1,"236":1}}],["скопируйте",{"2":{"218":1,"453":1}}],["сколько",{"2":{"125":1,"148":1,"181":2,"220":1,"239":1,"249":1,"250":1,"335":1,"355":1,"411":2,"443":1}}],["скоро",{"2":{"420":1}}],["скоростью",{"2":{"139":1,"394":1}}],["скорость",{"2":{"116":1,"440":1}}],["скорости",{"2":{"116":2,"228":1,"461":1}}],["скорее",{"2":{"125":1,"128":1,"384":1}}],["скорей",{"2":{"34":1,"449":1}}],["скоуп",{"2":{"67":1}}],["скелета",{"2":{"100":1}}],["скелет",{"2":{"11":1,"214":1,"495":1}}],["супротив",{"2":{"525":1}}],["субд",{"2":{"421":1,"428":1}}],["субъективное",{"2":{"485":1}}],["субъекту",{"2":{"326":1}}],["субъект",{"2":{"325":5,"326":2}}],["субъекта",{"2":{"245":1,"325":1}}],["суффиксальной",{"2":{"387":1}}],["суффикса",{"2":{"386":1,"391":1}}],["суть",{"2":{"331":1,"350":1}}],["сути",{"2":{"13":1,"96":1,"106":1,"107":1,"194":1,"228":1,"294":1,"298":1,"321":1,"448":1,"449":1}}],["сумме",{"2":{"200":1}}],["суммарный",{"2":{"273":1}}],["сумма",{"2":{"200":1,"205":1}}],["сумму",{"2":{"200":1}}],["существенные",{"2":{"451":1}}],["существенный",{"2":{"304":1,"347":1}}],["существенное",{"2":{"393":1}}],["существенно",{"2":{"336":1}}],["существовало",{"2":{"420":1}}],["существовать",{"2":{"302":1,"311":1,"407":1,"420":1}}],["существование",{"2":{"273":1}}],["существовавшие",{"2":{"119":1}}],["существует",{"2":{"113":1,"116":2,"125":3,"133":1,"134":1,"135":1,"137":1,"138":1,"139":2,"140":1,"143":2,"163":1,"187":1,"189":1,"216":1,"223":1,"230":1,"237":1,"245":3,"248":2,"251":3,"263":1,"264":1,"273":1,"275":1,"283":1,"290":1,"298":1,"306":1,"310":2,"313":1,"315":2,"326":1,"331":1,"336":1,"355":3,"384":1,"385":1,"397":1,"407":1,"410":1,"445":1,"495":1}}],["существующей",{"2":{"489":1}}],["существующего",{"2":{"460":1}}],["существующем",{"2":{"405":1}}],["существующих",{"2":{"12":1,"269":1}}],["существующие",{"0":{"10":1},"2":{"322":1}}],["существуют",{"2":{"67":1,"121":1,"125":1,"137":1,"139":2,"151":1,"180":1,"194":2,"218":1,"248":1,"251":2,"273":1,"283":1,"313":1,"334":1,"336":1,"355":1,"407":1,"408":1,"424":1,"426":1,"451":1}}],["сущность",{"2":{"329":2,"388":2,"449":1}}],["сущностей",{"2":{"16":1,"67":1}}],["сущности",{"0":{"43":1},"2":{"16":1,"23":1,"43":1,"245":1,"329":2,"334":1,"348":1,"388":1,"451":1}}],["сущностями",{"2":{"3":1,"67":2}}],["сабмодулями",{"2":{"436":1}}],["сабхедер",{"2":{"29":1}}],["сахара",{"2":{"352":1}}],["санитизации",{"2":{"223":1}}],["сайд",{"2":{"62":1}}],["сайдбара",{"2":{"536":1}}],["сайдбаром",{"2":{"534":1}}],["сайдбаре",{"2":{"90":1}}],["сайдбар",{"2":{"30":1,"33":2,"35":1,"86":1,"534":1,"536":1}}],["сайтом",{"2":{"206":1,"460":1,"484":1}}],["сайтов",{"2":{"125":3,"196":1,"226":1,"228":1,"461":1}}],["сайту",{"2":{"106":1,"125":1,"229":1,"251":1,"264":1,"439":2}}],["сайте",{"2":{"48":1,"106":1,"107":1,"131":1,"186":1,"191":1,"208":2,"217":2,"218":2,"245":1,"284":1,"354":1,"366":1,"368":1,"387":1,"443":1,"448":1,"449":1,"460":1,"461":1,"524":1}}],["сайт",{"0":{"74":1},"2":{"26":1,"74":1,"100":2,"106":1,"135":1,"191":1,"203":1,"208":1,"213":5,"214":6,"215":2,"218":2,"220":1,"228":3,"245":1,"384":1,"418":2,"429":1,"433":1,"435":1,"436":1,"439":4,"452":1,"460":2,"461":2,"495":1,"515":1,"516":1}}],["сайты",{"0":{"22":1},"2":{"22":1,"107":1,"180":1,"355":1,"382":1}}],["сайтами",{"2":{"245":1,"461":1}}],["сайтах",{"2":{"89":1,"189":1,"191":1,"208":1,"299":1}}],["сайта",{"0":{"25":1},"2":{"9":1,"25":2,"26":1,"27":1,"39":1,"106":4,"122":1,"124":2,"131":1,"136":1,"160":1,"165":1,"166":1,"180":1,"187":1,"189":1,"190":1,"193":1,"194":1,"196":1,"208":1,"213":1,"217":2,"218":1,"245":1,"409":1,"422":1,"435":2,"448":1,"450":1,"451":1,"452":1,"461":3,"494":1,"496":2,"515":1,"524":2}}],["сама",{"2":{"171":1,"181":1,"260":1,"405":1}}],["самая",{"2":{"121":1,"384":1,"423":1,"436":1}}],["самых",{"2":{"183":1,"252":1,"290":1,"311":1}}],["самые",{"2":{"167":1,"337":1,"394":1,"443":1,"451":1}}],["самыми",{"2":{"264":1}}],["самым",{"2":{"139":1,"142":1,"149":1,"181":1,"194":1,"198":1,"414":1,"422":1,"428":1,"449":1,"461":1}}],["самый",{"2":{"17":1,"22":1,"32":1,"106":1,"233":1,"240":1,"244":1,"246":1,"278":1,"297":1,"311":1,"314":1,"326":1,"337":1,"344":1,"435":1,"450":1,"460":1}}],["сами",{"2":{"128":1,"160":1,"304":1,"436":1,"439":1,"443":1,"460":1,"503":1}}],["самим",{"2":{"11":1,"86":1,"461":1}}],["самую",{"2":{"25":1}}],["самоучитель",{"2":{"460":1}}],["самоуправляемые",{"2":{"251":1}}],["самописный",{"2":{"459":1}}],["само",{"2":{"420":1}}],["самообновляющийся",{"2":{"214":1}}],["самостоятельные",{"2":{"408":1}}],["самостоятельный",{"2":{"107":1,"284":1}}],["самостоятельной",{"2":{"411":1}}],["самостоятельно",{"2":{"124":1,"128":1,"249":1,"299":1,"439":2}}],["самой",{"2":{"34":1,"102":1,"214":1,"421":1,"450":1,"461":1}}],["самого",{"2":{"3":1,"152":1,"163":1,"196":1,"215":1,"233":1,"272":2,"283":1,"416":1,"435":1,"495":1}}],["самому",{"2":{"4":1,"26":1,"304":1,"320":1,"451":1,"459":1}}],["самом",{"2":{"3":1,"124":1,"128":1,"134":1,"135":1,"139":1,"157":1,"228":1,"239":1,"243":1,"305":1,"342":1,"384":1,"448":1}}],["самое",{"2":{"2":1,"3":1,"33":1,"35":1,"48":1,"88":1,"96":1,"106":2,"162":1,"165":1,"215":1,"222":1,"223":1,"245":1,"256":1,"281":1,"321":2,"330":1,"436":1,"444":1,"451":1,"454":1}}],["сам",{"2":{"3":1,"94":1,"100":1,"139":1,"256":1,"315":1,"325":1,"363":1,"386":1,"407":1,"448":1,"449":2,"455":1}}],["сенсорных",{"2":{"507":1}}],["сенсорное",{"2":{"163":1,"180":1}}],["сеансов",{"2":{"355":1}}],["сессий",{"2":{"359":1}}],["сессионного",{"2":{"358":1}}],["сессионное",{"2":{"358":1}}],["сессионные",{"0":{"355":1}}],["сессиях",{"2":{"183":1}}],["сессиями",{"0":{"95":1},"2":{"95":1}}],["сестры",{"2":{"273":1}}],["секретного",{"2":{"245":1}}],["секретный",{"2":{"245":4}}],["секунды",{"2":{"386":1,"393":2}}],["секунду",{"2":{"384":2}}],["секундах",{"2":{"249":1}}],["секунд",{"2":{"180":1,"249":1,"250":1,"444":1}}],["секцию",{"2":{"221":1,"358":1}}],["секцией",{"2":{"196":1}}],["секций",{"2":{"180":1}}],["секции",{"2":{"142":1,"143":1,"166":1,"191":1,"194":2,"216":2,"221":2,"222":4,"245":1,"258":1,"263":1,"277":1,"410":1}}],["секция",{"0":{"196":1},"2":{"4":1,"11":1,"215":1,"245":2,"384":1,"410":1}}],["селекторы",{"2":{"140":1}}],["сегодняшний",{"2":{"160":1,"419":1,"421":1}}],["сегодня",{"2":{"138":2,"160":1,"171":1,"174":1,"189":2,"228":2,"252":1,"264":1,"299":1,"397":1,"420":1}}],["сегмент",{"2":{"273":1}}],["сегментировать",{"2":{"252":1}}],["сегмента",{"2":{"222":1}}],["сегментах",{"2":{"126":1}}],["сегментом",{"2":{"125":1}}],["сегменты",{"2":{"125":1,"222":1}}],["сеттерами",{"2":{"449":1}}],["сеть",{"2":{"251":2,"264":4}}],["сетью",{"2":{"251":1}}],["сетям",{"2":{"251":2}}],["сетями",{"2":{"139":1}}],["сетях",{"2":{"202":1,"258":1}}],["сетке",{"2":{"189":1}}],["сетевое",{"2":{"382":1}}],["сетевой",{"2":{"244":1,"335":1,"397":2,"402":1}}],["сетевым",{"2":{"403":1}}],["сетевыми",{"2":{"256":1}}],["сетевые",{"2":{"337":1,"382":1,"397":1,"402":1,"407":1,"413":1}}],["сетевых",{"2":{"125":1,"228":1,"243":3,"264":1,"382":1,"397":2,"398":1,"401":1,"408":1}}],["сетей",{"0":{"196":1},"2":{"125":1,"196":2}}],["сети",{"2":{"11":1,"103":1,"125":5,"140":1,"209":1,"228":1,"251":6,"264":4,"384":1,"393":1,"397":1,"429":1}}],["семантические",{"2":{"457":1}}],["семантически",{"2":{"87":1}}],["сейчас",{"2":{"40":1,"141":1,"158":1,"172":1,"234":1,"248":1,"249":1,"331":1,"395":1,"428":1,"439":1,"460":1}}],["себя",{"0":{"124":1,"369":1},"1":{"125":1,"370":1,"371":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"381":1},"2":{"39":1,"68":2,"69":1,"73":1,"76":1,"122":1,"128":1,"134":1,"138":2,"139":1,"141":1,"147":1,"148":1,"150":1,"162":2,"176":2,"178":1,"179":1,"219":1,"228":1,"229":1,"233":1,"254":1,"264":1,"283":1,"301":1,"302":1,"304":1,"325":1,"329":1,"356":1,"388":1,"397":1,"407":2,"425":1,"429":2,"430":1,"440":1,"449":1,"451":2,"460":1,"495":1,"500":1,"533":1}}],["себе",{"2":{"26":2,"128":1,"141":1,"160":1,"181":1,"213":1,"228":1,"299":1,"305":1,"405":1,"420":1,"451":1}}],["серьезной",{"2":{"384":1}}],["серьезная",{"2":{"355":1}}],["серьезных",{"2":{"10":1,"103":1,"171":1}}],["серию",{"2":{"409":1}}],["сериализуя",{"2":{"396":1}}],["сериализуемой",{"2":{"395":1}}],["сериализуемыми",{"2":{"384":1}}],["сериализуемые",{"2":{"384":1,"388":1}}],["сериализован",{"2":{"385":1}}],["сериализованы",{"2":{"327":1}}],["сериализовать",{"2":{"355":1}}],["сериализовываться",{"2":{"328":1}}],["серия",{"2":{"245":1}}],["серебряной",{"2":{"256":1,"275":1}}],["середине",{"2":{"29":1}}],["серой",{"2":{"175":1}}],["серая",{"2":{"139":1}}],["сертификация",{"2":{"460":1}}],["сертификации",{"2":{"135":1,"460":1}}],["сертификатов",{"2":{"135":1}}],["сертификат",{"2":{"135":5,"257":1,"439":3}}],["сертификата",{"2":{"124":1,"135":7,"136":1}}],["сертификаты",{"2":{"4":1,"439":1}}],["сертифицированных",{"2":{"135":1}}],["сертифицирующим",{"2":{"135":1}}],["сердечка",{"2":{"93":1,"94":1}}],["сервиcа",{"2":{"107":1}}],["сервису",{"2":{"388":1}}],["сервисный",{"2":{"500":1}}],["сервисных",{"2":{"284":1,"290":1}}],["сервисного",{"2":{"264":3}}],["сервисом",{"2":{"245":1,"392":1}}],["сервисов",{"2":{"39":1,"107":3,"134":1,"202":2,"228":1,"243":1,"245":1,"248":1,"392":2,"398":1,"403":1,"429":1}}],["сервисе",{"2":{"243":1,"249":1,"393":1,"411":1}}],["сервисах",{"2":{"200":1,"386":1,"408":1}}],["сервиса",{"2":{"107":2,"109":1,"244":1,"264":1,"265":2,"281":2,"290":2,"345":1,"356":1,"390":1,"391":1,"395":1,"410":2,"411":1,"430":1,"461":1}}],["сервисами",{"2":{"125":1,"305":1,"354":1,"359":1,"388":1,"391":1,"410":1,"419":1,"496":1}}],["сервисам",{"2":{"41":1,"384":1,"388":2,"403":1}}],["сервисы",{"0":{"40":1},"2":{"106":1,"107":1,"128":1,"157":1,"243":1,"382":1,"388":1,"408":1,"429":2,"431":1,"436":1,"444":1,"449":1,"460":1,"533":1}}],["сервис",{"0":{"105":1},"2":{"10":1,"39":1,"40":2,"41":1,"58":1,"105":1,"107":1,"249":2,"251":1,"264":4,"281":1,"322":1,"323":1,"345":2,"348":1,"391":1,"393":2,"398":2,"400":1,"409":2,"410":1,"417":1,"451":1,"460":1,"484":1,"533":1}}],["серверу",{"2":{"135":2,"228":1,"245":3,"248":1,"402":2}}],["серверов",{"2":{"128":1,"131":1,"133":2}}],["сервером",{"2":{"11":1,"107":1,"128":1,"135":1,"215":1,"228":1,"243":1,"244":1,"246":2,"251":1,"302":3,"330":1,"334":1,"388":1,"397":1,"402":2,"411":1,"461":1}}],["серверы",{"0":{"125":1,"133":1},"1":{"127":1},"2":{"125":2,"137":1,"251":1}}],["серверами",{"2":{"394":1,"402":1}}],["серверам",{"2":{"303":1}}],["серверах",{"2":{"135":1,"213":1,"251":1}}],["сервера",{"0":{"128":1,"129":1,"131":1},"1":{"129":1,"130":2,"131":1,"132":2,"133":1},"2":{"108":1,"122":2,"124":1,"125":2,"126":1,"128":3,"131":4,"135":2,"214":1,"233":1,"244":2,"248":1,"250":2,"256":2,"302":1,"329":1,"335":1,"400":1,"401":1,"402":1,"419":1,"429":1,"440":1,"448":1,"461":6,"524":1}}],["сервере",{"2":{"40":1,"70":1,"107":1,"108":2,"125":1,"128":2,"134":3,"135":1,"228":2,"244":3,"245":1,"246":1,"257":1,"264":1,"328":1,"379":1,"397":2,"433":1,"435":2,"439":1,"461":1,"469":1,"470":1}}],["серверному",{"2":{"461":1}}],["серверного",{"2":{"233":1,"402":1}}],["серверной",{"2":{"128":1,"413":1}}],["серверный",{"2":{"244":1}}],["серверным",{"2":{"132":1}}],["серверных",{"2":{"109":1}}],["серверные",{"2":{"40":1,"228":1,"256":1}}],["серверная",{"0":{"6":1}}],["сервер",{"0":{"134":1,"401":1},"1":{"402":1},"2":{"39":1,"105":1,"107":2,"108":2,"109":2,"125":1,"126":2,"127":1,"128":9,"129":1,"131":1,"133":1,"134":3,"136":2,"137":1,"214":3,"215":1,"217":1,"222":1,"228":1,"243":1,"244":1,"245":2,"247":2,"248":1,"249":2,"250":3,"355":1,"382":2,"397":2,"399":2,"400":3,"401":1,"402":4,"409":1,"419":2,"430":1,"435":2,"439":1,"444":1,"460":1,"461":3}}],["спальни",{"2":{"461":1}}],["спать",{"2":{"461":1}}],["спагетти",{"2":{"304":2}}],["спам",{"0":{"209":1}}],["спланировать",{"2":{"293":1}}],["спуститься",{"2":{"237":1}}],["спиннера",{"2":{"181":3}}],["спиннер",{"2":{"181":1}}],["спиннеры",{"0":{"181":1},"1":{"182":1},"2":{"181":1}}],["списание",{"2":{"201":1}}],["список",{"0":{"296":1,"306":1},"1":{"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"304":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,"334":1,"335":1,"336":1,"337":1},"2":{"31":1,"95":2,"108":2,"110":3,"120":1,"128":1,"135":1,"143":1,"150":1,"173":1,"174":1,"176":3,"180":1,"183":2,"184":1,"187":1,"192":2,"209":1,"219":1,"220":1,"222":7,"223":2,"228":1,"231":2,"233":1,"236":1,"237":2,"242":3,"258":1,"266":1,"269":1,"273":5,"274":1,"291":1,"294":1,"305":1,"306":1,"310":1,"354":1,"355":1,"411":1,"415":1,"423":1}}],["списках",{"2":{"176":1,"220":1}}],["спискам",{"2":{"167":1}}],["списка",{"2":{"151":1,"165":1,"175":1,"176":1,"183":2,"184":3,"189":1,"212":1,"222":4,"231":1,"254":1,"273":1,"290":4,"384":1,"395":1}}],["списков",{"2":{"147":1,"183":1,"192":1,"231":1,"524":1}}],["списком",{"2":{"11":1,"41":1,"125":1,"223":1,"231":1,"236":1,"290":2}}],["списке",{"2":{"3":1,"184":1,"189":1,"290":1,"320":1,"334":1,"395":1}}],["спроектированного",{"2":{"403":1}}],["спросить",{"2":{"236":1}}],["спровоцировать",{"2":{"180":1}}],["спрайтовых",{"2":{"218":1}}],["справедливо",{"2":{"355":1}}],["справочную",{"2":{"460":1}}],["справочник",{"2":{"338":1,"460":1}}],["справочником",{"2":{"110":1}}],["справочного",{"2":{"323":1}}],["справочный",{"0":{"306":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,"334":1,"335":1,"336":1,"337":1}}],["справку",{"2":{"219":1}}],["справки",{"2":{"177":1}}],["справиться",{"2":{"160":1,"181":1,"242":1}}],["справа",{"2":{"29":1,"89":1,"125":1,"175":2,"179":2}}],["спрятана",{"2":{"105":1}}],["спектру",{"2":{"350":1}}],["спектр",{"2":{"216":1,"316":1}}],["сперва",{"2":{"64":1,"81":1,"442":1,"449":1,"460":1,"461":1}}],["специфичных",{"2":{"495":1}}],["специфичной",{"2":{"134":1}}],["специфичное",{"2":{"109":1}}],["специфического",{"2":{"277":1}}],["специфической",{"2":{"250":1}}],["специфические",{"2":{"219":1,"398":1}}],["спецификаций",{"2":{"461":1}}],["спецификацию",{"2":{"261":1,"501":1}}],["спецификациях",{"2":{"355":1}}],["спецификация",{"2":{"258":1,"460":1}}],["спецификациями",{"2":{"403":1}}],["спецификациям",{"2":{"216":1}}],["спецификации",{"2":{"68":1,"69":1,"139":1,"243":1,"258":3}}],["специализированном",{"2":{"160":1}}],["специализированным",{"2":{"108":1,"160":1}}],["специальную",{"2":{"144":1}}],["специальным",{"2":{"285":1}}],["специальные",{"0":{"282":1},"1":{"283":1},"2":{"125":1,"144":1,"251":1,"269":1,"283":1}}],["специальный",{"0":{"412":1,"413":1},"2":{"119":1,"129":1,"151":1,"284":1,"285":2,"337":1,"425":1}}],["специальных",{"2":{"108":1,"256":1,"281":1,"292":1,"407":1}}],["специальная",{"2":{"115":1,"116":1,"426":1}}],["специальной",{"2":{"233":2,"349":1}}],["специально",{"2":{"181":1,"223":1,"228":1,"256":1,"266":1,"271":1,"428":1}}],["специального",{"2":{"109":1,"391":1}}],["специальному",{"2":{"13":1,"280":1}}],["спецпредложений",{"2":{"4":1}}],["спорным",{"2":{"495":1}}],["спонсировать",{"2":{"354":1}}],["способами",{"2":{"269":1,"293":1,"328":1}}],["способа",{"2":{"222":1,"342":1,"461":1}}],["способов",{"2":{"218":1,"237":1,"244":1,"251":1,"273":1,"290":1,"313":1,"318":1,"334":1}}],["способом",{"2":{"140":1,"142":1,"180":1,"183":1,"223":1,"303":1,"318":1,"337":2,"342":2,"349":1,"415":1,"418":1,"422":1}}],["способе",{"2":{"143":1,"489":1,"491":1}}],["способный",{"2":{"128":1}}],["способности",{"0":{"26":1}}],["способы",{"2":{"68":1,"194":1,"244":1,"313":1,"336":1,"424":1}}],["способ",{"0":{"111":1},"2":{"55":1,"106":1,"110":1,"111":1,"143":3,"235":1,"236":1,"237":1,"244":2,"248":1,"259":1,"264":1,"283":1,"293":1,"314":1,"324":1,"326":1,"336":1,"342":1,"344":1,"347":1,"351":1,"384":1,"386":1,"395":1,"418":1,"427":1,"430":1,"435":2,"443":1,"461":1}}],["спойлер",{"2":{"4":1}}],["симулированный",{"2":{"413":1}}],["симуляции",{"2":{"405":1}}],["символов",{"2":{"218":1,"355":1}}],["символом",{"2":{"176":1}}],["символ",{"2":{"163":1,"187":1,"355":1}}],["сигнатура",{"2":{"398":1}}],["сигнал",{"2":{"411":1}}],["сигнализирует",{"2":{"337":1}}],["сигналы",{"2":{"279":1}}],["сигнальные",{"2":{"273":1}}],["сиблингу",{"2":{"273":1}}],["ситуацией",{"2":{"449":1}}],["ситуациях",{"2":{"452":1}}],["ситуация",{"2":{"236":1,"285":1,"451":1}}],["ситуациями",{"2":{"181":1}}],["ситуаций",{"2":{"233":1,"244":1}}],["ситуацию",{"2":{"160":1,"281":1}}],["ситуации",{"2":{"139":1,"170":1,"349":1,"420":1}}],["сих",{"2":{"141":1,"150":1,"161":1,"191":1,"212":1,"228":1,"237":1,"239":2,"278":1,"334":1,"349":1}}],["синтез",{"2":{"449":1}}],["синтаксического",{"2":{"352":1}}],["синтаксисов",{"2":{"279":1}}],["синтаксисом",{"2":{"143":1,"151":1,"278":1,"337":2,"416":1}}],["синтаксису",{"2":{"278":1,"337":1}}],["синтаксисы",{"2":{"142":1}}],["синтаксис",{"2":{"116":1,"142":2,"143":6,"278":3,"280":2,"281":1,"283":3,"337":3,"354":1,"387":2,"411":1,"413":1,"492":1}}],["синтаксисе",{"2":{"114":1,"220":1,"279":2,"332":1,"352":1}}],["синтаксиса",{"2":{"112":1,"113":1,"121":1,"138":1,"142":1,"278":1,"283":2,"337":1,"351":1}}],["синхронного",{"2":{"405":1}}],["синхронность",{"2":{"336":1}}],["синхронной",{"2":{"335":3,"336":1}}],["синхронный",{"0":{"336":1}}],["синхронные",{"2":{"335":1,"408":1}}],["синхронизирует",{"2":{"421":2}}],["синхронизируется",{"2":{"358":1}}],["синхронизированном",{"2":{"429":1}}],["синхронизирован",{"2":{"357":2}}],["синхронизировано",{"2":{"354":1,"358":1}}],["синхронизироваться",{"2":{"429":1}}],["синхронизировать",{"2":{"331":1,"349":1,"356":1,"429":2}}],["синхронизация",{"2":{"397":1}}],["синхронизации",{"2":{"236":1}}],["синхронизацию",{"2":{"134":1,"149":1,"394":1,"429":1}}],["синдицированных",{"2":{"248":1}}],["синглтоном",{"2":{"391":1}}],["синглтоны",{"2":{"315":1}}],["синглтонами",{"2":{"314":1}}],["синглтона",{"2":{"313":1,"319":1,"321":1}}],["синглтон",{"2":{"216":1,"236":1,"290":1,"294":1,"305":1,"311":1,"315":2,"322":2,"326":1,"346":1,"350":1,"356":1,"357":1,"449":1}}],["синоним",{"2":{"125":1}}],["сильный",{"2":{"283":1}}],["сильные",{"2":{"279":1}}],["сильное",{"2":{"442":1}}],["сильно",{"2":{"3":1,"22":1,"26":1,"29":1,"47":1,"50":1,"79":1,"100":1,"109":1,"124":1,"125":1,"143":2,"301":1,"415":1,"443":1,"448":1,"450":1,"451":2,"454":1,"459":1,"460":2,"461":1,"524":1,"543":1}}],["силами",{"2":{"303":1}}],["сила",{"2":{"243":1,"285":1}}],["силу",{"2":{"12":1}}],["системные",{"2":{"423":1}}],["системным",{"2":{"179":1}}],["системой",{"2":{"256":2,"261":1,"334":1,"355":1,"378":1,"422":1}}],["системе",{"2":{"68":1,"131":1,"256":2,"258":1,"358":1,"365":1,"405":1,"421":1,"425":2,"451":1}}],["систему",{"2":{"3":1,"106":1,"128":1,"188":1,"247":2,"248":1,"249":1,"297":2,"299":1,"303":1,"342":1,"355":1,"384":1,"405":1,"422":1,"423":1}}],["систематическое",{"2":{"256":1}}],["системах",{"0":{"422":1,"423":1,"424":1},"2":{"213":1,"256":1,"263":1,"423":2,"424":1}}],["система",{"2":{"2":1,"68":1,"76":1,"106":2,"128":1,"162":1,"181":2,"204":1,"220":1,"256":1,"297":2,"302":1,"303":1,"334":1,"349":1,"385":1,"500":1}}],["системами",{"2":{"2":1,"228":1,"254":1,"256":2,"451":1}}],["системы",{"0":{"405":1},"1":{"406":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,"419":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},"2":{"2":1,"12":1,"41":2,"68":3,"106":2,"135":1,"162":1,"175":1,"244":1,"249":1,"256":2,"281":1,"286":1,"297":1,"306":1,"329":1,"402":1,"405":1,"407":1,"422":1,"451":1,"452":1,"459":1}}],["систем",{"2":{"2":1,"363":1,"403":1,"420":1,"451":1}}],["слышат",{"2":{"429":1}}],["слышали",{"2":{"194":1}}],["слияний",{"2":{"428":1,"429":1}}],["слияния",{"2":{"428":1,"430":1}}],["слияниями",{"0":{"427":1}}],["слиянии",{"0":{"428":1},"2":{"428":1}}],["слияние",{"2":{"421":1,"427":1,"428":4}}],["слишком",{"2":{"143":1,"170":1,"171":1,"172":1,"219":1,"251":1,"299":1,"303":1,"384":3}}],["сладко",{"2":{"228":1}}],["слайдер",{"0":{"447":1}}],["слайдеров",{"2":{"180":1}}],["слайдеры",{"0":{"180":1},"2":{"180":3}}],["слабо",{"2":{"299":1,"436":1}}],["слабом",{"2":{"106":1}}],["слабосвязные",{"2":{"41":1}}],["слабосвязанными",{"2":{"7":1}}],["слабосвязанные",{"2":{"3":1,"4":1}}],["слабую",{"2":{"34":1}}],["слабая",{"0":{"34":1},"2":{"436":1}}],["слушатель",{"2":{"389":1}}],["слушателей",{"2":{"355":1,"451":1}}],["слушателями",{"2":{"325":1}}],["слушателя",{"2":{"263":2,"284":1}}],["служат",{"2":{"451":1}}],["служебный",{"2":{"409":1}}],["службе",{"2":{"245":1,"402":1}}],["службу",{"2":{"201":1,"250":1,"396":1,"397":1}}],["службы",{"2":{"126":1,"388":1}}],["служб",{"2":{"125":1,"264":1}}],["служит",{"2":{"108":1,"402":1}}],["служить",{"2":{"72":1,"408":1}}],["случаи",{"2":{"282":1,"283":1,"299":1,"301":1,"347":1,"398":1}}],["случаям",{"2":{"242":1}}],["случаями",{"2":{"219":1,"242":1}}],["случая",{"2":{"140":1,"275":1,"277":1,"304":1,"347":1,"384":1,"407":2,"411":1}}],["случаях",{"2":{"4":1,"114":1,"151":1,"160":1,"162":1,"174":1,"176":1,"181":1,"191":1,"200":1,"208":1,"214":1,"216":1,"228":1,"245":1,"251":1,"259":1,"275":1,"313":1,"315":1,"335":1,"342":1,"384":1,"404":1,"412":1,"417":1,"438":1,"449":2,"536":1}}],["случаен",{"2":{"323":1}}],["случается",{"2":{"245":1}}],["случаев",{"2":{"106":1,"216":1,"222":2,"256":1,"265":1,"269":1,"300":1,"326":3,"335":1,"336":2,"337":1,"408":1,"409":1,"438":1,"445":1,"448":2,"461":2,"524":1}}],["случае",{"2":{"12":1,"22":1,"41":1,"47":1,"106":3,"107":1,"108":1,"124":1,"126":1,"128":2,"131":2,"134":1,"135":2,"139":2,"140":1,"142":1,"143":1,"157":1,"163":1,"168":1,"172":1,"176":1,"177":1,"183":2,"196":1,"203":1,"205":1,"216":1,"222":3,"223":1,"229":1,"236":3,"237":2,"239":2,"243":2,"244":3,"249":1,"250":2,"251":3,"263":1,"264":1,"265":1,"278":1,"279":1,"280":2,"283":1,"284":1,"290":2,"297":1,"304":1,"310":1,"319":1,"321":2,"325":1,"327":1,"328":1,"329":1,"331":1,"337":5,"345":1,"347":1,"348":1,"349":1,"351":1,"352":1,"355":2,"384":1,"385":1,"388":2,"393":1,"396":1,"402":1,"407":1,"408":2,"410":1,"411":4,"413":1,"415":2,"416":2,"418":1,"423":1,"426":1,"428":1,"435":1,"436":1,"439":1,"443":1,"448":2,"449":1,"451":1}}],["случайно",{"2":{"195":1}}],["случай",{"0":{"412":1,"413":1},"2":{"9":1,"93":1,"285":1,"411":1,"413":1,"429":1,"435":1,"460":1}}],["слою",{"2":{"388":1}}],["сложен",{"2":{"334":2}}],["сложнее",{"2":{"297":1,"303":1,"337":1,"407":2}}],["сложную",{"2":{"199":1,"303":1}}],["сложны",{"2":{"338":1}}],["сложный",{"2":{"330":1,"449":1}}],["сложные",{"2":{"149":1,"170":1,"228":1,"239":1,"279":1,"281":1,"342":1}}],["сложных",{"2":{"114":1,"138":1,"174":1,"191":1,"237":1,"264":1,"279":1,"329":1,"340":1,"363":1,"382":1,"459":1}}],["сложным",{"2":{"3":1,"128":1,"334":1,"355":1,"357":1,"407":1,"461":1}}],["сложными",{"2":{"2":1,"114":1,"451":1}}],["сложная",{"2":{"109":1}}],["сложно",{"2":{"394":1,"460":1}}],["сложному",{"2":{"334":1,"415":1}}],["сложное",{"2":{"298":1}}],["сложностей",{"2":{"403":1}}],["сложностям",{"2":{"298":1}}],["сложность",{"2":{"105":1,"191":2,"303":1,"334":2,"340":1,"388":1,"420":1}}],["сложности",{"2":{"2":1,"138":1,"143":1,"170":1,"228":1,"250":1,"256":1,"297":1,"334":1,"405":2,"421":1,"451":2,"485":1}}],["сложной",{"2":{"41":1,"229":1,"264":1,"385":1}}],["сложного",{"0":{"2":1}}],["слоев",{"2":{"331":1,"384":1}}],["слоте",{"2":{"283":1}}],["слотом",{"2":{"283":2}}],["слотов",{"2":{"283":4,"288":1}}],["слотам",{"2":{"415":1}}],["слотами",{"2":{"283":1}}],["слота",{"2":{"283":3,"437":1}}],["слоту",{"2":{"283":1}}],["слот",{"2":{"283":4,"289":1}}],["слоты",{"0":{"283":3},"2":{"283":5}}],["сломает",{"2":{"223":1}}],["сломать",{"2":{"106":1}}],["слов",{"2":{"199":1,"221":1,"429":1}}],["словами",{"2":{"433":1,"449":1,"461":1,"495":1}}],["словарь",{"2":{"391":1}}],["словаря",{"2":{"322":1,"326":1}}],["слова",{"2":{"177":1,"221":1}}],["слово",{"2":{"140":1,"143":3,"155":1,"157":1,"329":1,"337":1,"351":1,"386":1,"483":1}}],["словом",{"2":{"121":1,"337":1}}],["слой",{"2":{"58":1,"325":1,"459":1,"500":1,"530":1}}],["слоями",{"2":{"388":1}}],["слоя",{"2":{"40":1,"388":3}}],["следам",{"2":{"420":1}}],["следит",{"2":{"451":1}}],["следить",{"2":{"236":1,"326":1,"426":1,"451":1}}],["следите",{"0":{"166":1}}],["следовало",{"2":{"349":1,"352":1,"354":1}}],["следовать",{"2":{"217":1,"233":1,"300":1,"365":1}}],["следовательно",{"2":{"140":1}}],["следование",{"2":{"186":1}}],["следствия",{"2":{"170":1}}],["следствием",{"2":{"169":1}}],["следуйте",{"2":{"287":1,"341":1}}],["следуя",{"2":{"216":2,"231":1,"249":1,"261":1,"289":2,"297":1,"313":1,"390":1,"422":1}}],["следуют",{"2":{"163":1,"198":1,"280":1,"342":1}}],["следующую",{"2":{"127":1,"139":1,"214":3,"222":1,"230":1,"336":1,"397":1,"401":1,"409":1,"411":1,"414":1,"418":1,"419":1,"425":2,"460":1}}],["следующего",{"0":{"304":1},"1":{"307":1,"308":1,"309":1,"310":1},"2":{"166":1,"194":1,"216":1,"222":1,"239":1,"243":1,"247":1,"264":1,"280":1,"283":1,"289":1,"294":1,"336":1,"407":1,"409":1,"413":1}}],["следующем",{"2":{"150":1,"214":2,"220":1,"222":1,"247":1,"264":1,"280":2,"281":1,"289":1,"408":1,"417":1}}],["следующему",{"2":{"125":1,"165":1,"239":1,"272":1,"323":1,"334":1,"344":1}}],["следующее",{"2":{"83":1,"113":1,"124":1,"150":1,"160":1,"161":1,"213":2,"214":1,"218":1,"220":1,"221":1,"222":1,"226":1,"227":1,"229":1,"244":1,"245":1,"254":1,"255":1,"264":1,"269":1,"270":1,"283":2,"289":2,"290":1,"321":1,"341":1,"355":2,"365":1,"383":1,"386":1,"406":1,"408":1,"417":2,"425":3,"428":3,"452":1}}],["следующей",{"2":{"81":1,"134":1,"158":1,"223":1,"224":1,"228":1,"236":1,"243":1,"245":1,"251":1,"252":1,"265":1,"277":1,"292":1,"326":1,"338":1,"345":1,"350":1,"359":1,"388":1,"403":1,"410":1,"414":1,"420":1,"425":1,"426":1,"429":1}}],["следующий",{"2":{"150":1,"219":1,"222":1,"223":1,"242":1,"280":1,"283":1,"290":1,"301":1,"384":1,"391":1,"393":1,"414":1,"415":1}}],["следующим",{"2":{"122":1,"125":2,"126":1,"141":1,"148":1,"170":1,"183":2,"196":1,"214":1,"217":3,"219":2,"220":1,"221":2,"222":1,"231":1,"232":1,"233":1,"237":1,"239":2,"246":1,"249":1,"251":1,"254":1,"256":1,"263":1,"265":1,"272":2,"274":1,"281":2,"283":1,"288":1,"289":3,"290":1,"318":1,"321":1,"323":1,"329":1,"331":1,"334":1,"336":1,"337":1,"345":1,"346":1,"385":2,"394":1,"398":1,"399":1,"401":1,"410":1,"414":1,"418":1,"419":2,"423":1,"425":1,"428":1,"500":1}}],["следующими",{"2":{"100":1,"159":1,"172":1,"222":1,"264":1,"326":1,"330":1,"351":1}}],["следующие",{"2":{"67":1,"116":1,"125":1,"138":1,"142":1,"143":1,"168":1,"193":1,"197":1,"212":1,"214":1,"217":1,"222":2,"230":2,"233":1,"235":1,"246":1,"253":1,"261":1,"263":1,"264":1,"266":1,"268":1,"271":1,"284":1,"286":1,"289":3,"293":1,"314":1,"329":1,"331":1,"332":1,"335":1,"340":1,"349":1,"350":1,"352":1,"382":1,"385":1,"388":1,"394":1,"396":1,"407":2,"409":1,"410":2,"411":1,"421":1,"423":1,"425":1,"426":1,"428":1,"429":1,"508":1}}],["следующих",{"2":{"66":1,"135":1,"139":1,"233":1,"279":1,"305":1,"334":1,"530":1}}],["следующая",{"2":{"17":1,"222":1,"396":1}}],["следует",{"2":{"110":1,"114":1,"121":1,"126":1,"130":1,"139":1,"157":1,"173":1,"175":1,"177":1,"186":1,"189":1,"191":1,"210":1,"211":1,"218":2,"228":1,"233":1,"236":1,"244":2,"251":1,"256":1,"261":1,"264":1,"265":1,"272":1,"275":1,"284":1,"285":1,"290":2,"294":1,"299":1,"305":1,"312":1,"342":1,"383":1,"384":1,"398":1,"413":1,"419":1,"449":1,"461":1}}],["слева",{"2":{"28":1,"29":1,"30":2,"33":1,"35":1,"90":1,"175":2,"196":1,"534":1}}],["ступенькой",{"2":{"392":1}}],["студенты",{"2":{"365":1}}],["стирают",{"2":{"256":1}}],["стимулировать",{"0":{"165":1}}],["стиля",{"2":{"289":1,"484":1,"496":1}}],["стилями",{"2":{"220":1,"222":2,"263":1}}],["стилях",{"2":{"23":1,"269":1}}],["стиль",{"2":{"146":1,"147":1,"157":1,"221":1,"459":1}}],["стиле",{"2":{"520":1,"521":1}}],["стилей",{"2":{"138":1,"142":2,"162":1,"165":1,"176":1,"215":2,"216":1,"217":2,"218":2,"220":1,"221":1,"222":1,"235":1,"236":1,"260":1,"269":1,"395":1}}],["стилем",{"2":{"138":1,"174":1}}],["стилизованной",{"2":{"459":1}}],["стилизовать",{"2":{"175":1}}],["стилизации",{"2":{"173":1,"181":1,"496":2}}],["стилизацию",{"2":{"89":1,"175":1,"451":1,"454":1}}],["стилизацией",{"2":{"25":1}}],["стили",{"2":{"96":1,"142":2,"208":1,"222":1,"235":1,"269":1,"283":1,"289":1,"300":1,"459":4}}],["стилю",{"2":{"68":1,"166":1}}],["стоящих",{"2":{"495":1}}],["сторы",{"2":{"449":2,"470":1,"472":1}}],["стором",{"2":{"449":1}}],["сторов",{"2":{"351":1,"449":1}}],["стороной",{"2":{"245":1}}],["сторонами",{"2":{"245":1}}],["сторона",{"2":{"197":1,"201":1}}],["стороне",{"2":{"160":1,"391":1,"395":1,"405":1,"461":2,"543":1}}],["стороны",{"2":{"108":1,"139":1,"171":1,"181":1,"273":1,"294":1,"495":1}}],["стороннюю",{"2":{"492":1}}],["сторонняя",{"0":{"245":1},"2":{"453":1}}],["сторонней",{"2":{"449":1}}],["стороннего",{"2":{"108":1,"461":1}}],["стороннее",{"2":{"13":1}}],["сторонние",{"2":{"215":2,"224":1,"225":1,"492":1,"543":1}}],["сторонних",{"0":{"454":1},"2":{"108":1,"109":1,"220":1,"247":1,"251":1,"334":1}}],["сторонний",{"2":{"106":1,"208":1}}],["сторонним",{"2":{"12":1,"76":1,"108":3,"202":1,"209":1}}],["сторон",{"2":{"9":1}}],["сторе",{"2":{"351":1,"357":1,"449":1}}],["стор",{"2":{"350":6,"351":1,"352":3,"353":1,"354":2,"449":4}}],["сторами",{"2":{"449":1}}],["сторам",{"2":{"354":1}}],["стора",{"0":{"350":1},"1":{"351":1,"352":1,"353":1,"354":1},"2":{"351":6,"354":1,"355":1,"357":1}}],["стола",{"2":{"430":1}}],["столкнулась",{"2":{"421":1}}],["столкнуться",{"2":{"139":1,"233":1,"329":1}}],["столкнетесь",{"2":{"384":1}}],["столбце",{"2":{"237":1}}],["столе",{"2":{"179":1,"259":1}}],["столько",{"2":{"148":1,"239":1,"250":1,"355":1,"411":2}}],["стоимость",{"2":{"103":1}}],["стоит",{"2":{"96":1,"116":1,"121":1,"134":1,"159":1,"171":1,"180":1,"243":1,"281":1,"284":1,"290":1,"304":1,"310":1,"332":1,"348":1,"438":1}}],["степенью",{"2":{"382":1}}],["степени",{"2":{"117":1,"138":1,"143":1,"163":1,"167":1,"294":1,"335":1,"411":1,"416":1,"420":1}}],["стейты",{"2":{"449":1}}],["стейт",{"2":{"449":2,"451":1}}],["стейта",{"2":{"284":2,"448":1,"449":3}}],["стейтом",{"2":{"34":1,"449":5}}],["стековые",{"2":{"189":1}}],["стек",{"0":{"23":1}}],["стрелку",{"2":{"352":1}}],["стрелками",{"2":{"214":2}}],["стрелочную",{"2":{"336":1}}],["стремитесь",{"2":{"171":1}}],["стремимся",{"2":{"128":1,"345":1}}],["стремящихся",{"2":{"121":1}}],["страшном",{"2":{"448":1}}],["стратегия",{"2":{"543":1}}],["стратегиями",{"2":{"226":1,"264":1}}],["стратегий",{"2":{"264":2,"265":1,"460":1}}],["стратегией",{"2":{"264":1,"265":2}}],["стратегию",{"2":{"233":1,"264":2}}],["стратегии",{"2":{"64":1,"264":1,"268":1}}],["страдает",{"2":{"143":1}}],["страну",{"2":{"239":1}}],["страны",{"2":{"237":1,"239":1}}],["страна",{"2":{"237":1}}],["странички",{"2":{"461":1}}],["страничной",{"2":{"285":1}}],["страничным",{"2":{"183":1}}],["страничный",{"2":{"171":1}}],["страниц",{"2":{"36":1,"138":2,"171":1,"183":2,"194":1,"228":4,"251":1,"264":1,"266":1,"355":1,"459":1}}],["страницей",{"2":{"183":1,"186":1}}],["странице",{"2":{"22":1,"36":1,"47":1,"108":1,"138":1,"139":1,"140":2,"148":1,"151":2,"180":1,"195":1,"208":1,"236":1,"291":1,"355":2,"384":2,"440":1,"450":1}}],["страницах",{"2":{"190":1,"305":1}}],["страницами",{"2":{"183":1,"229":1,"231":1,"233":1}}],["страницам",{"2":{"108":3}}],["страница",{"2":{"4":1,"7":2,"30":1,"93":1,"102":1,"108":2,"138":1,"141":1,"142":1,"164":1,"180":1,"195":2,"218":1,"231":7,"461":1}}],["страницы",{"0":{"28":1,"271":1},"1":{"29":1,"30":1,"31":1,"32":1,"272":1,"273":1,"274":1,"275":1},"2":{"4":1,"22":1,"30":1,"36":1,"102":1,"108":2,"127":1,"140":2,"141":2,"164":2,"183":2,"187":3,"191":1,"195":2,"196":3,"215":1,"223":1,"228":3,"245":1,"251":1,"266":1,"272":1,"334":1,"355":3,"363":1,"384":5,"438":1,"461":4}}],["страницу",{"2":{"3":1,"7":1,"87":1,"125":1,"135":1,"141":2,"164":1,"183":1,"184":2,"195":2,"196":1,"208":2,"215":1,"228":2,"231":1,"236":3,"263":2,"269":1,"272":1,"355":1,"358":1,"384":2,"461":3,"522":1}}],["странным",{"2":{"142":1,"233":1}}],["странно",{"2":{"141":1}}],["строчек",{"2":{"525":1}}],["строчкой",{"2":{"304":1}}],["строчками",{"2":{"95":1}}],["строя",{"2":{"405":1}}],["строятся",{"2":{"150":1}}],["строим",{"2":{"350":1}}],["строится",{"2":{"430":1}}],["строить",{"2":{"269":2,"340":1}}],["строительные",{"2":{"141":1,"276":1}}],["строительную",{"2":{"26":1}}],["строгость",{"2":{"109":1}}],["строковые",{"2":{"355":2}}],["строковых",{"2":{"245":1}}],["строковому",{"2":{"322":1}}],["строкой",{"2":{"47":1,"89":1,"236":1,"242":1,"347":1,"355":1,"393":1}}],["строк",{"2":{"236":1,"251":1,"279":2,"299":1,"402":1,"426":1,"453":1,"461":1}}],["строки",{"2":{"140":1,"143":1,"149":1,"212":1,"214":1,"215":1,"222":1,"224":1,"236":2,"238":1,"245":2,"246":1,"290":1,"326":1,"337":2,"347":2,"351":1,"352":1,"355":1,"385":1,"392":1,"393":1,"395":1,"396":3,"401":1,"402":1,"410":3,"411":2,"416":1,"419":1,"421":1,"422":1,"428":1,"443":1}}],["строку",{"2":{"106":1,"108":1,"130":1,"240":1,"242":1,"245":1,"247":1,"248":2,"273":1,"285":1,"322":1,"331":1,"337":1,"386":1,"395":1,"396":1,"416":1,"418":1,"419":1,"423":1,"428":2,"448":1}}],["строке",{"2":{"81":1,"132":4,"184":2,"222":9,"233":7,"251":1,"253":1,"260":1,"289":12,"326":2,"330":4,"332":2,"333":4,"337":3,"343":1,"344":4,"347":3,"349":1,"351":1,"352":3,"354":4,"357":2,"384":1,"391":7,"392":3,"395":2,"396":4,"400":1,"402":1,"411":2,"415":4,"416":9,"426":1}}],["строках",{"2":{"219":1,"222":2,"264":1,"416":1}}],["строками",{"2":{"108":1,"242":1,"264":1,"326":1}}],["строка",{"2":{"29":1,"89":1,"108":1,"218":1,"222":1,"233":2,"245":2,"246":1,"251":1,"259":2,"260":3,"261":2,"273":2,"283":1,"285":1,"328":1,"337":2,"343":3,"349":5,"351":4,"352":3,"355":1,"357":4,"384":1,"385":1,"391":3,"392":3,"396":1,"402":9,"428":1}}],["стройматериалы",{"2":{"26":1}}],["структурируя",{"2":{"455":1}}],["структурированное",{"2":{"68":1}}],["структурированность",{"2":{"17":1}}],["структур",{"2":{"307":1,"329":1}}],["структура",{"0":{"215":1},"2":{"139":1,"187":1,"215":1,"237":1,"321":1}}],["структурные",{"0":{"309":1},"2":{"138":1}}],["структурных",{"2":{"68":2}}],["структурой",{"2":{"126":1,"138":1,"209":1}}],["структуры",{"2":{"117":1,"139":1,"187":1,"212":1,"215":1,"327":1,"345":1,"391":1}}],["структуре",{"2":{"111":1,"126":1,"187":1,"215":1,"216":1,"461":1}}],["структуру",{"2":{"17":1,"22":1,"26":1,"214":2,"215":4,"216":1,"305":1,"345":1}}],["стакан",{"2":{"460":1}}],["стабильного",{"2":{"426":1}}],["стабильной",{"2":{"425":1}}],["стабильный",{"2":{"423":1}}],["стабильных",{"2":{"408":1}}],["стабилен",{"2":{"128":1}}],["стационарности",{"2":{"403":1}}],["ставшее",{"2":{"429":1}}],["ставший",{"2":{"189":1}}],["ставится",{"2":{"233":1}}],["ставиться",{"2":{"328":1}}],["ставить",{"2":{"106":1,"213":1}}],["ставим",{"2":{"86":1,"91":1,"97":1,"100":1}}],["сталкивались",{"2":{"290":1}}],["сталкиваемся",{"2":{"128":1}}],["стал",{"2":{"175":1,"186":1,"189":1,"201":1,"213":1,"290":1,"392":1,"407":1,"421":1}}],["стала",{"2":{"167":1,"194":1,"229":1,"331":1,"449":1}}],["стало",{"2":{"165":1,"228":1,"230":1,"449":1,"451":1}}],["стали",{"2":{"2":1,"138":1,"173":1,"448":1,"449":1,"459":1}}],["станут",{"2":{"143":1,"304":1,"351":1,"352":2}}],["станет",{"2":{"140":1,"233":1,"395":1,"420":1}}],["становиться",{"2":{"256":1}}],["становится",{"2":{"116":1,"143":1,"196":1,"236":1,"243":1,"264":1,"277":1,"285":1,"449":1}}],["становились",{"2":{"162":1}}],["становятся",{"2":{"108":1}}],["стандартов",{"2":{"210":1,"245":1,"252":1,"397":1}}],["стандартом",{"2":{"167":1,"175":1,"194":1,"213":1,"230":1,"245":1,"249":1,"264":1,"281":1,"380":1,"501":1}}],["стандартная",{"2":{"402":1}}],["стандартную",{"2":{"261":1}}],["стандартного",{"2":{"355":1,"445":1,"448":2}}],["стандартной",{"2":{"243":1}}],["стандартному",{"2":{"186":1}}],["стандартный",{"2":{"248":1,"287":1,"324":1,"534":1}}],["стандартных",{"2":{"189":1,"211":1,"252":1,"256":2,"267":1,"382":1}}],["стандартные",{"2":{"174":1,"252":1,"253":1}}],["стандартными",{"2":{"173":1}}],["стандартным",{"2":{"165":1,"186":1,"357":1}}],["стандартизирован",{"2":{"186":1}}],["стандартизации",{"2":{"138":1}}],["стандарты",{"0":{"457":1},"2":{"138":1,"139":1,"186":1,"243":1,"459":1}}],["стандарту",{"2":{"127":1,"128":1}}],["стандарте",{"2":{"108":1,"181":1,"245":1}}],["стандартами",{"2":{"138":1,"157":1,"163":1}}],["стандарта",{"2":{"106":1}}],["стандарт",{"2":{"106":1,"108":1,"109":1,"163":1}}],["старайтесь",{"2":{"456":1,"460":1}}],["старается",{"2":{"384":1}}],["старой",{"2":{"435":1}}],["старого",{"2":{"116":1,"216":1}}],["старте",{"2":{"533":1,"544":1}}],["стартер",{"2":{"495":1}}],["старта",{"2":{"530":1}}],["стартапе",{"2":{"450":1}}],["старт",{"2":{"409":1}}],["стартовый",{"2":{"263":1}}],["стартовать",{"2":{"259":1}}],["стартовом",{"2":{"221":1}}],["стартового",{"2":{"139":1,"214":1}}],["старых",{"2":{"116":2}}],["старыми",{"0":{"116":1},"2":{"116":2}}],["старый",{"2":{"61":1}}],["старший",{"2":{"106":1}}],["стадию",{"2":{"66":1}}],["стадии",{"0":{"66":1},"2":{"67":1,"79":1,"151":1}}],["статистика",{"2":{"420":1}}],["статистики",{"2":{"397":1,"443":1,"530":1}}],["статичен",{"2":{"236":1}}],["статическое",{"2":{"215":1}}],["статическим",{"2":{"314":1}}],["статическими",{"2":{"228":1}}],["статически",{"2":{"278":1}}],["статических",{"2":{"228":1,"239":1}}],["статический",{"0":{"278":1},"2":{"128":1,"228":1,"233":1,"418":1}}],["статические",{"2":{"128":1,"216":1,"228":1,"237":1}}],["статичной",{"2":{"138":1}}],["статичный",{"2":{"461":2}}],["статичных",{"2":{"439":1}}],["статичным",{"2":{"76":1,"452":1}}],["статичные",{"2":{"6":1}}],["статус",{"2":{"244":1,"290":1}}],["статуса",{"2":{"243":1}}],["статей",{"2":{"196":1,"459":1}}],["стать",{"2":{"191":1,"286":1,"305":1,"384":1,"392":1,"460":2}}],["статья",{"2":{"108":1,"450":1}}],["статье",{"2":{"106":1,"445":1,"448":1,"459":1}}],["статьи",{"0":{"0":1},"2":{"109":1,"151":1,"196":1,"256":1,"425":1}}],["сваливает",{"2":{"451":1}}],["светлой",{"2":{"545":1}}],["светлый",{"2":{"256":1}}],["свете",{"2":{"356":1}}],["сведем",{"2":{"345":1,"382":1}}],["сведите",{"2":{"170":1}}],["сверху",{"2":{"29":2,"35":1,"102":1,"263":1,"335":1,"485":1}}],["свыше",{"2":{"47":1}}],["связали",{"2":{"262":1}}],["связать",{"2":{"230":1}}],["связана",{"2":{"301":1,"330":1}}],["связан",{"2":{"171":1,"209":1,"258":1}}],["связано",{"2":{"127":1,"195":1,"214":1,"395":1,"396":1,"408":1,"428":1}}],["связанную",{"2":{"245":1,"389":1}}],["связанная",{"2":{"197":1,"262":1}}],["связанными",{"2":{"143":1}}],["связанные",{"2":{"122":1,"171":1,"436":1,"437":1}}],["связанный",{"2":{"105":1,"233":1}}],["связанных",{"2":{"68":1,"138":1,"222":1,"416":1}}],["связанного",{"2":{"302":1}}],["связанное",{"2":{"50":1,"283":1}}],["связанность",{"0":{"34":1},"2":{"34":1,"436":1}}],["связаны",{"2":{"2":1,"3":2,"106":1,"132":1,"167":1,"193":1,"271":1,"274":1,"408":1,"452":1}}],["связывание",{"2":{"391":1}}],["связыванием",{"2":{"149":1}}],["связываем",{"2":{"343":1}}],["связывает",{"2":{"145":1,"150":1}}],["связью",{"2":{"341":1}}],["связь",{"2":{"109":1,"171":1,"172":1,"302":2,"323":1,"342":1,"345":1,"388":1,"395":1}}],["связей",{"0":{"273":1},"2":{"67":1}}],["связями",{"2":{"17":1}}],["связи",{"0":{"104":1},"1":{"105":1},"2":{"6":1,"43":1,"73":1,"105":2,"110":1,"135":1,"143":1,"164":1,"181":1,"222":1,"226":1,"228":1,"256":1,"269":1,"272":1,"290":1,"332":1,"382":1,"384":1,"405":1,"407":2,"420":1,"438":1,"439":1,"501":1,"530":1}}],["своя",{"2":{"435":1,"448":1}}],["сворачивать",{"2":{"301":1}}],["сводка",{"2":{"290":1}}],["сводки",{"2":{"290":1}}],["сводные",{"2":{"290":1}}],["свою",{"2":{"140":1,"142":1,"164":1,"171":1,"228":1,"238":1,"251":1,"264":1,"297":2,"337":1,"343":1,"411":1,"421":1,"436":1,"449":2,"452":1,"453":1,"533":1}}],["свободный",{"2":{"245":1}}],["свободного",{"2":{"245":1}}],["свободно",{"2":{"175":1,"215":1,"394":1}}],["свободна",{"2":{"62":1}}],["свободу",{"2":{"128":1,"143":1}}],["свое",{"2":{"147":1,"202":1,"215":1,"243":1,"250":1,"337":1,"349":1,"363":1,"460":1}}],["своей",{"2":{"93":1,"107":1,"131":1,"157":1,"171":1,"294":1,"298":1,"337":1,"461":1}}],["своего",{"2":{"40":1,"107":2,"109":1,"125":1,"199":1,"266":1,"325":1,"330":1,"342":1,"365":1,"402":1,"461":1}}],["своему",{"2":{"215":1,"355":1,"384":1,"403":1,"428":1,"443":2}}],["своем",{"2":{"40":1,"216":1,"243":1,"251":1,"384":1,"459":1}}],["своё",{"2":{"26":1,"47":2}}],["свойству",{"2":{"318":1,"330":1}}],["свойств",{"2":{"114":2,"222":2,"242":1,"290":1,"316":1,"330":1,"351":1,"407":1}}],["свойством",{"2":{"114":1,"356":1}}],["свойство",{"0":{"113":1},"2":{"113":1,"222":2,"289":2,"299":1,"320":1,"330":1,"357":1,"415":1}}],["свойстве",{"2":{"110":1,"289":1,"319":1}}],["свойствам",{"2":{"415":1,"416":1}}],["свойствами",{"2":{"113":1,"114":1,"222":1,"329":1,"351":1,"352":1,"415":1,"461":1}}],["свойствах",{"2":{"318":1}}],["свойства",{"2":{"16":1,"113":1,"115":1,"143":1,"222":5,"223":1,"236":1,"286":1,"330":1,"350":1,"352":5,"357":1,"391":1}}],["свой",{"0":{"107":1},"2":{"4":1,"12":1,"23":1,"39":1,"41":1,"58":2,"107":2,"134":1,"142":1,"143":2,"163":1,"216":1,"263":1,"301":1,"304":4,"407":1,"429":1,"435":1,"439":2,"460":3}}],["своих",{"2":{"135":1,"162":1,"167":1,"217":1,"238":1,"319":1,"344":1,"345":1,"382":1,"384":1,"461":1}}],["своими",{"2":{"215":1,"384":1,"435":1}}],["своим",{"2":{"41":1,"58":1,"100":1,"174":1,"273":1,"342":1,"420":1,"426":1,"444":1,"449":1}}],["свои",{"2":{"3":1,"23":2,"114":1,"157":1,"172":1,"224":1,"226":1,"228":1,"244":1,"267":1,"282":1,"293":1,"326":1,"327":1,"334":1,"347":1,"410":1,"420":1,"430":1,"431":1,"436":1,"443":2,"449":2,"451":1,"454":1,"459":2}}],["соцсетями",{"2":{"530":1}}],["социальных",{"0":{"196":1},"2":{"196":3,"202":1,"258":1}}],["социальными",{"2":{"139":1}}],["сорс",{"2":{"460":1}}],["сортировки",{"2":{"189":1}}],["соединяться",{"2":{"251":1}}],["соединению",{"2":{"257":1}}],["соединений",{"2":{"128":1}}],["соединение",{"2":{"128":1,"256":1,"387":1}}],["соединения",{"2":{"109":1,"128":1,"355":1}}],["сопутствующей",{"2":{"449":2}}],["сопутствующие",{"2":{"449":1}}],["сопутствующих",{"2":{"205":1}}],["сопоставимое",{"2":{"450":1}}],["сопоставимости",{"2":{"342":1}}],["сопоставить",{"2":{"356":1}}],["сопоставлены",{"2":{"242":1}}],["сопоставленный",{"2":{"219":1}}],["сопоставляет",{"2":{"229":1}}],["сопровождение",{"2":{"252":1}}],["сопровождения",{"2":{"157":1}}],["сопровождаемым",{"2":{"201":1}}],["сопровождаемость",{"2":{"68":1,"295":1}}],["сопровождать",{"2":{"181":1}}],["сопровождаться",{"2":{"176":1}}],["сотен",{"2":{"303":1}}],["сотрудничества",{"2":{"210":1}}],["сотрудничестве",{"2":{"162":1}}],["сотни",{"2":{"197":1,"407":1}}],["сожалению",{"2":{"172":1,"198":1,"302":1,"444":1,"460":1}}],["сочетании",{"2":{"148":1,"179":1,"312":1,"324":1}}],["сокращайте",{"2":{"171":1}}],["сокращения",{"0":{"484":1}}],["сокращение",{"0":{"145":1,"150":1},"2":{"150":1,"407":1}}],["сокращенное",{"2":{"283":1}}],["сокращенный",{"2":{"145":1}}],["сокращенайте",{"2":{"171":1}}],["сократить",{"2":{"125":1}}],["соглашается",{"2":{"209":1,"256":1,"263":1}}],["соглашению",{"2":{"280":1,"284":1}}],["соглашений",{"2":{"152":1,"157":1,"158":1,"216":1,"301":1}}],["соглашениям",{"2":{"236":1}}],["соглашения",{"0":{"152":1},"1":{"153":1,"154":1,"155":1,"156":1,"157":1},"2":{"157":3,"159":1,"215":1,"281":1,"304":1}}],["соглашением",{"2":{"281":1}}],["соглашение",{"2":{"143":1,"202":1,"230":1,"281":1,"410":2}}],["согласовать",{"2":{"315":1}}],["согласования",{"2":{"256":1}}],["согласование",{"2":{"68":1}}],["согласованность",{"2":{"218":1}}],["согласованности",{"2":{"165":1}}],["согласия",{"2":{"263":2}}],["согласиться",{"2":{"263":1}}],["согласие",{"2":{"202":1,"355":2}}],["согласны",{"2":{"157":1}}],["согласно",{"2":{"125":1,"127":1,"165":1,"194":1,"258":1,"303":1,"412":1}}],["сослаться",{"2":{"237":1}}],["сосредоточен",{"2":{"222":1}}],["сосредоточились",{"2":{"321":1,"340":1}}],["сосредоточиться",{"2":{"190":1,"384":1,"395":1,"407":1,"408":2}}],["сосредоточимся",{"2":{"140":1,"219":1,"226":1,"251":1,"254":1,"284":1,"290":1,"340":1,"355":1,"405":1}}],["составному",{"2":{"524":1}}],["составной",{"2":{"284":1}}],["составными",{"2":{"340":1}}],["составление",{"0":{"271":1},"1":{"272":1,"273":1,"274":1,"275":1}}],["составлять",{"2":{"273":1}}],["составляющая",{"2":{"228":1}}],["составляющие",{"2":{"125":1,"250":1,"352":1}}],["составляют",{"2":{"162":1,"228":1}}],["составляет",{"2":{"125":1,"355":1}}],["состав",{"2":{"248":1}}],["составителя",{"2":{"485":1}}],["составит",{"2":{"58":1}}],["состоящую",{"2":{"297":1}}],["состоящее",{"2":{"125":1}}],["состоять",{"2":{"449":1}}],["состоят",{"2":{"125":1,"297":1,"303":1,"391":2}}],["состоянию",{"2":{"273":1,"312":1,"351":2}}],["состоянии",{"2":{"175":2,"181":1,"244":1,"289":1,"290":1,"301":1,"337":2,"341":1,"429":1}}],["состояний",{"2":{"157":1,"223":1,"290":4,"356":1}}],["состояния",{"0":{"348":1},"1":{"349":1},"2":{"149":1,"151":1,"175":2,"222":1,"223":1,"264":1,"271":1,"273":2,"274":2,"288":1,"289":1,"290":2,"340":1,"347":2,"349":1,"354":1,"359":1,"426":1}}],["состояниями",{"2":{"110":1,"290":2,"292":1,"354":1,"376":1}}],["состояние",{"2":{"147":2,"151":1,"176":1,"181":1,"186":1,"246":1,"273":3,"288":1,"289":1,"290":3,"348":2,"349":2,"350":2,"351":1,"354":1,"449":2}}],["состоянием",{"2":{"110":1,"118":2,"236":1,"273":1,"283":1,"348":2,"349":1,"350":3,"360":1,"364":1,"452":1}}],["состоит",{"2":{"28":1,"66":1,"68":1,"135":1,"138":1,"141":1,"142":1,"334":1,"351":1,"388":1,"498":1}}],["солидно",{"2":{"445":1}}],["солидных",{"2":{"88":1}}],["соли",{"2":{"139":1}}],["содержатся",{"2":{"402":1}}],["содержат",{"2":{"301":1,"389":1,"402":1,"459":1}}],["содержать",{"2":{"141":1,"143":1,"222":2,"236":1,"245":2,"246":1,"249":1,"251":1,"261":1,"278":1,"350":2,"355":1,"385":1,"522":1}}],["содержащая",{"2":{"245":1,"385":1,"449":1}}],["содержащее",{"2":{"191":1}}],["содержащиеся",{"2":{"411":1}}],["содержащимся",{"2":{"328":1}}],["содержащим",{"2":{"233":1}}],["содержащий",{"2":{"142":1,"143":1,"261":1,"290":1,"351":1}}],["содержащих",{"2":{"135":1,"429":1}}],["содержанием",{"2":{"187":1}}],["содержание",{"2":{"159":1,"162":1,"289":1}}],["содержимого",{"2":{"171":2,"180":1,"183":1,"184":1,"190":1,"283":1,"489":1,"535":1}}],["содержимое",{"2":{"140":2,"142":1,"166":1,"194":1,"196":1,"214":1,"215":1,"221":1,"283":6,"288":1,"384":1,"461":1}}],["содержимым",{"2":{"151":1,"232":1,"289":1}}],["содержите",{"2":{"304":1}}],["содержится",{"2":{"245":1,"385":1}}],["содержит",{"2":{"108":2,"142":1,"143":1,"145":1,"215":1,"245":2,"248":1,"273":1,"284":1,"290":2,"329":1,"385":1,"415":1,"416":1}}],["соблюсти",{"2":{"298":1}}],["соблюдение",{"2":{"281":1}}],["соблюдения",{"2":{"256":1}}],["соблюдаем",{"2":{"344":1}}],["соблюдаться",{"2":{"295":1}}],["соблюдая",{"2":{"216":1}}],["соблюдали",{"2":{"157":1}}],["соблазн",{"2":{"199":1}}],["собеседованию",{"2":{"460":1}}],["собеседник",{"2":{"178":1}}],["соберет",{"2":{"140":1}}],["собирают",{"2":{"395":1}}],["собираются",{"2":{"151":1,"202":1,"304":1}}],["собирались",{"2":{"302":1}}],["собирать",{"2":{"250":2}}],["собирает",{"2":{"244":1,"273":1,"421":1,"443":1}}],["собираемся",{"2":{"214":1}}],["собираемого",{"2":{"118":1}}],["событии",{"2":{"301":1}}],["событий",{"0":{"273":1,"345":1},"1":{"346":1,"347":1},"2":{"222":1,"229":1,"236":2,"278":1,"279":1,"280":2,"284":1,"325":4,"326":2,"334":1,"346":1,"348":1,"360":1,"389":1,"414":1,"416":1,"429":1}}],["событию",{"2":{"222":1,"289":1,"301":1,"343":1}}],["событиях",{"2":{"389":1}}],["событиям",{"2":{"284":1,"415":1}}],["событиями",{"2":{"281":1,"310":1,"325":1}}],["события",{"0":{"156":1,"279":1},"2":{"143":1,"233":1,"236":2,"239":1,"263":2,"264":1,"271":1,"273":2,"274":2,"279":2,"280":3,"284":1,"290":1,"301":3,"325":1,"326":1,"342":2,"344":1,"345":2,"347":3,"389":1,"392":1,"416":5,"426":1}}],["событием",{"2":{"301":2,"343":1,"389":1}}],["событие",{"2":{"115":1,"150":4,"176":1,"178":1,"183":1,"236":1,"239":1,"263":5,"264":1,"274":2,"280":2,"301":1,"325":4,"326":3,"330":1,"345":2,"347":2,"385":3,"390":1,"409":1,"416":8,"425":1}}],["собственная",{"2":{"394":1}}],["собственную",{"2":{"355":1,"357":1,"411":2,"421":1}}],["собственными",{"2":{"384":1}}],["собственные",{"2":{"144":1,"157":1,"174":1,"222":1,"334":1,"408":1}}],["собственный",{"2":{"142":1,"163":1,"245":1,"263":1,"391":1,"407":1,"417":1}}],["собственных",{"2":{"128":1,"431":1}}],["собственной",{"2":{"244":2,"248":1,"397":1,"410":1,"411":1}}],["собственно",{"2":{"198":1,"231":1}}],["собственного",{"2":{"183":1,"253":1,"357":1,"402":1}}],["собственное",{"2":{"179":1,"192":1,"215":1,"251":1,"334":1}}],["собственном",{"2":{"136":1,"232":1,"256":1,"384":1}}],["собственному",{"2":{"125":1}}],["собственности",{"2":{"125":1}}],["собрана",{"2":{"284":1}}],["собранной",{"2":{"273":1}}],["собранных",{"2":{"244":1}}],["собранные",{"2":{"127":1}}],["собранную",{"2":{"215":1}}],["собрано",{"2":{"142":1}}],["собрать",{"2":{"127":1,"215":1,"249":1,"443":1}}],["собой",{"2":{"3":1,"6":1,"17":1,"125":1,"138":2,"139":1,"141":1,"142":1,"168":1,"174":1,"186":1,"194":1,"199":1,"210":1,"215":2,"222":1,"228":1,"245":1,"259":1,"260":1,"271":1,"272":1,"277":1,"290":1,"301":1,"331":1,"339":1,"342":1,"355":2,"370":1,"391":1,"397":1,"401":1,"416":1,"444":1}}],["соотношения",{"2":{"420":1}}],["соотноситься",{"2":{"273":1}}],["соответствовал",{"2":{"214":1}}],["соответствовать",{"2":{"126":1,"233":1,"256":1,"268":1,"337":1}}],["соответствует",{"2":{"128":1,"139":1,"222":1,"229":1,"239":1,"266":2,"318":1,"435":1}}],["соответствуют",{"2":{"126":1,"173":1,"397":1,"411":1}}],["соответствующим",{"2":{"244":1,"301":1,"415":1}}],["соответствующие",{"2":{"230":1,"236":1,"239":1,"243":1,"383":1,"407":1}}],["соответствующих",{"2":{"216":1,"297":1,"373":1,"398":1,"495":1}}],["соответствующий",{"2":{"100":1,"236":1,"245":1,"283":1,"290":1,"328":1,"389":1,"392":1,"397":1,"448":1}}],["соответствующую",{"2":{"127":1,"220":1,"350":1,"410":1,"419":1,"435":1}}],["соответствующем",{"2":{"301":1}}],["соответствующему",{"2":{"240":1,"327":2,"388":1}}],["соответствующее",{"2":{"148":1}}],["соответствующей",{"2":{"58":1,"397":1,"492":1}}],["соответствующего",{"2":{"17":1,"250":1,"340":1,"409":1}}],["соответствия",{"2":{"243":1,"289":1,"405":1,"407":1}}],["соответствии",{"2":{"126":1,"139":1,"175":1,"215":1,"222":2,"244":1,"249":1,"256":1,"264":1,"265":1,"272":1,"302":1,"327":1,"328":2,"403":1,"407":1,"422":1,"460":1,"542":1}}],["соответствие",{"2":{"68":1,"239":1,"403":1,"407":1,"416":1}}],["соответственно",{"2":{"47":1,"58":2,"108":1,"118":1,"122":1,"219":1,"244":1,"289":1,"384":1,"459":1,"461":1}}],["соображения",{"0":{"438":1},"2":{"253":1,"321":1}}],["сообщает",{"2":{"426":1}}],["сообществе",{"2":{"421":1}}],["сообщество",{"2":{"219":1}}],["сообщением",{"2":{"428":1}}],["сообщение",{"2":{"178":1,"264":1,"329":1,"385":4,"386":1,"389":1,"390":1,"391":2,"392":1,"393":1,"397":1,"410":1,"428":2,"483":1}}],["сообщений",{"2":{"109":2,"249":1,"340":1,"344":1,"345":4,"346":1,"348":1,"360":1,"384":1,"391":1,"392":1,"411":1}}],["сообщениями",{"2":{"385":1,"391":1,"429":1}}],["сообщения",{"2":{"109":1,"179":1,"249":1,"346":1,"384":1,"389":2,"391":2,"402":1}}],["сообщить",{"2":{"181":1,"249":1,"278":1}}],["сохраненные",{"2":{"394":1}}],["сохранения",{"2":{"143":1,"151":1,"411":1}}],["сохранением",{"2":{"284":2,"524":1}}],["сохранение",{"0":{"95":1},"2":{"355":1,"356":1}}],["сохранил",{"2":{"435":1}}],["сохранили",{"2":{"333":1}}],["сохранив",{"2":{"334":1}}],["сохранится",{"2":{"358":1}}],["сохраните",{"2":{"222":1,"428":2}}],["сохранить",{"2":{"34":1,"106":1,"190":1,"244":1,"251":1,"263":1,"329":1,"384":1,"428":1,"461":1}}],["сохраним",{"2":{"214":1,"289":1,"301":1}}],["сохраняющий",{"2":{"331":1}}],["сохраняются",{"2":{"284":1,"355":1}}],["сохраняем",{"2":{"263":1,"315":1,"333":1,"391":1,"400":2}}],["сохраняется",{"2":{"139":1,"355":1}}],["сохраняет",{"2":{"106":1,"151":1,"315":1,"330":1,"435":1,"443":1}}],["сохраняя",{"2":{"218":1,"331":1}}],["сохраняться",{"2":{"231":1}}],["сохранять",{"2":{"95":2,"107":1,"216":1,"420":1}}],["сохранялся",{"2":{"95":1}}],["софт",{"2":{"62":1}}],["создаётся",{"2":{"543":1}}],["создателем",{"2":{"421":1}}],["создать",{"2":{"26":1,"57":1,"62":1,"64":1,"86":1,"125":2,"137":1,"162":2,"167":1,"172":1,"210":1,"215":1,"219":1,"220":1,"222":1,"224":1,"229":1,"230":1,"232":1,"233":1,"234":1,"236":1,"239":1,"249":1,"269":2,"275":2,"289":1,"293":1,"297":1,"303":1,"332":2,"345":1,"350":1,"356":1,"385":1,"389":1,"395":1,"400":1,"411":3,"421":1,"425":1,"427":1,"429":1,"440":1,"444":1,"449":1,"452":1,"494":1,"495":1}}],["создающим",{"2":{"495":1}}],["создающий",{"2":{"405":1}}],["создающего",{"2":{"495":1}}],["создают",{"2":{"148":1,"216":1,"254":1,"305":1,"355":1,"397":1}}],["создаются",{"2":{"125":1,"210":1,"334":1,"375":1}}],["создав",{"2":{"272":1,"348":1,"357":1,"428":1}}],["создаваемый",{"2":{"355":1}}],["создаваемой",{"2":{"265":1}}],["создавали",{"2":{"237":1}}],["создавалось",{"2":{"344":1}}],["создавало",{"2":{"113":1}}],["создавая",{"2":{"181":1,"183":1,"218":1,"228":1,"384":1,"438":1}}],["создавать",{"2":{"58":2,"138":2,"144":1,"222":1,"224":1,"226":1,"229":1,"231":2,"237":1,"239":1,"254":1,"280":2,"286":1,"298":1,"303":1,"331":1,"338":1,"355":1,"378":1,"390":1,"394":1,"414":1,"416":1,"459":1,"495":1,"496":1}}],["создайте",{"2":{"230":1,"232":1,"287":1,"289":1,"391":1,"401":1,"410":1,"414":1,"415":1,"427":1,"428":1,"515":1}}],["создаст",{"2":{"143":1,"214":1,"233":1,"489":2}}],["создастся",{"2":{"100":1}}],["созданы",{"2":{"425":1,"461":1}}],["создано",{"2":{"394":1,"409":1}}],["создана",{"2":{"215":2,"435":1}}],["созданном",{"2":{"407":1,"461":1}}],["созданному",{"2":{"143":1}}],["созданного",{"2":{"264":1,"410":1}}],["созданные",{"2":{"384":1}}],["созданными",{"2":{"357":1}}],["созданных",{"2":{"222":1}}],["созданный",{"2":{"214":1,"385":1,"421":1}}],["создан",{"2":{"116":1,"184":1,"271":1,"418":1,"425":1,"485":1}}],["созданию",{"2":{"143":1,"215":1,"284":1,"307":1}}],["создания",{"2":{"60":1,"100":1,"111":1,"112":1,"114":1,"125":2,"136":1,"139":4,"140":2,"141":2,"143":1,"151":1,"163":1,"170":1,"171":1,"194":1,"212":1,"214":2,"215":2,"222":1,"223":1,"224":2,"228":1,"229":1,"230":1,"231":1,"236":1,"237":1,"239":1,"245":2,"246":1,"254":1,"255":1,"256":1,"265":1,"267":1,"269":1,"271":2,"281":1,"283":1,"285":1,"286":1,"290":1,"300":1,"301":1,"324":2,"329":1,"334":2,"340":1,"345":1,"348":1,"351":1,"356":1,"359":1,"363":1,"364":1,"374":1,"377":1,"386":2,"390":1,"391":1,"393":1,"394":1,"395":3,"401":2,"402":4,"409":1,"410":1,"411":1,"415":1,"416":1,"419":1,"425":2,"450":1,"451":1,"495":2}}],["созданием",{"2":{"58":1,"122":1}}],["создание",{"0":{"57":1,"98":1,"372":1,"443":1},"1":{"99":1,"100":1},"2":{"212":1,"215":1,"225":1,"229":1,"244":1,"256":1,"261":1,"280":1,"312":1,"385":1,"405":2,"420":1,"430":1,"443":2,"444":1,"461":1,"492":1,"495":1,"496":2,"545":1}}],["создании",{"0":{"126":1,"529":1},"1":{"127":1,"530":1,"531":1,"532":1,"533":1},"2":{"41":1,"108":1,"113":1,"139":3,"236":1,"327":1,"331":1,"340":1,"356":1,"410":1,"496":2}}],["создадим",{"2":{"103":1,"124":1,"212":1,"214":2,"221":2,"226":1,"286":1,"292":1,"301":1,"321":1,"334":1,"357":1,"390":1,"392":1,"394":2,"395":1,"397":1,"409":1,"411":1,"426":1}}],["создаем",{"2":{"96":1,"99":1,"102":1,"140":1,"150":1,"184":1,"222":2,"233":2,"236":1,"246":1,"280":1,"281":1,"284":2,"289":2,"322":1,"326":1,"344":1,"349":1,"354":1,"357":2,"372":1,"385":1,"391":1,"396":1,"402":1}}],["создается",{"2":{"140":1,"245":1,"263":1,"275":1,"426":1}}],["создает",{"2":{"48":1,"106":1,"125":1,"166":1,"215":1,"222":1,"223":1,"250":1,"256":1,"274":1,"315":1,"323":1,"349":1,"421":1,"448":1,"500":1}}],["создали",{"2":{"17":1,"223":1,"224":1,"231":1,"236":1,"252":1,"262":1,"272":1,"289":1,"290":1,"292":1,"396":1}}],["совпадении",{"2":{"461":1}}],["совпадения",{"2":{"426":1}}],["совпадает",{"2":{"283":1}}],["совпадают",{"2":{"245":1,"323":1,"435":1}}],["совпадать",{"2":{"239":1}}],["совокупность",{"2":{"355":1,"408":1}}],["совсем",{"2":{"231":1,"333":1,"451":1,"461":1}}],["совместим",{"2":{"411":1}}],["совместимости",{"2":{"143":1,"284":1}}],["совместимость",{"0":{"116":1},"2":{"110":1,"116":3,"329":1}}],["совместимых",{"2":{"135":1}}],["совместимым",{"2":{"110":1}}],["совместному",{"2":{"286":1}}],["совместного",{"2":{"280":1,"282":1,"347":1,"356":1}}],["совместно",{"2":{"128":1,"143":1,"348":1,"384":1,"417":1,"421":1,"429":1}}],["совместное",{"2":{"108":1,"284":1}}],["совместную",{"2":{"68":1}}],["совершенствования",{"2":{"225":1}}],["совершенствование",{"2":{"223":1}}],["совершенствовать",{"2":{"223":1,"226":1,"390":1}}],["совершенно",{"2":{"142":1,"151":1,"355":1}}],["совершается",{"2":{"201":1}}],["совершать",{"2":{"83":1}}],["совершить",{"2":{"198":1,"289":1}}],["советуется",{"2":{"435":1,"448":1}}],["советы",{"0":{"446":1},"1":{"447":1,"448":1},"2":{"63":1,"452":1,"467":1,"473":1}}],["совет",{"2":{"22":1,"143":1,"147":1,"157":1,"251":1,"299":1,"304":1,"321":1,"460":1,"501":1}}],["современный",{"2":{"213":1,"365":1,"442":1,"443":1,"448":1,"460":1}}],["современных",{"2":{"213":1,"252":1,"334":1,"354":1,"359":1,"365":1,"403":2}}],["современными",{"2":{"174":1,"359":1}}],["современным",{"2":{"142":1,"492":1}}],["современные",{"0":{"457":1},"2":{"44":1,"61":1,"243":1,"254":1,"303":1,"429":1,"439":1,"443":1}}],["современная",{"2":{"138":1}}],["современной",{"2":{"213":1,"300":1,"431":1}}],["современном",{"2":{"141":1,"384":1}}],["современного",{"2":{"116":1,"496":1}}],["современное",{"2":{"2":1}}],["со",{"0":{"116":1},"2":{"11":1,"12":1,"17":1,"25":1,"41":1,"58":1,"76":1,"100":2,"108":2,"114":2,"116":2,"122":1,"126":1,"143":1,"145":1,"154":1,"160":1,"166":1,"171":1,"181":1,"186":1,"196":2,"214":2,"215":2,"218":1,"222":4,"231":2,"232":1,"233":1,"236":2,"239":1,"245":2,"254":1,"263":1,"264":1,"265":1,"279":1,"285":1,"289":1,"290":1,"321":1,"325":1,"330":1,"334":1,"337":1,"342":1,"347":2,"351":1,"354":1,"357":1,"384":1,"392":1,"393":1,"401":1,"403":1,"415":2,"435":1,"442":1,"448":1,"449":1,"461":4}}],["с",{"0":{"50":1,"104":1,"110":1,"135":1,"173":1,"199":1,"216":1,"266":1,"269":1,"271":1,"281":1,"285":1,"345":1,"350":1,"356":1,"373":1,"377":1,"381":1,"382":1,"390":1,"394":1,"421":1,"429":1},"1":{"105":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"217":1,"270":1,"271":1,"272":2,"273":2,"274":2,"275":2,"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,"346":1,"347":1,"351":1,"352":1,"353":1,"354":1,"357":1,"358":1,"383":1,"384":1,"385":1,"386":1,"387":1,"388":1,"389":1,"390":1,"391":2,"392":2,"393":2,"394":1,"395":2,"396":2,"397":2,"398":2,"399":2,"400":2,"401":1,"402":1,"403":1,"404":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,"58":1,"61":1,"62":1,"66":1,"67":1,"68":3,"73":1,"76":4,"79":1,"81":2,"83":1,"86":1,"88":1,"89":4,"93":3,"94":3,"95":1,"96":3,"102":1,"105":3,"106":13,"107":10,"108":3,"109":4,"110":4,"111":1,"114":3,"115":4,"116":1,"121":2,"122":5,"123":1,"125":5,"126":1,"127":1,"128":7,"130":1,"131":4,"132":2,"134":4,"135":4,"136":4,"138":4,"139":9,"140":3,"141":3,"142":8,"143":5,"144":1,"147":2,"148":1,"149":1,"150":4,"151":1,"152":1,"154":2,"155":1,"157":1,"158":1,"160":7,"162":5,"163":4,"164":3,"165":2,"166":1,"167":4,"168":1,"169":1,"170":1,"171":4,"172":3,"173":2,"174":1,"175":3,"176":2,"177":3,"178":1,"179":3,"180":4,"181":2,"183":2,"184":3,"186":2,"188":1,"189":4,"190":1,"191":2,"193":1,"194":5,"195":2,"196":2,"197":2,"198":2,"199":1,"200":1,"201":2,"204":2,"206":1,"207":1,"208":2,"209":3,"210":4,"212":6,"213":6,"214":10,"215":11,"217":4,"218":7,"219":2,"220":5,"221":4,"222":20,"223":4,"225":3,"226":8,"228":8,"229":5,"230":3,"231":4,"233":8,"234":1,"235":3,"236":8,"237":4,"238":3,"239":7,"240":2,"242":8,"243":4,"244":2,"245":3,"246":1,"247":1,"248":4,"249":4,"250":9,"251":11,"252":3,"254":3,"255":1,"256":14,"257":1,"258":2,"259":4,"261":3,"262":2,"263":5,"264":7,"265":4,"266":2,"267":6,"269":9,"271":3,"272":5,"273":6,"274":3,"275":2,"276":1,"277":3,"278":5,"279":3,"280":2,"281":8,"283":10,"284":7,"285":3,"286":1,"287":1,"288":2,"289":14,"290":8,"291":1,"292":2,"293":3,"294":3,"295":1,"297":3,"298":2,"299":2,"300":2,"301":8,"302":6,"304":1,"305":3,"310":3,"312":1,"313":1,"315":2,"316":2,"318":1,"321":1,"323":3,"324":1,"326":3,"327":3,"328":3,"329":6,"330":1,"331":7,"332":3,"334":9,"335":1,"336":5,"337":15,"338":3,"340":6,"341":1,"342":3,"343":2,"344":3,"345":3,"347":6,"348":2,"349":5,"350":2,"351":3,"352":3,"354":3,"355":8,"356":4,"357":7,"358":3,"359":2,"363":3,"365":1,"367":1,"373":2,"376":1,"377":2,"378":2,"379":1,"382":5,"383":1,"384":6,"386":3,"387":3,"388":7,"389":3,"390":5,"391":5,"392":3,"393":2,"394":5,"395":8,"396":5,"397":3,"398":2,"399":1,"400":3,"402":7,"403":3,"404":2,"405":4,"406":1,"407":11,"408":4,"409":3,"410":8,"411":10,"412":1,"413":1,"414":4,"415":2,"416":14,"417":1,"418":2,"419":4,"420":3,"421":5,"422":2,"423":1,"425":4,"426":4,"427":1,"428":9,"429":10,"430":1,"435":4,"436":4,"438":3,"439":4,"440":3,"442":2,"443":3,"444":4,"445":1,"446":1,"448":4,"449":11,"450":4,"451":3,"452":5,"453":1,"454":1,"456":1,"460":12,"461":11,"467":1,"484":3,"489":3,"492":2,"494":1,"495":5,"496":6,"497":1,"498":3,"500":1,"501":1,"507":2,"515":1,"521":1,"524":3,"527":1,"528":1,"530":1,"531":1,"532":1,"533":2,"534":1,"542":1}}],["дня",{"2":{"460":1}}],["дней",{"2":{"456":1,"460":1}}],["дни",{"2":{"248":1,"298":1}}],["дюймов",{"2":{"444":1}}],["дэвиду",{"2":{"302":1}}],["думать",{"2":{"363":1}}],["думаю",{"2":{"299":1}}],["дубликаты",{"2":{"326":1}}],["дубликата",{"2":{"290":1}}],["дублированию",{"2":{"355":1}}],["дублирование",{"2":{"223":1,"302":1,"310":1,"355":1}}],["дублировать",{"2":{"106":1,"417":1}}],["дыхательной",{"2":{"297":1}}],["длительных",{"2":{"337":1,"355":1}}],["длительному",{"2":{"405":1}}],["длительное",{"2":{"181":1}}],["длительного",{"2":{"181":2}}],["длиной",{"2":{"299":1}}],["длину",{"2":{"222":1}}],["длинных",{"2":{"269":1,"337":1}}],["длинными",{"2":{"219":1}}],["длинный",{"2":{"183":1}}],["для",{"0":{"64":1,"107":1,"126":1,"137":1,"159":1,"173":1,"185":1,"193":1,"201":1,"211":1,"225":1,"253":1,"268":1,"293":1,"304":1,"339":1,"360":1,"364":1,"401":1,"404":1,"432":1,"514":1},"1":{"127":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1,"194":1,"195":1,"196":1,"197":1,"307":1,"308":1,"309":1,"310":1,"402":1,"515":1,"516":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,"52":1,"57":1,"58":4,"61":1,"62":3,"66":1,"67":2,"68":2,"70":1,"76":3,"78":1,"79":2,"81":2,"82":1,"86":3,"88":3,"89":1,"93":1,"94":1,"95":2,"100":1,"102":1,"103":1,"105":1,"106":4,"107":3,"108":3,"109":6,"110":2,"111":1,"112":5,"113":1,"114":5,"116":5,"118":2,"119":1,"121":3,"122":4,"124":3,"125":20,"126":1,"127":2,"128":5,"131":2,"132":2,"133":2,"134":3,"135":10,"136":1,"137":1,"138":4,"139":8,"140":5,"141":5,"142":9,"143":11,"147":2,"148":2,"150":3,"151":6,"152":1,"154":1,"157":4,"158":1,"159":2,"160":3,"162":4,"163":4,"164":2,"165":3,"166":2,"167":2,"168":1,"169":1,"170":3,"171":3,"172":5,"174":2,"175":2,"176":6,"177":4,"178":1,"179":3,"180":4,"181":3,"182":3,"183":3,"184":2,"186":4,"187":2,"188":1,"189":5,"190":3,"191":5,"192":1,"194":6,"196":1,"199":1,"200":1,"201":1,"204":2,"207":1,"208":1,"210":3,"212":3,"213":7,"214":8,"215":8,"216":2,"218":8,"219":13,"220":2,"221":3,"222":22,"224":2,"226":1,"228":6,"229":2,"230":4,"231":3,"232":1,"233":3,"236":6,"237":1,"238":2,"239":5,"240":2,"242":3,"243":8,"244":3,"245":13,"246":3,"247":1,"248":3,"249":9,"250":6,"251":14,"252":2,"253":2,"254":5,"255":2,"256":12,"258":3,"259":3,"260":1,"261":2,"263":6,"264":12,"265":4,"266":1,"267":2,"268":2,"269":2,"271":2,"272":1,"273":7,"275":7,"277":3,"278":3,"279":2,"280":3,"281":5,"282":2,"283":5,"284":3,"285":2,"286":3,"288":1,"289":14,"290":11,"292":1,"294":4,"297":2,"298":3,"299":1,"300":1,"301":4,"302":1,"303":1,"304":3,"305":7,"311":1,"313":1,"315":3,"316":2,"318":1,"320":3,"321":6,"322":5,"323":2,"325":1,"326":5,"327":5,"328":2,"329":6,"330":7,"331":4,"332":1,"333":1,"334":10,"335":7,"337":15,"338":2,"340":6,"341":3,"342":4,"343":1,"344":3,"346":1,"347":5,"348":4,"349":4,"351":2,"352":1,"353":2,"354":7,"355":15,"356":1,"357":4,"358":2,"359":2,"360":2,"363":3,"364":3,"365":2,"366":1,"368":1,"371":1,"372":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"381":1,"382":4,"383":1,"384":7,"385":2,"386":1,"387":4,"388":3,"389":2,"390":3,"391":2,"392":1,"393":3,"394":3,"395":7,"396":3,"397":7,"398":4,"399":1,"400":5,"401":5,"402":10,"403":2,"404":1,"405":5,"407":5,"408":5,"409":6,"410":7,"411":5,"412":1,"413":3,"414":3,"415":4,"416":3,"417":2,"418":6,"419":6,"420":4,"421":5,"422":2,"423":1,"425":1,"426":3,"427":2,"428":1,"429":6,"430":2,"431":4,"432":2,"433":1,"435":12,"436":4,"438":2,"439":3,"440":2,"441":1,"442":2,"443":8,"444":9,"445":2,"446":1,"447":1,"448":8,"449":6,"450":3,"451":8,"452":1,"454":1,"455":2,"456":1,"458":1,"459":2,"460":6,"461":18,"485":1,"491":1,"492":5,"494":1,"495":6,"497":2,"498":1,"500":1,"501":3,"504":1,"506":2,"515":1,"517":1,"524":4,"527":2,"530":6,"533":5,"540":1,"543":4,"544":1}}],["дриллинг",{"2":{"449":1}}],["др",{"2":{"213":1,"256":1,"533":1}}],["драйверами",{"2":{"189":1}}],["древовидной",{"2":{"187":1,"345":1}}],["древней",{"2":{"160":1}}],["дружелюбие",{"2":{"168":1}}],["дружественный",{"0":{"209":1}}],["дружественные",{"2":{"125":1}}],["дружественного",{"2":{"125":1}}],["другую",{"2":{"206":1,"236":1,"244":1,"278":1,"331":1,"349":1,"355":1,"357":1,"412":1,"427":1,"454":1}}],["другу",{"2":{"167":1,"273":1,"389":1}}],["другая",{"2":{"329":1,"331":1,"486":1}}],["друга",{"2":{"164":1,"191":1,"198":1,"251":1,"273":1,"331":1,"342":1,"410":1,"417":1}}],["другого",{"2":{"87":1,"119":1,"124":1,"143":1,"191":1,"200":2,"230":1,"269":1,"302":1,"304":2,"321":1,"329":1,"330":1,"334":1,"402":1,"408":1,"449":2}}],["другой",{"0":{"111":1},"2":{"34":1,"39":1,"41":2,"108":1,"139":1,"141":1,"166":1,"222":1,"228":1,"236":1,"243":1,"249":1,"263":2,"278":1,"290":1,"293":1,"294":1,"321":1,"325":1,"328":1,"336":1,"347":1,"354":1,"435":1,"438":1,"449":4,"452":1,"460":1,"495":1,"500":1}}],["другое",{"2":{"26":1,"36":1,"81":1,"131":1,"139":1,"143":1,"151":1,"214":1,"251":1,"263":1,"273":1,"276":1,"289":1,"337":1,"429":1,"449":1}}],["другому",{"2":{"280":1,"290":1,"304":1,"327":1}}],["другом",{"2":{"2":1,"3":1,"68":1,"107":1,"143":1,"167":2,"169":1,"194":1,"216":1,"269":1,"271":1,"273":1,"277":1,"293":1,"301":1,"335":1,"340":2,"351":1,"355":1,"436":1,"442":1,"496":1}}],["другими",{"2":{"96":1,"128":2,"160":1,"162":1,"164":1,"183":1,"207":1,"215":1,"228":1,"229":1,"236":1,"256":1,"263":1,"275":1,"297":1,"301":1,"308":1,"312":1,"324":1,"334":1,"337":1,"382":1,"384":1,"391":1,"411":1,"433":1,"449":1,"452":1,"461":1,"495":1}}],["другим",{"2":{"64":1,"96":1,"125":1,"139":1,"143":1,"162":1,"169":1,"185":1,"187":1,"215":1,"249":1,"251":1,"273":1,"349":1,"355":1,"387":1,"418":1,"428":1}}],["другие",{"0":{"119":1,"120":1,"133":1,"197":1},"2":{"4":1,"58":1,"95":1,"103":1,"107":1,"109":1,"110":3,"117":1,"128":1,"138":3,"139":1,"141":1,"142":3,"143":2,"150":1,"163":1,"173":1,"181":1,"197":1,"218":1,"221":1,"230":1,"233":1,"236":1,"237":1,"238":1,"251":1,"256":1,"257":1,"273":1,"277":1,"278":1,"282":1,"283":1,"292":1,"300":1,"314":1,"321":1,"325":1,"329":1,"330":1,"337":1,"340":1,"349":1,"355":2,"364":1,"370":1,"380":1,"386":1,"394":1,"395":1,"408":2,"411":1,"417":2,"419":1,"424":1,"427":1,"429":1,"438":1,"439":1,"440":1,"444":1,"451":1,"458":1,"461":1,"533":2}}],["других",{"0":{"0":1},"2":{"16":1,"21":1,"41":1,"81":1,"86":1,"121":1,"125":3,"133":2,"139":2,"151":2,"164":1,"176":1,"191":4,"203":1,"212":1,"215":1,"216":1,"218":1,"224":1,"243":1,"258":1,"272":1,"284":1,"285":1,"298":1,"299":1,"304":1,"313":1,"315":2,"316":1,"347":2,"350":1,"363":1,"384":1,"386":1,"395":1,"397":1,"398":1,"402":2,"429":1,"439":1,"451":2,"495":1,"533":1}}],["друг",{"2":{"2":1,"3":1,"68":1,"164":1,"167":3,"169":1,"191":1,"194":1,"198":1,"251":1,"269":1,"271":1,"273":3,"293":1,"301":1,"331":1,"335":1,"340":2,"342":1,"389":1,"410":1,"417":1,"436":1,"496":1}}],["д",{"0":{"274":1},"2":{"67":2,"107":1,"110":1,"111":1,"115":1,"139":1,"140":1,"142":1,"143":2,"149":1,"151":1,"162":5,"166":2,"171":2,"175":1,"177":1,"178":1,"179":1,"183":2,"213":1,"215":3,"218":1,"228":3,"233":1,"242":1,"243":1,"244":1,"248":1,"249":1,"250":2,"256":3,"258":1,"259":1,"260":1,"283":1,"284":1,"291":2,"297":1,"322":1,"325":1,"329":1,"332":1,"337":1,"342":1,"384":1,"385":1,"397":1,"405":1,"407":3,"408":1,"411":3,"413":1,"414":1,"427":1,"430":1,"457":1,"461":1,"494":2,"496":4}}],["динамичного",{"2":{"531":1,"533":1}}],["динамично",{"2":{"440":1,"451":1,"496":1,"497":1}}],["динамичным",{"2":{"299":1,"498":1}}],["динамичными",{"2":{"38":1}}],["динамичных",{"2":{"271":1}}],["динамической",{"2":{"461":1}}],["динамическому",{"2":{"285":1}}],["динамического",{"2":{"233":1,"278":2,"285":1}}],["динамическое",{"2":{"144":1,"242":1,"278":1}}],["динамическая",{"2":{"229":1}}],["динамические",{"0":{"285":1},"2":{"229":1,"237":1,"271":1,"274":1,"354":1}}],["динамических",{"2":{"228":1,"239":1,"244":1}}],["динамически",{"2":{"228":1,"236":1,"285":1,"461":1}}],["динамический",{"0":{"278":1},"2":{"215":1,"278":1}}],["диспетчере",{"2":{"326":1}}],["диспетчером",{"2":{"325":1}}],["диспетчера",{"2":{"325":2,"326":1,"346":1,"392":1}}],["дисплее",{"2":{"163":1}}],["дистрибутивов",{"2":{"423":1}}],["дистрибутивах",{"2":{"423":2}}],["дистрибутива",{"2":{"127":1,"134":1,"136":1,"423":1}}],["дистрибуция",{"2":{"162":1}}],["дисциплину",{"2":{"407":1,"409":1}}],["дисциплине",{"2":{"368":1}}],["дисциплина",{"2":{"407":1,"420":2}}],["дисциплинах",{"2":{"299":1}}],["дисциплинами",{"2":{"162":2}}],["дисциплиной",{"2":{"294":1}}],["дисциплины",{"2":{"160":1,"162":1,"407":1,"409":1}}],["диске",{"2":{"365":1}}],["дисковое",{"2":{"355":1,"443":1}}],["дискуссия",{"2":{"177":1}}],["диска",{"2":{"132":1}}],["диск",{"2":{"106":1,"444":1}}],["диалога",{"2":{"288":2,"289":2,"290":1}}],["диалоге",{"2":{"188":1,"189":1}}],["диалог",{"2":{"188":2,"207":1,"274":2,"275":3,"288":2,"289":4}}],["диалоги",{"0":{"188":1},"2":{"171":1,"188":1,"231":1,"273":1,"275":1,"286":1}}],["диалоговые",{"2":{"272":1}}],["диалоговое",{"2":{"206":1}}],["диалогов",{"0":{"274":1},"2":{"171":1,"188":1,"273":1,"274":1,"275":1,"281":1,"292":1}}],["диапазоны",{"2":{"183":1}}],["диапазон",{"2":{"125":1}}],["диаграмме",{"2":{"274":2,"297":1}}],["диаграмму",{"2":{"141":1}}],["диаграмма",{"0":{"14":1},"2":{"14":2}}],["диаграммы",{"2":{"5":1,"14":2,"67":1,"273":1,"345":1,"384":1,"388":1,"458":1}}],["директивой",{"2":{"283":1}}],["директиве",{"2":{"222":1,"280":1}}],["директиву",{"2":{"184":1,"280":2,"283":1}}],["директивы",{"2":{"142":1,"144":2,"147":1,"150":2,"159":1,"215":1,"222":2,"280":1,"283":1,"286":1}}],["директив",{"0":{"144":1},"1":{"145":1,"146":1,"147":1,"148":1,"149":1,"150":1},"2":{"112":1,"150":1,"151":2,"158":1,"285":1}}],["директивами",{"2":{"144":1}}],["директива",{"0":{"279":1},"2":{"96":2,"144":1,"145":1,"146":1,"149":1,"150":1,"283":1}}],["директорий",{"2":{"441":1}}],["директория",{"2":{"435":2}}],["директориях",{"2":{"230":1}}],["директории",{"2":{"103":1,"126":2,"218":1,"290":1,"401":1,"410":1,"418":1,"426":1,"489":2,"498":1,"503":1}}],["директорию",{"2":{"87":1,"435":1}}],["дирректорию",{"2":{"86":1}}],["дизайна",{"0":{"162":1},"2":{"163":2,"164":1,"165":1,"168":1,"169":1,"190":1,"194":1,"196":1,"216":1,"228":1,"244":1,"272":1,"293":1,"373":1,"451":1,"494":1,"496":1}}],["дизайну",{"2":{"22":1,"263":1}}],["дизайнерское",{"2":{"236":1}}],["дизайнером",{"2":{"216":1,"380":1}}],["дизайнер",{"2":{"163":2,"164":1,"165":1,"167":1}}],["дизайнеру",{"2":{"163":1}}],["дизайнерами",{"2":{"160":1,"210":1}}],["дизайне",{"2":{"22":2,"163":1,"290":1,"407":1}}],["дизайн",{"0":{"1":1,"24":1,"25":1,"68":1,"162":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"25":1,"26":1},"2":{"25":2,"26":1,"66":1,"68":2,"162":4,"171":1,"172":1,"194":1,"223":1,"271":3,"272":3,"289":1,"290":1,"309":1,"407":2,"484":1}}],["дойти",{"2":{"461":1}}],["дойдем",{"2":{"184":1}}],["доскролил",{"2":{"448":1}}],["дословно",{"2":{"264":1}}],["достойны",{"2":{"460":1}}],["достоинствами",{"2":{"298":1}}],["достигнем",{"2":{"297":1}}],["достигнет",{"2":{"169":1}}],["достигается",{"2":{"245":1,"254":1}}],["достижению",{"2":{"169":1}}],["достижений",{"2":{"142":1}}],["достижения",{"2":{"76":1,"191":1,"222":1,"231":1,"297":1}}],["достичь",{"2":{"64":1,"194":1}}],["доступе",{"2":{"460":1}}],["доступен",{"2":{"125":1,"355":1,"421":1,"439":1,"516":1}}],["доступной",{"2":{"449":1}}],["доступное",{"2":{"355":1}}],["доступном",{"2":{"355":1}}],["доступно",{"0":{"531":1},"2":{"289":1,"355":1,"530":1}}],["доступный",{"2":{"355":1,"515":1}}],["доступные",{"0":{"530":1},"2":{"218":1,"233":1,"256":1,"354":1,"388":1,"496":1}}],["доступными",{"2":{"354":1}}],["доступным",{"2":{"183":1,"223":1,"277":1,"283":1,"341":1,"348":1}}],["доступных",{"2":{"170":1,"174":1,"242":1,"264":1,"363":1,"394":1,"491":1}}],["доступны",{"2":{"143":1,"163":1,"242":2,"280":1,"281":1,"285":1,"360":1,"440":1,"508":1}}],["доступна",{"2":{"134":1,"355":1,"366":1,"449":1}}],["доступом",{"2":{"128":1}}],["доступ",{"0":{"58":1},"2":{"58":1,"105":1,"106":3,"107":3,"108":8,"128":1,"135":3,"143":4,"183":1,"191":1,"196":1,"209":1,"222":1,"226":1,"244":1,"249":1,"253":1,"266":1,"283":1,"312":1,"329":1,"350":1,"351":2,"355":2,"384":2,"393":1,"397":1,"415":1,"416":1,"437":1,"439":1,"440":1,"449":2}}],["доступа",{"0":{"394":1},"1":{"395":1,"396":1,"397":1,"398":1,"399":1,"400":1},"2":{"17":1,"40":1,"52":1,"57":1,"106":5,"107":1,"108":1,"114":1,"125":2,"128":1,"143":1,"245":1,"275":1,"283":1,"311":1,"312":1,"315":1,"342":1,"382":1,"384":1,"388":3,"390":1,"402":1,"403":1,"435":1,"444":1}}],["доставка",{"0":{"430":1},"2":{"429":1,"430":2,"433":1}}],["доставки",{"2":{"4":1,"70":1,"79":1,"134":1,"140":1,"430":1}}],["достаточным",{"2":{"409":1}}],["достаточный",{"0":{"164":1}}],["достаточную",{"2":{"188":1}}],["достаточное",{"2":{"216":1,"219":1}}],["достаточно",{"2":{"40":1,"57":1,"58":1,"81":1,"131":2,"176":1,"181":1,"215":1,"219":1,"222":1,"230":1,"234":1,"244":1,"248":2,"256":1,"263":2,"273":1,"283":1,"284":1,"289":1,"302":1,"314":1,"323":1,"331":1,"336":1,"342":1,"343":1,"344":1,"347":1,"355":2,"357":1,"385":1,"387":1,"390":1,"398":1,"399":1,"418":1,"419":1,"428":1,"431":1,"436":1,"444":1,"445":1,"448":1,"451":1,"461":1,"495":1}}],["дождаться",{"2":{"263":1}}],["допускает",{"2":{"416":1}}],["допускают",{"2":{"256":1}}],["допустим",{"2":{"244":1,"283":1,"452":1}}],["допустимы",{"2":{"243":1}}],["дополненного",{"2":{"402":1}}],["дополнение",{"2":{"323":1}}],["дополнением",{"2":{"261":1}}],["дополнениями",{"2":{"219":1}}],["дополнили",{"2":{"334":1}}],["дополнительную",{"2":{"245":1}}],["дополнительных",{"2":{"143":1,"214":1,"218":1,"222":1,"243":1,"251":1,"261":2,"274":1,"383":1,"403":1,"406":1,"407":1,"410":1,"433":1}}],["дополнительными",{"2":{"189":1,"215":1,"228":1,"388":1}}],["дополнительным",{"2":{"141":1,"291":1,"347":1}}],["дополнительные",{"2":{"138":1,"139":1,"219":1,"243":1,"327":1,"331":1,"377":1,"388":1,"414":1,"429":1,"461":1}}],["дополнительный",{"2":{"29":1,"200":1,"216":1,"337":1}}],["дополнительная",{"2":{"103":1}}],["дополнительного",{"2":{"252":1,"255":1,"420":1}}],["дополнительной",{"2":{"139":2,"331":1}}],["дополнительное",{"2":{"48":1,"214":1,"233":1,"245":1}}],["дополнительно",{"2":{"16":1}}],["дополняем",{"2":{"333":1}}],["дополнять",{"2":{"332":1}}],["дополняющего",{"2":{"331":1}}],["дорогой",{"2":{"408":1}}],["дорогостоящим",{"2":{"405":1}}],["дорогостоящей",{"2":{"250":1}}],["дорогим",{"2":{"329":1}}],["дороги",{"2":{"147":1}}],["доработаем",{"2":{"289":1}}],["доработки",{"2":{"223":1}}],["дорабатывать",{"2":{"212":1}}],["договаривается",{"2":{"355":1}}],["договоре",{"2":{"202":1}}],["догадались",{"2":{"142":1,"214":1,"321":1}}],["доходит",{"2":{"183":1,"248":1}}],["додо",{"2":{"162":1}}],["дочерняя",{"2":{"280":1,"344":1}}],["дочернему",{"2":{"280":1,"343":1}}],["дочернем",{"2":{"239":1,"279":1,"281":2,"358":1}}],["дочернего",{"2":{"143":1,"280":2,"343":1}}],["дочерний",{"2":{"274":1,"279":1,"299":2,"344":1}}],["дочерними",{"2":{"280":1}}],["дочерним",{"2":{"273":1,"280":1,"290":1,"342":2}}],["дочерних",{"2":{"222":1,"274":1,"281":1,"283":1,"342":1,"344":1,"348":1}}],["дочерние",{"2":{"151":1,"238":2,"239":1,"342":3}}],["доведем",{"2":{"220":1}}],["доверенных",{"2":{"108":2}}],["доводить",{"2":{"158":1}}],["довольно",{"2":{"3":1,"9":1,"25":1,"39":1,"81":1,"107":2,"109":1,"122":1,"128":1,"190":1,"200":1,"201":1,"202":1,"214":1,"218":2,"219":1,"229":1,"248":1,"263":1,"289":1,"305":1,"315":1,"324":1,"329":2,"330":1,"337":1,"342":1,"344":1,"384":1,"385":1,"389":1,"394":1,"425":1,"428":1,"444":1,"460":2,"461":1,"495":3,"527":1}}],["документ",{"2":{"459":1}}],["документируйте",{"0":{"458":1},"2":{"438":1}}],["документирован",{"2":{"394":1}}],["документированная",{"2":{"394":1}}],["документирования",{"2":{"273":1,"458":1}}],["документирование",{"0":{"72":1},"2":{"66":1}}],["документов",{"2":{"394":2}}],["документом",{"2":{"201":1}}],["документной",{"2":{"384":1}}],["документа",{"2":{"111":1,"146":1,"284":2}}],["документаций",{"2":{"461":1}}],["документацию",{"2":{"131":1,"139":1,"151":1,"212":1,"304":1,"354":1,"495":1}}],["документации",{"2":{"110":1,"119":1,"120":1,"128":1,"129":1,"133":1,"150":1,"151":1,"163":1,"213":1,"233":1,"242":2,"264":1,"265":1,"283":1,"285":1,"337":1,"355":1,"387":1,"398":1,"411":2,"415":1,"423":1,"424":1,"435":1,"438":1,"440":1,"460":1,"484":1}}],["документацией",{"2":{"72":1,"213":1,"251":1,"357":1,"429":1}}],["документация",{"2":{"67":1,"273":1,"438":1,"449":1,"460":4,"485":1}}],["доброжелательные",{"2":{"460":1}}],["добрый",{"2":{"61":1}}],["добились",{"2":{"291":1,"292":1}}],["добиться",{"2":{"194":1,"230":1,"266":1}}],["добавятся",{"2":{"428":1}}],["добавьте",{"2":{"219":1,"222":1,"386":1,"396":1,"428":1,"435":1}}],["добавив",{"2":{"217":1,"411":1,"428":1}}],["добавили",{"2":{"143":1,"290":1}}],["добавились",{"2":{"83":1}}],["добавит",{"2":{"108":1,"410":1,"425":1}}],["добавить",{"2":{"29":1,"218":1,"256":1,"331":1,"417":1,"419":1,"423":1,"425":2,"444":1,"452":2,"459":1}}],["добавим",{"2":{"36":1,"222":1,"393":1,"398":1,"410":1}}],["добавленные",{"2":{"428":1}}],["добавлен",{"2":{"200":2}}],["добавления",{"2":{"139":1,"222":1,"298":1,"328":1,"329":1,"331":3}}],["добавление",{"2":{"12":1,"79":1,"217":1,"242":1,"258":1,"392":1,"448":1,"451":1,"483":1,"492":1,"530":1}}],["добавляются",{"2":{"461":1}}],["добавляют",{"2":{"432":1}}],["добавляя",{"2":{"325":1,"333":1}}],["добавлялись",{"2":{"138":1}}],["добавляется",{"2":{"440":1}}],["добавляет",{"2":{"108":1,"115":1,"331":1,"383":1,"396":1,"452":1,"459":1,"507":1,"517":1,"540":1}}],["добавляем",{"2":{"88":1,"89":1,"236":1,"284":1,"290":1,"429":1}}],["добавлять",{"2":{"18":1,"200":1,"291":1,"334":1,"349":1}}],["долларов",{"2":{"125":1}}],["доля",{"2":{"116":1}}],["дольше",{"2":{"106":1,"384":1}}],["долгосрочной",{"2":{"68":1}}],["долгого",{"2":{"39":1}}],["должна",{"2":{"76":1,"139":1,"142":1,"143":1,"151":1,"165":1,"181":1,"210":1,"246":1,"251":1,"281":1,"297":3,"335":1,"342":1,"400":1,"416":1,"435":1,"460":1}}],["должны",{"2":{"22":1,"41":1,"76":1,"113":1,"114":1,"139":1,"141":2,"164":2,"167":1,"169":2,"171":1,"172":1,"179":1,"184":1,"188":1,"197":1,"216":1,"218":1,"222":2,"223":1,"230":1,"239":1,"244":3,"245":1,"249":1,"256":1,"262":1,"266":1,"273":1,"280":1,"281":1,"283":1,"289":1,"294":1,"295":2,"299":1,"300":3,"302":1,"303":1,"304":1,"305":1,"326":1,"337":1,"341":1,"344":1,"347":1,"349":1,"351":1,"384":1,"389":1,"397":1,"411":1,"417":1,"436":1,"440":1,"448":1,"455":1}}],["должном",{"2":{"459":1}}],["должно",{"2":{"11":1,"44":1,"79":1,"106":1,"107":1,"150":1,"172":1,"195":1,"220":1,"239":1,"256":3,"258":1,"259":1,"260":1,"268":1,"280":2,"351":1,"384":1,"407":1,"409":1,"410":1,"411":1,"412":4,"450":1,"496":1}}],["должен",{"2":{"11":1,"23":2,"48":1,"76":1,"86":1,"106":1,"113":1,"125":1,"135":1,"139":2,"148":1,"172":2,"175":1,"195":1,"202":1,"210":1,"214":1,"217":1,"220":1,"244":1,"245":2,"248":1,"249":1,"251":1,"256":1,"258":2,"261":1,"263":1,"264":1,"278":1,"279":1,"280":1,"289":2,"298":1,"299":1,"301":1,"302":1,"311":1,"319":1,"321":2,"325":1,"328":1,"329":1,"332":3,"342":1,"347":1,"365":1,"384":2,"385":1,"392":1,"407":1,"410":1,"417":1,"418":1,"435":2,"449":1,"461":1,"542":1}}],["домашний",{"2":{"196":1,"461":1,"542":1}}],["домашняя",{"0":{"195":1},"2":{"195":1}}],["домашнюю",{"2":{"164":1}}],["домашнего",{"2":{"125":1}}],["домашней",{"2":{"125":1}}],["домене",{"2":{"125":2}}],["домену",{"2":{"125":1}}],["доменным",{"2":{"131":1}}],["доменные",{"2":{"125":1}}],["доменных",{"0":{"125":1},"1":{"127":1},"2":{"125":1}}],["доменное",{"2":{"124":1,"125":2}}],["домены",{"0":{"125":1},"1":{"127":1},"2":{"125":3,"132":1,"135":1}}],["доменов",{"2":{"108":1,"125":1,"297":1}}],["доменом",{"2":{"100":1,"108":1,"126":1}}],["домен",{"2":{"108":1,"125":9,"126":1,"134":1,"135":1,"137":1,"200":1,"398":1,"439":3,"460":1,"516":2}}],["доменами",{"2":{"125":1}}],["домена",{"2":{"108":4,"122":1,"125":4,"126":1,"130":1,"135":1,"136":1,"137":2,"355":1,"394":1,"402":2,"439":1}}],["дом",{"2":{"26":1}}],["до",{"0":{"257":1},"1":{"258":1,"259":1,"260":1,"261":1,"262":1,"263":1},"2":{"22":1,"60":1,"93":1,"112":1,"116":1,"125":2,"135":1,"138":2,"139":2,"141":1,"143":1,"150":1,"151":1,"158":2,"161":1,"169":1,"174":1,"183":1,"184":1,"188":1,"191":1,"196":1,"200":1,"201":1,"207":1,"212":1,"216":4,"220":1,"224":1,"228":1,"229":1,"233":2,"236":1,"237":1,"239":2,"244":1,"248":1,"249":2,"260":1,"264":1,"272":1,"275":1,"278":2,"283":1,"297":1,"304":1,"318":1,"329":1,"331":1,"332":1,"334":1,"337":1,"349":2,"357":1,"373":1,"384":4,"407":2,"414":1,"419":1,"429":1,"430":1,"440":1,"448":1,"461":3,"496":1}}],["декларируемое",{"2":{"449":1}}],["декомпозиции",{"2":{"451":1}}],["декодирован",{"2":{"245":1}}],["декодированной",{"2":{"242":1}}],["декодирует",{"2":{"245":1}}],["декораторов",{"2":{"331":2}}],["декораторы",{"2":{"331":3,"333":1}}],["декораторами",{"2":{"334":1}}],["декораторам",{"2":{"331":1}}],["декоратора",{"2":{"305":1,"331":2,"333":1,"334":1,"357":1}}],["декоратор",{"0":{"331":1},"1":{"332":1,"333":1},"2":{"216":1,"294":1,"330":1,"331":3,"332":2,"357":2}}],["дебаге",{"2":{"448":1}}],["дебажить",{"2":{"55":1}}],["девопс",{"2":{"433":1}}],["девичестве",{"2":{"50":1}}],["детей",{"2":{"460":1}}],["детьми",{"2":{"340":1}}],["деталей",{"2":{"303":1}}],["детализирована",{"2":{"297":1}}],["детализации",{"2":{"191":1}}],["детали",{"0":{"502":1},"1":{"503":1,"504":1},"2":{"236":1,"458":1}}],["детальную",{"2":{"452":1}}],["детального",{"2":{"292":1}}],["детально",{"2":{"163":1}}],["детальный",{"2":{"14":1}}],["деталях",{"0":{"276":1},"1":{"277":1,"278":1,"279":1,"280":1,"281":1},"2":{"149":1,"245":1}}],["деталям",{"2":{"122":2,"237":1}}],["децентрализованные",{"2":{"251":2}}],["децентрализованных",{"2":{"228":1,"251":1}}],["дефисами",{"2":{"221":1}}],["деятельность",{"2":{"178":1}}],["деятельностью",{"2":{"64":1}}],["деактивации",{"2":{"175":2}}],["демонстрации",{"2":{"167":1,"363":1}}],["демонстрирующий",{"2":{"297":1,"350":1}}],["демонстрируют",{"2":{"161":1}}],["демонстрирует",{"2":{"166":1,"184":1,"317":1,"420":1,"449":1}}],["деньги",{"2":{"444":1}}],["день",{"2":{"125":1,"160":1,"171":1,"419":1,"421":1}}],["денег",{"2":{"62":1}}],["держи",{"0":{"303":1},"2":{"294":2}}],["держим",{"2":{"22":1}}],["держателем",{"2":{"285":1}}],["держать",{"2":{"214":1,"460":1}}],["дереву",{"2":{"281":1,"318":1,"342":1,"344":2,"449":1}}],["дереве",{"2":{"273":1,"280":1,"347":1}}],["деревьев",{"2":{"237":1}}],["дерево",{"2":{"141":1,"298":1}}],["дерева",{"2":{"119":1,"151":1,"216":1,"273":1,"344":1}}],["де",{"2":{"109":1,"230":1,"501":1}}],["деплое",{"2":{"435":1}}],["деплоится",{"2":{"435":1}}],["деплоить",{"2":{"435":1}}],["деплой",{"2":{"435":1,"469":1,"470":1}}],["деплоя",{"2":{"70":1,"429":1,"435":4,"460":1,"496":1,"530":1,"533":1}}],["депозитами",{"2":{"106":1}}],["действовало",{"2":{"254":1}}],["действовать",{"2":{"244":1,"332":1}}],["действительному",{"2":{"248":1}}],["действительно",{"2":{"208":1,"323":1,"331":1,"438":1,"442":1,"450":1}}],["действительная",{"2":{"106":1}}],["действию",{"0":{"196":1},"2":{"164":1,"196":3,"208":1}}],["действии",{"0":{"368":1},"2":{"141":1,"161":1,"188":1,"213":1,"214":1,"222":1,"227":1,"255":1,"270":1,"300":2,"334":1,"340":1,"341":1,"368":1,"383":1,"406":1}}],["действием",{"2":{"176":1,"177":1}}],["действие",{"2":{"106":2,"141":1,"176":1,"177":1,"199":1,"208":1,"275":1,"277":1,"328":1,"331":1,"427":1}}],["действиями",{"2":{"189":1}}],["действиях",{"2":{"164":1,"171":1}}],["действия",{"2":{"83":1,"106":1,"135":1,"171":2,"177":1,"181":1,"189":1,"198":2,"230":1,"266":1,"280":1,"284":1,"286":1,"289":2,"325":1,"384":2,"397":1,"409":1,"429":2,"450":1}}],["действий",{"2":{"63":1,"165":1,"171":1,"181":2,"207":2,"208":1,"347":1,"390":1,"433":1}}],["действующего",{"2":{"334":1}}],["действуют",{"2":{"3":1}}],["действуя",{"2":{"264":1}}],["действует",{"2":{"23":1,"135":1,"245":1,"251":1,"264":1,"305":1,"329":1}}],["дестабилизируют",{"2":{"305":1}}],["десктоп",{"2":{"461":1}}],["десктопными",{"2":{"228":1}}],["десктопных",{"2":{"218":1}}],["десктопе",{"2":{"33":1}}],["десятилетнем",{"2":{"442":1}}],["десятилетиям",{"2":{"17":1}}],["десяток",{"2":{"171":1}}],["десятками",{"2":{"48":1}}],["десятки",{"2":{"47":1,"443":1,"444":1}}],["делиться",{"2":{"284":1,"334":1,"449":1}}],["делится",{"2":{"183":1}}],["делсостояние",{"2":{"273":1}}],["делсобытия",{"2":{"273":1}}],["дело",{"2":{"248":2,"272":1,"299":1,"329":1}}],["дел",{"2":{"212":1,"220":1,"222":7,"223":1,"231":2,"236":1,"269":2,"273":5,"274":1,"290":2}}],["делайте",{"2":{"453":1,"455":1}}],["делающее",{"2":{"449":1}}],["делаются",{"2":{"43":1,"503":1}}],["делают",{"2":{"41":1,"218":1,"339":1,"355":1,"408":2}}],["делая",{"2":{"254":1,"331":1}}],["делали",{"2":{"222":1,"228":1,"340":1,"398":1,"415":1,"440":1}}],["дела",{"2":{"125":1,"237":1,"452":1}}],["делать",{"2":{"35":1,"38":1,"41":1,"47":1,"50":1,"86":1,"94":1,"96":1,"107":1,"108":1,"132":1,"172":2,"177":1,"180":1,"220":1,"237":1,"256":1,"297":1,"299":1,"305":1,"351":1,"384":1,"407":1,"411":1,"426":1,"444":1,"448":1,"449":1,"461":2,"545":1}}],["делаться",{"2":{"34":1,"195":1}}],["делается",{"2":{"58":1,"95":1,"106":1,"125":1,"143":1,"244":1,"300":1,"330":1,"363":1,"438":1,"492":1}}],["делает",{"2":{"48":1,"106":1,"109":1,"114":1,"137":1,"140":1,"142":1,"171":1,"172":1,"191":1,"213":1,"221":1,"228":2,"249":1,"252":1,"278":1,"289":1,"318":1,"321":1,"337":1,"345":1,"347":1,"352":1,"387":1,"393":1,"407":1,"411":1,"428":1,"429":1,"443":1,"444":1,"449":1,"451":1,"515":1}}],["делаете",{"2":{"26":1}}],["делаем",{"2":{"22":1,"58":1,"64":1,"89":1,"143":1,"248":1,"301":1,"337":1,"386":1,"402":1}}],["делегатора",{"2":{"392":1}}],["делегировать",{"2":{"302":1,"321":1}}],["делегируется",{"2":{"327":1}}],["делегирует",{"2":{"290":1}}],["деле",{"2":{"3":1,"128":1,"157":1,"305":1,"384":1}}],["даны",{"2":{"212":1}}],["данную",{"2":{"296":1}}],["данная",{"2":{"184":1,"212":1,"326":1,"396":1,"428":1,"451":1,"461":1}}],["данном",{"2":{"112":1,"126":1,"132":1,"135":2,"139":1,"140":1,"142":1,"143":1,"164":2,"172":1,"183":1,"200":1,"203":1,"205":1,"214":1,"222":2,"223":1,"228":1,"237":1,"239":1,"248":1,"249":1,"251":1,"275":1,"278":1,"281":1,"283":1,"290":1,"321":2,"342":1,"347":1,"348":1,"392":1,"394":2,"396":1,"398":1,"402":1,"411":1,"415":2,"416":2,"435":1,"436":1,"449":1,"451":1,"486":1,"489":1,"491":1}}],["данное",{"2":{"72":1,"409":1,"496":1}}],["данной",{"2":{"67":1,"106":1,"134":1,"144":1,"170":1,"194":1,"195":1,"216":1,"244":1,"248":1,"251":2,"265":1,"271":1,"274":1,"294":1,"299":1,"301":1,"305":1,"429":1,"460":1,"543":1}}],["данного",{"0":{"76":1,"483":1},"2":{"64":1,"176":1,"189":1,"220":1,"264":1,"271":1,"329":1,"348":2,"384":1,"385":1,"393":1,"435":1,"448":1,"449":1,"452":1}}],["данным",{"2":{"108":1,"183":1,"250":1,"311":1,"342":1,"382":1,"460":1}}],["данными",{"0":{"173":1},"1":{"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1},"2":{"17":1,"38":1,"39":1,"41":1,"47":1,"94":1,"107":3,"135":1,"223":1,"228":1,"244":1,"245":1,"273":1,"280":1,"281":1,"284":1,"331":1,"342":1,"347":1,"348":1,"349":1,"360":1,"389":1,"402":1,"438":1,"542":1}}],["данный",{"2":{"11":1,"16":1,"36":1,"43":1,"125":1,"143":1,"191":1,"215":1,"219":1,"236":1,"289":1,"296":1,"299":1,"318":1,"325":1,"328":1,"330":1,"414":1,"459":1,"485":1,"489":1,"492":1,"505":1,"508":1,"524":1,"530":1,"537":1}}],["данные",{"0":{"44":1,"103":1},"1":{"45":1,"46":1,"47":1},"2":{"3":1,"11":2,"17":2,"47":2,"94":1,"103":1,"106":2,"107":3,"108":1,"154":1,"202":1,"221":1,"239":2,"244":4,"245":1,"246":1,"247":1,"250":2,"251":2,"273":2,"278":1,"280":2,"281":4,"283":1,"290":1,"300":2,"326":3,"327":2,"329":1,"331":1,"333":1,"342":2,"344":3,"345":1,"347":1,"355":7,"356":1,"384":3,"385":1,"386":1,"388":1,"389":1,"390":1,"391":2,"396":1,"397":5,"398":1,"399":2,"400":2,"402":2,"437":4,"438":1,"448":2,"449":3,"451":4,"460":1,"461":3}}],["данных",{"0":{"15":1,"17":1,"42":2,"273":1,"340":1,"355":1,"376":1},"1":{"16":1,"17":1,"18":2,"19":2,"43":2,"44":2,"45":2,"46":2,"47":2,"48":2,"341":1,"342":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},"2":{"3":1,"6":2,"11":1,"16":1,"17":8,"39":3,"40":2,"41":1,"43":1,"44":1,"47":1,"48":1,"58":2,"61":1,"67":1,"79":1,"107":7,"108":1,"109":1,"114":2,"118":1,"139":2,"143":3,"148":1,"149":1,"162":1,"176":1,"183":5,"222":1,"228":2,"233":1,"236":1,"237":1,"239":2,"244":8,"245":2,"249":1,"250":2,"254":1,"263":1,"264":1,"273":1,"274":1,"279":3,"281":1,"283":1,"286":1,"301":1,"307":1,"310":1,"316":3,"323":1,"324":1,"327":1,"334":1,"340":1,"342":3,"347":4,"348":1,"349":1,"354":1,"355":13,"356":2,"359":1,"376":1,"382":3,"385":2,"393":1,"394":6,"395":2,"396":3,"397":1,"400":1,"402":1,"403":1,"407":2,"408":1,"438":1,"444":2,"449":4,"451":2,"452":1,"460":1,"461":1}}],["дат",{"2":{"448":1,"524":1}}],["дата",{"0":{"448":1}}],["датами",{"2":{"445":1}}],["датой",{"2":{"435":1,"448":1}}],["дату",{"2":{"430":2,"435":1}}],["датчики",{"2":{"284":1}}],["даты",{"2":{"174":2}}],["дать",{"2":{"106":1,"122":1,"171":1,"210":1,"275":1,"355":1,"418":1,"496":2}}],["даст",{"2":{"110":1,"346":1,"350":1,"451":1}}],["дал",{"2":{"202":1,"215":1,"449":1}}],["далеко",{"2":{"107":1,"192":1,"213":1,"214":1,"251":1,"302":1,"450":1,"453":1}}],["далее",{"0":{"112":1},"2":{"86":2,"100":1,"106":1,"134":1,"139":1,"143":1,"157":1,"169":1,"172":1,"186":1,"214":2,"215":1,"221":2,"222":1,"236":1,"244":1,"247":1,"250":1,"251":1,"254":1,"256":2,"262":1,"284":1,"297":2,"313":1,"336":1,"354":1,"356":1,"397":1,"402":1,"407":1,"416":1,"418":1,"429":1}}],["дальше",{"2":{"106":1,"139":1,"177":1,"214":1,"219":1,"426":1,"456":1}}],["дальнейшего",{"2":{"172":1,"251":1,"429":1,"495":1}}],["дальнейшей",{"2":{"68":1,"151":1,"159":1,"191":1,"494":1,"496":1}}],["дальнейшем",{"2":{"11":1,"16":1,"18":1,"29":1,"34":1,"40":1,"57":1,"58":1,"88":1,"95":1,"141":1,"150":1,"184":1,"247":1,"305":1,"459":1,"497":1,"500":1}}],["дальнейшая",{"2":{"38":1,"429":1}}],["дальнейших",{"2":{"9":1,"12":1,"368":1}}],["дальнейшую",{"2":{"3":1}}],["дала",{"2":{"94":1}}],["дает",{"2":{"83":1,"106":1,"109":2,"143":1,"146":1,"181":1,"219":1,"229":1,"294":1,"305":1,"330":1,"342":1,"350":1,"384":1,"404":1,"409":1,"415":1,"448":1}}],["даёт",{"2":{"64":1,"83":1,"444":1,"451":1,"460":1}}],["давид",{"2":{"368":1}}],["давным",{"2":{"160":1}}],["давно",{"2":{"39":1,"160":1,"181":1}}],["давайте",{"2":{"110":1,"111":1,"124":1,"133":1,"139":2,"140":1,"142":1,"143":2,"152":1,"163":1,"172":1,"198":1,"212":1,"216":1,"217":1,"218":1,"228":1,"229":1,"230":1,"231":1,"234":1,"235":1,"245":3,"256":1,"257":1,"271":1,"278":1,"280":1,"283":1,"285":1,"289":4,"305":1,"310":1,"317":1,"323":1,"325":1,"326":1,"329":1,"330":1,"335":1,"342":1,"343":1,"344":1,"345":1,"348":1,"351":1,"384":1,"392":2,"393":1,"394":1,"400":1,"408":1,"410":1,"417":1,"421":1,"426":1,"428":1}}],["давать",{"2":{"106":1}}],["давая",{"2":{"2":1,"256":1}}],["дают",{"2":{"17":2,"124":1,"431":1}}],["даже",{"2":{"12":1,"40":1,"48":1,"67":1,"106":1,"108":1,"135":1,"138":2,"139":2,"151":1,"158":1,"162":2,"165":1,"167":1,"180":1,"195":1,"198":2,"218":2,"223":1,"228":2,"236":1,"237":2,"239":1,"245":1,"250":2,"251":1,"256":1,"264":1,"267":1,"277":1,"281":1,"282":1,"283":1,"296":1,"302":1,"305":1,"320":1,"328":1,"329":1,"334":1,"344":1,"349":1,"358":1,"384":2,"394":1,"405":1,"407":1,"408":1,"410":1,"416":1,"419":1,"420":1,"429":1,"448":1,"449":2,"451":1,"459":1,"460":3,"524":1}}],["да",{"2":{"10":1,"143":2,"214":1,"219":1,"225":1,"315":1,"331":1,"337":1,"357":1}}],["двинемся",{"2":{"426":1}}],["двигателя",{"2":{"460":1}}],["двигаться",{"2":{"219":1,"427":1}}],["двигаясь",{"2":{"228":1}}],["движок",{"2":{"394":1}}],["движущихся",{"2":{"334":1,"384":1}}],["движению",{"2":{"334":1}}],["движение",{"2":{"284":1}}],["движения",{"2":{"169":1}}],["движки",{"2":{"254":1}}],["движке",{"2":{"213":1,"256":1,"355":1}}],["движка",{"2":{"116":1,"353":1,"396":1}}],["двойной",{"2":{"396":1}}],["двойных",{"2":{"222":1}}],["двойные",{"2":{"140":1}}],["двойная",{"2":{"178":1}}],["двоеточия",{"2":{"150":1,"239":1}}],["двоеточие",{"2":{"145":1,"233":1}}],["двусмысленное",{"2":{"449":1}}],["двусторонним",{"2":{"149":1}}],["двум",{"2":{"219":1,"301":1}}],["двумя",{"2":{"95":1,"215":1,"218":1,"231":1,"330":1,"396":1,"403":1}}],["двунаправленную",{"2":{"109":1}}],["двухдневный",{"2":{"460":1}}],["двухфакторная",{"0":{"250":1},"2":{"249":1}}],["двух",{"2":{"96":1,"128":1,"134":1,"139":1,"164":1,"233":1,"250":1,"256":1,"281":1,"285":1,"402":1,"416":1,"505":1,"537":1}}],["двадцатилетней",{"2":{"460":1}}],["дважды",{"2":{"302":1}}],["два",{"2":{"3":2,"17":2,"47":1,"57":1,"106":1,"114":1,"116":1,"125":1,"135":1,"143":1,"148":1,"151":1,"162":1,"175":2,"183":1,"222":4,"223":1,"235":1,"239":1,"245":1,"250":1,"259":1,"263":3,"277":1,"278":1,"289":3,"304":1,"324":1,"325":1,"330":1,"335":1,"337":1,"351":1,"357":1,"382":1,"387":1,"397":1,"398":1,"411":1,"417":1,"436":1,"438":1,"452":1,"460":2,"461":2,"522":1}}],["двери",{"2":{"302":1}}],["две",{"2":{"2":1,"16":1,"106":1,"109":1,"126":1,"143":1,"164":1,"222":1,"239":1,"249":1,"290":1,"337":2,"357":1,"382":1,"402":1,"411":1}}],["иллюстрации",{"2":{"492":1}}],["илья",{"2":{"460":1}}],["или",{"0":{"37":1,"109":1,"164":1,"176":1,"178":1,"180":1,"249":1,"256":1,"447":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,"62":1,"63":1,"66":1,"89":1,"93":2,"95":1,"96":1,"103":1,"105":2,"106":2,"107":1,"108":4,"109":2,"112":1,"114":2,"115":1,"116":1,"122":2,"125":7,"126":2,"128":2,"129":1,"131":1,"134":3,"139":9,"140":2,"141":1,"142":1,"143":6,"144":1,"146":4,"147":3,"148":1,"149":1,"150":1,"151":3,"160":1,"162":6,"163":4,"164":2,"165":2,"166":3,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"174":1,"175":7,"176":4,"177":3,"179":1,"180":1,"181":2,"183":3,"185":1,"186":2,"189":2,"191":3,"192":2,"193":1,"194":5,"195":1,"196":3,"198":3,"199":1,"200":1,"201":1,"202":2,"203":3,"204":1,"205":2,"206":1,"207":1,"208":1,"209":3,"212":1,"213":5,"214":4,"215":1,"216":7,"218":1,"219":2,"220":2,"221":2,"222":5,"223":5,"225":1,"228":1,"230":3,"231":1,"233":2,"236":2,"237":1,"238":1,"239":1,"243":4,"244":5,"245":2,"246":1,"249":2,"250":7,"251":4,"254":1,"256":5,"258":4,"263":6,"264":3,"266":3,"269":1,"271":2,"272":2,"273":1,"274":2,"275":3,"277":2,"278":2,"279":2,"280":1,"281":3,"282":3,"283":3,"284":2,"286":2,"289":2,"290":3,"291":2,"292":1,"293":1,"297":2,"298":3,"299":3,"300":1,"301":1,"302":4,"303":2,"304":3,"305":3,"306":1,"312":2,"314":1,"316":3,"321":3,"322":1,"323":1,"324":1,"325":2,"327":2,"328":2,"329":6,"330":2,"331":4,"332":2,"334":5,"335":3,"336":2,"337":5,"338":1,"340":1,"344":1,"345":2,"347":2,"348":1,"349":1,"352":1,"354":2,"355":4,"357":4,"358":1,"360":1,"365":2,"384":6,"386":2,"388":6,"389":2,"390":1,"391":1,"392":1,"394":2,"395":1,"399":1,"400":1,"405":4,"407":3,"408":6,"410":3,"411":4,"413":1,"416":1,"417":1,"418":2,"420":2,"422":1,"423":1,"425":2,"428":1,"429":1,"430":1,"432":1,"436":1,"437":3,"439":1,"440":1,"442":1,"443":2,"448":3,"449":11,"451":2,"452":1,"453":1,"454":2,"459":3,"460":5,"461":3,"483":3,"492":1,"495":4,"500":1,"524":1}}],["иерарxичную",{"2":{"459":1}}],["иерархия",{"2":{"272":1,"282":1}}],["иерархические",{"2":{"290":1}}],["иерархический",{"2":{"187":1}}],["иерархическому",{"2":{"281":1}}],["иерархичных",{"2":{"17":1}}],["иерархичного",{"2":{"17":1,"451":1}}],["иерархичное",{"2":{"2":1}}],["иерархию",{"2":{"164":1,"224":1,"272":1}}],["иерархии",{"2":{"142":1,"215":1,"269":1,"272":2,"273":1,"280":1,"282":1,"321":1,"323":1,"449":2}}],["ивент",{"2":{"449":1}}],["ивенты",{"2":{"449":1}}],["ивентов",{"2":{"449":1}}],["ищутся",{"2":{"407":1}}],["игнорировать",{"2":{"314":1}}],["игнорируют",{"2":{"273":1}}],["игнорируйте",{"2":{"215":1}}],["играет",{"2":{"451":1}}],["играй",{"2":{"251":1}}],["игры",{"2":{"251":1}}],["игру",{"2":{"199":1}}],["игрушек",{"2":{"62":1}}],["игрушки",{"2":{"19":1,"61":2}}],["игрушка",{"2":{"18":1}}],["иконографическое",{"2":{"273":1}}],["иконографических",{"2":{"220":1}}],["иконографию",{"2":{"216":1}}],["иконография",{"2":{"167":1}}],["иконок",{"2":{"189":1,"196":1,"216":1,"218":7,"224":1,"256":1,"261":1,"269":1,"498":1}}],["иконке",{"2":{"96":1}}],["иконкой",{"2":{"96":2,"222":1,"263":1}}],["иконкам",{"2":{"100":1}}],["иконками",{"2":{"89":1,"218":1,"440":1}}],["иконка",{"0":{"93":1},"2":{"93":2,"181":1,"189":5,"461":1}}],["иконки",{"0":{"189":1,"196":1},"2":{"89":1,"189":1,"196":1,"215":1,"218":1,"269":1,"440":2,"442":1,"443":1,"498":1,"531":1}}],["иконку",{"2":{"86":1,"94":1,"96":1,"259":1,"440":2,"506":1,"534":1,"536":1}}],["идущими",{"2":{"281":1}}],["идущие",{"2":{"102":1}}],["идеально",{"2":{"397":1,"410":1,"451":1}}],["идеале",{"2":{"23":1,"449":1}}],["идею",{"2":{"388":1,"461":1}}],["идее",{"2":{"297":1}}],["идеей",{"2":{"225":1,"417":1}}],["идентифицировал",{"2":{"402":1}}],["идентифицировать",{"2":{"229":1,"251":1}}],["идентифицирует",{"2":{"355":1}}],["идентифицирующее",{"2":{"289":1}}],["идентификацией",{"2":{"251":1}}],["идентификационных",{"2":{"250":1}}],["идентификационный",{"2":{"125":1}}],["идентификационная",{"2":{"245":1}}],["идентификацию",{"2":{"239":1,"251":1}}],["идентификации",{"2":{"214":1,"243":1,"251":1,"289":1,"391":1,"410":1}}],["идентификаторы",{"2":{"498":1}}],["идентификатора",{"2":{"251":1,"351":1,"391":1}}],["идентификатору",{"2":{"251":1}}],["идентификаторов",{"2":{"184":1}}],["идентификатором",{"2":{"140":1,"391":1}}],["идентификатор",{"2":{"143":1,"233":1,"236":2,"245":1,"246":1,"251":2}}],["идет",{"2":{"171":1,"196":1,"256":1,"408":1,"444":1,"485":1}}],["идете",{"2":{"26":1}}],["идея",{"2":{"151":1,"249":1,"254":1,"302":1,"303":1,"331":1,"449":1,"495":1}}],["итерируйте",{"2":{"272":1}}],["итерацией",{"2":{"251":1}}],["итераций",{"2":{"66":1}}],["итеративный",{"2":{"223":1,"225":1}}],["итераторе",{"2":{"148":1}}],["итак",{"2":{"139":1,"245":1,"271":1,"320":1,"329":1,"334":1,"350":1,"410":1}}],["итог",{"0":{"121":1}}],["итоговый",{"2":{"459":1}}],["итогов",{"0":{"136":1,"158":1,"210":1,"224":1,"252":1,"267":1,"292":1,"338":1,"359":1,"403":1,"431":1}}],["итогового",{"2":{"79":1}}],["итого",{"2":{"106":1}}],["итоге",{"0":{"528":1},"2":{"47":1,"90":1,"95":1,"157":1,"250":1,"278":1,"299":1,"302":1,"444":1,"449":1}}],["имитировать",{"2":{"416":1}}],["имитирует",{"2":{"450":1}}],["имитирующей",{"2":{"415":1}}],["имитирующих",{"2":{"407":1}}],["имитирующую",{"2":{"407":1}}],["имитирующая",{"2":{"394":1}}],["имитируют",{"2":{"394":1}}],["имитируя",{"2":{"208":1}}],["имитацией",{"2":{"408":1}}],["имитации",{"2":{"285":1}}],["ими",{"2":{"125":1,"229":1,"256":1,"273":1,"280":1,"286":1,"388":1,"431":1,"438":1,"527":1}}],["импорты",{"2":{"249":1}}],["импорт",{"0":{"278":1},"2":{"216":1,"219":2,"278":1,"449":1}}],["импорта",{"2":{"139":1,"222":1,"233":2,"278":1,"284":1,"289":2,"314":1,"326":1,"349":1,"351":1,"352":1,"357":1,"386":1,"387":1,"391":1,"392":2,"395":1,"416":1,"441":1}}],["импортирую",{"2":{"449":1}}],["импортируя",{"2":{"151":1,"347":1}}],["импортируется",{"2":{"143":1}}],["импортирует",{"2":{"141":1}}],["импортируем",{"2":{"111":1,"140":1,"143":2,"220":1,"233":2,"239":1,"251":1,"281":2,"290":3,"317":1,"347":1,"349":1,"354":1,"393":1,"396":1,"398":1,"400":1,"402":1,"411":2,"415":2}}],["импортировав",{"2":{"284":1}}],["импортировали",{"2":{"221":1,"278":1,"333":1}}],["импортированы",{"2":{"440":1}}],["импортированными",{"2":{"277":1}}],["импортированным",{"2":{"277":1}}],["импортированных",{"2":{"221":1}}],["импортирование",{"2":{"219":1}}],["импортирован",{"2":{"139":1,"215":1,"314":1}}],["импортировать",{"2":{"111":1,"139":1,"140":1,"141":1,"143":2,"215":1,"219":1,"221":1,"233":1,"243":1,"277":2,"284":1,"289":1,"314":1,"322":1,"323":1,"353":1,"386":1,"411":1,"440":2,"442":1}}],["импорте",{"2":{"61":1,"215":1,"219":1}}],["имя",{"2":{"86":1,"124":1,"125":3,"143":2,"157":1,"214":6,"215":1,"221":2,"236":2,"239":2,"242":1,"250":1,"258":3,"259":2,"261":1,"280":2,"283":6,"289":2,"322":2,"326":1,"351":1,"357":1,"385":1,"410":1,"423":1,"435":1,"483":1}}],["им",{"2":{"81":1,"106":1,"239":1,"281":1,"284":1,"407":1,"459":1,"461":1,"495":1}}],["имейте",{"2":{"243":1}}],["имея",{"2":{"162":1,"213":1,"256":1}}],["имели",{"2":{"141":1,"162":1}}],["имеющую",{"2":{"402":1}}],["имеющих",{"2":{"125":1}}],["имеются",{"2":{"242":1}}],["имеют",{"2":{"115":1,"142":1,"143":2,"144":1,"163":1,"164":1,"166":1,"186":1,"200":1,"256":1,"264":1,"290":1,"299":2,"302":1,"331":1,"337":1,"342":3,"355":1,"384":2,"391":1,"431":1,"448":1,"449":1,"459":1}}],["именование",{"2":{"281":1}}],["именовании",{"2":{"280":1,"281":2,"284":1,"304":1}}],["именования",{"2":{"189":1}}],["именованными",{"2":{"283":1}}],["именованных",{"2":{"237":1}}],["именованные",{"0":{"237":1},"1":{"238":1,"239":1},"2":{"237":2,"283":2}}],["именованного",{"2":{"233":1}}],["именовать",{"2":{"44":1}}],["имени",{"0":{"244":1},"2":{"125":1,"214":1,"229":1,"239":1,"244":3,"250":1,"252":1,"259":1,"279":1,"281":2,"283":1,"289":4,"321":1,"322":2,"323":1,"326":1,"329":1,"332":1,"334":1,"355":1,"393":1,"440":1,"498":1,"531":1}}],["именам",{"2":{"236":1,"322":1,"396":1}}],["именами",{"2":{"222":1,"239":1,"244":1,"245":1,"337":2,"420":1,"440":1}}],["имена",{"0":{"155":1,"156":1},"2":{"108":1,"125":2,"140":1,"239":1,"265":1,"322":1,"337":1,"498":1}}],["именем",{"2":{"108":1,"115":1,"217":1,"221":1,"222":1,"233":3,"239":1,"263":1,"281":2,"283":2,"285":1,"289":2,"331":1,"332":1,"355":1,"357":1,"386":1,"396":1,"416":1,"442":1}}],["имен",{"0":{"125":1},"1":{"127":1},"2":{"44":1,"125":1,"238":1,"245":1,"272":1,"277":1,"279":1,"323":1,"330":1}}],["именно",{"2":{"2":1,"39":1,"106":1,"125":1,"127":1,"130":1,"135":1,"138":2,"141":1,"142":1,"143":1,"198":1,"212":1,"215":2,"218":1,"231":1,"236":1,"239":1,"250":1,"256":1,"274":1,"280":1,"325":1,"330":1,"335":1,"342":1,"347":1,"351":1,"386":1,"387":2,"407":1,"415":1,"449":1,"451":1,"460":2}}],["имеем",{"2":{"41":1,"128":1,"135":1,"143":1,"215":1,"248":1,"290":1}}],["имеет",{"2":{"38":1,"41":1,"50":1,"106":4,"107":1,"109":1,"113":1,"114":2,"116":1,"121":1,"127":1,"128":1,"131":1,"140":1,"143":1,"146":1,"148":1,"163":1,"172":1,"174":1,"175":1,"200":1,"204":1,"218":1,"233":1,"244":1,"245":2,"256":1,"258":1,"259":1,"263":2,"272":1,"273":1,"278":3,"279":1,"282":1,"289":1,"297":1,"301":1,"315":1,"323":1,"326":1,"329":1,"330":1,"342":1,"345":1,"347":2,"349":1,"355":1,"385":1,"388":1,"397":1,"406":1,"408":1,"410":1,"416":1,"420":1,"451":2}}],["имеется",{"2":{"4":1,"186":1,"216":1,"347":1}}],["иметь",{"2":{"11":1,"18":1,"23":1,"115":1,"119":1,"125":3,"128":1,"138":1,"143":1,"146":1,"157":1,"164":2,"167":1,"172":1,"184":1,"191":1,"219":1,"222":1,"223":1,"238":1,"242":1,"244":2,"250":1,"258":1,"264":1,"271":1,"275":1,"280":2,"291":1,"299":1,"305":1,"314":1,"321":1,"325":1,"347":1,"365":1,"382":1,"410":2,"421":1,"428":1,"437":1,"444":1,"449":1}}],["изнутри",{"2":{"386":1}}],["изначально",{"2":{"29":1,"394":1,"436":1,"461":1}}],["изложенные",{"2":{"382":1}}],["излишняя",{"2":{"299":1}}],["издателя",{"2":{"325":1}}],["издревле",{"2":{"2":1}}],["измерения",{"2":{"407":1}}],["измерить",{"2":{"267":1}}],["измеримые",{"2":{"168":1}}],["изменено",{"0":{"465":1,"467":1,"470":1,"473":1},"2":{"139":1}}],["изменении",{"2":{"139":1,"194":1,"222":1,"356":1,"358":1,"451":2}}],["изменений",{"0":{"462":1},"1":{"463":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"470":1,"471":1,"472":1,"473":1,"474":1,"475":1},"2":{"110":3,"114":2,"120":1,"121":1,"139":1,"148":1,"213":1,"228":1,"236":2,"274":1,"354":1,"397":1,"405":1,"411":1,"414":1,"417":1,"419":1,"420":2,"421":1,"425":2,"433":1,"448":1,"483":1}}],["изменениям",{"2":{"363":1,"381":1}}],["изменениями",{"2":{"236":1,"325":1,"358":1,"394":1,"414":1,"444":1,"451":2}}],["изменениях",{"2":{"179":1,"290":1,"325":1,"449":1}}],["изменения",{"0":{"115":1,"117":1,"118":1,"119":1,"120":1},"2":{"40":1,"41":1,"110":7,"111":1,"117":1,"121":1,"132":1,"137":1,"138":3,"194":1,"214":1,"219":1,"222":1,"236":1,"279":1,"290":1,"301":2,"305":1,"331":1,"334":1,"349":1,"355":1,"405":2,"421":3,"425":1,"428":1,"429":3,"430":2,"431":1,"448":2,"470":1,"500":1}}],["изменение",{"2":{"38":2,"115":1,"118":1,"126":1,"127":1,"274":1,"279":1,"284":1,"290":2,"337":1,"347":1,"348":1,"349":1,"350":1,"351":1,"354":1,"420":1,"428":1}}],["изменяем",{"2":{"290":1,"333":2}}],["изменяете",{"2":{"331":1,"432":1}}],["изменяет",{"2":{"233":1,"332":1,"342":1,"344":1,"349":2}}],["изменяется",{"2":{"139":1,"325":1,"337":1,"432":1}}],["изменяются",{"2":{"284":1}}],["изменяющие",{"2":{"138":1,"167":1}}],["изменяя",{"2":{"241":1}}],["изменяться",{"2":{"264":2,"451":1}}],["изменять",{"2":{"129":1,"138":1,"143":1,"218":1,"239":1,"273":1,"351":1,"451":1,"543":1}}],["изменит",{"2":{"410":1}}],["измените",{"2":{"219":1,"265":1}}],["изменится",{"2":{"151":1,"393":1,"409":1,"444":1}}],["изменить",{"2":{"126":2,"143":1,"147":1,"162":1,"215":1,"221":1,"250":1,"329":2,"336":1,"348":1,"396":1,"404":1,"417":1,"451":1,"452":1,"459":1}}],["изменил",{"2":{"420":1}}],["изменилась",{"2":{"337":1}}],["изменили",{"2":{"293":1}}],["изменилось",{"2":{"111":1,"143":1,"238":1,"420":1}}],["изменился",{"2":{"106":1,"111":1,"217":1}}],["изменим",{"2":{"86":1,"236":1,"317":1,"398":1,"414":1}}],["изощренных",{"2":{"444":1}}],["изоляции",{"2":{"250":1,"315":1}}],["изолированные",{"2":{"141":1}}],["изобретено",{"2":{"451":1}}],["изобретайте",{"2":{"334":1}}],["изобретать",{"2":{"216":1,"294":1,"326":1}}],["изображение",{"2":{"272":1}}],["изображению",{"2":{"259":1}}],["изображений",{"0":{"180":1},"2":{"174":1,"180":4,"291":1}}],["изображениями",{"2":{"180":1,"196":1}}],["изображения",{"2":{"16":1,"164":1,"166":1,"215":1,"259":1,"261":3,"426":1,"440":2}}],["изобразить",{"2":{"141":1}}],["извлекать",{"2":{"416":1}}],["извлекает",{"2":{"416":1}}],["извлекаем",{"2":{"140":1,"396":1}}],["извлеченного",{"2":{"395":1}}],["извлечения",{"2":{"355":1,"394":1,"395":1}}],["известен",{"2":{"302":1}}],["известную",{"2":{"397":1}}],["известно",{"2":{"245":1}}],["известной",{"2":{"202":1,"213":1}}],["известны",{"2":{"249":1}}],["известных",{"2":{"229":1,"251":1,"263":1}}],["известный",{"2":{"128":1,"233":1,"245":1,"447":1,"448":1}}],["известными",{"2":{"251":1,"258":1}}],["известным",{"2":{"125":1}}],["известные",{"2":{"9":1,"350":2}}],["изучайте",{"2":{"460":1}}],["изучаемые",{"2":{"395":1}}],["изучающей",{"2":{"163":1}}],["изучать",{"2":{"22":1,"139":1,"165":1,"465":1,"467":1}}],["изучили",{"2":{"252":1}}],["изучите",{"2":{"160":1}}],["изучить",{"2":{"21":1,"67":1,"134":1,"139":1,"172":1,"216":1,"261":1,"283":1,"387":1,"435":1,"496":1}}],["изучим",{"2":{"138":1,"226":1}}],["изученных",{"2":{"268":1}}],["изученный",{"2":{"9":1}}],["изучению",{"2":{"275":1,"411":1}}],["изучении",{"2":{"216":1,"254":1,"495":1}}],["изучения",{"2":{"158":1,"294":1,"305":1,"337":1,"409":1,"460":2}}],["изучение",{"0":{"21":1,"144":1,"460":1},"1":{"145":1,"146":1,"147":1,"148":1,"149":1,"150":1},"2":{"197":1,"363":1,"456":1,"460":1}}],["из",{"0":{"491":1},"2":{"14":1,"23":1,"28":1,"34":1,"39":1,"41":2,"48":1,"50":2,"66":1,"68":2,"76":1,"79":1,"81":1,"86":1,"93":1,"96":1,"100":1,"106":1,"107":1,"109":1,"110":1,"111":2,"114":3,"117":1,"125":4,"126":1,"128":1,"134":1,"135":1,"138":3,"139":5,"140":2,"141":2,"142":2,"143":7,"144":1,"146":1,"147":2,"148":1,"151":1,"160":1,"163":1,"165":1,"166":1,"169":2,"170":1,"173":1,"175":2,"176":1,"177":1,"180":3,"181":1,"182":1,"183":1,"185":1,"186":1,"187":1,"188":1,"189":1,"194":3,"195":2,"196":2,"197":1,"198":1,"199":1,"207":1,"208":2,"210":1,"212":1,"213":3,"214":1,"215":3,"216":3,"218":6,"220":1,"221":3,"222":5,"228":3,"229":1,"231":1,"233":3,"236":5,"237":2,"238":1,"239":6,"242":1,"243":2,"244":1,"245":3,"250":2,"251":1,"253":1,"254":2,"255":1,"256":2,"258":1,"259":1,"261":1,"263":3,"264":1,"265":1,"269":1,"271":1,"272":1,"273":1,"275":2,"278":1,"279":3,"280":2,"281":2,"282":1,"283":2,"284":2,"285":1,"289":3,"290":2,"295":1,"297":3,"298":1,"299":2,"301":1,"303":1,"304":2,"310":1,"311":1,"313":1,"315":2,"319":1,"321":1,"325":3,"326":1,"329":1,"331":4,"334":3,"335":2,"336":4,"337":3,"340":3,"342":1,"344":1,"345":1,"347":1,"348":3,"349":1,"350":2,"351":2,"352":1,"354":1,"355":5,"357":4,"358":1,"384":6,"389":1,"390":1,"391":4,"392":2,"395":1,"396":1,"397":4,"400":1,"402":3,"405":2,"408":2,"409":1,"410":2,"411":5,"414":2,"415":2,"416":1,"417":1,"420":3,"421":3,"425":1,"428":1,"429":3,"435":4,"440":5,"441":1,"443":2,"448":1,"449":5,"450":1,"451":1,"452":1,"456":1,"460":2,"461":2,"495":1,"498":2,"500":1,"505":1,"537":1}}],["избыточности",{"2":{"302":1}}],["избавляет",{"2":{"184":1}}],["избегаемы",{"2":{"448":1}}],["избегаем",{"2":{"398":1}}],["избегания",{"2":{"302":1}}],["избегание",{"2":{"180":1}}],["избегая",{"2":{"284":1}}],["избегать",{"2":{"186":1,"197":1,"209":1,"211":1,"277":1,"299":1}}],["избегайте",{"0":{"453":1},"2":{"170":1,"299":1,"438":1}}],["избежание",{"2":{"221":1}}],["избежания",{"2":{"9":1,"533":1}}],["избежать",{"2":{"44":1,"171":1,"196":1,"217":1,"269":1,"281":1,"301":1,"314":1,"315":1,"451":1}}],["избранном",{"2":{"93":1}}],["избранного",{"2":{"89":1}}],["избранное",{"0":{"92":1},"1":{"93":1,"94":1,"95":1,"96":1,"97":1},"2":{"4":1,"29":1,"33":1,"93":3,"95":2,"96":1}}],["исчезновении",{"2":{"504":1}}],["исчезают",{"2":{"291":1}}],["исчезла",{"2":{"160":1,"428":1}}],["исчерпывающий",{"2":{"294":1}}],["исчерпывающим",{"2":{"110":1,"143":1}}],["исчерпывающее",{"2":{"205":1}}],["истинным",{"2":{"415":1}}],["истины",{"2":{"302":1,"349":1,"350":1}}],["истечения",{"2":{"135":1,"249":1}}],["истечении",{"2":{"125":1,"135":1,"278":1}}],["историю",{"2":{"240":1,"421":1}}],["история",{"0":{"462":1},"1":{"463":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"470":1,"471":1,"472":1,"473":1,"474":1,"475":1},"2":{"162":1,"331":1,"421":1}}],["истории",{"2":{"118":2,"126":1,"127":1,"128":1,"130":1,"136":1,"137":1,"242":2}}],["историческим",{"2":{"420":1}}],["исторически",{"2":{"44":1,"449":1}}],["источники",{"2":{"460":1,"485":1}}],["источнику",{"2":{"108":1,"460":1}}],["источник",{"2":{"108":1,"281":1,"349":1,"350":1,"421":1}}],["источников",{"2":{"108":3,"402":2}}],["искренне",{"2":{"368":1}}],["искренней",{"2":{"223":1}}],["искусственной",{"2":{"393":1}}],["искусственного",{"2":{"162":1}}],["искушению",{"2":{"298":1}}],["исключительных",{"2":{"461":1}}],["исключительным",{"2":{"303":1}}],["исключить",{"2":{"417":1}}],["исключают",{"2":{"417":1}}],["исключается",{"2":{"215":1}}],["исключена",{"2":{"355":1}}],["исключение",{"2":{"195":2}}],["исключением",{"2":{"124":1,"179":1,"195":1,"215":1,"269":1,"300":2,"395":1,"408":1,"449":1}}],["исключения",{"2":{"139":1,"195":1,"425":1}}],["искать",{"2":{"48":1,"165":2,"363":1,"442":1}}],["исходящие",{"2":{"300":1}}],["исходящими",{"2":{"209":1}}],["исходя",{"2":{"221":1,"236":1,"261":1,"340":1,"342":1}}],["исходному",{"2":{"301":1,"357":1}}],["исходном",{"2":{"281":1,"411":1,"416":1,"417":1,"431":1}}],["исходного",{"2":{"134":2,"290":1,"331":1,"355":1,"400":1,"407":1,"420":1,"421":1,"444":1}}],["исходные",{"2":{"421":1}}],["исходными",{"0":{"421":1}}],["исходным",{"2":{"390":1,"405":1,"410":1,"417":1,"420":1,"426":1}}],["исходных",{"0":{"378":1},"2":{"213":1,"215":2,"419":1,"420":1}}],["исходный",{"2":{"161":1,"183":1,"207":1,"222":1,"264":1,"274":1,"322":1,"330":1,"357":1,"406":1,"410":1,"426":1,"428":1}}],["исходная",{"2":{"12":1}}],["исхода",{"2":{"79":1}}],["исследование",{"0":{"243":1},"1":{"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1}}],["исследований",{"2":{"168":1,"407":1}}],["исследования",{"2":{"39":1,"160":1}}],["исследовать",{"2":{"4":1,"215":1}}],["исследуем",{"2":{"21":1,"337":1}}],["испускающую",{"2":{"345":1}}],["испускает",{"2":{"326":1}}],["испускаемые",{"2":{"416":1}}],["испускаем",{"2":{"115":1}}],["испуская",{"2":{"274":1}}],["исправить",{"2":{"266":1,"416":1,"428":1}}],["исправление",{"2":{"73":1,"470":1}}],["исправлять",{"2":{"2":1}}],["испытываем",{"2":{"248":1}}],["испортит",{"2":{"450":1}}],["испорчен",{"2":{"245":1}}],["исполнение",{"2":{"327":1}}],["исполнения",{"2":{"140":1}}],["использовалось",{"2":{"350":1}}],["использовал",{"2":{"165":1,"421":1}}],["использовались",{"2":{"405":1,"448":1}}],["использовали",{"2":{"94":1,"228":1,"236":1,"239":2,"242":1,"280":1,"292":1,"302":1,"321":1,"354":1,"413":1}}],["использованы",{"2":{"167":1,"245":2}}],["использована",{"2":{"143":1,"151":1}}],["использован",{"2":{"139":1,"143":1}}],["использовано",{"2":{"125":1,"337":1}}],["использованию",{"2":{"173":1,"217":1,"222":1,"224":1,"256":1,"286":1,"396":1,"412":1,"425":1,"448":1}}],["использованием",{"2":{"126":1,"164":1,"197":1,"202":1,"212":1,"226":1,"237":1,"251":1,"256":1,"267":1,"274":1,"283":1,"285":1,"292":2,"299":1,"313":1,"318":1,"321":1,"337":1,"340":1,"355":1,"356":1,"391":2,"403":1,"407":1,"408":1,"411":1,"412":1,"423":1,"440":1,"461":1}}],["использование",{"0":{"54":1,"140":1,"410":1,"425":1,"526":1},"1":{"141":1,"411":1,"426":1},"2":{"40":1,"58":1,"77":1,"108":1,"125":1,"134":1,"135":1,"139":1,"143":2,"151":1,"161":1,"166":1,"171":1,"177":1,"180":1,"183":2,"187":1,"191":1,"194":1,"207":1,"211":1,"212":1,"216":1,"218":2,"219":1,"228":3,"236":1,"238":1,"242":1,"244":1,"245":1,"248":1,"250":1,"256":1,"264":2,"278":1,"280":1,"284":2,"285":1,"289":1,"290":2,"301":1,"324":1,"334":1,"337":1,"349":1,"351":1,"352":1,"354":2,"357":1,"363":1,"403":1,"404":1,"407":1,"408":2,"411":2,"412":1,"413":1,"427":1,"449":2,"451":1,"459":1,"461":1,"484":1,"492":1}}],["использовании",{"2":{"39":1,"109":1,"113":1,"114":1,"121":1,"127":1,"134":1,"136":1,"137":1,"141":2,"143":1,"147":1,"162":1,"166":1,"181":1,"191":1,"194":1,"202":1,"204":1,"218":1,"221":1,"222":1,"228":1,"229":1,"242":1,"251":1,"280":1,"350":1,"364":1,"384":2,"386":1,"387":1,"421":1,"438":1}}],["использования",{"2":{"23":1,"76":1,"83":1,"94":1,"114":1,"115":1,"116":2,"125":2,"134":1,"139":1,"140":2,"143":2,"172":2,"181":1,"191":1,"197":1,"211":1,"218":1,"222":1,"226":1,"229":1,"236":1,"239":1,"240":1,"243":1,"245":1,"247":1,"249":2,"250":1,"251":1,"253":1,"254":1,"256":2,"265":1,"268":1,"271":1,"275":1,"277":2,"279":1,"282":2,"283":1,"284":1,"295":1,"301":1,"305":1,"315":1,"316":1,"318":1,"321":1,"322":1,"326":1,"329":1,"334":1,"339":1,"347":1,"348":1,"350":1,"355":2,"356":2,"382":1,"394":1,"396":1,"417":1,"426":1,"429":1,"438":1,"448":1,"449":1,"460":1,"461":1,"492":1,"501":1,"526":1}}],["использоваться",{"2":{"76":1,"127":1,"145":1,"176":1,"180":1,"181":1,"214":2,"218":1,"231":1,"233":1,"245":1,"277":1,"295":1,"350":1,"372":1,"391":1,"500":1}}],["использовать",{"0":{"312":1},"2":{"10":1,"17":1,"39":1,"55":1,"58":2,"67":1,"81":1,"87":1,"93":1,"107":1,"109":1,"114":5,"116":1,"127":1,"128":1,"132":1,"134":2,"139":7,"140":2,"141":2,"142":7,"143":4,"146":1,"149":1,"150":3,"151":2,"152":1,"157":2,"160":1,"173":1,"175":1,"178":1,"181":1,"183":1,"187":1,"189":1,"212":1,"213":4,"214":2,"215":1,"216":1,"218":5,"219":1,"221":2,"229":1,"230":2,"236":1,"238":2,"239":2,"242":2,"243":4,"244":1,"245":1,"246":1,"247":2,"251":4,"252":1,"253":2,"254":1,"256":2,"258":2,"260":2,"261":1,"262":1,"264":11,"265":1,"268":1,"272":1,"275":3,"277":2,"278":1,"283":2,"284":2,"285":1,"286":1,"289":4,"293":1,"294":1,"298":1,"302":2,"305":1,"306":1,"314":1,"315":1,"317":1,"320":1,"322":1,"326":3,"331":1,"332":1,"334":3,"336":2,"337":5,"338":1,"342":1,"344":1,"345":1,"347":2,"348":2,"350":1,"351":1,"352":1,"353":1,"354":2,"355":3,"356":1,"357":3,"358":1,"364":1,"382":1,"384":2,"387":5,"388":1,"390":1,"391":1,"394":2,"395":1,"397":2,"403":2,"410":1,"411":1,"413":1,"416":2,"417":1,"420":1,"421":2,"425":2,"426":1,"436":3,"440":3,"443":1,"449":1,"451":2,"452":3,"456":1,"492":1,"496":1,"497":1,"498":1}}],["используйте",{"0":{"167":1,"454":1,"456":1,"457":1},"2":{"114":2,"142":2,"147":2,"157":1,"174":1,"214":1,"216":1,"253":1,"360":1,"411":1,"448":2,"454":1,"459":1}}],["использующая",{"2":{"284":1}}],["использующими",{"2":{"352":1,"384":1}}],["использующим",{"2":{"251":1}}],["использующие",{"2":{"250":1}}],["использующий",{"2":{"166":1}}],["использующей",{"2":{"492":1}}],["использующем",{"2":{"249":1}}],["использующего",{"2":{"108":1,"345":1}}],["используют",{"2":{"116":1,"138":1,"152":1,"180":1,"192":1,"213":1,"251":1,"254":1,"281":1,"344":1}}],["используются",{"2":{"22":1,"67":1,"106":1,"118":1,"128":1,"137":1,"139":1,"151":1,"159":1,"162":1,"174":1,"176":1,"215":1,"222":1,"245":1,"248":1,"254":1,"258":1,"275":1,"278":2,"279":1,"310":1,"323":1,"329":1,"337":2,"359":1,"435":1,"443":1,"451":1,"543":1}}],["использую",{"2":{"102":1,"140":1,"449":1}}],["используя",{"2":{"83":1,"107":1,"125":1,"128":1,"139":1,"141":1,"143":1,"165":1,"214":1,"216":3,"221":1,"222":1,"224":1,"233":3,"237":1,"239":1,"245":1,"251":1,"264":1,"265":1,"269":1,"281":1,"283":2,"290":1,"298":1,"304":1,"330":1,"334":1,"335":1,"344":1,"352":1,"354":1,"355":1,"357":1,"365":1,"372":1,"390":1,"391":1,"395":1,"411":2,"416":1,"430":1,"435":1,"443":2,"483":1}}],["используете",{"2":{"116":1,"304":1,"422":1,"454":1}}],["использует",{"2":{"114":2,"127":1,"164":1,"167":1,"180":1,"216":1,"219":1,"233":1,"244":1,"256":1,"265":1,"285":1,"329":1,"395":1,"409":1,"410":1,"411":1,"419":1,"435":1,"441":1,"443":1,"448":2,"449":1,"498":1,"515":1}}],["используется",{"2":{"7":1,"23":1,"50":1,"106":1,"108":1,"125":3,"127":1,"128":1,"129":1,"138":1,"143":1,"148":1,"150":1,"164":2,"175":1,"177":1,"179":1,"181":1,"183":1,"187":1,"189":2,"190":2,"191":2,"204":1,"206":1,"207":1,"215":1,"222":1,"233":1,"242":1,"245":2,"259":1,"260":1,"277":1,"283":1,"290":1,"301":1,"312":1,"326":1,"329":1,"334":1,"349":1,"351":1,"354":1,"388":1,"417":1,"420":1,"426":1,"428":1,"435":1,"443":1,"448":1,"451":2,"460":1,"485":1,"492":4,"501":1,"543":1}}],["используемую",{"2":{"245":1,"259":1}}],["используемом",{"2":{"217":1}}],["используемое",{"2":{"190":1,"259":1}}],["используемого",{"2":{"108":1,"112":1,"135":1,"139":1,"183":1,"430":1}}],["используемая",{"2":{"139":1}}],["используемым",{"2":{"275":1}}],["используемыми",{"2":{"242":1,"269":1}}],["используемых",{"2":{"133":1,"242":1,"252":1,"394":1,"397":1}}],["используемые",{"2":{"116":1,"141":1,"143":1,"144":1,"174":1,"215":1,"239":1,"242":1,"436":1}}],["используемый",{"2":{"106":1,"151":1,"177":1,"204":1,"222":1,"243":1,"245":1,"256":1,"280":1,"397":1}}],["используем",{"2":{"17":1,"23":3,"89":2,"100":1,"113":1,"125":1,"126":1,"128":1,"132":1,"140":2,"142":2,"143":2,"145":1,"149":1,"184":3,"218":2,"221":3,"222":1,"223":1,"231":1,"233":1,"236":3,"238":1,"245":2,"246":1,"248":1,"249":1,"280":1,"281":1,"283":4,"284":1,"290":2,"315":2,"317":1,"322":1,"328":1,"330":1,"336":1,"347":1,"349":1,"351":1,"352":2,"354":1,"355":2,"356":1,"386":2,"391":1,"396":1,"397":1,"400":1,"402":1,"411":1,"415":1,"416":1,"428":1}}],["иная",{"2":{"451":1}}],["иначе",{"2":{"142":1,"150":1,"163":1,"202":1,"213":1,"244":1,"411":1,"415":1,"449":1}}],["ингридиент",{"2":{"450":1}}],["инкремента",{"2":{"342":1,"343":1,"344":1}}],["инкапсуляций",{"2":{"284":1}}],["инкапсуляции",{"2":{"157":1,"216":1,"236":1,"284":1,"320":1,"334":1}}],["инкапсуляция",{"0":{"3":1,"300":1},"2":{"294":1,"300":1}}],["инкапсулировав",{"2":{"412":1}}],["инкапсулировать",{"2":{"312":1}}],["инкапсулировали",{"2":{"94":1,"451":1}}],["инкапсулируя",{"2":{"388":1}}],["инкапсулируют",{"2":{"218":1}}],["инкапсулирует",{"2":{"142":1,"391":1,"451":1}}],["иным",{"2":{"418":1}}],["иные",{"2":{"338":1}}],["иных",{"2":{"63":1,"461":1}}],["инвокер",{"2":{"315":1,"319":1,"321":1,"327":2,"328":2}}],["инвокеру",{"2":{"315":1,"327":1}}],["инвертирует",{"2":{"139":1}}],["инъекцией",{"2":{"318":1}}],["инъекцию",{"2":{"286":1,"317":1,"344":1}}],["инъекция",{"0":{"281":1,"316":1},"1":{"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1},"2":{"280":1,"294":1}}],["инъекциях",{"2":{"100":1}}],["инъекции",{"0":{"503":1},"2":{"265":1,"275":1,"281":1,"282":1,"292":1,"316":1,"318":1,"321":1,"503":1}}],["инициировать",{"2":{"389":1}}],["инициируя",{"2":{"264":1}}],["инициирует",{"2":{"263":1}}],["инициирующей",{"2":{"108":1}}],["инициализация",{"0":{"490":1},"2":{"501":1,"526":1}}],["инициализации",{"2":{"349":1,"498":1,"517":1}}],["инициализируя",{"2":{"357":1}}],["инициализируем",{"2":{"284":1,"330":1}}],["инициализирован",{"2":{"425":1}}],["инициализированную",{"2":{"347":1}}],["инициализировано",{"2":{"326":1}}],["инициализировать",{"2":{"242":1}}],["инициативе",{"2":{"263":1}}],["инноваций",{"2":{"191":1}}],["инжектируйте",{"2":{"289":1}}],["инжектируемого",{"2":{"496":1}}],["инжектируем",{"2":{"289":2}}],["инжектируемый",{"2":{"281":1,"286":1,"289":1}}],["инжектируемых",{"2":{"154":1}}],["инжектируемые",{"2":{"154":1}}],["инжектируете",{"2":{"438":1}}],["инжектируется",{"2":{"251":1}}],["инжектирует",{"2":{"235":1}}],["инжектировать",{"2":{"437":1}}],["инжектироваться",{"2":{"265":1,"288":1}}],["инжектированы",{"2":{"281":1}}],["инжектированный",{"2":{"251":1,"290":1}}],["инженеру",{"2":{"433":1}}],["инженерные",{"2":{"223":1}}],["инженерной",{"2":{"163":1}}],["инженер",{"2":{"210":1}}],["инженерии",{"2":{"138":1,"139":1,"297":1,"305":1}}],["интрасетей",{"2":{"125":1}}],["интеллектуальные",{"2":{"251":1}}],["интеллекта",{"2":{"162":1}}],["интегрирует",{"2":{"422":1}}],["интегрируется",{"2":{"410":1}}],["интегрирующие",{"2":{"297":1}}],["интегрируются",{"2":{"256":1,"414":1,"541":1}}],["интегрированные",{"2":{"301":1}}],["интегрированной",{"2":{"212":1}}],["интегрировать",{"2":{"215":1,"224":1,"225":1,"418":1}}],["интеграцию",{"2":{"492":1}}],["интеграционное",{"2":{"407":1}}],["интеграционные",{"2":{"71":1,"450":1}}],["интеграция",{"0":{"216":1,"430":1},"1":{"217":1},"2":{"79":1,"212":1,"429":1,"430":1,"433":1,"449":1,"533":1}}],["интеграции",{"2":{"41":1,"134":1,"225":1,"254":1,"261":1,"337":1,"359":1,"407":1,"496":2}}],["интерактивных",{"2":{"228":1,"271":1}}],["интерактивные",{"2":{"228":1}}],["интерактивность",{"2":{"228":2,"416":1}}],["интерактивности",{"0":{"274":1},"2":{"228":2,"272":1,"451":1}}],["интересная",{"2":{"486":1}}],["интересными",{"2":{"485":1}}],["интересный",{"2":{"435":1}}],["интересное",{"2":{"212":1,"449":1}}],["интересного",{"2":{"125":1,"387":1}}],["интересующих",{"2":{"330":1}}],["интерес",{"2":{"215":1}}],["интересам",{"2":{"204":1}}],["интервал",{"2":{"167":1}}],["интервалам",{"2":{"167":1}}],["интервалом",{"2":{"166":1,"180":1}}],["интерполяции",{"2":{"222":1}}],["интерполяцией",{"2":{"140":1,"148":1}}],["интерполируем",{"2":{"332":1}}],["интерполируя",{"2":{"222":1}}],["интерполированное",{"2":{"148":1}}],["интерпретатору",{"2":{"337":1}}],["интерпретатора",{"2":{"67":1}}],["интерпретации",{"2":{"143":1}}],["интерпретируют",{"2":{"202":1}}],["интерпретируются",{"2":{"140":1}}],["интерпретируется",{"2":{"196":1}}],["интерпретировано",{"2":{"146":1}}],["интерпретировать",{"2":{"141":1,"142":1}}],["интернационализационным",{"2":{"448":1,"524":1}}],["интернационализации",{"2":{"448":1,"524":1}}],["интернационализация",{"2":{"78":1,"437":1,"448":1,"532":1}}],["интернету",{"2":{"128":1,"267":1}}],["интернет",{"2":{"108":4,"128":1,"135":1,"138":1,"196":1,"334":1,"460":1}}],["интернета",{"2":{"107":1,"198":1,"228":1,"251":1,"430":1,"460":1}}],["интернете",{"2":{"27":1,"61":1,"86":1,"89":1,"107":1,"109":1,"122":2,"125":3,"136":1,"137":1,"180":1,"206":1,"216":2,"245":1,"267":1,"397":1,"420":1,"430":1,"459":1,"460":1}}],["интерфейсе",{"2":{"419":1}}],["интерфейсной",{"2":{"290":1}}],["интерфейсом",{"2":{"290":1,"295":1,"334":1,"388":1}}],["интерфейсов",{"2":{"68":1,"139":2,"163":2,"167":1,"170":1,"171":1,"214":1,"224":1,"239":1,"256":2,"269":1,"271":1,"334":1,"363":1,"373":1}}],["интерфейс",{"0":{"419":1},"2":{"67":1,"134":1,"142":1,"162":1,"165":1,"167":1,"216":1,"228":1,"237":1,"250":1,"263":3,"264":1,"281":1,"286":1,"300":1,"324":1,"331":1,"333":1,"334":1,"336":1,"350":1,"355":3,"384":1,"388":1,"418":1,"422":1}}],["интерфейсами",{"2":{"163":1}}],["интерфейса",{"0":{"163":1,"168":1,"269":1,"272":1,"373":1},"1":{"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":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},"2":{"67":1,"107":1,"115":1,"142":2,"149":1,"160":1,"162":2,"163":6,"164":2,"167":3,"169":1,"176":2,"180":1,"191":1,"196":1,"220":1,"228":1,"229":1,"256":1,"259":1,"271":1,"283":1,"284":1,"298":1,"299":2,"301":1,"323":2,"331":2,"332":1,"335":1,"344":1,"355":1,"380":1,"392":1,"395":1,"419":1,"450":1}}],["интерфейсы",{"2":{"23":1,"162":1,"165":1,"198":1,"228":1,"269":2}}],["интерьерные",{"2":{"61":1}}],["информирования",{"2":{"179":1}}],["информатике",{"2":{"420":1}}],["информативную",{"2":{"171":1}}],["информативен",{"2":{"163":1}}],["информационной",{"2":{"435":1}}],["информационного",{"2":{"340":1}}],["информационный",{"2":{"123":1,"161":1,"210":1}}],["информацией",{"2":{"142":1,"177":1,"179":1,"214":1,"236":1,"245":2,"327":1,"340":1,"344":1,"435":1}}],["информации",{"2":{"106":1,"119":1,"162":1,"171":1,"174":1,"180":1,"209":2,"245":1,"273":1,"340":2,"341":1,"342":1,"347":1,"355":1,"376":1,"400":1,"429":1,"460":1,"485":2}}],["информация",{"2":{"31":1,"47":1,"103":1,"106":1,"177":1,"237":1,"342":1,"360":1,"395":1,"410":1,"431":1,"485":1,"486":1}}],["информацию",{"2":{"11":1,"118":1,"151":1,"169":1,"170":1,"172":1,"174":1,"176":1,"177":1,"188":1,"214":1,"217":1,"239":1,"242":1,"244":1,"245":3,"273":1,"389":1,"390":1,"395":1,"399":1,"402":1,"418":1,"437":1,"460":1}}],["инфраструктуры",{"2":{"128":1}}],["инфраструктуре",{"2":{"125":1}}],["инсталляторов",{"2":{"422":1}}],["инсталляторах",{"2":{"170":1}}],["инсталируемым",{"2":{"363":1}}],["инстанцированный",{"2":{"324":1}}],["инстанцировании",{"2":{"315":2}}],["инстанцирования",{"2":{"298":1,"312":1,"315":1,"320":1,"387":1}}],["инстанцирование",{"2":{"111":2}}],["инстанцировать",{"2":{"216":1,"384":1,"386":1}}],["инстанцию",{"2":{"112":1}}],["инструкцию",{"2":{"336":1}}],["инструкций",{"2":{"136":1}}],["инструкциями",{"2":{"290":1}}],["инструкциям",{"2":{"216":1,"287":1,"341":1,"422":1}}],["инструкция",{"2":{"135":1}}],["инструкции",{"2":{"135":2,"216":1,"435":1}}],["инструменту",{"2":{"266":1}}],["инструментах",{"2":{"354":1,"405":1,"407":1,"426":1}}],["инструментария",{"2":{"305":1}}],["инструментам",{"2":{"219":1,"384":1}}],["инструментами",{"2":{"134":1,"266":1,"378":1,"409":1}}],["инструмента",{"2":{"213":2,"215":1,"266":1,"416":1,"430":1,"495":1}}],["инструментов",{"2":{"212":2,"224":1,"264":1,"298":1,"323":1,"349":1,"350":1,"354":1,"359":1,"363":1,"365":1,"384":1,"405":2,"407":1,"408":1,"410":1,"413":1,"429":1}}],["инструменты",{"0":{"214":1},"2":{"122":1,"212":1,"213":3,"224":1,"251":1,"262":2,"266":2,"268":1,"269":1,"358":1,"372":1,"375":1,"384":1,"403":1,"408":2,"411":1,"413":1,"414":1,"422":2,"429":1,"431":2,"433":1,"461":1}}],["инструмент",{"2":{"50":1,"140":1,"215":2,"219":1,"265":1,"282":1,"283":1,"350":1,"418":1,"419":1,"458":1}}],["инета",{"2":{"107":1}}],["индустрии",{"2":{"252":1,"431":1}}],["индивидуальных",{"2":{"256":1}}],["индивидуальные",{"2":{"203":1}}],["индивидуально",{"2":{"106":1}}],["индикатором",{"2":{"181":2}}],["индикаторов",{"2":{"181":1}}],["индикаторы",{"2":{"181":1}}],["индикатора",{"2":{"181":1}}],["индексу",{"2":{"416":1}}],["индексный",{"2":{"396":1}}],["индексировать",{"2":{"461":1}}],["индексироваться",{"2":{"256":1,"396":1}}],["индексированные",{"2":{"396":1}}],["индексируемыми",{"2":{"396":1}}],["индексируется",{"2":{"461":1}}],["индексирует",{"2":{"48":1}}],["индексы",{"2":{"148":1}}],["индекс",{"2":{"148":1}}],["индексация",{"2":{"48":1}}],["индексации",{"2":{"17":1,"228":1,"461":2}}],["индекса",{"2":{"17":1}}],["ином",{"2":{"305":1,"448":1}}],["иной",{"2":{"110":1,"118":1,"139":2,"166":1,"226":1,"435":1,"495":1}}],["иное",{"2":{"58":1,"114":1,"258":1,"495":1}}],["иного",{"2":{"22":1,"459":1}}],["иногда",{"2":{"4":1,"162":1,"223":1,"228":1,"325":1,"336":1,"430":1,"436":2,"449":1,"459":1,"461":2}}],["их",{"2":{"2":1,"12":1,"23":1,"26":1,"38":1,"61":1,"68":3,"88":1,"89":1,"107":1,"114":3,"115":1,"125":4,"127":1,"136":1,"139":3,"141":2,"142":2,"143":1,"151":4,"157":1,"158":1,"166":1,"170":1,"171":2,"175":1,"181":1,"189":1,"192":1,"197":1,"198":1,"209":1,"210":1,"211":1,"212":1,"214":1,"215":7,"216":3,"218":4,"219":1,"220":1,"226":2,"228":4,"231":1,"232":1,"233":1,"236":2,"238":2,"242":4,"243":2,"244":2,"245":1,"248":1,"249":1,"250":1,"251":1,"252":1,"254":2,"256":3,"258":1,"264":2,"271":1,"273":1,"274":1,"278":2,"279":3,"280":1,"281":2,"283":2,"284":1,"286":2,"290":1,"294":1,"297":2,"300":1,"301":1,"304":1,"305":1,"310":1,"313":1,"317":1,"322":1,"323":1,"325":1,"327":2,"331":1,"334":1,"335":2,"337":2,"338":2,"340":1,"344":1,"346":1,"347":2,"349":1,"352":1,"354":4,"355":4,"375":1,"382":2,"384":2,"389":1,"392":2,"394":1,"396":1,"397":1,"399":1,"402":1,"403":1,"404":1,"405":1,"407":2,"408":1,"409":1,"410":3,"411":1,"414":1,"416":2,"417":1,"421":1,"422":1,"425":1,"426":1,"428":1,"431":2,"435":1,"437":4,"438":3,"440":4,"445":1,"448":1,"449":6,"450":1,"451":3,"454":1,"455":1,"460":1,"492":1,"496":1,"498":1}}],["и",{"0":{"1":1,"3":1,"16":1,"58":1,"68":1,"71":1,"74":1,"75":1,"97":1,"103":1,"106":1,"111":1,"112":1,"115":1,"117":1,"118":1,"119":1,"125":1,"128":1,"143":1,"147":1,"148":1,"150":1,"153":1,"155":1,"156":1,"165":1,"166":1,"167":1,"175":1,"181":1,"183":1,"185":1,"196":1,"206":1,"214":1,"215":1,"232":1,"237":1,"244":1,"245":1,"272":1,"273":1,"274":1,"275":1,"277":1,"278":1,"279":1,"281":1,"283":1,"284":1,"294":1,"303":1,"345":1,"355":1,"356":1,"361":1,"371":1,"378":1,"405":1,"407":1,"410":1,"420":1,"427":1,"430":1,"438":1,"443":1,"448":1,"454":1,"457":1,"459":1,"461":1,"484":1,"490":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"76":1,"77":1,"78":1,"79":1,"127":1,"129":1,"130":1,"131":1,"132":1,"133":1,"182":1,"184":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1,"233":1,"234":1,"238":1,"239":1,"285":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"306":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,"334":1,"335":1,"336":1,"337":1,"338":1,"339":1,"346":1,"347":1,"357":1,"358":1,"362":1,"363":1,"364":1,"365":1,"366":1,"367":1,"368":1,"406":1,"407":1,"408":1,"409":1,"410":1,"411":2,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1,"419":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},"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,"57":2,"58":4,"60":1,"61":3,"62":3,"63":1,"64":1,"66":4,"67":8,"68":10,"70":2,"73":2,"76":4,"78":1,"79":5,"81":5,"83":1,"86":7,"87":1,"88":3,"89":4,"91":2,"93":2,"94":4,"95":4,"96":6,"97":1,"100":3,"102":3,"103":1,"105":3,"106":23,"107":16,"108":3,"109":4,"110":10,"111":4,"112":3,"113":1,"114":8,"115":7,"116":8,"117":2,"118":6,"121":2,"122":8,"124":1,"125":10,"126":2,"127":2,"128":11,"129":2,"130":1,"131":4,"132":4,"133":2,"134":6,"135":15,"136":8,"137":4,"138":24,"139":29,"140":15,"141":9,"142":15,"143":33,"144":1,"147":3,"148":1,"149":4,"150":4,"151":9,"152":2,"153":1,"154":4,"155":1,"156":1,"157":5,"158":4,"159":1,"160":13,"162":17,"163":5,"164":6,"165":8,"166":9,"167":8,"168":2,"169":4,"170":2,"171":11,"172":7,"173":1,"174":6,"175":10,"176":3,"177":4,"178":3,"179":4,"180":11,"181":8,"182":2,"183":13,"184":7,"185":2,"186":4,"187":2,"188":1,"189":8,"190":2,"191":6,"192":5,"193":1,"194":4,"195":4,"196":13,"197":4,"198":2,"199":1,"200":2,"201":2,"202":3,"203":2,"204":2,"206":1,"207":2,"208":1,"209":1,"210":7,"211":2,"212":7,"213":14,"214":21,"215":22,"216":13,"217":2,"218":17,"219":10,"220":8,"221":3,"222":26,"223":11,"224":5,"225":1,"226":2,"228":33,"229":10,"230":4,"231":5,"233":18,"234":1,"235":4,"236":14,"237":8,"238":2,"239":9,"240":1,"241":1,"242":13,"243":5,"244":19,"245":20,"246":1,"247":3,"248":8,"249":11,"250":16,"251":24,"252":8,"253":3,"254":9,"256":35,"258":5,"259":2,"260":3,"261":4,"262":2,"263":11,"264":11,"265":8,"266":4,"267":7,"268":3,"269":8,"270":1,"271":4,"272":5,"273":10,"274":2,"275":6,"276":2,"277":4,"278":8,"279":5,"280":7,"281":12,"282":1,"283":6,"284":11,"285":2,"286":6,"288":1,"289":23,"290":15,"291":2,"292":5,"293":2,"294":13,"295":5,"296":1,"297":6,"298":2,"299":13,"300":7,"301":14,"302":9,"303":5,"304":6,"305":9,"306":2,"307":1,"308":1,"309":1,"310":6,"311":4,"314":3,"315":4,"317":1,"318":1,"319":1,"320":1,"321":3,"322":3,"323":4,"324":2,"325":8,"326":10,"327":6,"328":1,"329":11,"330":13,"331":13,"332":2,"333":2,"334":10,"335":5,"336":6,"337":23,"338":5,"339":2,"340":9,"341":3,"342":15,"343":2,"344":6,"345":5,"346":1,"347":11,"348":8,"349":10,"350":8,"351":7,"352":5,"354":13,"355":31,"356":5,"357":6,"358":5,"359":4,"360":3,"363":11,"364":5,"365":6,"368":3,"370":1,"371":2,"373":1,"375":1,"376":2,"377":1,"379":1,"380":3,"381":1,"382":6,"384":22,"385":2,"386":2,"387":4,"388":8,"389":6,"390":4,"391":12,"392":7,"393":9,"394":10,"395":6,"396":7,"397":6,"398":4,"399":2,"400":5,"401":1,"402":9,"403":9,"405":15,"407":22,"408":15,"409":9,"410":17,"411":20,"412":1,"413":3,"414":6,"415":2,"416":20,"417":4,"418":5,"419":5,"420":11,"421":10,"422":3,"423":3,"425":3,"426":10,"427":3,"428":11,"429":12,"430":10,"431":6,"432":4,"433":3,"435":18,"436":11,"437":2,"438":6,"439":5,"440":7,"443":8,"444":20,"445":3,"448":19,"449":34,"450":6,"451":24,"452":11,"453":1,"455":5,"456":4,"457":2,"458":2,"459":22,"460":37,"461":31,"470":2,"483":1,"484":3,"485":7,"486":1,"487":1,"489":2,"491":2,"492":5,"494":4,"495":10,"496":14,"497":2,"498":3,"501":1,"506":2,"507":1,"515":2,"524":2,"526":1,"527":1,"530":2,"533":8,"534":6,"536":2,"541":2,"542":1,"543":3,"544":1,"545":2}}]],"serializationVersion":2}';export{t as default}; diff --git a/assets/chunks/@localSearchIndexru.8KmQLKYF.js b/assets/chunks/@localSearchIndexru.8KmQLKYF.js deleted file mode 100644 index 5bf7b4f27..000000000 --- a/assets/chunks/@localSearchIndexru.8KmQLKYF.js +++ /dev/null @@ -1 +0,0 @@ -const t='{"documentCount":546,"nextId":546,"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/tech-stack.html#техническии-стек-проекта","21":"/ru/arty-crafty/analysis/research.html#анализ-рынка","22":"/ru/arty-crafty/analysis/research.html#изучение-конкурентов","23":"/ru/arty-crafty/analysis/research.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#category-table","46":"/ru/arty-crafty/backend/db-data-model.html#product-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/supabase-api.html#supabase-rest-api","52":"/ru/arty-crafty/backend/supabase-api.html#supabase-sdk","53":"/ru/arty-crafty/backend/supabase-api.html#установка","54":"/ru/arty-crafty/backend/supabase-api.html#использование","55":"/ru/arty-crafty/backend/supabase-api.html#supabase-rest-api-1","56":"/ru/arty-crafty/backend/supabase.html#supabase","57":"/ru/arty-crafty/backend/supabase.html#создание-проекта","58":"/ru/arty-crafty/backend/supabase.html#безопасность-и-доступ","59":"/ru/arty-crafty/#онлаин-маркетплеис","60":"/ru/arty-crafty/#проект-arty-crafty","61":"/ru/arty-crafty/#причины","62":"/ru/arty-crafty/#цель","63":"/ru/arty-crafty/#что-здесь-будет","64":"/ru/arty-crafty/#для-чего","65":"/ru/arty-crafty/introduction/development-stages.html#план-работы","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#тестирование-и-qa","72":"/ru/arty-crafty/introduction/development-stages.html#документирование","73":"/ru/arty-crafty/introduction/development-stages.html#поддержка","74":"/ru/arty-crafty/introduction/goals.html#цели-и-задачи-проекта","75":"/ru/arty-crafty/introduction/goals.html#цели-данного-проекта","76":"/ru/arty-crafty/introduction/goals.html#нефункциональные-требования-software-quality-attributes","77":"/ru/arty-crafty/introduction/goals.html#общие-функциональные-требования","78":"/ru/arty-crafty/introduction/goals.html#этапы-развития-приложения-приблизительно","79":"/ru/arty-crafty/introduction/repository.html#репозитории-и-саит-проекта","80":"/ru/arty-crafty/showcase/codeium.html#codeium","81":"/ru/arty-crafty/showcase/codeium.html#автокомплит","82":"/ru/arty-crafty/showcase/codeium.html#чат-бот","83":"/ru/arty-crafty/showcase/codeium.html#explain-refactor-jsdoc","84":"/ru/arty-crafty/showcase/codeium.html#вывод","85":"/ru/arty-crafty/showcase/customization.html#кастомизация","86":"/ru/arty-crafty/showcase/customization.html#персонализация","87":"/ru/arty-crafty/showcase/customization.html#views","88":"/ru/arty-crafty/showcase/customization.html#routes","89":"/ru/arty-crafty/showcase/customization.html#header","90":"/ru/arty-crafty/showcase/customization.html#sidebar","91":"/ru/arty-crafty/showcase/customization.html#небольшои-рефакторинг","92":"/ru/arty-crafty/showcase/product-category.html#категория-товаров","93":"/ru/arty-crafty/showcase/product-category.html#layout","94":"/ru/arty-crafty/showcase/product-category.html#данные-и-api","95":"/ru/arty-crafty/showcase/favourites.html#избранное","96":"/ru/arty-crafty/showcase/favourites.html#иконка-на-карточке-товара","97":"/ru/arty-crafty/showcase/favourites.html#композабл-usefavourites","98":"/ru/arty-crafty/showcase/favourites.html#сохранение-между-сессиями","99":"/ru/arty-crafty/showcase/favourites.html#бэджик","100":"/ru/arty-crafty/showcase/favourites.html#tag-и-cmv","101":"/ru/arty-crafty/showcase/project-setup.html#создание-проекта","102":"/ru/arty-crafty/showcase/project-setup.html#репозитории-на-github","103":"/ru/arty-crafty/showcase/project-setup.html#vue-webapp","104":"/ru/backend/api.html#абстракция-канала-связи-с-бэкендом","105":"/ru/backend/api.html#api-сервис","106":"/ru/backend/auth.html#аутентификация-и-авторизация","107":"/ru/backend/backend.html#варианты-задеиствовать-свои-бэкенд-для-фронтендера","108":"/ru/backend/cors.html#cors","109":"/ru/backend/protocols.html#протоколы-to-rest-или-не-rest","110":"/ru/book/Appendix__Migrating_from_Vue_2.html#приложение-миграция-с-vue-2","111":"/ru/book/Appendix__Migrating_from_Vue_2.html#другои-способ-загрузки-и-запуска-приложения","112":"/ru/book/Appendix__Migrating_from_Vue_2.html#регистрация-глобальных-компонентов-плагинов-и-так-далее","113":"/ru/book/Appendix__Migrating_from_Vue_2.html#своиство-data-теперь-всегда-является-функциеи","114":"/ru/book/Appendix__Migrating_from_Vue_2.html#больше-реактивных-возможностеи","115":"/ru/book/Appendix__Migrating_from_Vue_2.html#изменения-в-v-model-props-и-events","116":"/ru/book/Appendix__Migrating_from_Vue_2.html#удалена-совместимость-со-старыми-браузерами","117":"/ru/book/Appendix__Migrating_from_Vue_2.html#изменения-в-организации-каталогов-и-фаилов","118":"/ru/book/Appendix__Migrating_from_Vue_2.html#изменения-в-роутере-и-state-manager","119":"/ru/book/Appendix__Migrating_from_Vue_2.html#новые-компоненты-и-другие-изменения","120":"/ru/book/Appendix__Migrating_from_Vue_2.html#другие-изменения","121":"/ru/book/Appendix__Migrating_from_Vue_2.html#итог","122":"/ru/book/Chapter_10__Deploying_Your_Application.html#развертывание-приложения","123":"/ru/book/Chapter_10__Deploying_Your_Application.html#технические-требования","124":"/ru/book/Chapter_10__Deploying_Your_Application.html#что-включает-в-себя-публикация-веб-приложения","125":"/ru/book/Chapter_10__Deploying_Your_Application.html#домены-серверы-доменных-имен-dns-и-записи-dns","126":"/ru/book/Chapter_10__Deploying_Your_Application.html#размышления-о-создании-приложения-для-развертывания","127":"/ru/book/Chapter_10__Deploying_Your_Application.html#chapter-5-to-do-spa-src-router-index-js","128":"/ru/book/Chapter_10__Deploying_Your_Application.html#опции-и-конфигурации-веб-сервера","129":"/ru/book/Chapter_10__Deploying_Your_Application.html#конфигурация-http-сервера-apache","130":"/ru/book/Chapter_10__Deploying_Your_Application.html#htaccess","131":"/ru/book/Chapter_10__Deploying_Your_Application.html#настроика-сервера-nginx","132":"/ru/book/Chapter_10__Deploying_Your_Application.html#etc-nginx-sites-available-default","133":"/ru/book/Chapter_10__Deploying_Your_Application.html#другие-серверы","134":"/ru/book/Chapter_10__Deploying_Your_Application.html#перенос-фаилов-на-сервер","135":"/ru/book/Chapter_10__Deploying_Your_Application.html#защита-веб-приложения-с-помощью-let-s-encrypt","136":"/ru/book/Chapter_10__Deploying_Your_Application.html#подведение-итогов","137":"/ru/book/Chapter_10__Deploying_Your_Application.html#вопросы-для-проверки","138":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#бонусная-глава-шаблоны-ux","139":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#технические-требования","140":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#ui-дизаин-против-ux-дизаина","141":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#принципы-проектирования-пользовательского-интерфеиса","142":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#достаточныи-контраст-или-различие-между-элементами","143":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#стимулировать-повторение-и-быть-последовательным","144":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#внимательно-следите-за-выравниванием-и-направлением","145":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#используите-близость-и-расстояние-чтобы-показать-естественные-группы","146":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#законы-проектирования-пользовательского-интерфеиса","147":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#закон-фитта","148":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#закон-хика","149":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#восемь-правил-бена-шнаидермана","150":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#принципы-проектирования-ux","151":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#общие-шаблоны-для-работы-с-данными","152":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#элементы-ввода-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#подсказки-tooltips","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#панели-прогресса-progress-bars-и-спиннеры","160":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#components-spinner-vue","161":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#пагинация-пеиджер-и-бесконечныи-скроллер","162":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#src-components-infinitescroller-vue","163":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#общие-шаблоны-для-взаимодеиствия-и-навигации","164":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#размещение-меню","165":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#хлебные-крошки-breadcrumbs","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#аккордеонные-меню","169":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#мегаменю","170":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#выпадающие-меню","171":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#общие-шаблоны-для-организации-контента","172":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#отзывчивые-responsive-приложения","173":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#домашняя-ссылка","174":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#главная-hero-секция-призыв-к-деиствию-call-to-action-и-иконки-социальных-сетеи","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#приманка-для-тараканов-roach-motels","180":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#privacy-zuckering","181":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#предотвращение-сравнения-цен","182":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#ненаправленность","183":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#скрытые-расходы","184":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#приманка-и-подмена","185":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#подтверждение-позора-confirm-shaming","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#подведение-итогов","189":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#вопросы-для-проверки","190":"/ru/book/Chapter_1__The_Vue_3_Framework.html#фреимворк-vue-3","191":"/ru/book/Chapter_1__The_Vue_3_Framework.html#прогрессивныи-фреимворк","192":"/ru/book/Chapter_1__The_Vue_3_Framework.html#использование-vue-в-веб-приложении","193":"/ru/book/Chapter_1__The_Vue_3_Framework.html#путь-сборщика-лучшии-путь","194":"/ru/book/Chapter_1__The_Vue_3_Framework.html#понимание-однофаиловых-компонентов","195":"/ru/book/Chapter_1__The_Vue_3_Framework.html#разные-варианты-options-composition-и-script-setup-api","196":"/ru/book/Chapter_1__The_Vue_3_Framework.html#изучение-встроенных-директив-в-vue-3","197":"/ru/book/Chapter_1__The_Vue_3_Framework.html#v-bind-сокращение","198":"/ru/book/Chapter_1__The_Vue_3_Framework.html#v-show","199":"/ru/book/Chapter_1__The_Vue_3_Framework.html#v-if-v-else-и-v-else-if","200":"/ru/book/Chapter_1__The_Vue_3_Framework.html#v-for-и-key","201":"/ru/book/Chapter_1__The_Vue_3_Framework.html#v-model","202":"/ru/book/Chapter_1__The_Vue_3_Framework.html#v-on-и-сокращение","203":"/ru/book/Chapter_1__The_Vue_3_Framework.html#встроенные-компоненты","204":"/ru/book/Chapter_1__The_Vue_3_Framework.html#кодовые-соглашения-code-conventions-в-книге","205":"/ru/book/Chapter_1__The_Vue_3_Framework.html#переменные-и-пропсы","206":"/ru/book/Chapter_1__The_Vue_3_Framework.html#константы","207":"/ru/book/Chapter_1__The_Vue_3_Framework.html#имена-классов-и-компонентов","208":"/ru/book/Chapter_1__The_Vue_3_Framework.html#функции-методы-события-и-имена-фаилов","209":"/ru/book/Chapter_1__The_Vue_3_Framework.html#экземпляры","210":"/ru/book/Chapter_1__The_Vue_3_Framework.html#подведение-итогов","211":"/ru/book/Chapter_1__The_Vue_3_Framework.html#вопросы-для-проверки","212":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#установка-рабочего-проекта","213":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#технические-требования","214":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#настроика-проекта-и-инструменты","215":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#структура-папок-и-ее-модификации","216":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#интеграция-с-css-фреимворками","217":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#фреимворк-w3-css","218":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#fontawesome-это-просто-замечательно","219":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#опции-конфигурации-vite","220":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#приложение-to-do","221":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#app-vue","222":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#todos-vue","223":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#краткая-критика-нашего-приложения-to-do","224":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#подведение-итогов","225":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#вопросы-для-проверки","226":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#композиция-пользовательского-интерфеиса-с-помощью-компонентов","227":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#технические-требования","228":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#составление-страницы-с-помощью-компонентов","229":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#этап-1-определение-макетов-и-элементов-пользовательского-интерфеиса","230":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#шаг-2-определение-связеи-потока-данных-взаимодеиствии-и-событии","231":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#шаг-3-определение-элементов-пользовательскои-интерактивности-входов-диалогов-уведомлении-и-т-д","232":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#шаг-4-выявление-шаблонов-проектирования-и-компромиссов","233":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#компоненты-в-деталях","234":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#локальные-и-глобальные-компоненты","235":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#статическии-асинхронныи-и-динамическии-импорт","236":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#пропсы-события-и-директива-v-model","237":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#настраиваемые-контроллеры-ввода","238":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#инъекция-зависимости-с-помощью-provide-и-inject","239":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#специальные-компоненты","240":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#слоты-слоты-и-еще-раз-слоты","241":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#композабл-функции-composables-и-миксины","242":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#динамические-компоненты-с-помощью-component-is","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#конструкция","246":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#реализация","247":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#реализация-нашего-нового-приложения-to-do","248":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#небольшая-критика-нашего-нового-приложения-to-do","249":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#подведение-итогов","250":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#вопросы-для-проверки","251":"/ru/book/Chapter_6__Progressive_Web_Applications.html#прогрессивные-веб-приложения","252":"/ru/book/Chapter_6__Progressive_Web_Applications.html#технические-требования","253":"/ru/book/Chapter_6__Progressive_Web_Applications.html#pwa-или-устанавливаемые-spa","254":"/ru/book/Chapter_6__Progressive_Web_Applications.html#увеличение-spa-до-уровня-pwa","255":"/ru/book/Chapter_6__Progressive_Web_Applications.html#фаил-манифеста","256":"/ru/book/Chapter_6__Progressive_Web_Applications.html#необходимо","257":"/ru/book/Chapter_6__Progressive_Web_Applications.html#рекомендуется","258":"/ru/book/Chapter_6__Progressive_Web_Applications.html#описательные","259":"/ru/book/Chapter_6__Progressive_Web_Applications.html#тестирование-манифеста","260":"/ru/book/Chapter_6__Progressive_Web_Applications.html#подсказка-к-установке-install-prompt","261":"/ru/book/Chapter_6__Progressive_Web_Applications.html#service-workers","262":"/ru/book/Chapter_6__Progressive_Web_Applications.html#плагин-vite-pwa","263":"/ru/book/Chapter_6__Progressive_Web_Applications.html#тестирование-показателеи-pwa-с-помощью-google-lighthouse","264":"/ru/book/Chapter_6__Progressive_Web_Applications.html#подведение-итогов","265":"/ru/book/Chapter_6__Progressive_Web_Applications.html#вопросы-для-проверки","266":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#принципы-и-шаблоны-проектирования-программного-обеспечения","267":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#каковы-принципы-проектирования-программного-обеспечения","268":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#неполныи-список-принципов-проектирования","269":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#separation-of-concerns-разделение-ответственности","270":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#composition-over-inheritance-композиция-над-наследованием","271":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#single-responsibility-principle-принцип-единои-ответственности","272":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#encapsulation-инкапсуляция","273":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#kic-keep-it-clean","274":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#dry-–-don-t-repeat-yourself-не-повторяися","275":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#kiss-keep-it-simple-and-short-держи-это-простым-и-коротким","276":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#code-for-the-next-пиши-код-для-следующего","277":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#что-такое-шаблон-проектирования-программного-обеспечения","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#поведенческие-шаблоны","281":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#структурные-шаблоны","282":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#асинхронные-шаблоны","283":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-singleton","284":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#когда-его-использовать","285":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#реализация","286":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#метод-1","287":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#метод-2","288":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-dependency-injection-инъекция-зависимостеи","289":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-dependency-injection-1-js","290":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-dependency-injection-2-js","291":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-dependency-injection-3-js","292":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-dependency-injection-4-js","293":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-dependency-injection-5-js","294":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-dependency-injection-6-js","295":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-dependency-injection-7-js","296":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-factory-фабрика","297":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-observer-наблюдатель","298":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-observer-1-js","299":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-command-команда","300":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-command-1-js","301":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-proxy","302":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-proxy-1-js","303":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-decorator-декоратор","304":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-decorator-1-vue","305":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-decorator-2-vue","306":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-facade-фасад","307":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-callback-обратныи-вызов","308":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-callback-1-js-синхронныи-фибоначчи","309":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-promise-обещаниe","310":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#подведение-итогов","311":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#вопросы-для-проверки","312":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#многопоточность-с-web-workers","313":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#технические-требования","314":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#введение-в-web-workers","315":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#реализация-web-worker","316":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#my-worker-js","317":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#main-js","318":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#шаблон-business-delegate","319":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#шаблон-dispatcher","320":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#установка-конвеиера-взаимодеиствия-с-веб-рабочим","321":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#services-webworker-js","322":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#webworker-index-js","323":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#webworker-services-test-js","324":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#получение-доступа-к-indexeddb-с-помощью-dexiejs-в-web-worker","325":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#src-components-dbnotes-vue","326":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#src-webworker-services-dbservice-js","327":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#src-webworker-index-js","328":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#webworker-services-network-js","329":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#webworker-index-js-1","330":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#src-components-networkcommunication-vue","331":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#простои-nodejs-сервер-для-тестирования","332":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#server-index-js","333":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#подведение-итогов","334":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#вопросы-для-проверки","335":"/ru/book/Chapter_7__Data_Flow_Management.html#управление-потоками-данных","336":"/ru/book/Chapter_7__Data_Flow_Management.html#технические-требования","337":"/ru/book/Chapter_7__Data_Flow_Management.html#основное-взаимодеиствие-компонентов","338":"/ru/book/Chapter_7__Data_Flow_Management.html#basic-parentbasic-vue","339":"/ru/book/Chapter_7__Data_Flow_Management.html#basic-child-vue","340":"/ru/book/Chapter_7__Data_Flow_Management.html#реализация-шины-событии-с-помощью-шаблонов-singleton-и-observer","341":"/ru/book/Chapter_7__Data_Flow_Management.html#services-messagebus-js","342":"/ru/book/Chapter_7__Data_Flow_Management.html#bus-child-vue","343":"/ru/book/Chapter_7__Data_Flow_Management.html#реализация-базового-реактивного-состояния","344":"/ru/book/Chapter_7__Data_Flow_Management.html#service-simplestate-js","345":"/ru/book/Chapter_7__Data_Flow_Management.html#реализация-мощного-реактивного-стора-с-помощью-pinia","346":"/ru/book/Chapter_7__Data_Flow_Management.html#options-api-basic-store","347":"/ru/book/Chapter_7__Data_Flow_Management.html#stores-counter-js","348":"/ru/book/Chapter_7__Data_Flow_Management.html#main-js","349":"/ru/book/Chapter_7__Data_Flow_Management.html#pinia-childpinia-vue","350":"/ru/book/Chapter_7__Data_Flow_Management.html#хранилища-данных-браузера-сессионные-локальные-и-indexeddb","351":"/ru/book/Chapter_7__Data_Flow_Management.html#экспериментируем-с-шаблонами-reactivity-и-proxies","352":"/ru/book/Chapter_7__Data_Flow_Management.html#services-sessionstorage-js","353":"/ru/book/Chapter_7__Data_Flow_Management.html#session-storage-childsession-vue","354":"/ru/book/Chapter_7__Data_Flow_Management.html#подведение-итогов","355":"/ru/book/Chapter_7__Data_Flow_Management.html#вопросы-для-проверки","356":"/ru/book/#vue-js-3-шаблоны-проектирования-и-лучшие-практики","357":"/ru/book/#здесь-представлен-перевод-книги-vue-js-3-design-patterns-and-best-practices-на-русскии-язык","358":"/ru/book/#предисловие","359":"/ru/book/#для-кого-эта-книга","360":"/ru/book/#чтобы-получить-максимальную-пользу-от-этои-книги","361":"/ru/book/#купить-книгу","362":"/ru/book/#скачать-фаилы-кода-примеров","363":"/ru/book/#код-в-деиствии","364":"/ru/book/Chapter_5__Single-Page_Applications.html#одностраничные-приложения","365":"/ru/book/Chapter_5__Single-Page_Applications.html#технические-требования","366":"/ru/book/Chapter_5__Single-Page_Applications.html#что-такое-spa","367":"/ru/book/Chapter_5__Single-Page_Applications.html#vue-3-роутер","368":"/ru/book/Chapter_5__Single-Page_Applications.html#установка","369":"/ru/book/Chapter_5__Single-Page_Applications.html#новое-приложение-to-do","370":"/ru/book/Chapter_5__Single-Page_Applications.html#определение-маршрутов-и-объект-router","371":"/ru/book/Chapter_5__Single-Page_Applications.html#src-router-index-js","372":"/ru/book/Chapter_5__Single-Page_Applications.html#src-main-js","373":"/ru/book/Chapter_5__Single-Page_Applications.html#шаблонные-компоненты-маршрутизатора","374":"/ru/book/Chapter_5__Single-Page_Applications.html#app-vue","375":"/ru/book/Chapter_5__Single-Page_Applications.html#вложенные-маршруты-именованные-представления-и-программная-навигация","376":"/ru/book/Chapter_5__Single-Page_Applications.html#определение-вложенных-маршрутов","377":"/ru/book/Chapter_5__Single-Page_Applications.html#src-views-directory-vue-component-lines-13-18","378":"/ru/book/Chapter_5__Single-Page_Applications.html#push","379":"/ru/book/Chapter_5__Single-Page_Applications.html#replace","380":"/ru/book/Chapter_5__Single-Page_Applications.html#go","381":"/ru/book/Chapter_5__Single-Page_Applications.html#исследование-шаблонов-аутентификации","382":"/ru/book/Chapter_5__Single-Page_Applications.html#простая-аутентификация-по-имени-пользователя-и-паролю","383":"/ru/book/Chapter_5__Single-Page_Applications.html#openid-и-сторонняя-аутентификация","384":"/ru/book/Chapter_5__Single-Page_Applications.html#_1","385":"/ru/book/Chapter_5__Single-Page_Applications.html#_2","386":"/ru/book/Chapter_5__Single-Page_Applications.html#_3","387":"/ru/book/Chapter_5__Single-Page_Applications.html#беспарольная-аутентификация-или-аутентификация-по-одноразовому-паролю-otp","388":"/ru/book/Chapter_5__Single-Page_Applications.html#_2fa-двухфакторная-аутентификация","389":"/ru/book/Chapter_5__Single-Page_Applications.html#web3-аутентификация","390":"/ru/book/Chapter_5__Single-Page_Applications.html#подведение-итогов","391":"/ru/book/Chapter_5__Single-Page_Applications.html#вопросы-для-проверки","392":"/ru/book/summary.html#что-включает-в-себя-эта-книга","393":"/ru/book/summary.html#глава-1-фреимворк-vue-3","394":"/ru/book/summary.html#глава-2-принципы-и-шаблоны-проектирования-программного-обеспечения","395":"/ru/book/summary.html#глава-3-создание-рабочего-проекта","396":"/ru/book/summary.html#глава-4-композиция-пользовательского-интерфеиса-с-помощью-компонентов","397":"/ru/book/summary.html#глава-5-одностраничные-приложения","398":"/ru/book/summary.html#глава-6-прогрессивные-веб-приложения","399":"/ru/book/summary.html#глава-7-управление-потоками-данных","400":"/ru/book/summary.html#глава-8-многопоточность-с-помощью-web-workers","401":"/ru/book/summary.html#глава-9-тестирование-и-контроль-исходных-текстов","402":"/ru/book/summary.html#глава-10-развертывание-приложения","403":"/ru/book/summary.html#глава-11-ux-patterns","404":"/ru/book/summary.html#приложение-миграция-с-vue-2-на-vue-3","405":"/ru/deployment/ci-cd.html#ci-cd","406":"/ru/deployment/docker.html#docker","407":"/ru/deployment/hosting.html#хостинг","408":"/ru/deployment/github-actions.html#github-actions","409":"/ru/development/architectural-patterns.html#архитектурные-решения","410":"/ru/development/architectural-patterns.html#use-cases","411":"/ru/development/architectural-patterns.html#лучшие-практики-и-соображения","412":"/ru/development/assets.html#ресурсы-приложения","413":"/ru/development/assets.html#baseicon","414":"/ru/development/assets.html#icons-js","415":"/ru/book/Chapter_9__Testing_and_Source_Control.html#тестирование-и-системы-контроля-версии","416":"/ru/book/Chapter_9__Testing_and_Source_Control.html#технические-требования","417":"/ru/book/Chapter_9__Testing_and_Source_Control.html#что-такое-тестирование-и-tdd","418":"/ru/book/Chapter_9__Testing_and_Source_Control.html#что-тестировать","419":"/ru/book/Chapter_9__Testing_and_Source_Control.html#наш-базовыи-пример-приложения","420":"/ru/book/Chapter_9__Testing_and_Source_Control.html#установка-и-использование-vitest","421":"/ru/book/Chapter_9__Testing_and_Source_Control.html#src-tests-fibonacci-test-js","422":"/ru/book/Chapter_9__Testing_and_Source_Control.html#специальныи-случаи-утверждения-намеренная-ошибка","423":"/ru/book/Chapter_9__Testing_and_Source_Control.html#специальныи-случаи-утверждения-асинхронныи-код","424":"/ru/book/Chapter_9__Testing_and_Source_Control.html#установка-vue-test-utils","425":"/ru/book/Chapter_9__Testing_and_Source_Control.html#src-tests-fibonaccioutput-test-js","426":"/ru/book/Chapter_9__Testing_and_Source_Control.html#src-tests-fibonacciinput-test-js","427":"/ru/book/Chapter_9__Testing_and_Source_Control.html#in-source-тестирование","428":"/ru/book/Chapter_9__Testing_and_Source_Control.html#покрытие","429":"/ru/book/Chapter_9__Testing_and_Source_Control.html#интерфеис-vitest","430":"/ru/book/Chapter_9__Testing_and_Source_Control.html#что-такое-source-control-и-зачем-он-нужен","431":"/ru/book/Chapter_9__Testing_and_Source_Control.html#управление-исходными-текстами-с-помощью-git","432":"/ru/book/Chapter_9__Testing_and_Source_Control.html#установка-в-системах-windows","433":"/ru/book/Chapter_9__Testing_and_Source_Control.html#установка-в-системах-linux","434":"/ru/book/Chapter_9__Testing_and_Source_Control.html#установка-в-системах-macos","435":"/ru/book/Chapter_9__Testing_and_Source_Control.html#использование-git","436":"/ru/book/Chapter_9__Testing_and_Source_Control.html#chapter-10-gitignore","437":"/ru/book/Chapter_9__Testing_and_Source_Control.html#управление-ветвями-и-слияниями","438":"/ru/book/Chapter_9__Testing_and_Source_Control.html#конфликты-при-слиянии","439":"/ru/book/Chapter_9__Testing_and_Source_Control.html#работа-с-удаленными-репозиториями","440":"/ru/book/Chapter_9__Testing_and_Source_Control.html#непрерывная-интеграция-и-доставка","441":"/ru/book/Chapter_9__Testing_and_Source_Control.html#подведение-итогов","442":"/ru/book/Chapter_9__Testing_and_Source_Control.html#вопросы-для-проверки","443":"/ru/development/building.html#создание-и-сборка-приложения","444":"/ru/development/ide.html#настроика-ide","445":"/ru/development/libraries.html#подскажите-удобную-библиотеку","446":"/ru/development/misc.html#полезные-советы","447":"/ru/development/misc.html#карусель-или-слаидер","448":"/ru/development/misc.html#дата-и-время","449":"/ru/development/stores.html#state-management-во-vue-3","450":"/ru/development/testing.html#тестирование","451":"/ru/frontend/about-frameworks.html#о-фронтенд-фреимворках","452":"/ru/frontend/architecture.html#архитектура-фронтэнд-приложении","453":"/ru/frontend/architecture.html#избегаите-зависимостеи","454":"/ru/frontend/architecture.html#используите-обертки-над-компонентами-ui-библиотек-и-сторонних-утилит","455":"/ru/frontend/architecture.html#регулярныи-рефакторинг","456":"/ru/frontend/architecture.html#используите-css3","457":"/ru/frontend/architecture.html#используите-современные-стандарты-и-возможности-языков","458":"/ru/frontend/architecture.html#документируите-проект","459":"/ru/frontend/css-ui-libs.html#css-и-ui-библиотеки","460":"/ru/frontend/learning.html#изучение-vue","461":"/ru/frontend/spa-pwa-ssr-ssg.html#spa-pwa-ssg-ssr-и-seo","462":"/ru/misc/CHANGELOG.html#история-изменении","463":"/ru/misc/CHANGELOG.html#v1-4-24-11-2023","464":"/ru/misc/CHANGELOG.html#новое","465":"/ru/misc/CHANGELOG.html#изменено","466":"/ru/misc/CHANGELOG.html#v1-3-10-10-2023","467":"/ru/misc/CHANGELOG.html#изменено-1","468":"/ru/misc/CHANGELOG.html#v1-2-27-09-2023","469":"/ru/misc/CHANGELOG.html#новое-1","470":"/ru/misc/CHANGELOG.html#изменено-2","471":"/ru/misc/CHANGELOG.html#v1-1-15-09-2023","472":"/ru/misc/CHANGELOG.html#новое-2","473":"/ru/misc/CHANGELOG.html#изменено-3","474":"/ru/misc/CHANGELOG.html#v1-0-11-09-2023","475":"/ru/misc/CHANGELOG.html#новое-3","476":"/ru/misc/cheat-sheets.html#шпаргалки-cheat-sheet","477":"/ru/misc/cheat-sheets.html#vue","478":"/ru/misc/cheat-sheets.html#javascript","479":"/ru/misc/cheat-sheets.html#html","480":"/ru/misc/cheat-sheets.html#css","481":"/ru/misc/cheat-sheets.html#typescript","482":"/ru/misc/cheat-sheets.html#markdown","483":"/ru/misc/contribute.html#внесите-лепту-в-развитие-данного-ресурса","484":"/ru/misc/glossary.html#глоссарии-и-сокращения","485":"/ru/misc/introduction.html#предисловие","486":"/ru/misc/introduction.html#у-нас-есть-телеграм-канал","487":"/ru/vue-webapp/contribution.html#участие-в-проекте","488":"/ru/vue-webapp/getting-started.html#установка","489":"/ru/vue-webapp/getting-started.html#установка-через-create-vue-webapp","490":"/ru/vue-webapp/getting-started.html#инициализация-и-запуск-веб-приложения","491":"/ru/vue-webapp/getting-started.html#установка-из-репозитория","492":"/ru/vue-webapp/guidelines.html#принципы","493":"/ru/vue-webapp/#vue-3-webapp-билдер","494":"/ru/vue-webapp/#краткое-описание","495":"/ru/vue-webapp/#обоснование","496":"/ru/vue-webapp/objectives.html#цели","497":"/ru/vue-webapp/options/adaptability.html#адаптивность","498":"/ru/vue-webapp/options/api.html#api-модуль","499":"/ru/vue-webapp/options/api.html#api-rest","500":"/ru/vue-webapp/options/api.html#json-rpc","501":"/ru/vue-webapp/options/baseIcon.html#baseicon","502":"/ru/vue-webapp/options/description.html#детали-реализации","503":"/ru/vue-webapp/options/description.html#инъекции-кода-в-index-html","504":"/ru/vue-webapp/options/description.html#css-tricks","505":"/ru/vue-webapp/options/drawer.html#navigation-drawers","506":"/ru/vue-webapp/options/drawer.html#simpledrawer","507":"/ru/vue-webapp/options/drawer.html#touchslideoutdrawer","508":"/ru/vue-webapp/options/footer.html#footers","509":"/ru/vue-webapp/options/footer.html#simplefooter","510":"/ru/vue-webapp/options/footer.html#richfooter","511":"/ru/vue-webapp/options/footer.html#mantinesimplefooter","512":"/ru/vue-webapp/options/footer.html#mantinerichfooter","513":"/ru/vue-webapp/options/footer.html#distributedfooter","514":"/ru/vue-webapp/options/ga-gp.html#github-actions-сценарии-для-развертывания-на-github-pages","515":"/ru/vue-webapp/options/ga-gp.html#deployment","516":"/ru/vue-webapp/options/ga-gp.html#настроика-base-в-vite-конфиге","517":"/ru/vue-webapp/options/google-analytics.html#google-analytics","518":"/ru/vue-webapp/options/header.html#headers","519":"/ru/vue-webapp/options/header.html#simpleheader","520":"/ru/vue-webapp/options/header.html#mantinesimpleheader","521":"/ru/vue-webapp/options/header.html#mantinelayeredheader","522":"/ru/vue-webapp/options/header.html#slidingheader","523":"/ru/vue-webapp/options/i18n.html#i18n","524":"/ru/vue-webapp/options/i18n.html#i18next","525":"/ru/vue-webapp/options/i18n.html#usei18nlight","526":"/ru/vue-webapp/options/i18n.html#использование","527":"/ru/vue-webapp/options/i18n.html#i18next-расширения","528":"/ru/vue-webapp/options/i18n.html#в-итоге","529":"/ru/vue-webapp/options/#опции-при-создании-приложения","530":"/ru/vue-webapp/options/#доступные-опции","531":"/ru/vue-webapp/options/#доступно-по-умолчанию","532":"/ru/vue-webapp/options/#в-разработке","533":"/ru/vue-webapp/options/#в-планах","534":"/ru/vue-webapp/options/layout-main.html#mainlayout","535":"/ru/vue-webapp/options/layout-main.html#routing","536":"/ru/vue-webapp/options/layout-one-column.html#onecolumnlayout","537":"/ru/vue-webapp/options/navbar.html#navbar","538":"/ru/vue-webapp/options/navbar.html#simplenavbar","539":"/ru/vue-webapp/options/navbar.html#mantinesimplenavbar","540":"/ru/vue-webapp/options/open-graph.html#google-analytics","541":"/ru/vue-webapp/options/pwa.html#pwa","542":"/ru/vue-webapp/options/pwa.html#manifest-json","543":"/ru/vue-webapp/options/pwa.html#service-worker","544":"/ru/vue-webapp/options/splash-screen.html#splash-screen","545":"/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":[3,1,119],"21":[2,1,1],"22":[2,2,13],"23":[2,2,136],"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,73],"49":[1,1,1],"50":[3,1,58],"51":[3,1,1],"52":[2,3,16],"53":[2,5,6],"54":[2,5,36],"55":[3,3,58],"56":[1,1,1],"57":[2,1,32],"58":[3,1,116],"59":[2,1,1],"60":[3,2,32],"61":[1,2,81],"62":[1,2,47],"63":[4,2,44],"64":[3,2,53],"65":[2,1,1],"66":[3,2,46],"67":[2,2,116],"68":[3,2,130],"69":[1,2,9],"70":[1,2,18],"71":[3,2,10],"72":[1,2,10],"73":[1,2,23],"74":[4,1,1],"75":[4,4,68],"76":[6,4,14],"77":[3,4,15],"78":[5,4,86],"79":[4,1,13],"80":[1,1,1],"81":[1,1,89],"82":[2,1,10],"83":[3,1,95],"84":[1,1,13],"85":[1,1,1],"86":[1,1,94],"87":[1,1,38],"88":[1,1,73],"89":[1,1,66],"90":[1,1,16],"91":[2,1,18],"92":[2,1,1],"93":[1,2,58],"94":[3,2,62],"95":[1,1,1],"96":[4,1,96],"97":[2,1,106],"98":[3,1,75],"99":[1,1,126],"100":[3,1,12],"101":[2,1,1],"102":[3,2,16],"103":[2,2,174],"104":[5,1,1],"105":[2,5,122],"106":[3,1,399],"107":[6,1,258],"108":[1,1,228],"109":[6,1,153],"110":[5,1,148],"111":[6,5,82],"112":[7,5,81],"113":[6,5,97],"114":[3,5,187],"115":[7,5,121],"116":[5,5,175],"117":[6,5,58],"118":[6,5,86],"119":[6,5,50],"120":[2,5,21],"121":[1,5,73],"122":[2,1,85],"123":[2,2,23],"124":[8,2,73],"125":[7,9,463],"126":[6,2,151],"127":[10,15,143],"128":[5,2,276],"129":[4,7,51],"130":[2,11,69],"131":[3,7,92],"132":[6,10,98],"133":[2,7,44],"134":[4,2,167],"135":[8,2,253],"136":[2,2,112],"137":[3,2,55],"138":[4,1,168],"139":[2,4,59],"140":[5,4,223],"141":[4,4,172],"142":[6,8,150],"143":[6,8,180],"144":[6,8,116],"145":[8,8,145],"146":[4,8,35],"147":[2,8,139],"148":[2,8,120],"149":[4,8,211],"150":[3,8,118],"151":[6,4,45],"152":[3,10,101],"153":[4,13,145],"154":[4,13,122],"155":[3,13,141],"156":[6,13,96],"157":[2,13,117],"158":[4,13,159],"159":[6,13,211],"160":[4,19,79],"161":[5,13,243],"162":[5,18,240],"163":[6,4,29],"164":[2,13,118],"165":[4,13,103],"166":[2,13,81],"167":[2,13,152],"168":[2,13,76],"169":[1,13,194],"170":[2,13,77],"171":[5,4,12],"172":[3,9,236],"173":[2,9,136],"174":[13,9,205],"175":[2,9,56],"176":[2,4,78],"177":[3,6,88],"178":[3,6,106],"179":[6,6,74],"180":[2,6,82],"181":[3,6,50],"182":[1,6,57],"183":[2,6,39],"184":[3,6,53],"185":[5,6,82],"186":[2,6,108],"187":[2,6,72],"188":[2,4,97],"189":[3,4,42],"190":[3,1,278],"191":[2,3,474],"192":[5,3,269],"193":[5,7,231],"194":[3,3,292],"195":[8,3,542],"196":[6,3,48],"197":[5,7,58],"198":[2,7,67],"199":[4,7,97],"200":[4,7,95],"201":[2,7,91],"202":[5,7,134],"203":[2,3,267],"204":[6,3,46],"205":[3,9,18],"206":[1,9,44],"207":[4,9,17],"208":[6,9,9],"209":[1,9,119],"210":[2,3,49],"211":[3,3,68],"212":[3,1,164],"213":[2,3,292],"214":[4,3,363],"215":[5,3,470],"216":[4,3,278],"217":[3,7,153],"218":[4,3,323],"219":[3,3,255],"220":[3,3,165],"221":[2,9,187],"222":[2,9,583],"223":[6,9,207],"224":[2,3,75],"225":[3,3,59],"226":[6,1,160],"227":[2,6,30],"228":[5,6,114],"229":[8,8,172],"230":[9,8,233],"231":[13,8,131],"232":[7,8,168],"233":[3,6,31],"234":[4,9,159],"235":[5,9,305],"236":[6,9,170],"237":[3,9,239],"238":[7,9,274],"239":[2,6,48],"240":[6,8,367],"241":[5,6,283],"242":[8,11,203],"243":[4,6,99],"244":[3,10,36],"245":[1,10,80],"246":[1,10,456],"247":[6,6,422],"248":[7,6,88],"249":[2,6,95],"250":[3,6,61],"251":[3,1,167],"252":[2,3,52],"253":[4,3,459],"254":[5,3,39],"255":[2,8,172],"256":[2,10,112],"257":[2,10,56],"258":[2,10,140],"259":[2,8,69],"260":[6,8,391],"261":[2,3,360],"262":[3,3,230],"263":[7,3,138],"264":[2,3,79],"265":[3,3,55],"266":[6,1,198],"267":[6,6,64],"268":[4,6,25],"269":[6,9,195],"270":[7,9,123],"271":[7,9,210],"272":[3,9,104],"273":[4,9,274],"274":[8,9,182],"275":[12,9,128],"276":[9,9,167],"277":[7,6,185],"278":[4,6,39],"279":[2,19,16],"280":[2,19,14],"281":[2,19,18],"282":[2,19,70],"283":[2,10,50],"284":[3,12,52],"285":[1,12,37],"286":[2,13,78],"287":[2,13,151],"288":[6,10,78],"289":[7,16,39],"290":[6,16,93],"291":[7,16,38],"292":[7,16,101],"293":[7,16,193],"294":[7,16,115],"295":[7,16,137],"296":[4,10,83],"297":[4,10,175],"298":[6,14,231],"299":[4,10,129],"300":[6,14,133],"301":[2,10,267],"302":[6,12,257],"303":[4,10,303],"304":[6,14,112],"305":[5,14,90],"306":[4,10,274],"307":[5,10,210],"308":[8,15,238],"309":[4,10,419],"310":[2,6,92],"311":[3,6,42],"312":[4,1,149],"313":[2,4,57],"314":[4,4,516],"315":[3,7,162],"316":[4,11,133],"317":[3,11,121],"318":[3,4,216],"319":[2,4,113],"320":[6,4,142],"321":[4,13,234],"322":[4,13,174],"323":[5,13,153],"324":[11,4,197],"325":[5,15,251],"326":[6,15,216],"327":[5,15,241],"328":[5,15,178],"329":[4,15,69],"330":[5,15,158],"331":[5,4,75],"332":[4,13,280],"333":[2,4,115],"334":[3,4,50],"335":[3,1,150],"336":[2,3,79],"337":[3,3,235],"338":[4,7,94],"339":[4,7,188],"340":[9,3,153],"341":[4,13,46],"342":[4,13,259],"343":[4,3,127],"344":[4,8,253],"345":[7,3,178],"346":[4,11,174],"347":[4,11,162],"348":[3,11,45],"349":[4,11,260],"350":[7,3,476],"351":[6,3,110],"352":[4,10,215],"353":[5,10,127],"354":[2,3,71],"355":[3,3,52],"356":[8,1,4],"357":[16,9,1],"358":[1,8,124],"359":[4,8,50],"360":[7,8,144],"361":[2,8,14],"362":[4,8,24],"363":[3,8,41],"364":[2,1,108],"365":[2,2,33],"366":[4,2,397],"367":[3,2,124],"368":[1,5,150],"369":[4,5,158],"370":[5,5,24],"371":[5,10,345],"372":[4,10,46],"373":[3,5,81],"374":[2,5,439],"375":[7,5,170],"376":[3,12,101],"377":[9,12,354],"378":[2,5,57],"379":[2,5,15],"380":[2,5,258],"381":[3,2,222],"382":[7,5,315],"383":[4,5,469],"384":[2,5,106],"385":[2,5,118],"386":[2,5,207],"387":[8,5,321],"388":[3,5,288],"389":[2,5,459],"390":[2,2,109],"391":[3,2,64],"392":[6,1,1],"393":[5,7,20],"394":[8,7,26],"395":[5,7,32],"396":[8,7,22],"397":[4,7,15],"398":[5,7,19],"399":[5,7,26],"400":[7,7,28],"401":[7,7,32],"402":[4,7,27],"403":[4,7,29],"404":[7,7,16],"405":[2,1,64],"406":[1,1,1],"407":[1,1,137],"408":[2,1,450],"409":[2,1,163],"410":[2,3,78],"411":[4,3,163],"412":[2,1,201],"413":[1,3,71],"414":[2,3,118],"415":[5,1,191],"416":[2,5,46],"417":[5,5,296],"418":[2,5,232],"419":[4,5,183],"420":[4,5,266],"421":[6,9,392],"422":[5,5,107],"423":[5,5,149],"424":[4,5,150],"425":[6,10,182],"426":[6,10,331],"427":[3,5,154],"428":[1,5,194],"429":[2,5,127],"430":[9,5,203],"431":[6,5,163],"432":[4,5,75],"433":[4,5,86],"434":[4,5,39],"435":[2,5,191],"436":[4,8,215],"437":[4,5,65],"438":[3,5,231],"439":[4,5,267],"440":[4,5,141],"441":[2,5,87],"442":[3,5,63],"443":[4,1,216],"444":[2,1,863],"445":[3,1,42],"446":[2,1,8],"447":[3,3,15],"448":[3,3,347],"449":[5,1,587],"450":[1,1,162],"451":[3,1,414],"452":[3,1,197],"453":[2,4,78],"454":[9,4,41],"455":[2,4,29],"456":[2,4,47],"457":[6,4,18],"458":[2,4,30],"459":[4,1,223],"460":[2,1,501],"461":[6,1,538],"462":[2,1,1],"463":[6,2,1],"464":[1,8,13],"465":[1,8,5],"466":[5,2,1],"467":[1,7,12],"468":[6,2,1],"469":[1,8,6],"470":[1,8,24],"471":[6,2,1],"472":[1,8,3],"473":[1,8,4],"474":[6,2,1],"475":[1,8,3],"476":[4,1,1],"477":[1,4,5],"478":[1,4,4],"479":[1,4,4],"480":[1,4,6],"481":[1,4,8],"482":[1,4,2],"483":[6,1,36],"484":[3,1,66],"485":[1,1,80],"486":[5,2,23],"487":[3,1,17],"488":[1,1,1],"489":[5,1,128],"490":[5,5,13],"491":[3,1,38],"492":[1,1,144],"493":[4,1,1],"494":[2,4,70],"495":[1,4,175],"496":[1,1,171],"497":[1,1,81],"498":[2,1,1],"499":[3,2,103],"500":[2,2,89],"501":[1,1,67],"502":[2,1,1],"503":[5,2,41],"504":[2,2,27],"505":[2,1,11],"506":[1,2,21],"507":[1,2,22],"508":[1,1,9],"509":[1,1,1],"510":[1,1,1],"511":[1,1,1],"512":[1,1,1],"513":[1,1,1],"514":[7,1,1],"515":[1,7,78],"516":[5,7,38],"517":[2,1,41],"518":[1,1,4],"519":[1,1,4],"520":[1,1,8],"521":[1,1,9],"522":[1,1,32],"523":[1,1,1],"524":[1,1,97],"525":[1,1,16],"526":[1,1,54],"527":[2,1,52],"528":[2,1,16],"529":[4,1,1],"530":[2,4,77],"531":[3,4,21],"532":[2,4,11],"533":[2,4,80],"534":[1,1,27],"535":[1,1,10],"536":[1,1,43],"537":[1,1,13],"538":[1,1,1],"539":[1,1,1],"540":[2,1,34],"541":[1,1,13],"542":[2,1,54],"543":[2,1,60],"544":[2,1,44],"545":[1,1,80]},"averageFieldLength":[3.4560439560439566,5.245421245421242,113.95970695970695],"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":"Category table","titles":["Модель данных в базе данных","Данные",null]},"46":{"title":"Product 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":"Supabase REST API","titles":[]},"52":{"title":"Supabase SDK","titles":["Supabase REST API"]},"53":{"title":"Установка:","titles":["Supabase REST API","Supabase SDK",null]},"54":{"title":"Использование:","titles":["Supabase REST API","Supabase SDK",null]},"55":{"title":"Supabase REST API","titles":["Supabase REST API"]},"56":{"title":"Supabase","titles":[]},"57":{"title":"Создание проекта","titles":["Supabase"]},"58":{"title":"Безопасность и доступ","titles":["Supabase"]},"59":{"title":"Онлайн маркетплейс","titles":[]},"60":{"title":"Проект Arty-Crafty","titles":["Онлайн маркетплейс"]},"61":{"title":"Причины","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":"Тестирование и QA","titles":["План работы"]},"72":{"title":"Документирование","titles":["План работы"]},"73":{"title":"Поддержка","titles":["План работы"]},"74":{"title":"Цели и задачи проекта","titles":[]},"75":{"title":"Цели данного проекта:","titles":["Цели и задачи проекта"]},"76":{"title":"Нефункциональные требования (software quality attributes)","titles":["Цели и задачи проекта"]},"77":{"title":"Общие функциональные требования","titles":["Цели и задачи проекта"]},"78":{"title":"Этапы развития приложения (приблизительно)","titles":["Цели и задачи проекта"]},"79":{"title":"Репозиторий и сайт проекта","titles":[]},"80":{"title":"Codeium","titles":[]},"81":{"title":"Автокомплит","titles":["Codeium"]},"82":{"title":"Чат-бот","titles":["Codeium"]},"83":{"title":"Explain, Refactor, JSDoc","titles":["Codeium"]},"84":{"title":"Вывод","titles":["Codeium"]},"85":{"title":"Кастомизация","titles":[]},"86":{"title":"Персонализация","titles":["Кастомизация"]},"87":{"title":"Views","titles":["Кастомизация"]},"88":{"title":"Routes","titles":["Кастомизация"]},"89":{"title":"Header","titles":["Кастомизация"]},"90":{"title":"Sidebar","titles":["Кастомизация"]},"91":{"title":"Небольшой рефакторинг","titles":["Кастомизация"]},"92":{"title":"Категория товаров","titles":[]},"93":{"title":"Layout","titles":["Категория товаров"]},"94":{"title":"Данные и API","titles":["Категория товаров"]},"95":{"title":"Избранное","titles":[]},"96":{"title":"Иконка на карточке товара","titles":["Избранное"]},"97":{"title":"Композабл useFavourites","titles":["Избранное"]},"98":{"title":"Сохранение между сессиями","titles":["Избранное"]},"99":{"title":"Бэджик","titles":["Избранное"]},"100":{"title":"Tag и CMV","titles":["Избранное"]},"101":{"title":"Создание проекта","titles":[]},"102":{"title":"Репозиторий на GitHub","titles":["Создание проекта"]},"103":{"title":"vue-webapp","titles":["Создание проекта"]},"104":{"title":"Абстракция канала связи с бэкендом","titles":[]},"105":{"title":"API сервис","titles":["Абстракция канала связи с бэкендом"]},"106":{"title":"Аутентификация и авторизация","titles":[]},"107":{"title":"Варианты задействовать свой бэкенд для фронтендера","titles":[]},"108":{"title":"CORS","titles":[]},"109":{"title":"Протоколы. To REST или не REST?","titles":[]},"110":{"title":"Приложение: Миграция с Vue 2","titles":[]},"111":{"title":"Другой способ загрузки и запуска приложения","titles":["Приложение: Миграция с Vue 2"]},"112":{"title":"Регистрация глобальных компонентов, плагинов и так далее","titles":["Приложение: Миграция с Vue 2"]},"113":{"title":"Свойство data теперь всегда является функцией","titles":["Приложение: Миграция с Vue 2"]},"114":{"title":"Больше реактивных возможностей","titles":["Приложение: Миграция с Vue 2"]},"115":{"title":"Изменения в v-model, props и events","titles":["Приложение: Миграция с Vue 2"]},"116":{"title":"Удалена совместимость со старыми браузерами","titles":["Приложение: Миграция с Vue 2"]},"117":{"title":"Изменения в организации каталогов и файлов","titles":["Приложение: Миграция с Vue 2"]},"118":{"title":"Изменения в роутере и state manager","titles":["Приложение: Миграция с Vue 2"]},"119":{"title":"Новые компоненты и другие изменения.","titles":["Приложение: Миграция с Vue 2"]},"120":{"title":"Другие изменения","titles":["Приложение: Миграция с Vue 2"]},"121":{"title":"Итог","titles":["Приложение: Миграция с Vue 2"]},"122":{"title":"Развертывание приложения","titles":[]},"123":{"title":"Технические требования","titles":["Развертывание приложения"]},"124":{"title":"Что включает в себя публикация веб-приложения?","titles":["Развертывание приложения"]},"125":{"title":"Домены, серверы доменных имен (DNS) и записи DNS","titles":["Развертывание приложения","Что включает в себя публикация веб-приложения?"]},"126":{"title":"Размышления о создании приложения для развертывания","titles":["Развертывание приложения"]},"127":{"title":"/chapter 5/to-do SPA/src/router/index.js","titles":["Развертывание приложения","Размышления о создании приложения для развертывания","Домены, серверы доменных имен (DNS) и записи DNS",null]},"128":{"title":"Опции и конфигурации веб-сервера","titles":["Развертывание приложения"]},"129":{"title":"Конфигурация HTTP-сервера Apache","titles":["Развертывание приложения","Опции и конфигурации веб-сервера"]},"130":{"title":"/.htaccess","titles":["Развертывание приложения","Опции и конфигурации веб-сервера","Конфигурация HTTP-сервера Apache",null]},"131":{"title":"Настройка сервера Nginx","titles":["Развертывание приложения","Опции и конфигурации веб-сервера"]},"132":{"title":"/etc/nginx/sites-available/default","titles":["Развертывание приложения","Опции и конфигурации веб-сервера","Настройка сервера Nginx",null]},"133":{"title":"Другие серверы","titles":["Развертывание приложения","Опции и конфигурации веб-сервера"]},"134":{"title":"Перенос файлов на сервер","titles":["Развертывание приложения"]},"135":{"title":"Защита веб-приложения с помощью Let\'s Encrypt","titles":["Развертывание приложения"]},"136":{"title":"Подведение итогов","titles":["Развертывание приложения"]},"137":{"title":"Вопросы для проверки","titles":["Развертывание приложения"]},"138":{"title":"Бонусная глава - Шаблоны UX","titles":[]},"139":{"title":"Технические требования","titles":["Бонусная глава - Шаблоны UX"]},"140":{"title":"UI-дизайн против UX-дизайна","titles":["Бонусная глава - Шаблоны UX"]},"141":{"title":"Принципы проектирования пользовательского интерфейса","titles":["Бонусная глава - Шаблоны UX"]},"142":{"title":"Достаточный контраст или различие между элементами","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"143":{"title":"Стимулировать повторение и быть последовательным.","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"144":{"title":"Внимательно следите за выравниванием и направлением","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"145":{"title":"Используйте близость и расстояние, чтобы показать естественные группы","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"146":{"title":"Законы проектирования пользовательского интерфейса","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"147":{"title":"Закон Фитта","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"148":{"title":"Закон Хика","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"149":{"title":"Восемь правил Бена Шнайдермана","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"150":{"title":"Принципы проектирования UX","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"151":{"title":"Общие шаблоны для работы с данными","titles":["Бонусная глава - Шаблоны UX"]},"152":{"title":"Элементы ввода HTML","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными"]},"153":{"title":"Чекбоксы, радиокнопки и тумблеры","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML"]},"154":{"title":"Чипы, таблетки или теги","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML"]},"155":{"title":"Подсказки (tooltips)","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML"]},"156":{"title":"Уведомляющие точки, пузырьки, метки или значки","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML"]},"157":{"title":"Тостовые уведомления","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML"]},"158":{"title":"Карусель или слайдеры изображений","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML"]},"159":{"title":"Панели прогресса (progress bars) и спиннеры","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML"]},"160":{"title":"./components/Spinner.vue","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML","Панели прогресса (progress bars) и спиннеры"]},"161":{"title":"Пагинация (пейджер) и бесконечный скроллер","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML"]},"162":{"title":"./src/components/InfiniteScroller.vue","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML","Пагинация (пейджер) и бесконечный скроллер"]},"163":{"title":"Общие шаблоны для взаимодействия и навигации","titles":["Бонусная глава - Шаблоны UX"]},"164":{"title":"Размещение меню","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для взаимодействия и навигации","Элементы ввода HTML"]},"165":{"title":"Хлебные крошки (breadcrumbs)","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для взаимодействия и навигации","Элементы ввода HTML"]},"166":{"title":"Модальные диалоги","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для взаимодействия и навигации","Элементы ввода HTML"]},"167":{"title":"Иконки меню","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для взаимодействия и навигации","Элементы ввода HTML"]},"168":{"title":"Аккордеонные меню","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для взаимодействия и навигации","Элементы ввода HTML"]},"169":{"title":"Мегаменю","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для взаимодействия и навигации","Элементы ввода HTML"]},"170":{"title":"Выпадающие меню","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для взаимодействия и навигации","Элементы ввода HTML"]},"171":{"title":"Общие шаблоны для организации контента","titles":["Бонусная глава - Шаблоны UX"]},"172":{"title":"Отзывчивые (responsive) приложения","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для организации контента"]},"173":{"title":"Домашняя ссылка","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для организации контента"]},"174":{"title":"Главная (hero) секция, призыв к действию (call to action) и иконки социальных сетей","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для организации контента"]},"175":{"title":"Другие шаблоны","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для организации контента"]},"176":{"title":"Темные шаблоны","titles":["Бонусная глава - Шаблоны UX"]},"177":{"title":"Вопросы с подвохом","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"178":{"title":"Проникновение в корзину","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"179":{"title":"Приманка для тараканов (Roach motels)","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"180":{"title":"Privacy Zuckering","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"181":{"title":"Предотвращение сравнения цен","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"182":{"title":"Ненаправленность","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"183":{"title":"Скрытые расходы","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"184":{"title":"Приманка и подмена","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"185":{"title":"Подтверждение позора (Confirm shaming)","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"186":{"title":"Замаскированная реклама","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"187":{"title":"Дружественный спам","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"188":{"title":"Подведение итогов","titles":["Бонусная глава - Шаблоны UX"]},"189":{"title":"Вопросы для проверки","titles":["Бонусная глава - Шаблоны UX"]},"190":{"title":"Фреймворк Vue 3","titles":[]},"191":{"title":"Прогрессивный фреймворк","titles":["Фреймворк Vue 3"]},"192":{"title":"Использование Vue в веб-приложении","titles":["Фреймворк Vue 3"]},"193":{"title":"Путь сборщика, лучший путь...","titles":["Фреймворк Vue 3","Использование Vue в веб-приложении"]},"194":{"title":"Понимание однофайловых компонентов","titles":["Фреймворк Vue 3"]},"195":{"title":"Разные варианты - options, composition, и script setup API","titles":["Фреймворк Vue 3"]},"196":{"title":"Изучение встроенных директив в Vue 3","titles":["Фреймворк Vue 3"]},"197":{"title":"v-bind: (сокращение ":")","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"198":{"title":"v-show","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"199":{"title":"v-if, v-else и v-else-if","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"200":{"title":"v-for и :key","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"201":{"title":"v-model","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"202":{"title":"v-on: (и сокращение @)","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"203":{"title":"Встроенные компоненты","titles":["Фреймворк Vue 3"]},"204":{"title":"Кодовые соглашения (code conventions) в книге","titles":["Фреймворк Vue 3"]},"205":{"title":"Переменные и пропсы","titles":["Фреймворк Vue 3","Кодовые соглашения (code conventions) в книге"]},"206":{"title":"Константы","titles":["Фреймворк Vue 3","Кодовые соглашения (code conventions) в книге"]},"207":{"title":"Имена классов и компонентов","titles":["Фреймворк Vue 3","Кодовые соглашения (code conventions) в книге"]},"208":{"title":"Функции, методы, события и имена файлов","titles":["Фреймворк Vue 3","Кодовые соглашения (code conventions) в книге"]},"209":{"title":"Экземпляры","titles":["Фреймворк Vue 3","Кодовые соглашения (code conventions) в книге"]},"210":{"title":"Подведение итогов","titles":["Фреймворк Vue 3"]},"211":{"title":"Вопросы для проверки","titles":["Фреймворк Vue 3"]},"212":{"title":"Установка рабочего проекта","titles":[]},"213":{"title":"Технические требования","titles":["Установка рабочего проекта"]},"214":{"title":"Настройка проекта и инструменты","titles":["Установка рабочего проекта"]},"215":{"title":"Структура папок и её модификации","titles":["Установка рабочего проекта"]},"216":{"title":"Интеграция с CSS-фреймворками","titles":["Установка рабочего проекта"]},"217":{"title":"Фреймворк w3.css","titles":["Установка рабочего проекта","Интеграция с CSS-фреймворками"]},"218":{"title":"FontAwesome - это просто замечательно","titles":["Установка рабочего проекта"]},"219":{"title":"Опции конфигурации Vite","titles":["Установка рабочего проекта"]},"220":{"title":"Приложение To-Do","titles":["Установка рабочего проекта"]},"221":{"title":"App.vue","titles":["Установка рабочего проекта","Приложение To-Do","Фреймворк w3.css"]},"222":{"title":"ToDos.vue","titles":["Установка рабочего проекта","Приложение To-Do","Фреймворк w3.css"]},"223":{"title":"Краткая критика нашего приложения To-Do","titles":["Установка рабочего проекта","Приложение To-Do","Фреймворк w3.css"]},"224":{"title":"Подведение итогов","titles":["Установка рабочего проекта"]},"225":{"title":"Вопросы для проверки","titles":["Установка рабочего проекта"]},"226":{"title":"Композиция пользовательского интерфейса с помощью компонентов","titles":[]},"227":{"title":"Технические требования","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"228":{"title":"Составление страницы с помощью компонентов","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"229":{"title":"Этап 1 - определение макетов и элементов пользовательского интерфейса","titles":["Композиция пользовательского интерфейса с помощью компонентов","Составление страницы с помощью компонентов"]},"230":{"title":"Шаг 2 - определение связей, потока данных, взаимодействий и событий","titles":["Композиция пользовательского интерфейса с помощью компонентов","Составление страницы с помощью компонентов"]},"231":{"title":"Шаг 3 - определение элементов пользовательской интерактивности (входов, диалогов, уведомлений и т.д.)","titles":["Композиция пользовательского интерфейса с помощью компонентов","Составление страницы с помощью компонентов"]},"232":{"title":"Шаг 4 - выявление шаблонов проектирования и компромиссов","titles":["Композиция пользовательского интерфейса с помощью компонентов","Составление страницы с помощью компонентов"]},"233":{"title":"Компоненты в деталях","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"234":{"title":"Локальные и глобальные компоненты","titles":["Композиция пользовательского интерфейса с помощью компонентов","Компоненты в деталях"]},"235":{"title":"Статический, асинхронный и динамический импорт","titles":["Композиция пользовательского интерфейса с помощью компонентов","Компоненты в деталях"]},"236":{"title":"Пропсы, события и директива v-model","titles":["Композиция пользовательского интерфейса с помощью компонентов","Компоненты в деталях"]},"237":{"title":"Настраиваемые контроллеры ввода","titles":["Композиция пользовательского интерфейса с помощью компонентов","Компоненты в деталях"]},"238":{"title":"Инъекция зависимости с помощью Provide и Inject","titles":["Композиция пользовательского интерфейса с помощью компонентов","Компоненты в деталях"]},"239":{"title":"Специальные компоненты","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"240":{"title":"Слоты, слоты и еще раз слоты...","titles":["Композиция пользовательского интерфейса с помощью компонентов","Специальные компоненты"]},"241":{"title":"Композабл функции (composables) и миксины","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"242":{"title":"Динамические компоненты с помощью "component :is"","titles":["Композиция пользовательского интерфейса с помощью компонентов","Композабл функции (composables) и миксины"]},"243":{"title":"Реальный пример - плагин модалов","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"244":{"title":"Настройка нашего проекта","titles":["Композиция пользовательского интерфейса с помощью компонентов","Реальный пример - плагин модалов"]},"245":{"title":"Конструкция","titles":["Композиция пользовательского интерфейса с помощью компонентов","Реальный пример - плагин модалов"]},"246":{"title":"Реализация","titles":["Композиция пользовательского интерфейса с помощью компонентов","Реальный пример - плагин модалов"]},"247":{"title":"Реализация нашего нового приложения To-Do","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"248":{"title":"Небольшая критика нашего нового приложения To-Do","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"249":{"title":"Подведение итогов","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"250":{"title":"Вопросы для проверки","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"251":{"title":"Прогрессивные веб-приложения","titles":[]},"252":{"title":"Технические требования","titles":["Прогрессивные веб-приложения"]},"253":{"title":"PWA или устанавливаемые SPA","titles":["Прогрессивные веб-приложения"]},"254":{"title":"Увеличение SPA до уровня PWA","titles":["Прогрессивные веб-приложения"]},"255":{"title":"Файл манифеста","titles":["Прогрессивные веб-приложения","Увеличение SPA до уровня PWA"]},"256":{"title":"Необходимо:","titles":["Прогрессивные веб-приложения","Увеличение SPA до уровня PWA","Файл манифеста"]},"257":{"title":"Рекомендуется:","titles":["Прогрессивные веб-приложения","Увеличение SPA до уровня PWA","Файл манифеста"]},"258":{"title":"Описательные:","titles":["Прогрессивные веб-приложения","Увеличение SPA до уровня PWA","Файл манифеста"]},"259":{"title":"Тестирование манифеста","titles":["Прогрессивные веб-приложения","Увеличение SPA до уровня PWA"]},"260":{"title":"Подсказка к установке (Install prompt)","titles":["Прогрессивные веб-приложения","Увеличение SPA до уровня PWA"]},"261":{"title":"Service workers","titles":["Прогрессивные веб-приложения"]},"262":{"title":"Плагин Vite-PWA","titles":["Прогрессивные веб-приложения"]},"263":{"title":"Тестирование показателей PWA с помощью Google Lighthouse","titles":["Прогрессивные веб-приложения"]},"264":{"title":"Подведение итогов","titles":["Прогрессивные веб-приложения"]},"265":{"title":"Вопросы для проверки","titles":["Прогрессивные веб-приложения"]},"266":{"title":"Принципы и шаблоны проектирования программного обеспечения","titles":[]},"267":{"title":"Каковы принципы проектирования программного обеспечения?","titles":["Принципы и шаблоны проектирования программного обеспечения"]},"268":{"title":"Неполный список принципов проектирования","titles":["Принципы и шаблоны проектирования программного обеспечения"]},"269":{"title":"Separation of concerns (Разделение ответственности)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"270":{"title":"Composition over inheritance (Композиция над наследованием)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"271":{"title":"Single responsibility principle (Принцип единой ответственности)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"272":{"title":"Encapsulation (Инкапсуляция)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"273":{"title":"KIC - keep it clean","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"274":{"title":"DRY – don’t repeat yourself (не повторяйся)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"275":{"title":"KISS - keep it simple and short (держи это простым и коротким)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"276":{"title":"Code for the next (Пиши код для следующего)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"277":{"title":"Что такое шаблон проектирования программного обеспечения?","titles":["Принципы и шаблоны проектирования программного обеспечения"]},"278":{"title":"Краткий справочный список шаблонов","titles":["Принципы и шаблоны проектирования программного обеспечения"]},"279":{"title":"Порождающие шаблоны","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Code for the next (Пиши код для следующего)"]},"280":{"title":"Поведенческие шаблоны","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Code for the next (Пиши код для следующего)"]},"281":{"title":"Структурные шаблоны","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Code for the next (Пиши код для следующего)"]},"282":{"title":"Асинхронные шаблоны","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Code for the next (Пиши код для следующего)"]},"283":{"title":"Шаблон Singleton","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"284":{"title":"Когда его использовать","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Singleton"]},"285":{"title":"Реализация","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Singleton"]},"286":{"title":"Метод 1","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Singleton","Реализация"]},"287":{"title":"Метод 2","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Singleton","Реализация"]},"288":{"title":"Шаблон Dependency injection (инъекция зависимостей)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"289":{"title":"./chapter 2/dependency-injection-1.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"290":{"title":"./chapter 2/dependency-injection-2.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"291":{"title":"./chapter 2/dependency-injection-3.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"292":{"title":"./chapter 2/dependency-injection-4.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"293":{"title":"./chapter 2/dependency-injection-5.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"294":{"title":"./chapter 2/dependency-injection-6.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"295":{"title":"./chapter 2/dependency-injection-7.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"296":{"title":"Шаблон factory (фабрика)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"297":{"title":"Шаблон Observer (наблюдатель)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"298":{"title":"./chapter 2/Observer-1.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Observer (наблюдатель)"]},"299":{"title":"Шаблон Command (команда)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"300":{"title":"./chapter 2/Command-1.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Command (команда)"]},"301":{"title":"Шаблон Proxy","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"302":{"title":"./chapter 2/proxy-1.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Proxy"]},"303":{"title":"Шаблон Decorator (декоратор)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"304":{"title":"./chapter 2/decorator-1.vue","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Decorator (декоратор)"]},"305":{"title":"./chapter 2/decorator-2.vue","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Decorator (декоратор)"]},"306":{"title":"Шаблон Façade (фасад)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"307":{"title":"Шаблон Callback (обратный вызов)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"308":{"title":"./chapter 2/callback-1.js - Синхронный Фибоначчи","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Callback (обратный вызов)"]},"309":{"title":"Шаблон Promise (обещаниe)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"310":{"title":"Подведение итогов","titles":["Принципы и шаблоны проектирования программного обеспечения"]},"311":{"title":"Вопросы для проверки","titles":["Принципы и шаблоны проектирования программного обеспечения"]},"312":{"title":"Многопоточность с Web Workers","titles":[]},"313":{"title":"Технические требования","titles":["Многопоточность с Web Workers"]},"314":{"title":"Введение в Web workers","titles":["Многопоточность с Web Workers"]},"315":{"title":"Реализация web worker","titles":["Многопоточность с Web Workers","Введение в Web workers"]},"316":{"title":"./my_worker.js","titles":["Многопоточность с Web Workers","Введение в Web workers","Реализация web worker",null]},"317":{"title":"./main.js","titles":["Многопоточность с Web Workers","Введение в Web workers","Реализация web worker",null]},"318":{"title":"Шаблон Business delegate","titles":["Многопоточность с Web Workers"]},"319":{"title":"Шаблон Dispatcher","titles":["Многопоточность с Web Workers"]},"320":{"title":"Установка конвейера взаимодействия с веб-рабочим","titles":["Многопоточность с Web Workers"]},"321":{"title":"./services/WebWorker.js","titles":["Многопоточность с Web Workers","Установка конвейера взаимодействия с веб-рабочим","Реализация web worker",null]},"322":{"title":"./webworker/index.js","titles":["Многопоточность с Web Workers","Установка конвейера взаимодействия с веб-рабочим","Реализация web worker",null]},"323":{"title":"./webworker/services/test.js","titles":["Многопоточность с Web Workers","Установка конвейера взаимодействия с веб-рабочим","Реализация web worker",null]},"324":{"title":"Получение доступа к IndexedDB с помощью DexieJS в web worker.","titles":["Многопоточность с Web Workers"]},"325":{"title":"/src/components/DbNotes.vue","titles":["Многопоточность с Web Workers","Получение доступа к IndexedDB с помощью DexieJS в web worker.","Реализация web worker",null]},"326":{"title":"./src/webworker/services/dbService.js","titles":["Многопоточность с Web Workers","Получение доступа к IndexedDB с помощью DexieJS в web worker.","Реализация web worker",null]},"327":{"title":"./src/webworker/index.js","titles":["Многопоточность с Web Workers","Получение доступа к IndexedDB с помощью DexieJS в web worker.","Реализация web worker",null]},"328":{"title":"./webworker/services/network.js","titles":["Многопоточность с Web Workers","Получение доступа к IndexedDB с помощью DexieJS в web worker.","Реализация web worker",null]},"329":{"title":"./webworker/index.js","titles":["Многопоточность с Web Workers","Получение доступа к IndexedDB с помощью DexieJS в web worker.","Реализация web worker",null]},"330":{"title":"./src/components/NetworkCommunication.vue","titles":["Многопоточность с Web Workers","Получение доступа к IndexedDB с помощью DexieJS в web worker.","Реализация web worker",null]},"331":{"title":"Простой NodeJS-сервер для тестирования","titles":["Многопоточность с Web Workers"]},"332":{"title":"./server/index.js","titles":["Многопоточность с Web Workers","Простой NodeJS-сервер для тестирования","Реализация web worker",null]},"333":{"title":"Подведение итогов","titles":["Многопоточность с Web Workers"]},"334":{"title":"Вопросы для проверки","titles":["Многопоточность с Web Workers"]},"335":{"title":"Управление потоками данных","titles":[]},"336":{"title":"Технические требования","titles":["Управление потоками данных"]},"337":{"title":"Основное взаимодействие компонентов","titles":["Управление потоками данных"]},"338":{"title":"/basic/ParentBasic.vue","titles":["Управление потоками данных","Основное взаимодействие компонентов",null,null,null]},"339":{"title":"/basic/Child.vue","titles":["Управление потоками данных","Основное взаимодействие компонентов",null,null,null]},"340":{"title":"Реализация шины событий с помощью шаблонов Singleton и Observer","titles":["Управление потоками данных"]},"341":{"title":"/services/MessageBus.js","titles":["Управление потоками данных","Реализация шины событий с помощью шаблонов Singleton и Observer",null,null]},"342":{"title":"/bus/Child.vue","titles":["Управление потоками данных","Реализация шины событий с помощью шаблонов Singleton и Observer",null,null]},"343":{"title":"Реализация базового реактивного состояния","titles":["Управление потоками данных"]},"344":{"title":"/service/SimpleState.js","titles":["Управление потоками данных","Реализация базового реактивного состояния",null,null]},"345":{"title":"Реализация мощного реактивного стора с помощью Pinia","titles":["Управление потоками данных"]},"346":{"title":"Options API basic store","titles":["Управление потоками данных","Реализация мощного реактивного стора с помощью Pinia",null,null]},"347":{"title":"/stores/counter.js","titles":["Управление потоками данных","Реализация мощного реактивного стора с помощью Pinia",null,null]},"348":{"title":"./main.js","titles":["Управление потоками данных","Реализация мощного реактивного стора с помощью Pinia",null,null]},"349":{"title":"/pinia/ChildPinia.vue","titles":["Управление потоками данных","Реализация мощного реактивного стора с помощью Pinia",null,null]},"350":{"title":"Хранилища данных браузера - сессионные, локальные и IndexedDB","titles":["Управление потоками данных"]},"351":{"title":"Экспериментируем с шаблонами reactivity и Proxies","titles":["Управление потоками данных"]},"352":{"title":"/services/sessionStorage.js","titles":["Управление потоками данных","Экспериментируем с шаблонами reactivity и Proxies",null,null]},"353":{"title":"/session_storage/ChildSession.vue","titles":["Управление потоками данных","Экспериментируем с шаблонами reactivity и Proxies",null,null]},"354":{"title":"Подведение итогов","titles":["Управление потоками данных"]},"355":{"title":"Вопросы для проверки","titles":["Управление потоками данных"]},"356":{"title":"Vue.js 3 - Шаблоны проектирования и лучшие практики","titles":[]},"357":{"title":"Здесь представлен перевод книги "Vue.js 3 - Design Patterns and Best Practices" на русский язык","titles":["Vue.js 3 - Шаблоны проектирования и лучшие практики",null,null]},"358":{"title":"Предисловие","titles":["Vue.js 3 - Шаблоны проектирования и лучшие практики"]},"359":{"title":"Для кого эта книга","titles":["Vue.js 3 - Шаблоны проектирования и лучшие практики"]},"360":{"title":"Чтобы получить максимальную пользу от этой книги","titles":["Vue.js 3 - Шаблоны проектирования и лучшие практики"]},"361":{"title":"Купить книгу","titles":["Vue.js 3 - Шаблоны проектирования и лучшие практики"]},"362":{"title":"Скачать файлы кода примеров","titles":["Vue.js 3 - Шаблоны проектирования и лучшие практики"]},"363":{"title":"Код в действии","titles":["Vue.js 3 - Шаблоны проектирования и лучшие практики"]},"364":{"title":"Одностраничные приложения","titles":[]},"365":{"title":"Технические требования","titles":["Одностраничные приложения"]},"366":{"title":"Что такое SPA?","titles":["Одностраничные приложения"]},"367":{"title":"Vue 3 роутер","titles":["Одностраничные приложения"]},"368":{"title":"Установка","titles":["Одностраничные приложения","Vue 3 роутер"]},"369":{"title":"Новое приложение To-Do","titles":["Одностраничные приложения","Vue 3 роутер"]},"370":{"title":"Определение маршрутов и объект Router","titles":["Одностраничные приложения","Vue 3 роутер"]},"371":{"title":"/src/router/index.js","titles":["Одностраничные приложения","Vue 3 роутер","Определение маршрутов и объект Router"]},"372":{"title":"/src/main.js","titles":["Одностраничные приложения","Vue 3 роутер","Определение маршрутов и объект Router"]},"373":{"title":"Шаблонные компоненты маршрутизатора","titles":["Одностраничные приложения","Vue 3 роутер"]},"374":{"title":"App.vue","titles":["Одностраничные приложения","Vue 3 роутер"]},"375":{"title":"Вложенные маршруты, именованные представления и программная навигация","titles":["Одностраничные приложения","Vue 3 роутер"]},"376":{"title":"Определение вложенных маршрутов","titles":["Одностраничные приложения","Vue 3 роутер","Вложенные маршруты, именованные представления и программная навигация"]},"377":{"title":"/src/views/Directory.vue component, lines 13-18","titles":["Одностраничные приложения","Vue 3 роутер","Вложенные маршруты, именованные представления и программная навигация"]},"378":{"title":".push()","titles":["Одностраничные приложения","Vue 3 роутер"]},"379":{"title":".replace()","titles":["Одностраничные приложения","Vue 3 роутер"]},"380":{"title":".go()","titles":["Одностраничные приложения","Vue 3 роутер"]},"381":{"title":"Исследование шаблонов аутентификации","titles":["Одностраничные приложения"]},"382":{"title":"Простая аутентификация по имени пользователя и паролю","titles":["Одностраничные приложения","Исследование шаблонов аутентификации"]},"383":{"title":"OpenID и сторонняя аутентификация","titles":["Одностраничные приложения","Исследование шаблонов аутентификации"]},"384":{"title":"1.","titles":["Одностраничные приложения","Исследование шаблонов аутентификации"]},"385":{"title":"2.","titles":["Одностраничные приложения","Исследование шаблонов аутентификации"]},"386":{"title":"3.","titles":["Одностраничные приложения","Исследование шаблонов аутентификации"]},"387":{"title":"Беспарольная аутентификация или аутентификация по одноразовому паролю (OTP)","titles":["Одностраничные приложения","Исследование шаблонов аутентификации"]},"388":{"title":"2FA - двухфакторная аутентификация","titles":["Одностраничные приложения","Исследование шаблонов аутентификации"]},"389":{"title":"Web3-аутентификация","titles":["Одностраничные приложения","Исследование шаблонов аутентификации"]},"390":{"title":"Подведение итогов","titles":["Одностраничные приложения"]},"391":{"title":"Вопросы для проверки","titles":["Одностраничные приложения"]},"392":{"title":"Что включает в себя эта книга","titles":[]},"393":{"title":"Глава 1, Фреймворк Vue 3","titles":["Что включает в себя эта книга",null]},"394":{"title":"Глава 2, Принципы и шаблоны проектирования программного обеспечения","titles":["Что включает в себя эта книга",null]},"395":{"title":"Глава 3, Создание рабочего проекта","titles":["Что включает в себя эта книга",null]},"396":{"title":"Глава 4, Композиция пользовательского интерфейса с помощью компонентов","titles":["Что включает в себя эта книга",null]},"397":{"title":"Глава 5, Одностраничные приложения","titles":["Что включает в себя эта книга",null]},"398":{"title":"Глава 6, Прогрессивные веб-приложения","titles":["Что включает в себя эта книга",null]},"399":{"title":"Глава 7, Управление потоками данных","titles":["Что включает в себя эта книга",null]},"400":{"title":"Глава 8, Многопоточность с помощью web-workers","titles":["Что включает в себя эта книга",null]},"401":{"title":"Глава 9, Тестирование и контроль исходных текстов","titles":["Что включает в себя эта книга",null]},"402":{"title":"Глава 10, Развертывание приложения","titles":["Что включает в себя эта книга",null]},"403":{"title":"Глава 11, UX Patterns","titles":["Что включает в себя эта книга",null]},"404":{"title":"Приложение: Миграция с Vue 2 на Vue 3","titles":["Что включает в себя эта книга",null]},"405":{"title":"CI/CD","titles":[]},"406":{"title":"Docker","titles":[]},"407":{"title":"Хостинг","titles":[]},"408":{"title":"Github Actions","titles":[]},"409":{"title":"Архитектурные решения","titles":[]},"410":{"title":"Use cases","titles":["Архитектурные решения",null]},"411":{"title":"Лучшие практики и соображения","titles":["Архитектурные решения",null]},"412":{"title":"Ресурсы приложения","titles":[]},"413":{"title":"BaseIcon","titles":["Ресурсы приложения",null,null]},"414":{"title":"icons.js","titles":["Ресурсы приложения",null,null]},"415":{"title":"Тестирование и системы контроля версий","titles":[]},"416":{"title":"Технические требования","titles":["Тестирование и системы контроля версий"]},"417":{"title":"Что такое тестирование и TDD","titles":["Тестирование и системы контроля версий"]},"418":{"title":"Что тестировать","titles":["Тестирование и системы контроля версий"]},"419":{"title":"Наш базовый пример приложения","titles":["Тестирование и системы контроля версий"]},"420":{"title":"Установка и использование Vitest","titles":["Тестирование и системы контроля версий"]},"421":{"title":"/src/tests/Fibonacci.test.js","titles":["Тестирование и системы контроля версий","Установка и использование Vitest",null,null]},"422":{"title":"Специальный случай утверждения - намеренная ошибка","titles":["Тестирование и системы контроля версий"]},"423":{"title":"Специальный случай утверждения - асинхронный код","titles":["Тестирование и системы контроля версий"]},"424":{"title":"Установка Vue Test Utils","titles":["Тестирование и системы контроля версий"]},"425":{"title":"/src/tests/FibonacciOutput.test.js","titles":["Тестирование и системы контроля версий","Установка Vue Test Utils",null,null]},"426":{"title":"/src/tests/FibonacciInput.test.js","titles":["Тестирование и системы контроля версий","Установка Vue Test Utils",null,null]},"427":{"title":"In-source тестирование","titles":["Тестирование и системы контроля версий"]},"428":{"title":"Покрытие","titles":["Тестирование и системы контроля версий"]},"429":{"title":"Интерфейс Vitest","titles":["Тестирование и системы контроля версий"]},"430":{"title":"Что такое source control и зачем он нужен?","titles":["Тестирование и системы контроля версий"]},"431":{"title":"Управление исходными текстами с помощью Git","titles":["Тестирование и системы контроля версий"]},"432":{"title":"Установка в системах Windows","titles":["Тестирование и системы контроля версий"]},"433":{"title":"Установка в системах Linux","titles":["Тестирование и системы контроля версий"]},"434":{"title":"Установка в системах macOS","titles":["Тестирование и системы контроля версий"]},"435":{"title":"Использование Git","titles":["Тестирование и системы контроля версий"]},"436":{"title":"/chapter 10/.gitignore","titles":["Тестирование и системы контроля версий","Использование Git",null,null]},"437":{"title":"Управление ветвями и слияниями","titles":["Тестирование и системы контроля версий"]},"438":{"title":"Конфликты при слиянии","titles":["Тестирование и системы контроля версий"]},"439":{"title":"Работа с удаленными репозиториями","titles":["Тестирование и системы контроля версий"]},"440":{"title":"Непрерывная интеграция и доставка","titles":["Тестирование и системы контроля версий"]},"441":{"title":"Подведение итогов","titles":["Тестирование и системы контроля версий"]},"442":{"title":"Вопросы для проверки","titles":["Тестирование и системы контроля версий"]},"443":{"title":"Создание и сборка приложения","titles":[]},"444":{"title":"Настройка IDE","titles":[]},"445":{"title":"Подскажите удобную библиотеку","titles":[]},"446":{"title":"Полезные советы","titles":[]},"447":{"title":"Карусель или слайдер","titles":["Полезные советы",null]},"448":{"title":"Дата и время","titles":["Полезные советы",null]},"449":{"title":"State management во Vue 3","titles":[]},"450":{"title":"Тестирование","titles":[]},"451":{"title":"О фронтенд фреймворках","titles":[]},"452":{"title":"Архитектура фронтэнд приложений","titles":[]},"453":{"title":"Избегайте зависимостей","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"454":{"title":"Используйте обертки над компонентами UI библиотек и сторонних утилит","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"455":{"title":"Регулярный рефакторинг","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"456":{"title":"Используйте CSS3","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"457":{"title":"Используйте современные стандарты и возможности языков","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"458":{"title":"Документируйте проект","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"459":{"title":"CSS и UI библиотеки","titles":[]},"460":{"title":"Изучение Vue","titles":[]},"461":{"title":"SPA, PWA, SSG, SSR и SEO","titles":[]},"462":{"title":"История изменений","titles":[]},"463":{"title":"v1.4 (24-11-2023)","titles":["История изменений"]},"464":{"title":"Новое","titles":["История изменений","v1.4 (24-11-2023)",null]},"465":{"title":"Изменено","titles":["История изменений","v1.4 (24-11-2023)",null]},"466":{"title":"v1.3 (10-10-2023)","titles":["История изменений"]},"467":{"title":"Изменено","titles":["История изменений","v1.3 (10-10-2023)",null]},"468":{"title":"v1.2 (27-09-2023)","titles":["История изменений"]},"469":{"title":"Новое","titles":["История изменений","v1.2 (27-09-2023)",null]},"470":{"title":"Изменено","titles":["История изменений","v1.2 (27-09-2023)",null]},"471":{"title":"v1.1 (15-09-2023)","titles":["История изменений"]},"472":{"title":"Новое","titles":["История изменений","v1.1 (15-09-2023)"]},"473":{"title":"Изменено","titles":["История изменений","v1.1 (15-09-2023)"]},"474":{"title":"v1.0 (11-09-2023)","titles":["История изменений"]},"475":{"title":"Новое","titles":["История изменений","v1.0 (11-09-2023)"]},"476":{"title":"Шпаргалки (Cheat Sheet)","titles":[]},"477":{"title":"Vue","titles":["Шпаргалки (Cheat Sheet)",null]},"478":{"title":"JavaScript","titles":["Шпаргалки (Cheat Sheet)",null]},"479":{"title":"HTML","titles":["Шпаргалки (Cheat Sheet)",null]},"480":{"title":"CSS","titles":["Шпаргалки (Cheat Sheet)",null]},"481":{"title":"Typescript","titles":["Шпаргалки (Cheat Sheet)",null]},"482":{"title":"Markdown","titles":["Шпаргалки (Cheat Sheet)",null]},"483":{"title":"Внесите лепту в развитие данного ресурса","titles":[]},"484":{"title":"Глоссарий и сокращения","titles":[]},"485":{"title":"Предисловие","titles":[]},"486":{"title":"У нас есть Телеграм канал","titles":["Предисловие",null]},"487":{"title":"Участие в проекте","titles":[]},"488":{"title":"Установка","titles":[]},"489":{"title":"Установка через create vue-webapp","titles":["Установка"]},"490":{"title":"Инициализация и запуск веб приложения","titles":["Установка","Установка через create vue-webapp"]},"491":{"title":"Установка из репозитория","titles":["Установка"]},"492":{"title":"Принципы","titles":[]},"493":{"title":"Vue 3 webapp билдер","titles":[]},"494":{"title":"Краткое описание","titles":["Vue 3 webapp билдер"]},"495":{"title":"Обоснование","titles":["Vue 3 webapp билдер"]},"496":{"title":"Цели","titles":[]},"497":{"title":"Адаптивность","titles":[]},"498":{"title":"API модуль","titles":[]},"499":{"title":"API (REST)","titles":["API модуль"]},"500":{"title":"JSON-RPC","titles":["API модуль"]},"501":{"title":"BaseIcon","titles":[]},"502":{"title":"Детали реализации","titles":[]},"503":{"title":"Инъекции кода в index.html","titles":["Детали реализации"]},"504":{"title":"CSS tricks","titles":["Детали реализации"]},"505":{"title":"Navigation drawers","titles":[]},"506":{"title":"SimpleDrawer","titles":["Navigation drawers"]},"507":{"title":"TouchSlideoutDrawer","titles":["Navigation drawers"]},"508":{"title":"Footers","titles":[]},"509":{"title":"SimpleFooter","titles":["Footers"]},"510":{"title":"RichFooter","titles":["Footers"]},"511":{"title":"MantineSimpleFooter","titles":["Footers"]},"512":{"title":"MantineRichFooter","titles":["Footers"]},"513":{"title":"DistributedFooter","titles":["Footers"]},"514":{"title":"Github Actions сценарий для развертывания на Github Pages","titles":[]},"515":{"title":"Deployment","titles":["Github Actions сценарий для развертывания на Github Pages"]},"516":{"title":"Настройка base в Vite конфиге","titles":["Github Actions сценарий для развертывания на Github Pages"]},"517":{"title":"Google analytics","titles":[]},"518":{"title":"Headers","titles":[]},"519":{"title":"SimpleHeader","titles":["Headers"]},"520":{"title":"MantineSimpleHeader","titles":["Headers"]},"521":{"title":"MantineLayeredHeader","titles":["Headers"]},"522":{"title":"SlidingHeader","titles":["Headers"]},"523":{"title":"i18n","titles":[]},"524":{"title":"i18next","titles":["i18n"]},"525":{"title":"useI18nLight","titles":["i18n"]},"526":{"title":"Использование","titles":["i18n"]},"527":{"title":"i18next расширения","titles":["i18n"]},"528":{"title":"В итоге","titles":["i18n"]},"529":{"title":"Опции при создании приложения","titles":[]},"530":{"title":"Доступные опции","titles":["Опции при создании приложения"]},"531":{"title":"Доступно по умолчанию","titles":["Опции при создании приложения"]},"532":{"title":"В разработке","titles":["Опции при создании приложения"]},"533":{"title":"В планах","titles":["Опции при создании приложения"]},"534":{"title":"MainLayout","titles":[]},"535":{"title":"Routing","titles":["MainLayout"]},"536":{"title":"OneColumnLayout","titles":[]},"537":{"title":"Navbar","titles":[]},"538":{"title":"SimpleNavbar","titles":["Navbar"]},"539":{"title":"MantineSimpleNavbar","titles":["Navbar"]},"540":{"title":"Google analytics","titles":[]},"541":{"title":"PWA","titles":[]},"542":{"title":"manifest.json","titles":["PWA"]},"543":{"title":"Service worker","titles":["PWA"]},"544":{"title":"Splash screen","titles":[]},"545":{"title":"Темы","titles":[]}},"dirtCount":0,"index":[["^",{"2":{"444":1}}],["^20",{"2":{"443":1}}],["^index",{"2":{"130":1}}],["||",{"2":{"517":1}}],["|",{"2":{"408":4,"444":1}}],["🚀",{"2":{"408":1}}],["🛎️",{"2":{"408":1}}],["ютюбе",{"2":{"460":1}}],["ютюба",{"2":{"460":1}}],["ю",{"2":{"451":1}}],["юнит",{"2":{"423":1,"425":1}}],["юридическую",{"2":{"382":1}}],["юзер",{"2":{"106":1}}],["`~",{"2":{"444":1}}],["`$",{"2":{"413":4}}],["`",{"2":{"342":1,"408":3,"412":1}}],["`sent",{"2":{"342":1}}],["щелкает",{"2":{"258":1}}],["щелкать",{"2":{"220":1}}],["щелкнуть",{"2":{"220":1}}],["щелчку",{"2":{"387":1}}],["щелчке",{"2":{"247":1,"369":1}}],["щелчком",{"2":{"169":1,"170":1,"247":1}}],["щелчок",{"2":{"155":1,"247":1,"325":1}}],["щепоткой",{"2":{"191":1}}],["└────",{"2":{"165":1}}],["└──",{"2":{"165":3}}],["86",{"2":{"545":1}}],["8",{"0":{"400":1},"2":{"155":1,"213":1,"251":1,"263":1,"274":1,"277":1,"300":1,"302":3,"306":2,"308":2,"313":1,"314":3,"318":1,"320":1,"321":2,"323":1,"324":1,"329":2,"332":2,"350":2,"381":1,"388":1,"408":2,"435":1}}],["800",{"2":{"149":1}}],["80",{"2":{"81":1,"132":1}}],["№",{"2":{"154":1}}],["zero",{"2":{"444":1}}],["zip",{"2":{"218":2}}],["zuckering",{"0":{"180":1}}],["z",{"2":{"149":1,"173":1}}],["56",{"2":{"545":1}}],["58",{"2":{"444":1}}],["55",{"2":{"421":3,"423":1,"425":2}}],["512x512",{"2":{"262":2}}],["5rem",{"2":{"221":1}}],["50кб",{"2":{"448":1}}],["50",{"2":{"160":1,"342":1,"350":1,"421":1,"528":1}}],["5",{"0":{"127":1,"293":1,"397":1},"2":{"118":1,"126":2,"149":1,"153":1,"162":2,"166":1,"200":2,"218":1,"222":4,"235":1,"240":1,"241":2,"242":2,"246":2,"260":1,"294":1,"298":1,"299":1,"302":1,"309":1,"320":1,"321":2,"322":2,"325":1,"326":2,"328":1,"332":2,"342":2,"345":1,"346":2,"347":2,"350":1,"352":2,"366":1,"369":3,"371":2,"375":1,"377":1,"380":1,"382":4,"383":1,"386":1,"387":2,"388":1,"403":1,"408":3,"422":2,"426":2,"428":1,"439":1}}],["67",{"2":{"314":1,"545":3}}],["64",{"2":{"213":1,"432":1}}],["60000",{"2":{"235":1}}],["600",{"2":{"172":1}}],["600px",{"2":{"172":1}}],["60",{"2":{"142":2,"275":1,"314":1,"387":1,"388":1,"545":6}}],["6",{"0":{"294":1,"398":1},"2":{"116":1,"125":1,"153":1,"220":1,"222":4,"241":2,"245":1,"258":2,"259":1,"260":4,"261":2,"262":4,"263":3,"294":1,"295":2,"301":1,"302":1,"321":2,"322":2,"323":1,"325":2,"326":2,"332":2,"342":2,"347":2,"352":2,"353":1,"366":1,"383":1,"426":2,"429":1,"545":1}}],["78",{"2":{"545":1}}],["78919d98ece0",{"2":{"253":1}}],["767",{"2":{"497":1}}],["70",{"2":{"460":2,"525":1}}],["77",{"2":{"302":1}}],["7",{"0":{"295":1,"399":1},"2":{"116":2,"118":1,"154":1,"195":1,"230":1,"240":1,"247":1,"251":1,"260":1,"263":1,"288":1,"294":1,"295":1,"302":2,"303":1,"321":2,"322":2,"324":1,"332":2,"337":2,"340":1,"342":1,"343":1,"345":1,"353":3,"374":1,"387":1,"432":1}}],["7542",{"2":{"88":1}}],["400",{"2":{"522":1}}],["401",{"2":{"106":2}}],["480",{"2":{"497":1}}],["4",{"0":{"232":1,"292":1,"396":1,"463":1},"1":{"464":1,"465":1},"2":{"115":1,"125":1,"132":2,"145":2,"147":1,"149":1,"162":2,"194":2,"200":1,"201":1,"217":1,"220":1,"222":6,"229":2,"230":1,"231":1,"238":2,"240":1,"241":2,"245":1,"246":6,"247":3,"260":1,"270":1,"273":1,"294":1,"295":1,"297":1,"298":1,"302":1,"303":1,"304":1,"309":3,"318":1,"321":2,"322":2,"325":1,"326":2,"332":2,"338":2,"339":3,"342":2,"343":1,"346":2,"347":2,"349":2,"352":2,"359":1,"360":1,"367":1,"368":1,"371":2,"377":1,"386":1,"414":2,"425":2,"426":2,"428":1,"439":1,"444":1,"460":1}}],["90",{"2":{"263":1}}],["9",{"0":{"401":1},"2":{"134":1,"155":1,"167":1,"213":1,"215":1,"302":1,"308":2,"309":1,"321":2,"332":2,"419":2,"428":3,"429":1,"432":1,"435":1,"436":3,"438":1}}],["99",{"2":{"109":1,"449":3}}],["95",{"2":{"106":1,"445":1,"448":1}}],["09",{"0":{"468":1,"471":1,"474":1},"1":{"469":1,"470":1,"472":1,"473":1,"475":1}}],["04",{"2":{"213":1,"444":1}}],["0deg",{"2":{"160":1}}],["06c9c9",{"2":{"160":1}}],["000",{"2":{"258":1}}],["0001",{"2":{"125":1}}],["000000",{"2":{"262":1}}],["0000",{"2":{"125":7}}],["0",{"0":{"474":1},"1":{"475":1},"2":{"109":1,"125":12,"160":1,"213":1,"222":4,"242":1,"297":1,"298":1,"302":1,"307":2,"308":2,"309":1,"338":1,"344":1,"346":2,"347":2,"366":3,"371":1,"383":2,"387":1,"389":1,"408":5,"421":2,"426":6,"461":2,"500":2,"545":5}}],["ждать",{"2":{"387":2,"388":1,"421":1}}],["жив",{"2":{"323":2}}],["живом",{"2":{"402":1}}],["живой",{"2":{"215":1,"427":1}}],["живого",{"2":{"214":1,"425":1,"429":1}}],["живущий",{"2":{"106":1}}],["жизненно",{"2":{"276":1}}],["жизненного",{"2":{"195":1,"241":1,"273":2,"293":1,"342":1,"374":1}}],["жизненный",{"2":{"261":1,"273":1}}],["жизнь",{"2":{"215":1,"408":1,"451":1}}],["жизни",{"2":{"106":4,"350":1}}],["жить",{"2":{"191":1}}],["жирным",{"2":{"177":1}}],["жирный",{"2":{"144":1}}],["железу",{"2":{"461":1}}],["железо",{"2":{"461":1}}],["желаемым",{"2":{"415":1}}],["желаемых",{"2":{"222":1}}],["желающих",{"2":{"487":1}}],["желаю",{"2":{"363":1}}],["желательно",{"2":{"98":1,"213":1,"342":1,"460":1}}],["желании",{"2":{"40":1,"492":1,"496":1,"499":1}}],["желание",{"2":{"25":1}}],["жесткие",{"2":{"443":1}}],["жестким",{"2":{"135":1}}],["жестко",{"2":{"295":1,"451":1}}],["жесткое",{"2":{"290":1,"350":1}}],["же",{"2":{"3":1,"11":1,"12":1,"16":1,"20":1,"26":2,"33":1,"35":1,"41":1,"44":1,"48":1,"55":1,"61":1,"88":1,"96":2,"97":1,"106":2,"114":1,"115":1,"116":2,"122":1,"125":3,"126":1,"127":1,"128":1,"138":2,"140":1,"143":2,"144":1,"145":1,"147":2,"149":1,"151":1,"154":1,"158":1,"167":1,"170":1,"172":1,"177":1,"191":4,"193":1,"195":3,"199":1,"201":1,"215":1,"218":1,"221":1,"222":3,"227":1,"238":1,"240":1,"243":1,"251":1,"253":2,"255":1,"260":1,"267":1,"269":2,"271":1,"274":2,"276":2,"286":1,"287":1,"289":1,"290":1,"292":1,"293":2,"296":1,"298":3,"301":5,"302":2,"303":4,"304":1,"305":1,"306":1,"308":1,"309":1,"312":1,"314":2,"317":1,"332":2,"337":1,"339":1,"340":2,"342":2,"343":1,"344":2,"346":1,"347":3,"350":5,"352":1,"353":1,"366":1,"367":1,"371":1,"379":1,"381":1,"382":1,"383":1,"389":3,"407":1,"408":1,"409":2,"417":1,"418":1,"420":2,"421":1,"423":1,"424":1,"426":3,"428":1,"430":2,"431":1,"439":2,"444":1,"448":1,"449":3,"450":2,"451":1,"452":1,"454":1,"460":1,"461":1,"495":1,"499":1,"500":1,"503":1,"515":1,"524":1}}],["yandex",{"2":{"461":1}}],["yarnrc",{"2":{"444":2}}],["yarn",{"2":{"436":2,"443":1,"444":4}}],["yamllint",{"2":{"444":2}}],["yaml",{"2":{"408":7,"444":7}}],["yellow",{"2":{"374":1}}],["yes",{"2":{"103":6,"489":8,"494":4}}],["y=ref",{"2":{"241":1}}],["y",{"2":{"214":1,"241":4,"408":1}}],["yougithubusername",{"2":{"515":1}}],["youtube",{"2":{"63":1,"314":2,"366":1}}],["yourname",{"2":{"516":1}}],["yourself",{"0":{"274":1},"2":{"241":1,"266":1,"444":1}}],["your",{"2":{"54":1,"222":1,"408":13,"449":2}}],["√",{"2":{"103":15,"489":13,"494":5}}],["$dirs",{"2":{"408":1}}],["$backup",{"2":{"408":6}}],["$env",{"2":{"408":1}}],["$emit=defineemits",{"2":{"339":1}}],["$emit",{"2":{"115":1,"236":1,"237":2,"339":1}}],["$project",{"2":{"408":3}}],["$props=defineprops",{"2":{"339":1,"342":1}}],["$props",{"2":{"115":1,"160":2,"236":3,"237":2,"246":3,"304":2,"305":2,"339":2,"342":2,"374":1}}],["$github",{"2":{"408":5}}],["$target",{"2":{"408":8}}],["$sessionstorage",{"2":{"353":3}}],["$service",{"2":{"238":2}}],["$store",{"2":{"349":5}}],["$store=usecounterstore",{"2":{"349":1}}],["$store=usestore",{"2":{"206":1}}],["$state",{"2":{"344":4}}],["$root",{"2":{"408":3}}],["$route",{"2":{"377":2,"380":3,"385":3}}],["$router",{"2":{"206":1,"377":3,"378":4,"380":4}}],["$received",{"2":{"238":1}}],["$notifications",{"2":{"206":1}}],["$modals",{"2":{"206":1,"246":11,"247":1}}],["$uri",{"2":{"132":2}}],["$",{"2":{"103":2,"206":1,"340":1,"342":1,"345":1,"408":15,"412":1,"433":2,"434":2,"437":6,"438":5,"444":96,"490":2,"491":3}}],[">home",{"2":{"374":1}}],[">decrement",{"2":{"344":1,"349":1}}],[">increment",{"2":{"344":1}}],[">install",{"2":{"260":1}}],[">search",{"2":{"374":1}}],[">send",{"2":{"330":1,"342":1}}],[">save",{"2":{"325":1}}],[">cancel",{"2":{"246":1}}],[">completed",{"2":{"222":1}}],[">accept",{"2":{"246":1}}],[">no",{"2":{"222":1}}],[">pending",{"2":{"222":1}}],[">print",{"2":{"202":2}}],[">edit",{"2":{"203":1}}],[">",{"2":{"97":2,"99":3,"160":1,"162":2,"165":4,"192":2,"197":1,"198":1,"200":1,"201":1,"203":1,"217":1,"218":4,"221":2,"222":20,"237":2,"240":12,"242":2,"246":3,"255":1,"260":2,"298":1,"305":2,"325":5,"330":3,"338":4,"339":2,"349":2,"374":3,"377":4,"408":1,"411":8,"412":4,"413":2,"444":1,"459":2,"483":2,"497":5,"501":3,"517":2,"522":3,"526":2,"540":15}}],[">>",{"2":{"97":1,"98":1,"408":5}}],["⌥",{"2":{"81":2}}],["+page",{"2":{"444":6}}],["+layout",{"2":{"444":7}}],["+$backups",{"2":{"408":1}}],["++id",{"2":{"326":1}}],["+f",{"2":{"307":1}}],["+=",{"2":{"162":1}}],["+",{"2":{"81":4,"149":1,"191":1,"214":1,"263":1,"302":1,"308":2,"309":7,"332":1,"360":1,"383":2,"384":2,"386":1,"408":1,"414":2}}],["qbutton",{"2":{"459":1}}],["qa",{"0":{"71":1},"2":{"66":1}}],["quasar",{"2":{"444":2,"445":1}}],["quality",{"0":{"76":1}}],["quiet",{"2":{"444":1}}],["quicktime",{"2":{"190":1}}],["questions",{"2":{"485":1}}],["queue",{"2":{"321":9}}],["queuebuilder",{"2":{"207":1}}],["queryselector",{"2":{"426":1}}],["query",{"2":{"20":1,"332":2,"378":2,"380":2,"384":4,"385":2,"457":1}}],["quot",{"0":{"197":2,"242":2,"357":2},"2":{"2":4,"4":2,"9":2,"11":2,"23":2,"41":6,"58":2,"63":2,"64":4,"86":2,"96":10,"97":2,"98":4,"99":4,"103":2,"106":2,"107":4,"115":6,"116":2,"125":6,"126":4,"128":4,"138":2,"141":2,"142":6,"143":8,"145":6,"146":2,"147":2,"148":2,"149":4,"150":4,"153":6,"154":4,"155":2,"157":2,"158":2,"159":12,"161":2,"162":2,"164":4,"165":2,"169":2,"170":2,"172":4,"173":4,"174":4,"178":6,"179":2,"187":2,"188":2,"191":6,"192":6,"193":2,"194":4,"195":8,"203":4,"211":2,"213":2,"215":2,"218":8,"220":4,"222":2,"223":6,"232":2,"235":2,"238":8,"240":2,"241":2,"246":4,"247":2,"253":8,"261":2,"262":4,"263":2,"266":2,"272":2,"276":2,"277":2,"289":2,"297":4,"299":4,"301":2,"302":2,"303":2,"306":2,"308":6,"309":2,"312":2,"314":14,"319":2,"321":4,"324":2,"332":2,"337":4,"358":2,"366":4,"371":8,"374":2,"375":6,"377":4,"380":2,"383":30,"387":4,"388":4,"389":8,"417":4,"418":4,"421":4,"422":4,"425":2,"427":2,"430":4,"435":2,"438":2,"448":6,"449":8,"451":4,"452":4,"456":2,"460":5,"461":6,"489":8,"492":2,"495":2,"506":2,"515":14,"524":8,"534":2,"536":2}}],["xshell",{"2":{"444":1}}],["xss",{"2":{"106":1}}],["xo",{"2":{"444":4}}],["xaml",{"2":{"444":2}}],["xdv",{"2":{"444":1}}],["xcode",{"2":{"434":1}}],["xyz",{"2":{"235":1}}],["x26",{"2":{"222":2,"260":2,"325":2,"328":4,"387":2,"408":4,"444":1,"497":2}}],["xmlhttprequest",{"2":{"381":1,"461":1}}],["xml",{"2":{"130":1,"306":1,"381":1,"444":4}}],["xhr",{"2":{"105":1,"499":1}}],["x3c",{"2":{"83":2,"97":8,"98":2,"99":4,"114":9,"130":4,"160":10,"162":8,"192":12,"194":8,"195":8,"197":1,"198":2,"200":2,"201":1,"202":4,"203":8,"217":1,"218":5,"221":9,"222":46,"237":4,"240":54,"242":6,"246":22,"255":1,"260":6,"273":2,"298":1,"304":8,"305":7,"308":4,"309":3,"325":33,"328":2,"330":29,"338":20,"339":10,"342":12,"344":15,"349":14,"353":6,"374":20,"377":12,"387":1,"411":20,"412":4,"413":8,"444":1,"459":4,"497":10,"501":7,"517":5,"522":8,"526":8,"540":15}}],["x",{"2":{"55":2,"121":1,"141":1,"147":1,"154":1,"184":1,"325":1,"448":2,"504":1}}],["=+",{"2":{"444":1}}],["==",{"2":{"222":3,"246":1,"408":3}}],["=>return",{"2":{"347":1}}],["=>",{"2":{"162":1,"222":4,"235":5,"241":2,"246":6,"260":1,"261":2,"273":2,"298":1,"308":1,"309":16,"315":2,"316":2,"317":1,"321":2,"322":4,"323":4,"325":5,"326":3,"328":4,"330":1,"332":3,"342":2,"346":3,"347":2,"352":1,"371":1,"374":3,"375":3,"377":3,"386":1,"387":1,"389":2,"408":2,"413":2,"421":2,"422":2,"423":1,"425":2,"426":2,"526":1}}],["=",{"2":{"54":4,"60":2,"88":1,"97":2,"98":2,"105":5,"111":2,"112":2,"114":6,"115":2,"127":1,"160":1,"162":3,"191":1,"192":1,"195":3,"203":2,"222":5,"235":4,"236":4,"237":4,"238":4,"241":1,"242":1,"246":18,"260":7,"261":4,"286":1,"287":1,"289":1,"290":1,"291":1,"292":1,"293":3,"294":2,"295":1,"296":2,"298":6,"302":7,"304":1,"305":1,"307":3,"308":12,"309":14,"315":4,"316":1,"317":2,"321":7,"322":2,"323":1,"326":2,"327":1,"328":1,"329":1,"330":3,"332":6,"338":1,"341":1,"344":2,"346":1,"347":3,"348":1,"352":5,"353":1,"371":2,"374":1,"377":2,"382":2,"384":2,"385":1,"386":1,"408":1,"411":3,"413":3,"414":6,"421":2,"425":1,"427":1,"448":6,"449":1,"451":1,"497":1,"499":3,"500":2,"501":2,"517":1,"526":3}}],["jl65gwrnqq",{"2":{"517":2}}],["j",{"2":{"443":1}}],["jpg",{"2":{"414":1}}],["jpeg",{"2":{"407":1}}],["jest",{"2":{"421":1,"444":10,"450":1}}],["jenkins",{"2":{"405":1,"444":2}}],["jetbrains",{"2":{"213":1}}],["justify",{"2":{"221":1}}],["jasmine",{"2":{"444":10}}],["jamesives",{"2":{"408":3,"515":1}}],["javascirpt",{"2":{"359":1}}],["javascript",{"0":{"478":1},"2":{"44":1,"107":1,"114":1,"116":1,"161":1,"162":1,"172":1,"190":3,"191":2,"192":3,"193":4,"194":5,"195":4,"197":1,"199":1,"200":1,"201":2,"202":2,"209":1,"212":1,"213":1,"214":2,"215":2,"216":4,"219":2,"222":1,"235":3,"240":1,"261":1,"270":3,"271":1,"272":1,"273":2,"274":1,"283":1,"285":3,"286":2,"294":1,"297":1,"301":1,"303":1,"306":1,"307":2,"309":1,"310":1,"312":1,"314":9,"315":1,"321":1,"326":1,"327":1,"334":1,"343":1,"344":1,"350":1,"352":3,"354":1,"360":1,"366":2,"368":1,"377":1,"381":1,"383":1,"389":2,"391":1,"394":1,"401":1,"412":1,"420":1,"421":2,"422":1,"423":2,"424":1,"427":2,"443":2,"444":2,"445":1,"448":4,"449":2,"451":1,"452":1,"459":3,"460":7,"461":4,"478":1,"492":1,"497":1,"528":1}}],["java",{"2":{"190":1,"195":1,"285":1,"444":1}}],["jane",{"2":{"114":1}}],["jobs",{"2":{"408":2}}],["jo",{"2":{"383":1}}],["john",{"2":{"114":1,"236":1,"524":1}}],["join",{"0":{"47":1},"2":{"48":1}}],["jwts",{"2":{"383":1}}],["jwt",{"2":{"106":4,"383":8,"484":2,"533":1}}],["jsscripts",{"2":{"429":1}}],["jsself",{"2":{"316":1}}],["jstest",{"2":{"422":1,"423":1,"428":1}}],["jsethereum",{"2":{"389":1}}],["jseventbus",{"2":{"374":1}}],["jsexport",{"2":{"113":1,"219":1,"411":1,"424":1,"427":2,"516":1}}],["jslint",{"2":{"444":2}}],["jslocation",{"2":{"384":1}}],["jslocalstorage",{"2":{"350":1}}],["jslet",{"2":{"302":1,"309":3,"315":1,"350":1}}],["jsasync",{"2":{"309":1}}],["jsmyfunction",{"2":{"309":1}}],["jsfibonaccisync",{"2":{"308":1}}],["jsf",{"2":{"307":1}}],["jsfunction",{"2":{"296":1,"308":2,"309":1}}],["jsdom",{"2":{"424":3}}],["jsdoc",{"0":{"83":1},"2":{"83":2}}],["jsdescribe",{"2":{"421":1}}],["jsdispatcher",{"2":{"298":1}}],["jsif",{"2":{"261":1,"315":1,"427":1}}],["jsimport",{"2":{"54":1,"105":3,"111":2,"112":3,"127":1,"219":2,"222":1,"234":2,"235":1,"238":4,"241":2,"246":3,"260":1,"262":1,"287":1,"289":1,"292":1,"293":1,"295":2,"298":2,"317":1,"321":1,"322":1,"323":1,"326":1,"327":1,"328":1,"329":1,"341":1,"344":1,"346":1,"348":1,"352":1,"371":1,"372":1,"374":1,"377":1,"381":1,"382":1,"385":1,"386":1,"412":1,"421":1,"425":1,"426":1,"443":1,"499":1,"526":1}}],["js$",{"2":{"381":1}}],["js$props",{"2":{"374":1}}],["js$modals",{"2":{"246":1}}],["js$emit",{"2":{"236":1}}],["jsx",{"2":{"240":1,"444":3}}],["jspending",{"2":{"222":1}}],["jsconfig",{"2":{"444":11}}],["jsconsole",{"2":{"303":1,"308":2,"309":1}}],["jsconst",{"2":{"88":1,"98":1,"115":1,"235":3,"236":4,"237":2,"238":1,"246":1,"286":1,"290":1,"291":1,"294":1,"323":1,"332":1,"384":1,"387":1,"408":1,"414":1,"448":2}}],["jsclass",{"2":{"287":1,"293":1,"298":1,"300":1}}],["jscreateapp",{"2":{"113":1}}],["js",{"0":{"127":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"298":1,"300":1,"302":1,"308":1,"316":1,"317":1,"321":1,"322":1,"323":1,"326":1,"327":1,"328":1,"329":1,"332":1,"341":1,"344":1,"347":1,"348":1,"352":1,"356":1,"357":1,"371":1,"372":1,"414":1,"421":1,"425":1,"426":1},"1":{"357":1,"358":1,"359":1,"360":1,"361":1,"362":1,"363":1},"2":{"12":1,"53":1,"54":1,"75":1,"83":1,"89":1,"97":1,"103":3,"105":4,"106":1,"107":3,"111":1,"113":1,"139":1,"193":2,"195":1,"213":5,"214":1,"215":4,"216":2,"219":5,"222":2,"226":1,"234":3,"241":3,"246":8,"247":6,"252":1,"261":3,"262":2,"288":1,"290":1,"292":2,"293":5,"298":2,"312":2,"313":1,"315":4,"316":1,"317":1,"321":2,"323":1,"325":1,"330":2,"331":4,"336":1,"347":2,"350":1,"358":1,"360":1,"362":1,"365":1,"370":1,"371":2,"375":1,"377":1,"378":1,"380":1,"407":1,"410":1,"412":4,"414":1,"416":1,"419":2,"420":5,"421":2,"423":2,"424":1,"427":2,"428":1,"443":3,"444":21,"445":2,"447":1,"448":3,"449":1,"451":3,"452":1,"460":4,"461":1,"464":1,"485":1,"486":1,"496":1,"497":1,"499":1,"500":2,"517":3,"543":3}}],["jsonrpc",{"2":{"489":1,"500":6}}],["json5",{"2":{"444":1}}],["jsonc",{"2":{"444":1}}],["jsonmounted",{"2":{"374":1}}],["jsonp",{"2":{"332":3}}],["jsonplaceholder",{"2":{"107":1,"499":1}}],["json",{"0":{"18":1,"19":1,"38":1,"48":1,"500":1,"542":1},"2":{"6":1,"11":1,"17":5,"18":2,"19":1,"38":1,"47":2,"48":1,"55":1,"75":1,"86":1,"94":2,"98":2,"103":2,"105":1,"107":1,"109":9,"215":3,"255":4,"258":2,"286":1,"287":1,"292":1,"322":1,"325":4,"326":1,"327":1,"328":1,"331":1,"332":5,"350":2,"382":1,"383":2,"408":4,"412":1,"414":4,"420":3,"428":4,"429":1,"436":1,"443":4,"444":50,"460":1,"461":2,"489":5,"492":1,"499":1,"500":6,"526":1,"527":1,"530":1,"542":2}}],["rgba",{"2":{"545":6}}],["richfooter",{"0":{"510":1}}],["right",{"2":{"504":1}}],["rip",{"2":{"449":1}}],["rspack",{"2":{"444":12}}],["rc",{"2":{"444":1}}],["r",{"2":{"408":2,"449":1,"485":2}}],["rf",{"2":{"408":4}}],["rm",{"2":{"408":3}}],["rxdb",{"2":{"324":1}}],["raw",{"2":{"412":2,"414":1,"443":1}}],["ram",{"2":{"360":1}}],["range=ref",{"2":{"347":1}}],["range",{"2":{"346":1,"349":3,"422":1}}],["randomuuid",{"2":{"321":1}}],["random",{"2":{"242":1}}],["radius",{"2":{"160":1}}],["radio",{"2":{"153":1,"330":2}}],["rush",{"2":{"444":1}}],["rust",{"2":{"444":1}}],["rustfmt",{"2":{"444":2}}],["ruby",{"2":{"444":1}}],["ru",{"2":{"444":3,"460":1,"485":2}}],["rules",{"2":{"444":2}}],["rule",{"2":{"142":1}}],["runs",{"2":{"408":2}}],["runcommand",{"2":{"300":1}}],["runlog",{"2":{"238":2}}],["run",{"2":{"127":1,"214":1,"215":4,"217":1,"222":1,"408":9,"419":1,"420":3,"421":4,"428":1,"429":1}}],["roboto",{"2":{"545":1}}],["robots",{"2":{"215":1}}],["rollupjs",{"2":{"219":1}}],["rollup",{"2":{"219":1,"443":2,"444":2}}],["role",{"2":{"106":1}}],["roach",{"0":{"179":1}}],["row",{"2":{"172":1,"497":1}}],["rotate",{"2":{"160":4}}],["root",{"2":{"132":1,"408":1,"414":1,"545":1}}],["route",{"2":{"378":6}}],["routeview",{"2":{"376":3,"377":1}}],["routes",{"0":{"88":1},"2":{"88":2,"127":1,"368":1,"371":3,"409":1,"411":1}}],["routerlink>",{"2":{"374":3,"377":1}}],["routerlink",{"2":{"373":1,"374":4,"376":1,"377":2,"378":1}}],["routerview>",{"2":{"377":4}}],["routerview",{"2":{"373":1,"377":3}}],["routerecordraw",{"2":{"88":1}}],["router",{"0":{"127":1,"370":1,"371":1},"1":{"371":1,"372":1},"2":{"3":1,"20":1,"34":1,"110":1,"126":2,"127":2,"128":1,"130":1,"133":1,"136":1,"137":1,"235":3,"242":1,"318":1,"359":1,"360":1,"364":2,"367":1,"368":2,"370":1,"371":7,"372":3,"374":4,"377":2,"380":2,"385":1,"397":1,"411":4,"492":1,"535":1}}],["routing",{"0":{"7":1,"535":1},"2":{"11":1}}],["rbac",{"2":{"106":1}}],["rtl",{"2":{"448":1,"524":1}}],["rt",{"2":{"106":4,"484":1}}],["rpc",{"0":{"500":1},"2":{"103":1,"105":1,"109":9,"460":1,"489":1,"499":1,"500":5,"530":1}}],["rehydration",{"2":{"461":1}}],["remix",{"2":{"444":2}}],["remote",{"2":{"408":7,"439":1,"444":5}}],["removed",{"2":{"408":1}}],["removed=`ls",{"2":{"408":1}}],["remove",{"2":{"408":2}}],["removeroute",{"2":{"380":1}}],["removeitem",{"2":{"350":1}}],["removeeventlistener",{"2":{"241":1,"273":1}}],["renovate",{"2":{"444":2}}],["rendering",{"2":{"461":1}}],["renderwhitespace",{"2":{"444":1}}],["render",{"2":{"407":1}}],["renderer",{"2":{"314":1}}],["recentchange",{"2":{"444":1}}],["receiver",{"2":{"352":1}}],["received",{"2":{"330":5}}],["recursive",{"2":{"408":1}}],["reilly",{"2":{"361":1}}],["reddit",{"2":{"449":1,"485":1}}],["redis",{"2":{"449":1}}],["redirect",{"2":{"384":1}}],["red",{"2":{"349":3}}],["req",{"2":{"332":5}}],["requiresauth",{"2":{"411":1}}],["required",{"2":{"385":1,"408":1}}],["require",{"2":{"332":2}}],["requirements",{"2":{"68":1}}],["requestaccounts",{"2":{"389":1}}],["requestotp",{"2":{"387":1}}],["request",{"2":{"105":1,"130":2,"261":3,"321":2,"323":2,"325":3,"330":1,"332":2,"385":1,"389":1}}],["re",{"2":{"267":1}}],["repo",{"2":{"444":1}}],["repository",{"2":{"433":1}}],["reporter",{"2":{"428":1}}],["representation",{"2":{"412":1}}],["representational",{"2":{"327":1,"381":1}}],["replit",{"2":{"444":1}}],["replace",{"0":{"379":1}}],["replacement",{"2":{"214":1}}],["reply=>",{"2":{"330":1}}],["repeat",{"0":{"274":1},"2":{"266":1,"300":1}}],["registertype",{"2":{"262":1}}],["register",{"2":{"261":1,"449":1}}],["rejects",{"2":{"423":1}}],["reject",{"2":{"232":1,"235":1,"246":6,"309":7,"321":6,"323":1,"326":6,"328":6}}],["readme",{"2":{"444":2}}],["ready",{"2":{"260":4}}],["read",{"2":{"231":1,"449":1}}],["reactivity",{"0":{"351":1},"1":{"352":1,"353":1},"2":{"449":1,"451":2}}],["reactive",{"2":{"114":7,"246":6,"301":1,"335":1,"343":1,"344":3,"352":3,"448":6,"449":6,"451":2}}],["react",{"2":{"191":1,"366":1,"451":6,"460":2}}],["release",{"2":{"444":4}}],["releaserc",{"2":{"444":2}}],["related",{"2":{"262":1}}],["relative",{"2":{"99":1}}],["rel",{"2":{"255":1}}],["rel=",{"2":{"217":1,"218":3,"255":1}}],["reload",{"2":{"215":1,"408":1}}],["rewritecond",{"2":{"130":2}}],["rewriterule",{"2":{"130":2}}],["rewritebase",{"2":{"130":2}}],["rewriteengine",{"2":{"130":1}}],["rewrite",{"2":{"130":1}}],["resx",{"2":{"444":2}}],["res",{"2":{"332":6}}],["results",{"2":{"421":2}}],["result=>",{"2":{"328":2,"386":1,"387":2}}],["result=await",{"2":{"326":1}}],["result",{"2":{"309":8,"322":2,"326":3,"328":6,"386":1,"387":2,"389":2,"421":2}}],["resize",{"2":{"273":3}}],["responsibility",{"0":{"271":1},"2":{"266":1}}],["responsive",{"0":{"172":1},"2":{"253":1}}],["response=>",{"2":{"382":1}}],["response",{"2":{"261":3,"382":2,"384":1,"408":2}}],["respondwith",{"2":{"261":1}}],["resolver",{"2":{"443":1,"444":1}}],["resolves",{"2":{"423":3}}],["resolve",{"2":{"219":2,"232":1,"235":3,"246":6,"309":9,"321":6,"323":2,"326":6,"328":4,"423":1,"443":2}}],["resource",{"2":{"108":1,"412":2}}],["restful",{"2":{"327":2,"381":1}}],["rest",{"0":{"51":1,"55":1,"109":2,"499":1},"1":{"52":1,"53":1,"54":1,"55":1},"2":{"40":1,"50":1,"55":3,"57":1,"58":2,"94":1,"103":1,"105":1,"109":2,"381":1,"489":1,"499":1,"500":2}}],["ref=",{"2":{"162":1}}],["refresh",{"2":{"106":1,"484":1}}],["ref",{"2":{"97":2,"98":1,"114":6,"162":3,"195":7,"203":2,"222":5,"241":1,"260":4,"301":1,"325":1,"330":4,"338":2,"342":1,"347":2,"382":3,"448":7,"449":5,"451":2,"499":1}}],["refactor",{"0":{"83":1},"2":{"83":1}}],["return",{"2":{"83":2,"97":3,"105":1,"113":2,"192":1,"195":2,"222":2,"235":1,"241":1,"242":1,"246":3,"247":3,"261":2,"287":2,"289":1,"290":1,"291":1,"294":2,"296":2,"298":1,"302":3,"308":1,"309":7,"321":1,"323":1,"326":3,"328":2,"344":1,"346":3,"347":4,"352":5,"371":1,"413":2,"414":2,"499":1,"500":1}}],["returns",{"2":{"83":4}}],["return=minimal",{"2":{"55":1}}],["rdbms",{"2":{"39":1}}],["fcp",{"2":{"461":1}}],["fetish",{"2":{"450":1}}],["fetch",{"2":{"41":1,"105":1,"261":2,"381":1,"408":1,"495":1,"499":1}}],["ferferga",{"2":{"449":1}}],["fdb",{"2":{"444":1}}],["ftcms",{"2":{"363":1}}],["ftp",{"2":{"134":2}}],["fps",{"2":{"314":2}}],["fnc",{"2":{"445":1,"448":1}}],["fn",{"2":{"263":1,"298":4}}],["f12",{"2":{"263":2}}],["flow",{"2":{"481":1}}],["flowconfig",{"2":{"444":2}}],["flake",{"2":{"444":2}}],["flash",{"2":{"190":1}}],["fls",{"2":{"444":1}}],["flipcoin",{"2":{"242":3}}],["flex",{"2":{"93":1,"172":4,"221":2,"222":3,"497":3}}],["flexbox",{"2":{"35":1,"93":1,"172":1,"457":1,"480":2}}],["frequently",{"2":{"485":1}}],["freezed",{"2":{"444":1}}],["free",{"2":{"142":1}}],["framework",{"2":{"301":1,"360":1}}],["frontier",{"2":{"135":1}}],["from",{"2":{"54":4,"83":2,"97":3,"105":9,"111":2,"112":6,"114":1,"127":1,"162":1,"195":2,"203":3,"219":2,"221":1,"222":1,"234":4,"235":4,"238":4,"241":2,"242":2,"246":8,"260":1,"262":3,"273":1,"287":2,"289":1,"292":2,"293":4,"295":5,"298":2,"305":1,"317":2,"321":1,"322":1,"323":1,"325":2,"326":1,"327":1,"328":1,"329":1,"330":2,"338":2,"341":1,"342":2,"344":2,"346":1,"347":2,"348":3,"349":1,"352":1,"353":1,"371":3,"372":5,"374":2,"377":1,"381":1,"382":2,"385":1,"386":1,"412":3,"413":2,"414":2,"421":3,"425":3,"426":3,"443":2,"497":1,"499":2,"500":5,"501":2,"515":1,"526":2}}],["f",{"2":{"130":1,"307":3}}],["family",{"2":{"545":1}}],["fail",{"2":{"422":1}}],["fallback",{"2":{"414":1}}],["false",{"2":{"105":1,"153":2,"222":2,"246":2,"260":2,"262":1,"322":1,"346":1,"387":1,"408":2,"444":27,"449":1,"489":4}}],["fahrenheit",{"2":{"302":7}}],["factory",{"0":{"296":1},"2":{"279":1}}],["facebook",{"2":{"191":1,"386":1,"540":1}}],["façade",{"0":{"306":1},"2":{"266":1,"281":1,"306":1,"309":1,"350":1}}],["fa",{"2":{"218":2,"222":6}}],["favicon",{"2":{"215":1}}],["favourites",{"2":{"83":2,"88":3,"97":7,"98":3,"99":1}}],["favorite",{"2":{"83":3}}],["faq",{"2":{"168":1,"408":1,"485":1}}],["fix",{"2":{"444":1}}],["fixall",{"2":{"444":2}}],["field",{"2":{"414":2}}],["finance",{"2":{"524":1}}],["finally",{"2":{"309":2,"325":2}}],["find",{"2":{"426":4,"444":1,"526":1}}],["fingerprint",{"2":{"106":1}}],["fibonaccioutput",{"0":{"425":1},"2":{"419":2,"424":1,"425":3}}],["fibonacciinput",{"0":{"426":1},"2":{"419":2,"426":3}}],["fibonacci",{"0":{"421":1},"2":{"419":2,"420":3,"421":12,"422":2}}],["fibonaccipromise",{"2":{"309":2,"421":2,"423":2}}],["fibonacciasync",{"2":{"308":2}}],["fibonaccisync",{"2":{"308":3}}],["fill",{"2":{"413":1}}],["filter",{"2":{"222":2,"247":1}}],["filenesting",{"2":{"444":3}}],["filename2",{"2":{"435":1}}],["filename1",{"2":{"435":1}}],["filename",{"2":{"130":2,"235":1,"315":1,"414":10}}],["filelistlayout",{"2":{"444":1}}],["file=",{"2":{"408":1}}],["filehippo",{"2":{"186":2}}],["filezilla",{"2":{"134":1}}],["file",{"2":{"134":1,"143":1,"408":2,"435":1,"444":2}}],["files",{"2":{"103":1,"132":1,"215":1,"408":1,"444":3}}],["fi",{"2":{"169":1,"408":2}}],["fitts",{"2":{"147":1}}],["fira",{"2":{"444":1}}],["first",{"2":{"172":1,"206":1,"444":1,"522":1,"543":1}}],["firstname",{"2":{"47":1}}],["firesbase",{"2":{"533":1}}],["firestore",{"2":{"460":1}}],["firefox",{"2":{"116":1,"213":1,"314":1,"360":1}}],["firebase",{"2":{"39":2,"41":1,"107":2,"407":2,"444":4,"533":1}}],["font",{"2":{"545":1}}],["fontweight",{"2":{"444":1}}],["fontligatures",{"2":{"444":1}}],["fontfamily",{"2":{"444":1}}],["fontaliasing",{"2":{"444":1}}],["fontawesome",{"0":{"218":1},"2":{"218":6}}],["fonts",{"2":{"262":1,"543":1}}],["found",{"2":{"261":3}}],["foundation",{"2":{"135":1}}],["foot",{"2":{"253":1}}],["footers",{"0":{"508":1},"1":{"509":1,"510":1,"511":1,"512":1,"513":1}}],["footer>",{"2":{"246":2}}],["footer",{"0":{"32":1},"2":{"28":1,"103":1,"489":2,"496":2,"530":1,"533":1}}],["folder",{"2":{"408":1}}],["fold",{"2":{"174":1}}],["fork",{"2":{"483":1}}],["foreign",{"2":{"449":1}}],["foreach",{"2":{"322":1}}],["formulate",{"2":{"444":10}}],["formkit",{"2":{"444":10}}],["formatters",{"2":{"448":2}}],["formatter",{"2":{"444":1}}],["formatting",{"2":{"444":1,"448":1}}],["formatonsave",{"2":{"444":1}}],["format",{"2":{"408":3,"444":2}}],["forward",{"2":{"380":1}}],["for=",{"2":{"162":1,"200":1,"222":2,"325":1,"374":1,"377":1}}],["for",{"0":{"200":1,"276":1},"1":{"279":1,"280":1,"281":1,"282":1},"2":{"54":1,"103":1,"125":1,"142":1,"149":1,"162":1,"172":2,"200":1,"203":1,"222":2,"266":1,"298":1,"308":2,"309":1,"408":1,"414":2,"444":1,"461":1,"489":1}}],["fullpath",{"2":{"380":1}}],["fullscreen",{"2":{"256":2}}],["function",{"2":{"83":4,"97":4,"162":1,"222":2,"238":1,"241":2,"242":1,"246":1,"247":1,"260":3,"273":1,"302":2,"309":1,"322":1,"325":4,"330":1,"338":1,"339":1,"342":2,"344":1,"347":2,"352":2,"382":1,"386":1,"387":3,"414":3,"421":2,"517":1,"526":1}}],["functions",{"2":{"40":1,"107":2,"449":1}}],["fu",{"2":{"20":1,"444":1,"492":1}}],["l",{"2":{"130":2,"173":1,"298":2,"526":2}}],["learn",{"2":{"460":1}}],["learning",{"2":{"142":1}}],["leex",{"2":{"444":1}}],["less",{"2":{"444":1}}],["lerna",{"2":{"436":1,"444":2}}],["left",{"2":{"222":2}}],["level",{"2":{"165":6}}],["let",{"0":{"135":1},"2":{"122":1,"135":3,"136":1,"254":1,"296":1,"298":2,"308":4,"309":3,"315":1,"321":2,"326":2,"352":2,"387":1,"402":1,"414":1,"421":1,"426":2}}],["length==0",{"2":{"222":1}}],["length",{"2":{"97":1,"99":1,"222":6,"298":1,"414":2}}],["lts",{"2":{"213":1,"360":1}}],["lt",{"2":{"83":1,"113":1,"215":1,"221":1,"242":1,"347":1,"374":3,"438":4,"444":1}}],["license",{"2":{"444":1}}],["limit",{"2":{"444":3}}],["lib",{"2":{"444":1}}],["live",{"2":{"427":1}}],["life",{"2":{"195":1}}],["lifecycle",{"2":{"66":1}}],["lintstagedrc",{"2":{"444":2}}],["lint",{"2":{"444":4}}],["line",{"2":{"444":1}}],["linenumbers",{"2":{"444":1}}],["lineno",{"2":{"315":1}}],["lines",{"0":{"377":1}}],["linear",{"2":{"160":1}}],["link",{"2":{"217":2,"218":3,"255":1,"363":1}}],["linux",{"0":{"433":1},"2":{"128":2,"131":3,"134":1,"155":1,"213":2,"253":1,"263":1,"314":1,"360":5,"431":2,"433":1,"444":1}}],["lighthouserc",{"2":{"444":20}}],["lighthouse",{"0":{"263":1},"2":{"251":1,"263":3,"264":1}}],["light",{"2":{"103":1,"222":1,"240":1}}],["like",{"2":{"83":1,"449":2}}],["listening",{"2":{"332":1}}],["listen",{"2":{"132":1,"332":1}}],["list",{"2":{"83":3,"220":1,"222":8,"443":1,"444":1}}],["listfavourites",{"2":{"83":3,"97":5,"98":1,"99":1}}],["latexmk",{"2":{"444":1}}],["latest",{"2":{"214":1,"408":2}}],["landing",{"2":{"371":5,"374":1}}],["lang",{"2":{"257":1}}],["language",{"2":{"206":1,"230":1,"444":1}}],["lang=",{"2":{"97":1,"194":1,"413":1,"497":1,"501":1,"526":1}}],["lastindexof",{"2":{"414":2}}],["last",{"2":{"236":2,"444":1}}],["lastname",{"2":{"47":1}}],["label+",{"2":{"305":1}}],["label",{"2":{"222":3,"304":4,"305":1}}],["label>",{"2":{"222":4,"330":4}}],["law",{"2":{"147":1}}],["lamda",{"2":{"107":1}}],["lambda",{"2":{"107":1}}],["layer",{"2":{"103":1,"382":1,"489":1}}],["layouts",{"2":{"409":1}}],["layout",{"0":{"93":1},"2":{"27":1,"36":1,"103":1,"240":1,"377":1,"489":2,"530":1,"533":1,"536":1,"545":1}}],["lot",{"2":{"444":1}}],["lof",{"2":{"444":1}}],["loadicons",{"2":{"414":2}}],["loadingerror",{"2":{"235":2}}],["loadingcomponent",{"2":{"235":3}}],["loading",{"2":{"105":2,"198":3}}],["loadproject",{"2":{"374":2}}],["loadnotes",{"2":{"325":4}}],["loader",{"2":{"235":2}}],["lock",{"2":{"215":1,"444":13}}],["location",{"2":{"132":2,"384":1,"408":1}}],["locale",{"2":{"526":3}}],["locales",{"2":{"526":3}}],["local",{"2":{"436":1}}],["localstore",{"2":{"350":1}}],["localstoragename",{"2":{"408":3}}],["localstorage",{"2":{"98":4,"106":2,"260":1,"350":4,"355":2,"369":1,"374":1,"408":3,"545":1}}],["localhost",{"2":{"125":1,"214":1,"261":1,"328":1,"332":2}}],["lookup",{"2":{"318":1}}],["loopback",{"2":{"125":3}}],["loosely",{"2":{"2":1}}],["logic",{"2":{"449":2}}],["login",{"2":{"88":1,"449":1}}],["logs",{"2":{"408":1,"444":1}}],["log",{"2":{"238":1,"287":1,"302":1,"303":1,"308":7,"309":8,"315":1,"316":1,"332":1,"382":2,"389":2,"408":1,"436":6,"444":1,"448":1}}],["logmessage",{"2":{"238":2}}],["logout",{"2":{"105":1,"449":1}}],["low",{"2":{"39":1}}],["шпаргалки",{"0":{"476":1},"1":{"477":1,"478":1,"479":1,"480":1,"481":1,"482":1}}],["шкалы",{"2":{"314":1}}],["шкале",{"2":{"303":1}}],["шлюз",{"2":{"284":1}}],["шлюза",{"2":{"283":1}}],["шнайдермане",{"2":{"149":1}}],["шнайдерман",{"2":{"149":1}}],["шнайдермана",{"0":{"149":1}}],["шестнадцатеричных",{"2":{"125":1}}],["шифрующая",{"2":{"383":1}}],["шифрованного",{"2":{"382":1}}],["шифрования",{"2":{"135":2,"383":1}}],["шиной",{"2":{"340":1,"374":1}}],["шину",{"2":{"339":1,"340":1}}],["шины",{"0":{"340":1},"1":{"341":1,"342":1},"2":{"335":1,"340":1,"341":1,"343":1}}],["шина",{"2":{"109":1,"340":1,"355":1}}],["широкие",{"2":{"381":1}}],["широкий",{"2":{"140":2,"288":1}}],["широком",{"2":{"300":1,"318":1}}],["широкое",{"2":{"138":1,"218":1}}],["широко",{"2":{"128":1,"129":1,"168":1,"173":1,"184":1,"282":1,"309":1,"382":1}}],["широкого",{"2":{"41":1,"167":1,"495":1}}],["ширина",{"2":{"536":1}}],["ширине",{"2":{"172":1}}],["ширину",{"2":{"93":1,"164":1,"222":1}}],["ширины",{"2":{"93":1}}],["шторки",{"2":{"530":1}}],["шторка",{"2":{"530":1}}],["шторок",{"2":{"505":1}}],["штраф",{"2":{"327":1}}],["штатном",{"2":{"444":1}}],["штатную",{"2":{"86":1}}],["штата",{"2":{"375":1}}],["штатов",{"2":{"375":1}}],["штат",{"2":{"375":1}}],["штабелируемыми",{"2":{"303":1}}],["штука",{"2":{"109":1}}],["штукатурки",{"2":{"26":1}}],["шаге",{"2":{"231":1,"303":1,"383":1,"385":1,"386":1}}],["шагу",{"2":{"229":1}}],["шагом",{"2":{"214":1,"217":1,"221":1,"228":1,"231":1,"251":1,"321":1,"324":1,"384":1,"387":1,"395":1,"435":1}}],["шагов",{"2":{"66":1,"122":1,"135":1,"159":1,"213":1,"382":1,"386":1,"389":1,"439":1}}],["шаги",{"2":{"212":1,"213":2,"214":1,"217":1,"225":1,"246":1,"383":1,"438":1,"439":2}}],["шаг",{"0":{"230":1,"231":1,"232":1},"2":{"125":1,"138":1,"173":1,"214":1,"223":1,"228":1,"229":1,"230":1,"231":1,"232":1,"247":1,"303":1,"314":1,"348":1,"386":1,"388":2,"395":1,"438":1,"461":1}}],["шагах",{"2":{"149":1}}],["шагами",{"2":{"135":1}}],["шага",{"2":{"66":1}}],["шаблонная",{"2":{"420":1}}],["шаблонные",{"0":{"373":1}}],["шаблонным",{"2":{"174":1}}],["шаблону",{"2":{"173":1,"245":1,"247":1,"260":1,"306":1,"319":1,"320":1,"449":1}}],["шаблоне",{"2":{"162":1,"187":1,"195":5,"223":1,"241":1,"246":1,"247":1,"260":1,"303":3,"306":1,"319":1,"320":1,"330":1,"339":1,"342":1,"344":1,"373":1,"380":1,"412":1,"492":1}}],["шаблоном",{"2":{"158":1,"246":1,"297":1,"301":1,"311":1,"354":1,"377":1}}],["шаблонов",{"0":{"232":1,"278":1,"340":1,"381":1},"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,"306":1,"307":1,"308":1,"309":1,"341":1,"342":1,"382":1,"383":1,"384":1,"385":1,"386":1,"387":1,"388":1,"389":1},"2":{"138":3,"141":1,"154":2,"163":1,"169":2,"174":1,"175":1,"187":1,"188":1,"189":2,"212":1,"226":1,"229":1,"231":1,"232":1,"238":1,"239":1,"251":1,"260":1,"266":3,"276":1,"277":2,"278":2,"282":2,"287":1,"295":1,"318":1,"335":1,"350":1,"351":1,"358":1,"366":1,"388":1}}],["шаблона",{"2":{"155":1,"156":1,"159":1,"161":3,"162":1,"173":2,"195":1,"212":1,"216":1,"222":1,"238":2,"240":5,"242":2,"246":1,"277":1,"285":2,"297":1,"299":2,"300":1,"301":2,"303":2,"305":1,"306":2,"308":2,"312":1,"317":1,"318":2,"319":1,"334":1,"338":1,"340":1,"342":1,"343":1,"350":1,"351":1,"374":1,"387":1,"436":1,"494":1,"496":1,"533":1}}],["шаблонам",{"2":{"141":1,"151":1,"264":1,"337":1,"461":1}}],["шаблонами",{"0":{"351":1},"1":{"352":1,"353":1},"2":{"138":1,"150":1,"176":1,"185":1,"282":1,"284":1,"296":1,"302":1,"309":1,"312":1,"333":1,"335":1}}],["шаблонах",{"2":{"141":1,"217":1,"221":1,"226":1,"306":1,"358":1}}],["шаблоны",{"0":{"138":1,"151":1,"163":1,"171":1,"175":1,"176":1,"266":1,"279":1,"280":1,"281":1,"282":1,"356":1,"394":1},"1":{"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"152":2,"153":2,"154":2,"155":2,"156":2,"157":2,"158":2,"159":2,"160":2,"161":2,"162":2,"163":1,"164":2,"165":2,"166":2,"167":2,"168":2,"169":2,"170":2,"171":1,"172":2,"173":2,"174":2,"175":2,"176":1,"177":2,"178":2,"179":2,"180":2,"181":2,"182":2,"183":2,"184":2,"185":2,"186":2,"187":2,"188":1,"189":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,"306":1,"307":1,"308":1,"309":1,"310":1,"311":1,"357":1,"358":1,"359":1,"360":1,"361":1,"362":1,"363":1},"2":{"119":1,"138":1,"141":1,"145":1,"150":2,"154":2,"159":1,"163":1,"171":1,"175":4,"176":1,"189":2,"190":1,"203":1,"226":1,"228":1,"232":4,"234":1,"240":1,"241":1,"247":1,"249":2,"250":1,"266":1,"277":2,"278":1,"281":1,"302":1,"310":4,"311":2,"317":1,"318":1,"319":1,"320":1,"321":1,"335":1,"336":1,"340":1,"349":1,"351":1,"358":1,"368":1,"380":1,"381":1,"391":1,"394":1,"403":1}}],["шаблон",{"0":{"277":1,"283":1,"288":1,"296":1,"297":1,"299":1,"301":1,"303":1,"306":1,"307":1,"309":1,"318":1,"319":1},"1":{"284":1,"285":1,"286":1,"287":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"298":1,"300":1,"302":1,"304":1,"305":1,"308":1},"2":{"41":1,"97":1,"152":1,"154":1,"155":3,"156":1,"157":1,"158":2,"164":1,"168":2,"169":5,"172":1,"173":4,"177":1,"178":1,"179":1,"182":2,"185":1,"195":1,"212":1,"218":1,"221":1,"222":2,"232":2,"237":3,"239":1,"243":1,"277":2,"279":3,"280":2,"281":3,"282":2,"283":1,"284":1,"287":2,"288":1,"293":1,"295":1,"296":1,"297":2,"298":1,"299":1,"300":2,"301":3,"302":2,"303":3,"305":2,"306":4,"307":3,"308":1,"309":2,"311":1,"312":1,"318":7,"319":1,"330":1,"339":2,"340":2,"342":2,"343":1,"345":1,"353":1,"387":3,"409":1,"425":1,"449":1,"451":2,"459":1}}],["шрифта",{"2":{"217":1}}],["шрифтами",{"2":{"144":1,"218":1}}],["шрифты",{"2":{"215":1,"218":5,"224":1}}],["шрифтом",{"2":{"177":1,"222":1}}],["шрифтовых",{"2":{"218":1}}],["шрифтов",{"2":{"144":1,"216":3,"218":3,"220":1}}],["шрифт",{"2":{"26":1,"144":1}}],["цукерберг",{"2":{"451":1}}],["цитата",{"2":{"459":1}}],["цикле",{"2":{"314":1}}],["цикл",{"2":{"200":1,"261":1,"273":1}}],["циклу",{"2":{"200":1}}],["цикла",{"2":{"195":1,"200":1,"241":1,"273":2,"293":1,"342":1,"374":1,"377":1}}],["цифровыми",{"2":{"389":1}}],["цифрой",{"2":{"156":1,"161":1}}],["цифра",{"2":{"156":1}}],["цифры",{"2":{"125":1}}],["цветом",{"2":{"263":1,"421":1}}],["цветовой",{"2":{"142":1}}],["цветов",{"2":{"140":1,"142":1,"152":1,"253":1}}],["цветовые",{"2":{"26":1,"533":1}}],["цвет",{"2":{"142":2,"153":1,"160":1,"218":1,"221":1,"257":2}}],["цветами",{"2":{"218":1,"260":1}}],["цветах",{"2":{"153":1}}],["цвета",{"2":{"142":2,"143":1,"152":1,"253":1,"421":1}}],["царька",{"2":{"96":1}}],["цепляемыми",{"2":{"303":1}}],["цепочечный",{"2":{"421":1}}],["цепочечными",{"2":{"112":1,"421":1}}],["цепочку",{"2":{"294":1,"308":1,"309":2}}],["цепочке",{"2":{"192":1,"309":1}}],["ценность",{"2":{"441":1,"442":1}}],["цене",{"2":{"389":1}}],["ценовые",{"2":{"182":1}}],["цена",{"2":{"181":1}}],["цен",{"0":{"181":1}}],["центов",{"2":{"125":1}}],["централизованным",{"2":{"344":1}}],["централизованное",{"2":{"355":1}}],["централизованного",{"2":{"335":1,"344":2}}],["централизованному",{"2":{"240":1,"374":1}}],["центральный",{"2":{"345":1,"351":1,"440":1}}],["центральном",{"2":{"440":1}}],["центрального",{"2":{"349":1,"354":1}}],["центральное",{"2":{"226":1,"345":2,"349":1}}],["центральной",{"2":{"31":1,"535":1}}],["центральную",{"2":{"142":1}}],["центральная",{"2":{"28":1}}],["центрирования",{"2":{"221":1}}],["центре",{"2":{"214":1}}],["центру",{"2":{"157":1,"221":1}}],["центр",{"2":{"106":1}}],["цены",{"2":{"125":1,"181":1,"182":1}}],["целях",{"2":{"327":1}}],["целями",{"2":{"68":1,"147":1}}],["целям",{"2":{"67":1,"214":1}}],["целая",{"2":{"282":1}}],["целые",{"2":{"277":1,"417":1}}],["целый",{"2":{"253":1,"439":1,"440":1}}],["целостного",{"2":{"430":1}}],["целое",{"2":{"193":1,"272":1,"380":1,"417":1,"419":1}}],["целого",{"2":{"162":1}}],["целом",{"2":{"67":1,"135":1,"223":1,"229":1,"246":1,"253":1,"276":1,"306":1,"318":1,"388":1,"444":1,"459":1,"460":1,"461":2}}],["целесообразность",{"2":{"450":1}}],["целесообразно",{"2":{"334":1,"409":1}}],["целесообразным",{"2":{"331":1}}],["целевую",{"2":{"374":1}}],["целевая",{"2":{"301":1,"369":2}}],["целевым",{"2":{"301":1}}],["целевые",{"2":{"258":1}}],["целевых",{"2":{"172":1,"253":1}}],["целевого",{"2":{"303":1,"304":2,"305":1}}],["целевому",{"2":{"155":1,"301":1,"303":1,"305":1,"389":1}}],["целевом",{"2":{"155":1}}],["целевое",{"2":{"127":1}}],["целевой",{"2":{"125":1,"301":4,"302":2,"303":1,"389":1,"438":1}}],["целей",{"2":{"140":2,"141":1,"190":1,"218":2,"277":1,"317":1,"318":1,"349":1,"350":1,"381":1,"389":1}}],["цели",{"0":{"74":1,"75":1,"496":1},"1":{"75":1,"76":1,"77":1,"78":1},"2":{"147":5,"150":1,"269":1,"408":1,"449":1}}],["целиком",{"2":{"26":1}}],["цельсия",{"2":{"301":1}}],["целью",{"2":{"73":1,"176":1,"178":1,"182":1,"186":1,"187":1,"302":1,"342":1,"377":1,"417":1,"419":1}}],["цель",{"0":{"62":1},"2":{"64":1,"67":1,"122":1,"140":2,"150":1,"159":1,"169":1,"192":1,"220":1,"301":2,"303":3,"374":1,"426":1}}],["huskyrc",{"2":{"444":2}}],["human",{"2":{"149":1}}],["hxx",{"2":{"444":3}}],["hpp",{"2":{"444":3}}],["hmacsha256",{"2":{"383":1}}],["hmr",{"2":{"214":1,"443":1}}],["hs256",{"2":{"383":3}}],["href",{"2":{"374":1}}],["href=",{"2":{"217":1,"218":3,"255":1}}],["h4>child",{"2":{"349":1}}],["h4>данные",{"2":{"330":1}}],["h4>",{"2":{"330":2,"342":2,"349":1}}],["h4>текст",{"2":{"330":1}}],["h3>selected",{"2":{"325":1}}],["h3>notes",{"2":{"325":1}}],["h3>new",{"2":{"325":1}}],["h3>",{"2":{"325":3,"339":2}}],["hamburger",{"2":{"501":1}}],["handler",{"2":{"302":3,"352":3}}],["handleappinstalled",{"2":{"260":2}}],["hasroute",{"2":{"380":1}}],["hash",{"2":{"132":1,"371":2,"380":1}}],["has",{"2":{"83":1,"97":2}}],["hide=",{"2":{"522":1}}],["hidden",{"2":{"504":1}}],["histoire",{"2":{"444":10}}],["history",{"2":{"126":1,"127":1,"371":7,"444":5}}],["highlightmodifiedtabs",{"2":{"444":1}}],["hi",{"2":{"238":1,"317":1}}],["h1",{"2":{"194":1,"303":1,"304":1}}],["h1>",{"2":{"194":1,"222":2,"304":2}}],["h1>hello",{"2":{"194":1}}],["hyvinkaa",{"2":{"169":1}}],["hypertext",{"2":{"135":1}}],["holding",{"2":{"449":2}}],["houdini",{"2":{"444":1}}],["hover",{"2":{"444":1}}],["hot",{"2":{"214":1,"215":1}}],["hooks",{"2":{"195":1,"444":4}}],["homebrew",{"2":{"434":1}}],["home",{"2":{"132":1,"145":1,"369":1,"489":1}}],["homeview",{"2":{"87":1}}],["hosts",{"2":{"449":1}}],["host",{"2":{"108":1,"408":7}}],["how",{"2":{"103":1}}],["hopscotch",{"2":{"50":1}}],["hoppscotch",{"0":{"49":1},"1":{"50":1},"2":{"444":1}}],["h",{"2":{"55":8,"408":1,"444":4}}],["htaccess",{"0":{"130":1},"2":{"131":1}}],["httponly",{"2":{"106":3}}],["http",{"0":{"129":1},"1":{"130":1},"2":{"55":2,"105":11,"107":1,"108":3,"128":1,"129":1,"135":1,"312":1,"327":2,"328":3,"329":1,"332":2,"381":2,"412":1,"499":5,"500":4}}],["https",{"2":{"54":1,"55":3,"79":2,"102":1,"103":1,"108":6,"116":3,"120":1,"135":3,"136":1,"139":1,"147":1,"168":1,"192":1,"202":1,"203":2,"213":2,"217":2,"218":1,"219":5,"226":1,"240":1,"241":1,"242":1,"246":1,"247":1,"252":1,"253":2,"255":1,"275":1,"298":1,"313":1,"336":1,"340":1,"349":1,"350":1,"362":1,"363":1,"365":1,"380":1,"382":1,"383":3,"384":2,"387":2,"407":1,"416":1,"444":2,"461":1,"486":1,"491":1,"499":1,"500":1,"515":1,"517":1}}],["htmlnanorc",{"2":{"444":20}}],["html=",{"2":{"413":1}}],["html>",{"2":{"192":2}}],["html5",{"2":{"136":1,"190":1,"371":1,"457":1,"479":1,"492":1}}],["html$",{"2":{"130":1}}],["html",{"0":{"152":1,"479":1,"503":1},"1":{"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1},"2":{"23":1,"103":1,"108":1,"111":1,"116":2,"117":1,"126":2,"127":2,"128":1,"130":2,"132":3,"141":1,"151":1,"152":1,"153":2,"154":2,"159":1,"162":1,"170":1,"190":5,"191":1,"192":3,"193":2,"194":6,"195":1,"196":2,"197":4,"201":2,"202":4,"203":4,"215":3,"216":3,"217":2,"218":3,"221":3,"222":5,"234":2,"237":1,"240":5,"242":1,"249":1,"255":2,"259":1,"262":1,"272":1,"302":1,"360":1,"380":1,"383":1,"403":1,"407":1,"408":2,"412":2,"418":2,"423":1,"425":3,"428":3,"438":5,"444":6,"451":3,"460":1,"461":10,"497":1,"503":2,"517":2,"540":2,"544":1}}],["heidisql",{"2":{"444":1}}],["height",{"2":{"18":1,"160":1,"221":1,"413":7}}],["heex",{"2":{"444":1}}],["hexcolorlength",{"2":{"444":1}}],["helps",{"2":{"414":1}}],["helloworld",{"2":{"215":1}}],["hello=",{"2":{"195":1}}],["hello",{"2":{"192":1,"195":10,"212":1,"223":1,"524":1}}],["heavycomponent",{"2":{"235":2}}],["heads",{"2":{"242":4}}],["head",{"2":{"192":1,"216":1,"255":1}}],["head>",{"2":{"192":2}}],["headers",{"0":{"518":1},"1":{"519":1,"520":1,"521":1,"522":1},"2":{"386":1,"500":1}}],["headerh1",{"2":{"305":2}}],["header=",{"2":{"240":1}}],["header>",{"2":{"240":3,"246":2,"501":1,"522":2}}],["header",{"0":{"29":1,"89":1},"2":{"28":1,"103":1,"240":3,"246":1,"377":2,"383":4,"457":1,"489":2,"496":2,"501":2,"519":1,"520":1,"521":1,"522":1,"530":1,"533":1}}],["headless",{"2":{"6":1,"12":2,"61":1,"75":1,"78":1,"450":1,"459":1,"496":1}}],["here",{"2":{"194":1,"222":1}}],["heroku",{"2":{"407":1,"533":1}}],["hero",{"0":{"174":1},"2":{"174":2}}],["white",{"2":{"222":1}}],["w3css",{"2":{"217":3}}],["w3schools",{"2":{"217":3}}],["w3",{"0":{"217":1},"1":{"221":1,"222":1,"223":1},"2":{"217":4,"221":2,"222":28,"240":4,"255":1,"366":1,"374":2}}],["write",{"2":{"194":1,"408":1,"449":1}}],["wrapper=mount",{"2":{"426":1}}],["wrapper",{"2":{"99":1,"240":1,"246":2,"425":2,"426":2}}],["wrap",{"2":{"93":1}}],["way",{"2":{"483":1}}],["wait",{"2":{"387":5}}],["watchman",{"2":{"444":2}}],["watch",{"2":{"374":4,"451":1}}],["watcher",{"2":{"162":6}}],["walmart",{"2":{"23":1}}],["will",{"2":{"448":1}}],["wild",{"2":{"135":1}}],["windi",{"2":{"444":10}}],["window",{"2":{"216":1,"241":1,"260":2,"273":2,"314":1,"315":3,"350":3,"352":2,"389":1,"408":1,"444":4,"448":3,"517":2}}],["windows",{"0":{"432":1},"2":{"128":1,"131":1,"134":1,"155":1,"213":3,"253":1,"256":1,"263":1,"360":5,"389":1,"423":1,"432":2}}],["width",{"2":{"160":1,"172":1,"221":1,"222":2,"413":7,"536":1,"545":1}}],["wide",{"2":{"125":1,"190":1,"366":1}}],["wiki",{"2":{"147":1,"275":1,"350":1}}],["wikipedia",{"2":{"147":1,"275":1,"350":1}}],["without",{"2":{"448":1}}],["with",{"2":{"54":1,"332":1,"378":2,"408":8,"414":1,"444":1}}],["words",{"2":{"449":1}}],["wordseparators",{"2":{"444":1}}],["world",{"2":{"125":1,"190":1,"192":1,"194":1,"195":4,"212":1,"223":1,"366":1}}],["workspace",{"2":{"444":3}}],["workingissueformatscm",{"2":{"444":1}}],["workbench",{"2":{"444":11}}],["workbox",{"2":{"261":1,"262":4,"461":2,"543":1}}],["work",{"2":{"408":1,"444":2}}],["workflows",{"2":{"408":3}}],["workflow",{"2":{"103":2,"408":2,"489":1,"530":1}}],["workerу",{"2":{"321":1}}],["workers",{"0":{"261":1,"312":1,"314":1,"400":1},"1":{"313":1,"314":1,"315":2,"316":2,"317":2,"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,"334":1},"2":{"251":3,"260":1,"261":1,"274":1,"277":1,"284":1,"300":1,"306":2,"312":2,"313":1,"314":10,"316":2,"317":3,"318":1,"319":1,"320":1,"321":1,"333":4,"334":4,"350":2,"354":1,"359":1,"381":1,"400":1}}],["worker",{"0":{"315":1,"316":1,"324":1,"543":1},"1":{"316":1,"317":1,"321":1,"322":1,"323":1,"325":2,"326":2,"327":2,"328":2,"329":2,"330":2,"332":1},"2":{"103":2,"253":1,"261":4,"262":1,"265":1,"312":1,"314":2,"315":21,"316":4,"317":5,"318":2,"320":2,"321":11,"322":1,"323":4,"324":1,"325":5,"326":2,"327":3,"328":1,"329":1,"461":3,"484":1,"489":1,"494":1,"503":1,"530":1,"541":1,"543":2}}],["www",{"2":{"108":1,"116":1,"125":1,"132":2,"158":1,"168":1,"169":1,"217":2,"219":1,"255":1,"298":1,"363":1,"366":1,"408":6,"517":1}}],["we",{"2":{"194":1}}],["webdriverio",{"2":{"450":1}}],["webhooks",{"2":{"439":1}}],["webp",{"2":{"414":1}}],["webpack",{"2":{"110":1,"117":1,"118":1,"443":4,"444":13}}],["web3js",{"2":{"389":1}}],["web3",{"0":{"389":1},"2":{"388":1,"389":2,"390":1}}],["webworker",{"0":{"321":1,"322":1,"323":1,"326":1,"327":1,"328":1,"329":1},"2":{"321":4,"323":3,"325":5,"330":4}}],["webmanifest",{"2":{"255":2}}],["webfonts",{"2":{"218":2}}],["website",{"2":{"407":5,"408":1,"540":1}}],["webstorm",{"2":{"213":1,"444":2}}],["websocket",{"2":{"109":1}}],["websockets",{"2":{"105":1,"109":3,"460":1,"499":1}}],["web",{"0":{"312":1,"314":1,"315":1,"324":1,"400":1},"1":{"313":1,"314":1,"315":2,"316":3,"317":3,"318":1,"319":1,"320":1,"321":2,"322":2,"323":2,"324":1,"325":3,"326":3,"327":3,"328":3,"329":3,"330":3,"331":1,"332":2,"333":1,"334":1},"2":{"109":1,"125":1,"126":1,"132":1,"190":1,"218":1,"251":2,"253":1,"263":1,"274":1,"277":1,"284":1,"300":1,"306":2,"312":3,"313":1,"314":12,"315":8,"316":6,"317":5,"318":3,"319":1,"320":3,"321":8,"322":1,"323":4,"324":1,"325":5,"326":2,"327":3,"328":2,"329":1,"333":4,"334":4,"350":2,"353":1,"354":1,"358":1,"359":1,"360":1,"366":5,"371":4,"381":1,"383":1,"384":1,"400":1,"427":1,"461":4,"500":1,"542":1}}],["webapp",{"0":{"103":1,"489":1,"493":1},"1":{"490":1,"494":1,"495":1},"2":{"103":5,"464":1,"487":2,"489":7,"491":2,"494":1,"515":2,"516":1,"542":1}}],["webapi",{"2":{"94":1}}],["weight",{"2":{"18":1}}],["bzl",{"2":{"444":1}}],["bbl",{"2":{"444":1}}],["bit",{"2":{"449":1}}],["bitkeeper",{"2":{"430":1,"431":1}}],["binance",{"2":{"389":1}}],["bind",{"0":{"197":1},"2":{"197":1}}],["by",{"2":{"342":1,"408":1,"421":2}}],["blg",{"2":{"444":1}}],["blame",{"2":{"444":3}}],["black",{"2":{"222":1}}],["blue",{"2":{"221":1,"222":4}}],["bloc",{"2":{"444":1}}],["blockchain",{"2":{"389":1}}],["block",{"2":{"160":1}}],["blog",{"2":{"116":1}}],["b",{"2":{"191":3,"309":7,"437":1,"438":1,"448":2}}],["built",{"2":{"202":1,"203":2,"242":1}}],["builddata",{"2":{"408":4}}],["build",{"2":{"116":1,"127":1,"215":1,"408":10,"420":2,"443":1,"444":4,"515":2}}],["bundleconfig",{"2":{"444":2}}],["bundle",{"2":{"193":1,"443":3}}],["bundler",{"2":{"193":1}}],["button>вариант",{"2":{"240":2}}],["button>option",{"2":{"240":2}}],["button>",{"2":{"202":2,"203":1,"222":2,"240":4,"246":2,"260":1,"325":1,"330":1,"338":1,"339":1,"342":1,"344":2,"349":2,"526":1}}],["button",{"2":{"153":1,"202":2,"203":1,"222":4,"246":2,"260":1,"325":1,"330":1,"338":1,"339":1,"342":1,"344":2,"349":2,"426":2,"459":1,"526":2}}],["business",{"0":{"318":1},"2":{"312":1,"317":1,"318":5,"320":1,"334":1,"449":2}}],["bus",{"0":{"342":1},"2":{"109":1,"339":2}}],["brew",{"2":{"434":1}}],["break",{"2":{"300":3,"302":2}}],["breaking",{"2":{"120":1}}],["breadcrumbs",{"0":{"165":1},"2":{"93":1}}],["bracketpairs",{"2":{"444":1}}],["branching",{"2":{"436":1}}],["branch",{"2":{"408":1,"431":1,"436":1,"437":8,"438":1,"515":2}}],["branches",{"2":{"408":2}}],["brands",{"2":{"218":3}}],["brave",{"2":{"213":1}}],["br>",{"2":{"114":1,"344":1}}],["browserslist",{"2":{"444":2}}],["browser",{"2":{"106":1,"256":1,"360":1,"444":1}}],["box",{"2":{"497":4}}],["boilerplate",{"2":{"496":1}}],["bound",{"2":{"449":2}}],["boundary",{"2":{"444":1}}],["bower",{"2":{"444":3}}],["bottombar",{"2":{"222":1}}],["bootstrap",{"2":{"216":1}}],["boolean",{"2":{"97":1,"222":1,"321":1}}],["border",{"2":{"160":3,"222":2,"240":1,"497":1,"545":1}}],["body>",{"2":{"192":2}}],["body",{"2":{"20":1,"192":2,"215":1,"216":1,"332":1,"497":1,"544":1}}],["be",{"2":{"408":2,"444":1,"497":1}}],["before",{"2":{"308":4,"309":2}}],["beforeinstallprompt",{"2":{"260":3}}],["below",{"2":{"174":1}}],["bento",{"2":{"167":1}}],["bearer",{"2":{"55":3,"386":2}}],["best",{"0":{"357":1},"2":{"23":1,"139":1,"226":1,"246":1,"247":1,"252":1,"313":1,"336":1,"362":1,"365":1,"416":1,"460":2,"464":1,"485":1}}],["babel",{"2":{"444":10}}],["babelrc",{"2":{"444":10}}],["bazelproject",{"2":{"444":1}}],["bazelignore",{"2":{"444":1}}],["bazelrc",{"2":{"444":1}}],["bazel",{"2":{"444":3}}],["banner",{"2":{"412":1}}],["band",{"2":{"145":1}}],["bash$",{"2":{"489":1}}],["bashpnpm",{"2":{"489":1}}],["basic",{"0":{"338":1,"339":1,"346":1}}],["basetoggle",{"2":{"531":1}}],["baseurl",{"2":{"500":1}}],["baseurl=",{"2":{"328":1}}],["baseinput",{"2":{"454":1}}],["baseicon",{"0":{"413":1,"501":1},"2":{"89":1,"99":3,"412":2,"443":2,"501":5,"531":1}}],["basebutton",{"2":{"409":1,"454":1,"459":2}}],["base64urlencode",{"2":{"383":2}}],["base64",{"2":{"383":3,"412":1}}],["based",{"2":{"106":3,"324":1}}],["base",{"0":{"516":1},"2":{"103":1,"413":1,"516":2,"545":1}}],["bar",{"2":{"240":1}}],["bars",{"0":{"159":1},"1":{"160":1},"2":{"164":2}}],["backers",{"2":{"444":1}}],["backend",{"2":{"39":1,"107":1,"383":1}}],["backroute",{"2":{"411":1}}],["backups",{"2":{"408":1}}],["backup",{"2":{"408":8}}],["background",{"2":{"257":1,"258":1,"262":1}}],["back",{"2":{"165":1,"380":1}}],["badge",{"2":{"97":1,"156":1,"339":1}}],["baas",{"0":{"37":1},"1":{"38":1,"39":1,"40":1,"41":1},"2":{"39":1,"107":5}}],["agnostic",{"2":{"499":1}}],["age",{"2":{"236":1}}],["azure",{"2":{"444":2}}],["ava",{"2":{"444":10}}],["available",{"0":{"132":1},"2":{"131":1}}],["aux",{"2":{"444":1}}],["automation",{"2":{"515":1}}],["autocompleterefs",{"2":{"444":1}}],["autodetection",{"2":{"444":1}}],["autodetectcolorscheme",{"2":{"444":1}}],["autofetch",{"2":{"444":1}}],["autofocus",{"2":{"222":1}}],["auto",{"2":{"262":1,"413":1,"444":1,"542":1}}],["autoupdate",{"2":{"262":1,"444":1}}],["authors",{"2":{"444":3}}],["authorization",{"2":{"55":3,"106":2,"386":2}}],["authenticator",{"2":{"388":1}}],["auth0",{"2":{"386":1}}],["authinterceptor",{"2":{"105":2}}],["auth",{"2":{"105":3,"384":1,"494":1,"496":1,"533":2}}],["abc",{"2":{"374":1}}],["a>",{"2":{"325":2}}],["ajax",{"2":{"306":1,"366":1,"381":2}}],["after",{"2":{"241":1,"308":5,"309":2,"408":1}}],["aaaa",{"2":{"125":2}}],["awesome",{"2":{"219":1}}],["aws",{"2":{"107":1}}],["await",{"2":{"54":3,"105":2,"261":3,"309":8,"326":1,"423":3,"499":1}}],["amd",{"2":{"360":1}}],["amazon",{"2":{"107":2,"158":5,"253":1,"407":2}}],["amplify",{"2":{"39":1}}],["at",{"2":{"106":6,"383":1,"444":1,"484":1}}],["attributes",{"0":{"76":1}}],["ad",{"2":{"162":1}}],["admin",{"2":{"125":1,"238":1}}],["adapter",{"2":{"103":1,"489":1}}],["addextraspaceontop",{"2":{"444":1}}],["added",{"2":{"438":1}}],["addeventlistener",{"2":{"241":1,"260":2,"261":1,"273":1}}],["addroute",{"2":{"380":1}}],["addresponseinterceptor",{"2":{"105":2,"500":1}}],["addnote",{"2":{"325":1,"326":2}}],["addcommand",{"2":{"300":1}}],["addyosmani",{"2":{"253":1}}],["addtodo",{"2":{"222":6}}],["adds",{"2":{"103":1,"489":1,"494":1}}],["add",{"2":{"53":1,"97":1,"103":7,"326":1,"433":1,"435":2,"438":1,"439":1,"489":6,"494":3}}],["acme",{"2":{"542":3}}],["acr",{"2":{"444":1}}],["acn",{"2":{"444":1}}],["activitybar",{"2":{"444":1}}],["active",{"2":{"246":3,"374":1,"377":1,"444":1}}],["actions",{"0":{"408":1,"514":1},"1":{"515":1,"516":1},"2":{"103":1,"345":1,"346":4,"347":1,"405":1,"408":12,"444":1,"460":1,"469":1,"496":1,"515":1,"530":1,"533":1}}],["action",{"0":{"174":1},"2":{"103":1,"174":1,"203":4,"300":2,"408":9,"426":1,"444":1,"489":1,"515":2}}],["according",{"2":{"421":1}}],["accordian",{"2":{"410":1}}],["accordianpanel",{"2":{"410":1}}],["accountroutes",{"2":{"411":2}}],["account",{"2":{"105":1,"411":2,"412":1,"414":1}}],["accept",{"2":{"246":5}}],["accessibility",{"2":{"459":1}}],["accessibilitysupport",{"2":{"444":1}}],["access",{"2":{"106":5,"108":4,"484":1}}],["ac",{"2":{"98":2}}],["arguments",{"2":{"517":1}}],["args",{"2":{"352":2}}],["article",{"2":{"457":1}}],["artisan",{"2":{"444":1}}],["arty",{"0":{"60":1},"2":{"79":2,"86":1,"102":1,"103":5}}],["array",{"2":{"83":8,"97":1,"236":1}}],["always",{"2":{"449":1}}],["alg",{"2":{"383":1,"444":1}}],["ally",{"2":{"444":3,"527":2}}],["all",{"2":{"309":1,"444":1}}],["allowcompoundwords",{"2":{"444":1}}],["allows",{"2":{"444":1}}],["allow",{"2":{"108":4}}],["alert",{"2":{"308":1}}],["alexa",{"2":{"140":1}}],["alias",{"2":{"219":1,"443":1}}],["align",{"2":{"160":1}}],["alibris",{"2":{"23":1}}],["alt",{"2":{"81":2}}],["air",{"2":{"444":1}}],["ai",{"2":{"81":1}}],["analysis",{"2":{"444":1,"481":1}}],["analytics",{"0":{"517":1,"540":1},"2":{"103":1,"489":1,"494":1,"503":1,"530":1}}],["antfu",{"2":{"444":3}}],["antialiased",{"2":{"444":1}}],["antony",{"2":{"20":1,"444":1,"492":1}}],["angular",{"2":{"366":1,"451":2}}],["any",{"2":{"360":1,"542":1}}],["anothercomponent",{"2":{"235":3}}],["anon",{"2":{"54":1,"55":6}}],["animation",{"2":{"160":1}}],["android",{"2":{"253":2,"260":1}}],["and",{"0":{"275":1,"357":1},"2":{"103":2,"125":1,"139":1,"172":1,"226":1,"246":1,"247":1,"252":1,"313":1,"336":1,"362":1,"365":1,"381":1,"408":4,"416":1,"422":1,"425":2,"426":2,"449":4,"460":2,"464":1,"485":1,"489":1,"494":1,"515":3}}],["an",{"2":{"83":1,"378":1,"422":1,"449":2}}],["annotations",{"2":{"444":1}}],["annotation",{"2":{"83":1}}],["axios",{"2":{"41":1,"105":1,"306":1,"327":4,"328":5,"332":2,"381":4,"382":4,"386":5,"387":3,"495":1,"499":1}}],["apollo",{"2":{"444":2}}],["apt",{"2":{"433":4}}],["apache",{"0":{"129":1},"1":{"130":1},"2":{"128":1,"129":1,"131":1,"324":1,"360":1,"407":1}}],["appveyor",{"2":{"444":2}}],["appsettings",{"2":{"444":2}}],["appsearchbar",{"2":{"89":1}}],["appsidebar",{"2":{"411":1,"534":1}}],["appfooter",{"2":{"411":2}}],["appinstalled",{"2":{"260":2}}],["appmanifest",{"2":{"255":1}}],["appleboy",{"2":{"408":3}}],["apple",{"2":{"253":2}}],["applications",{"2":{"262":1}}],["application",{"2":{"55":1,"103":1,"255":1,"259":1,"358":1,"461":2,"489":1,"500":1}}],["approach",{"2":{"172":1}}],["appheader>",{"2":{"522":1}}],["appheadersecond",{"2":{"522":1}}],["appheaderfirst",{"2":{"522":1}}],["appheader",{"2":{"91":1,"96":1,"99":1,"411":2,"522":1}}],["app",{"0":{"221":1,"374":1},"2":{"86":2,"89":1,"99":1,"111":5,"112":5,"125":1,"126":1,"127":3,"132":2,"192":6,"193":1,"194":2,"215":2,"220":1,"221":3,"229":2,"234":6,"238":2,"246":8,"247":1,"253":2,"255":1,"260":5,"263":1,"323":1,"332":6,"348":7,"372":4,"373":1,"374":2,"409":1,"411":1,"413":2,"419":2,"461":1,"497":1,"544":1}}],["appwrite",{"2":{"39":1}}],["apidata",{"2":{"499":2}}],["apikey",{"2":{"55":3}}],["api",{"0":{"50":1,"51":1,"55":1,"94":1,"105":1,"195":1,"346":1,"498":1,"499":1},"1":{"52":1,"53":1,"54":1,"55":1,"499":1,"500":1},"2":{"20":1,"40":2,"41":9,"50":1,"57":2,"58":1,"94":2,"96":1,"103":1,"105":10,"107":5,"109":2,"110":3,"112":2,"113":1,"114":1,"116":4,"121":1,"195":16,"202":1,"203":2,"238":1,"241":2,"242":1,"245":1,"246":9,"247":1,"251":1,"253":2,"261":1,"272":2,"274":2,"284":1,"288":2,"290":1,"301":8,"302":1,"303":5,"304":2,"306":7,"309":1,"312":3,"314":2,"315":1,"316":1,"324":2,"327":5,"330":1,"332":2,"343":1,"345":3,"346":2,"347":3,"349":3,"350":2,"351":1,"352":1,"380":4,"381":2,"382":4,"384":1,"407":2,"409":2,"425":1,"444":14,"448":4,"449":3,"451":1,"460":3,"461":1,"470":1,"489":2,"492":1,"494":1,"496":2,"499":4,"500":7,"530":3}}],["a",{"2":{"39":1,"54":1,"83":5,"103":1,"107":1,"125":2,"191":2,"253":1,"298":2,"309":10,"325":2,"374":2,"378":4,"414":1,"421":1,"438":1,"444":1,"448":2,"449":3,"452":1,"460":1,"461":1,"489":1,"494":1,"515":1}}],["asked",{"2":{"485":1}}],["aside",{"2":{"457":1}}],["astro",{"2":{"444":1,"495":1}}],["ashx",{"2":{"444":1}}],["ascx",{"2":{"444":1}}],["asax",{"2":{"444":1}}],["aspx",{"2":{"444":1}}],["asp",{"2":{"217":1}}],["assign",{"2":{"384":1}}],["assigned",{"2":{"125":1}}],["assets",{"2":{"215":2,"372":1,"409":1,"412":5,"414":2,"501":1,"543":1}}],["asynchronous",{"2":{"381":1}}],["async",{"2":{"105":1,"232":1,"245":1,"261":1,"309":3,"326":3,"423":3,"499":1,"500":1,"517":1}}],["as",{"2":{"39":1,"107":1,"414":3,"421":1}}],["two",{"2":{"461":1}}],["twitter",{"2":{"386":1,"540":8}}],["turbo",{"2":{"444":2}}],["tmp",{"2":{"444":1}}],["tdd",{"0":{"417":1},"2":{"415":1,"417":2,"419":1}}],["ttf",{"2":{"262":1}}],["t",{"0":{"274":1},"2":{"173":1,"266":1,"443":3,"449":2,"486":1,"492":1,"524":2,"526":2}}],["trevis",{"2":{"405":1}}],["tree",{"2":{"139":1,"252":1,"313":1,"336":1,"365":1,"414":1,"416":1,"444":3,"449":2,"453":1}}],["tr",{"2":{"255":1}}],["travis",{"2":{"444":2}}],["traffic",{"2":{"253":1}}],["transactions",{"2":{"524":1}}],["transport",{"2":{"499":1}}],["translate",{"2":{"460":1}}],["transitiongroup",{"2":{"203":1}}],["transition",{"2":{"203":1}}],["transformer",{"2":{"444":1}}],["transform",{"2":{"160":2,"451":1}}],["transfer",{"2":{"134":1,"135":1,"327":1,"381":1,"408":1}}],["tricks",{"0":{"504":1}}],["triggerexpansionontab",{"2":{"444":1}}],["triggerevent",{"2":{"162":4}}],["trigger",{"2":{"426":1}}],["trivago",{"2":{"253":1}}],["try",{"2":{"132":1,"142":1,"293":1,"309":2,"326":3,"422":1}}],["true",{"2":{"105":1,"153":1,"198":2,"222":1,"235":1,"246":1,"260":2,"262":1,"322":1,"347":1,"352":1,"371":2,"375":2,"408":1,"411":1,"414":2,"444":61,"489":4}}],["txtlogs",{"2":{"436":1}}],["txthome",{"2":{"165":2}}],["txtserver",{"2":{"132":1}}],["txt",{"2":{"125":1,"215":1,"444":1}}],["typ",{"2":{"383":1}}],["typicode",{"2":{"107":1,"499":1}}],["types",{"2":{"443":1,"481":1}}],["typescript",{"0":{"481":1},"2":{"20":2,"109":1,"194":1,"214":1,"349":1,"443":3,"444":6,"449":2,"481":4,"492":1}}],["type=",{"2":{"201":1,"222":3,"325":1,"330":3,"526":1}}],["typedoc",{"2":{"444":2}}],["typed",{"2":{"83":1}}],["type",{"2":{"55":1,"83":1,"152":1,"222":1,"236":2,"246":2,"258":1,"262":3,"296":2,"384":1,"408":1,"413":7,"500":1,"540":1}}],["tazerc",{"2":{"444":2}}],["tauri",{"2":{"371":1}}],["target",{"2":{"302":6,"352":7,"408":15,"443":1}}],["tail",{"2":{"408":1}}],["tails",{"2":{"242":4}}],["tailwind",{"2":{"216":2,"444":10,"459":2}}],["tasks",{"2":{"222":2,"444":2}}],["task",{"2":{"207":1,"222":1}}],["tags",{"2":{"103":1,"489":1,"494":1,"540":2}}],["tag",{"0":{"100":1},"2":{"517":2}}],["tabs",{"2":{"444":1}}],["tabsize",{"2":{"444":1}}],["tab",{"2":{"81":1}}],["table",{"0":{"45":1,"46":1,"47":1}}],["tablet",{"2":{"20":1,"86":1,"497":4,"534":2,"536":1}}],["terserrc",{"2":{"444":10}}],["terminal",{"2":{"213":1,"444":5}}],["tex",{"2":{"444":1}}],["textlint",{"2":{"444":2}}],["text=abc",{"2":{"374":1}}],["text",{"2":{"201":1,"213":1,"222":12,"240":2,"325":5,"330":1,"374":1,"425":1,"428":2,"545":6}}],["textarea>",{"2":{"325":1}}],["textarea",{"2":{"152":1,"201":1,"325":1}}],["testnet",{"2":{"500":1}}],["testjsonrpc",{"2":{"500":1}}],["testrest",{"2":{"499":2}}],["tests",{"0":{"421":1,"425":1,"426":1},"2":{"420":4}}],["testservice",{"2":{"322":4,"327":1,"329":1}}],["testing",{"2":{"360":1,"415":1,"417":2,"419":1}}],["test",{"0":{"323":1,"421":1,"424":1,"425":1,"426":1},"1":{"425":1,"426":1},"2":{"322":1,"323":2,"330":1,"332":2,"415":1,"418":1,"420":7,"421":10,"423":2,"424":5,"425":5,"426":3,"427":2,"428":1,"429":2,"444":1,"450":1,"526":1}}],["temperature",{"2":{"302":5}}],["template",{"2":{"99":1,"194":1,"240":8,"522":3}}],["template>",{"2":{"97":2,"114":2,"160":2,"162":2,"194":2,"203":2,"221":2,"240":9,"242":2,"246":2,"304":2,"305":2,"325":2,"330":2,"338":2,"339":2,"342":2,"344":2,"349":2,"353":2,"374":2,"411":6,"413":2,"459":2,"501":2,"522":2,"526":2}}],["team",{"2":{"145":1}}],["teleport",{"2":{"119":1,"203":1}}],["telegram",{"2":{"63":1,"366":1}}],["tsup",{"2":{"444":2}}],["tslint",{"2":{"444":2}}],["tsdoc",{"2":{"444":11}}],["tsdk",{"2":{"444":1}}],["tsx",{"2":{"444":3}}],["tsconfig",{"2":{"443":2,"444":11}}],["tsc",{"2":{"443":1}}],["ts",{"2":{"97":2,"98":1,"103":1,"194":1,"427":1,"444":33,"449":1,"497":1,"499":1,"500":2,"501":3,"503":1,"516":1,"526":2}}],["threshold",{"2":{"522":2}}],["throw",{"2":{"293":1,"408":1,"421":1,"422":1}}],["that",{"2":{"83":2,"449":4}}],["there",{"2":{"317":1,"449":1}}],["themetoggle",{"2":{"545":1}}],["themes",{"2":{"496":1,"533":1}}],["theme",{"2":{"257":1,"258":1,"262":1,"531":1}}],["thenable",{"2":{"309":1}}],["then",{"2":{"246":1,"309":13,"322":1,"323":1,"325":2,"328":2,"330":1,"382":1,"386":1,"387":2,"389":1,"408":4}}],["the",{"0":{"276":1},"1":{"279":1,"280":1,"281":1,"282":1},"2":{"83":5,"149":1,"174":1,"266":1,"301":1,"408":2,"412":2,"414":1,"421":4,"444":1,"461":1}}],["this",{"2":{"83":2,"194":1,"195":6,"287":2,"291":1,"293":1,"294":3,"298":9,"346":4,"352":3,"380":2,"444":3}}],["tip",{"2":{"448":1,"451":1}}],["tidy",{"2":{"444":1}}],["tinder",{"2":{"253":2}}],["time",{"2":{"383":1,"387":1}}],["timeout",{"2":{"235":3}}],["times",{"2":{"222":1}}],["timestamp",{"2":{"47":1}}],["titlebarstyle",{"2":{"444":1}}],["title=",{"2":{"237":1,"246":1,"305":1,"338":3}}],["title",{"2":{"0":1,"17":1,"18":1,"19":1,"237":2,"246":4,"325":5,"326":2,"339":2,"342":3,"540":4}}],["toml",{"2":{"444":10}}],["toc",{"2":{"444":1}}],["tocontain",{"2":{"425":1}}],["tothrow",{"2":{"422":1}}],["total",{"2":{"205":1,"206":1}}],["toequal",{"2":{"421":1,"426":1}}],["tobegreaterthan",{"2":{"421":1}}],["tobe",{"2":{"421":8,"423":1,"426":2}}],["tostring",{"2":{"384":1}}],["to=",{"2":{"374":3,"377":1}}],["tool",{"2":{"444":3}}],["toolchain",{"2":{"444":1}}],["tools",{"2":{"360":1}}],["tooltips",{"0":{"155":1}}],["toarray",{"2":{"326":2}}],["todolist",{"2":{"230":1,"231":1}}],["todofilter",{"2":{"230":1}}],["todoproject",{"2":{"229":1,"230":2,"231":2,"247":3,"369":1,"371":1,"374":3}}],["todo",{"2":{"222":26,"247":3}}],["todoservice",{"2":{"247":1}}],["todosummary",{"2":{"230":1,"247":1}}],["todos",{"0":{"222":1},"2":{"221":7,"499":1}}],["top",{"2":{"160":1,"371":1}}],["togglestatus",{"2":{"247":2}}],["toggle",{"2":{"153":2,"501":1}}],["togglefavourite",{"2":{"97":3}}],["tokens",{"2":{"328":1,"383":1}}],["token",{"2":{"105":1,"106":5,"385":2,"386":3,"484":2}}],["touchslideoutdrawer",{"0":{"507":1},"2":{"103":1,"507":1}}],["to",{"0":{"109":1,"127":1,"174":1,"220":1,"223":1,"247":1,"248":1,"369":1},"1":{"221":1,"222":1,"223":1},"2":{"43":1,"83":1,"103":1,"105":1,"174":1,"212":1,"214":1,"219":1,"220":2,"221":1,"222":2,"223":1,"224":1,"229":1,"242":1,"246":1,"247":3,"248":1,"250":1,"330":3,"364":2,"369":1,"371":1,"374":2,"378":4,"408":2,"412":1,"417":1,"418":1,"421":1,"444":2,"449":3,"450":1}}],["38",{"2":{"545":1}}],["39",{"2":{"435":1}}],["365",{"2":{"366":1}}],["360deg",{"2":{"160":1}}],["34",{"2":{"308":3,"309":1}}],["32",{"2":{"302":3,"432":1}}],["333333",{"2":{"262":1}}],["3x3",{"2":{"167":1}}],["300",{"2":{"328":2,"387":1,"444":1}}],["3000",{"2":{"316":1,"323":1,"328":1,"332":3}}],["30rem",{"2":{"222":1}}],["30",{"2":{"142":2,"162":1,"186":1,"444":1}}],["3",{"0":{"190":1,"196":1,"231":1,"291":1,"356":1,"357":1,"367":1,"386":1,"393":1,"395":1,"404":1,"449":1,"466":1,"493":1},"1":{"191":1,"192":1,"193":1,"194":1,"195":1,"196":1,"197":2,"198":2,"199":2,"200":2,"201":2,"202":2,"203":1,"204":1,"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"357":1,"358":1,"359":1,"360":1,"361":1,"362":1,"363":1,"368":1,"369":1,"370":1,"371":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"467":1,"494":1,"495":1},"2":{"20":1,"89":1,"94":1,"96":1,"97":1,"100":1,"108":1,"109":1,"110":3,"111":4,"112":2,"113":1,"115":2,"116":2,"117":2,"118":1,"119":2,"121":5,"124":1,"128":3,"132":2,"135":2,"136":1,"139":2,"144":1,"162":2,"165":2,"166":1,"189":1,"190":3,"191":1,"192":2,"193":3,"194":2,"195":4,"200":1,"202":1,"203":2,"204":1,"210":1,"212":2,"213":2,"214":4,"215":5,"217":1,"218":1,"219":1,"220":1,"222":4,"225":2,"226":2,"227":1,"228":1,"231":1,"233":1,"234":1,"235":3,"237":1,"240":1,"241":3,"242":1,"243":1,"244":1,"246":8,"247":1,"252":1,"260":2,"266":1,"270":1,"271":1,"272":1,"273":2,"277":2,"294":1,"295":2,"297":1,"298":2,"300":2,"301":2,"302":2,"303":1,"305":3,"306":1,"309":4,"310":1,"313":1,"314":2,"316":1,"321":2,"322":2,"323":2,"325":2,"326":1,"332":2,"335":1,"336":2,"338":3,"339":2,"342":3,"343":1,"344":4,"346":2,"347":2,"349":3,"352":3,"354":1,"358":2,"360":2,"362":1,"364":2,"365":1,"366":2,"367":1,"371":3,"375":1,"382":1,"383":3,"386":1,"389":1,"393":1,"394":1,"399":1,"401":1,"402":1,"409":2,"416":1,"421":1,"425":3,"426":4,"428":1,"438":1,"439":1,"443":1,"444":2,"448":3,"449":9,"451":3,"459":1,"460":6,"464":1,"477":1,"485":2,"492":2,"494":1,"496":1,"500":1,"545":2}}],["msg",{"2":{"526":1}}],["mjs",{"2":{"444":4}}],["m",{"2":{"408":2,"436":1,"438":1}}],["mdsvex",{"2":{"444":1}}],["md",{"2":{"408":1,"444":3}}],["mdn",{"2":{"352":1}}],["mkdir",{"2":{"408":2}}],["mvp",{"2":{"450":1}}],["mvc",{"2":{"449":1,"451":1}}],["mv",{"2":{"408":1}}],["mpr551xpscgmizp8ezuscoy7t7iqnpp",{"2":{"383":1}}],["mpa",{"2":{"253":1,"366":5,"367":2,"391":1}}],["myworker",{"2":{"317":5}}],["myprocessfunction",{"2":{"309":3}}],["myfuncc",{"2":{"309":3}}],["myfuncb",{"2":{"309":3}}],["myfunca",{"2":{"309":5}}],["myfunction",{"2":{"273":3,"287":3,"298":2}}],["myfile2",{"2":{"295":1}}],["myfile1",{"2":{"295":1}}],["mydata",{"2":{"350":2}}],["mydependency2",{"2":{"295":2}}],["mydependency1",{"2":{"295":2}}],["mydomain",{"2":{"125":1,"126":2,"127":2,"132":3}}],["myclass",{"2":{"287":5}}],["mycache",{"2":{"261":1}}],["mycomponent>",{"2":{"237":1}}],["mycomponent",{"2":{"112":12,"219":2,"234":7,"235":4,"237":3}}],["mymodal",{"2":{"246":2}}],["mymenubar>",{"2":{"240":2}}],["mymenubar",{"2":{"240":3}}],["mymethod",{"2":{"195":1}}],["mylayout>",{"2":{"240":2}}],["mylayout",{"2":{"240":2}}],["my",{"0":{"316":1},"2":{"197":3,"286":2,"287":4,"315":9,"317":1,"378":2,"382":1,"489":3,"490":1,"494":1,"515":2,"516":1}}],["mysql",{"2":{"40":1,"48":1,"444":1,"460":1}}],["moment",{"2":{"445":1,"448":1}}],["mocha",{"2":{"444":10}}],["monospace",{"2":{"444":1}}],["mono",{"2":{"444":1}}],["motels",{"0":{"179":1}}],["modern",{"2":{"444":1}}],["mode",{"2":{"371":1,"444":1}}],["modeling",{"2":{"230":1}}],["model=",{"2":{"201":1,"222":3,"237":2,"325":2,"330":3}}],["modelperson",{"2":{"115":4}}],["modelvalue",{"2":{"115":4,"237":9}}],["model",{"0":{"115":1,"201":1,"236":1},"2":{"110":1,"115":3,"198":1,"209":1,"222":2,"237":6,"242":1,"273":1,"449":1,"451":1}}],["modal>",{"2":{"246":1}}],["modal",{"2":{"246":14}}],["modals",{"2":{"244":1,"246":6,"247":3,"372":3}}],["module",{"2":{"214":1,"444":1}}],["modules",{"2":{"214":1,"215":2,"368":1,"414":6,"436":1,"443":1,"444":2}}],["mod",{"2":{"130":2,"444":1}}],["mozilla",{"2":{"116":1,"213":1,"261":1,"317":1,"350":1,"360":1,"384":1}}],["mount",{"2":{"111":1,"112":2,"192":2,"234":1,"246":1,"348":1,"372":1,"425":4,"426":1}}],["mobile",{"2":{"20":1,"172":2,"263":1,"497":4,"534":2,"536":1}}],["mit",{"2":{"487":1}}],["mitt",{"2":{"109":1,"298":2,"306":1,"340":4,"341":3}}],["mix",{"2":{"444":3}}],["mixin",{"2":{"241":1}}],["might",{"2":{"444":1}}],["migration",{"2":{"116":2,"120":1}}],["missing",{"2":{"293":1}}],["mime",{"2":{"255":1,"258":1}}],["minheight",{"2":{"413":1}}],["minwidth",{"2":{"413":1}}],["minimal",{"2":{"256":1}}],["min",{"2":{"218":3,"221":1,"222":1}}],["middleware",{"2":{"303":1}}],["middle",{"2":{"160":1}}],["mil",{"2":{"125":1}}],["microsoft",{"2":{"107":1,"145":1,"213":3,"253":1,"360":1,"386":1,"407":1,"444":1}}],["must",{"2":{"422":1}}],["music",{"2":{"63":1,"100":1}}],["multicursormodifier",{"2":{"444":1}}],["multipurpose",{"2":{"255":1}}],["multiviews",{"2":{"130":1}}],["muzhskaya",{"2":{"88":1}}],["map",{"2":{"414":2,"444":7}}],["mastery",{"2":{"460":1}}],["master",{"2":{"408":3,"436":3,"438":4,"439":5,"444":1}}],["match",{"2":{"261":1}}],["math",{"2":{"242":1}}],["material",{"2":{"18":1,"167":1,"216":3,"217":1}}],["macports",{"2":{"434":1}}],["mac",{"2":{"263":1}}],["macromedia",{"2":{"190":1}}],["macos",{"0":{"434":1},"2":{"134":1,"213":3,"253":1,"360":4,"434":1,"444":1}}],["max",{"2":{"162":3,"172":1,"222":1,"536":1,"545":1}}],["mailmap",{"2":{"444":1}}],["mail",{"2":{"125":1,"255":1}}],["maintainers",{"2":{"444":1}}],["maintainability",{"2":{"267":1}}],["maintenanceview",{"2":{"411":1}}],["maintenance",{"2":{"411":2}}],["mainheader",{"2":{"247":1}}],["main>",{"2":{"240":2,"246":2,"374":2}}],["mainlayout",{"0":{"534":1},"1":{"535":1},"2":{"36":1,"103":1,"411":2,"489":2,"536":1}}],["main",{"0":{"31":1,"317":1,"348":1,"372":1},"2":{"111":1,"113":1,"139":1,"193":1,"215":3,"216":2,"234":3,"246":2,"247":1,"252":1,"261":1,"313":1,"316":1,"336":1,"347":1,"365":1,"371":1,"377":1,"408":6,"416":1,"526":1}}],["markdownlint",{"2":{"444":2}}],["markdown",{"0":{"482":1},"2":{"444":1,"482":1}}],["marketplace",{"2":{"23":1}}],["margin",{"2":{"222":3,"504":1}}],["mary",{"2":{"114":1}}],["mantinelayeredheader",{"0":{"521":1}}],["mantine",{"2":{"520":1,"521":1}}],["mantinerichfooter",{"0":{"512":1},"2":{"489":2}}],["mantinesimplefooter",{"0":{"511":1},"2":{"103":1}}],["mantinesimplenavbar",{"0":{"539":1},"2":{"103":1,"489":2}}],["mantinesimpleheader",{"0":{"520":1},"2":{"91":1,"103":1,"489":2}}],["manually",{"2":{"444":1}}],["management",{"0":{"449":1},"2":{"430":1,"449":2}}],["manager",{"0":{"118":1},"2":{"96":1,"110":1,"213":1,"351":1}}],["man",{"2":{"145":1}}],["manifest+json",{"2":{"255":1}}],["manifest",{"0":{"542":1},"2":{"103":2,"215":1,"255":5,"258":1,"262":1,"489":1,"494":1,"541":1,"542":1}}],["many",{"2":{"43":2}}],["make",{"2":{"83":1,"103":1,"489":1,"494":1}}],["magento",{"2":{"41":1,"47":1,"94":1}}],["me",{"2":{"486":1}}],["merge",{"2":{"431":1,"437":1,"438":2}}],["mercurial",{"2":{"430":1}}],["merchants",{"2":{"12":1}}],["memory",{"2":{"371":2}}],["message=ref",{"2":{"342":1}}],["messagebus",{"0":{"341":1},"2":{"341":2,"342":6}}],["message",{"2":{"192":4,"315":2,"321":3,"339":1,"342":8,"524":1}}],["meatball",{"2":{"167":1}}],["menus",{"2":{"444":1}}],["menu",{"2":{"164":1}}],["metadata",{"2":{"444":1}}],["metamask",{"2":{"389":5}}],["meta",{"2":{"103":1,"105":1,"411":1,"413":1,"414":2,"427":3,"489":1,"494":1,"500":1,"501":1,"540":13}}],["method2",{"2":{"287":2}}],["method1",{"2":{"287":2}}],["methods",{"2":{"195":1}}],["method",{"2":{"83":1,"330":9,"389":1,"500":1}}],["medium",{"2":{"253":1}}],["media",{"2":{"20":1,"172":1,"186":1}}],["medusajs",{"2":{"61":1}}],["medusa",{"2":{"12":1}}],["gql",{"2":{"444":2}}],["gz",{"2":{"444":1}}],["gls",{"2":{"444":1}}],["glo",{"2":{"444":1}}],["global",{"2":{"449":1}}],["glob",{"2":{"413":1,"414":2,"501":1}}],["globpatterns",{"2":{"262":1}}],["glg",{"2":{"444":1}}],["g",{"2":{"444":1,"517":1}}],["gutter",{"2":{"545":1}}],["gui",{"2":{"451":1}}],["guides",{"2":{"444":1}}],["guide",{"2":{"68":1,"240":1,"460":2}}],["gulp",{"2":{"444":2}}],["guards",{"2":{"371":3,"382":1}}],["gb",{"2":{"360":2}}],["go",{"0":{"380":1},"2":{"380":4,"444":6}}],["governance",{"2":{"444":1}}],["gov",{"2":{"125":1}}],["googletagmanager",{"2":{"517":1}}],["googleanalytics",{"2":{"489":1}}],["google",{"0":{"263":1,"517":1,"540":1},"2":{"17":1,"103":1,"106":8,"107":2,"167":1,"173":4,"213":1,"216":1,"217":1,"251":1,"259":2,"261":1,"366":1,"386":1,"388":1,"407":1,"448":1,"460":1,"461":4,"489":1,"494":1,"503":1,"517":2,"530":1}}],["gatsby",{"2":{"444":5}}],["gateway",{"2":{"107":1}}],["garaguso",{"2":{"356":1,"383":1}}],["garfield",{"2":{"18":2}}],["gmail",{"2":{"106":1,"381":1}}],["ghz",{"2":{"360":1}}],["gh",{"2":{"103":1,"408":2,"515":3}}],["grpc",{"2":{"499":1}}],["grunt",{"2":{"444":2}}],["great",{"2":{"444":1}}],["grey",{"2":{"240":1}}],["gray",{"2":{"221":1,"222":2,"497":1}}],["graphql",{"2":{"499":1}}],["graphgl",{"2":{"109":1}}],["graph",{"2":{"103":1,"489":1,"494":1,"503":1,"530":1,"540":1}}],["grid",{"2":{"93":1,"457":1,"480":2}}],["gitpod",{"2":{"444":2}}],["gitmessage",{"2":{"444":1}}],["gitmodules",{"2":{"444":1}}],["gitattributes",{"2":{"444":1}}],["gitlens",{"2":{"444":4}}],["gitlab",{"2":{"134":1,"405":1,"415":1,"436":1,"439":2,"440":1,"442":1,"444":2}}],["gitignore",{"0":{"436":1},"2":{"215":1,"408":1,"435":1,"444":1}}],["git",{"0":{"431":1,"435":1},"1":{"436":1},"2":{"102":2,"134":2,"213":3,"215":2,"401":1,"405":1,"408":3,"409":1,"415":1,"429":1,"430":3,"431":4,"432":3,"433":6,"434":4,"435":9,"436":7,"437":7,"438":9,"439":12,"440":1,"441":1,"442":2,"444":10,"491":2}}],["githubactionsgithubpagesworkflow",{"2":{"489":1}}],["githubpullrequests",{"2":{"444":1}}],["githubissues",{"2":{"444":1}}],["github",{"0":{"102":1,"408":1,"514":2},"1":{"515":2,"516":2},"2":{"79":2,"86":1,"102":2,"103":6,"116":1,"134":1,"139":1,"213":1,"219":2,"226":2,"227":1,"246":2,"247":2,"252":1,"260":1,"313":2,"320":1,"336":1,"340":1,"353":1,"362":2,"365":2,"374":1,"380":1,"386":1,"405":2,"407":3,"408":23,"415":1,"416":1,"436":1,"439":6,"440":1,"442":1,"444":7,"460":2,"469":1,"483":1,"489":2,"491":1,"494":1,"496":1,"515":5,"530":3,"533":1}}],["gemfile",{"2":{"444":2}}],["generation",{"2":{"461":1}}],["generate",{"2":{"83":1}}],["generalroutes",{"2":{"411":2}}],["getbestblockhash",{"2":{"500":1}}],["getsvgicon",{"2":{"413":3,"414":2}}],["gets",{"2":{"412":2}}],["getroutes",{"2":{"380":1}}],["getnotes",{"2":{"325":1,"326":2}}],["gettimestamp",{"2":{"303":2}}],["getters",{"2":{"345":1,"346":4}}],["getter",{"2":{"302":1}}],["gettoken",{"2":{"105":1}}],["getall",{"2":{"289":1,"290":1,"291":1}}],["getallprojects",{"2":{"289":1,"290":1,"291":1,"292":1}}],["getimageurl",{"2":{"413":2,"414":2}}],["getinstance",{"2":{"285":1}}],["getitem",{"2":{"98":1,"350":2,"352":1,"408":1}}],["getelementbyid",{"2":{"162":1}}],["get",{"2":{"105":1,"108":1,"302":2,"327":3,"328":2,"329":1,"330":3,"332":3,"352":2,"381":2,"414":2,"499":1}}],["getuserdata",{"2":{"105":2}}],["gtag",{"2":{"517":5}}],["gt",{"2":{"60":2,"83":2,"113":1,"165":1,"169":2,"215":1,"221":1,"242":1,"347":1,"374":3,"408":1,"438":4,"444":1,"461":2}}],["1px",{"2":{"497":1}}],["192x192",{"2":{"262":2}}],["19",{"2":{"167":1}}],["1986",{"2":{"149":1}}],["18",{"0":{"377":1},"2":{"166":1}}],["17",{"2":{"161":1,"162":1}}],["16гб",{"2":{"444":1}}],["16",{"2":{"161":1,"213":2,"314":1,"350":2}}],["1516239022",{"2":{"383":1}}],["15",{"0":{"471":1},"1":{"472":1,"473":1},"2":{"161":1,"453":1}}],["1s",{"2":{"160":1}}],["1rem",{"2":{"160":2}}],["1443",{"2":{"500":1}}],["14",{"2":{"159":1}}],["13",{"0":{"377":1},"2":{"159":1}}],["1280px",{"2":{"545":1}}],["1234567890",{"2":{"383":1}}],["12",{"2":{"158":1,"460":1}}],["127",{"2":{"125":2}}],["1199",{"2":{"497":1}}],["11",{"0":{"403":1,"463":1,"474":1},"1":{"464":1,"465":1,"475":1},"2":{"142":1,"143":1,"144":1,"145":1,"147":1,"153":2,"154":1,"155":2,"157":1,"158":3,"159":2,"161":3,"162":1,"166":1,"167":1,"168":1,"169":2,"172":1,"173":4,"174":1,"177":1,"178":1,"185":1,"186":1,"438":3}}],["10000",{"2":{"497":1}}],["1000",{"2":{"342":1,"387":1,"449":1}}],["100vh",{"2":{"221":1}}],["100vw",{"2":{"221":1,"504":1}}],["100",{"2":{"160":1,"222":1,"342":1,"413":2,"418":1,"428":1,"461":1,"504":1}}],["10",{"0":{"402":1,"436":1,"466":2},"1":{"467":2},"2":{"125":2,"128":1,"135":1,"142":2,"157":1,"219":1,"254":1,"321":2,"332":2,"360":1,"371":1,"421":3,"423":1,"425":2,"426":6,"436":1,"444":1,"448":1,"459":1,"460":2}}],["1",{"0":{"18":1,"19":1,"229":1,"286":1,"289":1,"298":1,"300":1,"302":1,"304":1,"308":1,"384":1,"393":1,"471":1},"1":{"472":1,"473":1},"2":{"18":2,"19":1,"86":1,"108":6,"109":1,"114":1,"125":6,"130":2,"132":2,"142":1,"162":2,"165":2,"193":2,"200":1,"214":1,"215":1,"222":4,"229":1,"231":1,"233":1,"235":1,"240":2,"241":2,"246":6,"247":1,"255":2,"258":1,"259":1,"269":1,"287":1,"294":1,"297":1,"298":3,"300":1,"301":1,"302":3,"304":2,"305":3,"307":3,"308":10,"309":9,"314":4,"321":2,"322":2,"325":2,"326":3,"330":2,"332":2,"337":2,"338":3,"339":2,"342":2,"344":4,"346":2,"347":2,"349":2,"352":2,"360":1,"366":2,"369":2,"371":2,"380":2,"382":1,"383":2,"414":2,"419":1,"421":3,"425":2,"426":2,"439":1,"443":1,"448":2,"449":1,"460":2,"461":1,"499":1,"500":1,"504":1,"545":2}}],["х",{"2":{"275":1}}],["хак",{"2":{"504":1}}],["хау",{"2":{"430":1}}],["ханту",{"2":{"274":1}}],["характеристик",{"2":{"181":1}}],["характеристики",{"2":{"181":1,"364":1}}],["характер",{"2":{"123":1,"139":1,"185":1,"188":1,"441":1}}],["хватает",{"2":{"256":1,"430":1,"445":1}}],["хвастовство",{"2":{"214":1}}],["хювинкяя",{"2":{"169":1}}],["хювинкяа",{"2":{"169":1}}],["художественных",{"2":{"165":1}}],["хуже",{"2":{"149":1}}],["хлебным",{"2":{"165":1}}],["хлебные",{"0":{"165":1},"2":{"165":2}}],["хика",{"0":{"148":1},"2":{"149":1}}],["хеша",{"2":{"127":1}}],["хеш",{"2":{"127":1}}],["хеши",{"2":{"127":1}}],["хеширования",{"2":{"127":2}}],["хедеры",{"2":{"518":1}}],["хедере",{"2":{"86":1,"97":1}}],["хедером",{"2":{"35":1,"409":1,"534":1}}],["хедера",{"2":{"29":2}}],["хедер",{"2":{"29":2,"89":1,"536":1}}],["хэш",{"2":{"127":1,"371":1,"412":1}}],["хэша",{"2":{"118":1,"127":1,"380":1}}],["хранение",{"2":{"435":1}}],["хранением",{"2":{"354":1}}],["хранению",{"2":{"350":2}}],["хранения",{"2":{"293":1,"294":1,"321":1,"324":1,"325":1,"330":1,"335":1,"350":4,"366":1,"436":1}}],["хранят",{"2":{"389":1}}],["хранятся",{"2":{"17":1,"350":3,"382":1,"460":1}}],["хранящуюся",{"2":{"382":1}}],["хранящиеся",{"2":{"350":1}}],["хранящей",{"2":{"343":1}}],["храним",{"2":{"352":1}}],["хранилищ",{"2":{"350":3}}],["хранилищу",{"2":{"324":1,"353":1}}],["хранилищами",{"2":{"354":1}}],["хранилищах",{"2":{"350":1}}],["хранилища",{"0":{"350":1},"2":{"128":1,"132":1,"260":1,"335":2,"349":3,"350":6,"353":1,"389":1}}],["хранилищем",{"2":{"344":1,"352":1}}],["хранилище",{"2":{"126":1,"131":1,"251":1,"350":1,"351":1,"353":2,"435":1}}],["храните",{"2":{"410":1}}],["хранится",{"2":{"246":1,"355":1}}],["хранить",{"2":{"106":1,"222":1,"230":1,"253":1,"408":1,"449":1}}],["храниться",{"2":{"47":1,"321":1,"337":1}}],["хранит",{"2":{"43":1,"342":1,"350":1,"448":1}}],["хочу",{"2":{"452":2,"460":1}}],["хочется",{"2":{"276":1}}],["хочет",{"2":{"67":1,"107":2,"159":1,"177":1}}],["холсте",{"2":{"296":1}}],["ходе",{"2":{"159":2,"430":1}}],["ходу",{"2":{"17":1}}],["хост",{"2":{"408":2}}],["хостите",{"2":{"407":1}}],["хостингом",{"2":{"135":1}}],["хостинговым",{"2":{"128":1}}],["хостинг",{"0":{"407":1},"2":{"128":1,"129":2,"135":2,"178":1,"407":1}}],["хостинги",{"2":{"125":1,"496":1}}],["хостинга",{"2":{"122":2,"124":1,"128":3,"134":1,"136":1}}],["хостинге",{"2":{"103":1,"128":1,"137":1}}],["хостеры",{"2":{"407":1}}],["хосте",{"2":{"125":1,"408":1}}],["хотим",{"2":{"223":1,"232":2,"240":1,"260":1,"303":1,"318":1,"320":1,"323":1,"332":1,"342":1,"348":1,"351":1,"368":1,"375":3,"383":1,"384":1,"385":1,"421":1,"428":1,"435":1}}],["хотите",{"2":{"134":2,"177":1,"191":1,"194":2,"214":2,"317":1,"410":1,"421":1,"435":1,"448":1}}],["хотел",{"2":{"185":1}}],["хотя",{"2":{"110":1,"122":1,"125":1,"135":1,"136":1,"144":1,"159":1,"172":1,"185":1,"188":1,"213":2,"214":1,"219":1,"222":1,"226":1,"242":1,"255":1,"260":2,"270":1,"287":1,"307":1,"314":2,"366":1,"380":1,"381":1,"382":1,"411":1,"421":1,"441":1,"460":1}}],["хоть",{"2":{"99":1,"451":2}}],["хорош",{"2":{"453":1}}],["хороша",{"2":{"253":1}}],["хорошая",{"2":{"68":1,"194":1,"219":1,"450":1,"452":2}}],["хорошего",{"2":{"273":1,"314":1,"418":1}}],["хорошей",{"2":{"204":1,"225":1,"226":1,"238":1,"337":1,"374":1,"376":1,"394":1,"427":1,"449":1}}],["хорошее",{"2":{"150":1,"302":1,"349":1}}],["хорошему",{"2":{"141":1,"150":1}}],["хороших",{"2":{"218":1,"248":1}}],["хорошими",{"2":{"366":1}}],["хорошим",{"2":{"158":1,"173":2,"387":1,"460":2}}],["хорошие",{"2":{"133":1,"150":1,"446":1,"451":1,"459":2,"460":1}}],["хороший",{"2":{"25":1,"188":1,"191":1,"246":1,"270":1,"273":1,"342":1,"346":1,"437":1,"444":1}}],["хорошую",{"2":{"26":1,"213":1,"218":1}}],["хорошо",{"2":{"3":1,"39":2,"44":1,"62":1,"64":1,"128":1,"144":1,"150":1,"151":1,"161":1,"168":1,"169":1,"172":1,"190":1,"195":1,"247":1,"306":2,"318":1,"321":1,"324":2,"333":1,"342":1,"383":1,"386":1,"389":1,"444":1,"447":1,"459":1}}],["nls",{"2":{"444":2}}],["nx",{"2":{"444":2}}],["nvmrc",{"2":{"444":2}}],["nix",{"2":{"444":3}}],["npx",{"2":{"443":2}}],["npmjs",{"2":{"298":1}}],["npm",{"2":{"127":1,"213":1,"214":4,"215":6,"216":1,"217":1,"222":1,"262":1,"324":2,"327":1,"331":2,"340":1,"345":1,"368":1,"381":1,"409":1,"419":2,"420":3,"421":3,"424":2,"428":1,"429":3,"436":1,"443":1,"444":4,"448":1,"453":1,"496":1,"524":1}}],["njsproj",{"2":{"436":1}}],["ntvs",{"2":{"436":1}}],["nw",{"2":{"350":1,"371":1}}],["n>=2",{"2":{"307":1}}],["n",{"2":{"297":1,"307":3,"308":9,"309":5,"325":5,"408":1,"444":1}}],["nginx",{"0":{"131":1,"132":1},"1":{"132":1},"2":{"107":1,"128":1,"131":2,"132":1,"135":1,"360":1,"407":1}}],["nest",{"2":{"444":2}}],["nesting",{"2":{"444":2}}],["never",{"2":{"444":1}}],["next",{"0":{"276":1},"1":{"279":1,"280":1,"281":1,"282":1},"2":{"266":1,"444":2}}],["negotiation",{"2":{"130":1}}],["netlify",{"2":{"407":1,"444":2}}],["netflix",{"2":{"366":1}}],["netservice",{"2":{"329":2}}],["netbeans",{"2":{"213":1}}],["net",{"2":{"125":1,"383":1}}],["networks",{"2":{"500":1}}],["networkcommunication",{"0":{"330":1}}],["network",{"0":{"328":1},"2":{"107":1,"261":1,"317":1,"329":1,"350":1}}],["newitem",{"2":{"451":3}}],["new",{"2":{"97":1,"98":1,"111":1,"112":1,"162":1,"222":1,"235":1,"246":1,"287":1,"293":1,"296":2,"302":1,"309":6,"315":2,"317":1,"321":2,"323":1,"326":4,"328":2,"352":1,"384":1,"408":2,"414":2,"497":1,"517":1}}],["nativetabs",{"2":{"444":1}}],["naruto",{"2":{"116":1}}],["navigate",{"2":{"378":4}}],["navigator",{"2":{"261":2}}],["navigationdrawer",{"2":{"489":1,"537":1}}],["navigation",{"0":{"505":1},"1":{"506":1,"507":1},"2":{"103":1,"164":1,"371":2,"489":1,"496":1}}],["navbar",{"0":{"537":1},"1":{"538":1,"539":1},"2":{"103":1,"489":2,"530":1,"537":1}}],["named",{"2":{"414":1}}],["names",{"2":{"125":1}}],["name=",{"2":{"99":1,"240":3,"246":1,"330":2,"377":2,"412":1,"501":1,"540":4}}],["name",{"2":{"88":3,"103":1,"114":6,"132":1,"195":3,"201":2,"236":5,"237":1,"238":5,"240":1,"246":10,"256":2,"258":2,"261":2,"262":2,"294":4,"298":13,"350":5,"371":3,"374":4,"375":3,"377":4,"378":4,"380":2,"383":1,"408":12,"411":2,"412":2,"413":4,"414":8,"437":5,"489":1,"494":1,"542":2}}],["null",{"2":{"162":3,"246":2,"260":2,"293":1,"294":2,"350":1,"444":1}}],["num=",{"2":{"99":1}}],["numbers",{"2":{"83":1,"125":1}}],["number",{"2":{"83":1,"97":3,"98":1,"236":1,"425":2}}],["number>",{"2":{"83":2}}],["nuxt",{"2":{"10":1,"191":1,"444":2,"495":1}}],["nodе",{"2":{"444":1}}],["nodemon",{"2":{"444":4}}],["nodes",{"2":{"389":1}}],["nodejs",{"0":{"331":1},"1":{"332":1},"2":{"213":1}}],["node",{"2":{"107":2,"213":6,"214":2,"215":2,"219":2,"312":2,"330":2,"331":2,"360":1,"368":1,"408":2,"423":2,"436":1,"443":3,"444":6,"460":1,"461":1}}],["now",{"2":{"142":1}}],["note=",{"2":{"326":1}}],["note=ref",{"2":{"325":1}}],["notes",{"2":{"325":4,"326":8}}],["notes=ref",{"2":{"325":1}}],["note",{"2":{"325":13,"326":1}}],["notebook",{"2":{"20":1,"497":3,"506":1,"534":2,"536":1}}],["notation",{"2":{"286":1}}],["notificationinterceptor",{"2":{"105":2,"500":2}}],["not",{"2":{"103":1,"247":2,"421":1,"444":1,"448":1}}],["no",{"2":{"103":2,"222":1,"489":8,"494":4}}],["nosql",{"2":{"17":2,"39":1,"107":1,"324":1,"449":1}}],["u",{"2":{"411":1}}],["uri",{"2":{"328":1,"374":1,"384":1,"385":1,"500":1}}],["urlsearchparams",{"2":{"384":3}}],["urls",{"2":{"371":1}}],["url",{"2":{"0":1,"105":1,"152":1,"174":1,"215":1,"256":2,"258":3,"260":1,"261":1,"262":1,"328":2,"330":1,"332":2,"367":1,"369":1,"371":5,"374":3,"375":2,"376":1,"377":1,"378":4,"379":1,"380":4,"382":1,"383":1,"384":1,"386":1,"387":2,"412":2,"414":1,"439":2,"500":1,"540":2,"542":1}}],["us",{"2":{"384":1,"444":1}}],["using",{"2":{"378":1}}],["usage",{"2":{"340":1}}],["usability",{"2":{"267":1}}],["usb",{"2":{"253":1,"388":1}}],["usetouchswipe",{"2":{"507":1}}],["usenewswidget",{"2":{"451":1}}],["usei18nlight",{"0":{"525":1},"2":{"526":2}}],["usei18n",{"2":{"409":1,"451":1,"526":4}}],["usecounterstore=definestore",{"2":{"347":1}}],["usecounterstore",{"2":{"346":2,"349":1}}],["usedocumentscroll",{"2":{"241":5}}],["usewindowsevents",{"2":{"241":1}}],["useappconfig",{"2":{"501":3}}],["useadmin",{"2":{"241":1}}],["useauthservice",{"2":{"449":1}}],["useauthstore",{"2":{"449":1}}],["useauth",{"2":{"105":4,"449":1}}],["userloggedin",{"2":{"449":1}}],["useraccountview",{"2":{"411":1}}],["username",{"2":{"382":3,"408":2,"449":1}}],["userouter",{"2":{"377":3,"380":1}}],["useroute",{"2":{"377":3,"380":1,"385":2}}],["user",{"2":{"105":2,"132":1,"140":2,"149":1,"230":1,"238":1,"387":2,"408":6,"444":3,"484":2}}],["userid",{"2":{"105":1}}],["users",{"2":{"105":7,"238":1}}],["userdata",{"2":{"105":1}}],["usescreenwidth",{"2":{"497":6}}],["usescreensize",{"2":{"451":1}}],["useshoppingcart",{"2":{"451":1}}],["usesessionstorage",{"2":{"352":3,"353":2}}],["usestate",{"2":{"344":6}}],["usestore",{"2":{"241":1}}],["uses",{"2":{"83":1,"408":10}}],["usefavourites",{"0":{"97":1},"2":{"81":1,"97":6,"98":1}}],["use",{"0":{"14":1,"410":1},"2":{"14":4,"112":1,"206":1,"230":1,"241":1,"246":2,"247":1,"332":2,"348":1,"372":2,"444":1,"458":1}}],["upstream",{"2":{"439":1}}],["up",{"2":{"408":1,"444":1}}],["updating",{"2":{"408":1}}],["updateprojects",{"2":{"374":5}}],["update",{"2":{"115":5,"231":1,"237":6,"241":4,"408":1,"433":1,"444":1}}],["upwardprop",{"2":{"240":5}}],["unlighthouse",{"2":{"444":2}}],["unocss",{"2":{"444":10}}],["uno",{"2":{"444":10}}],["untrackedchanges",{"2":{"444":1}}],["undefined",{"2":{"427":1}}],["unique",{"2":{"449":1}}],["unicodehighlight",{"2":{"444":1}}],["unit",{"2":{"415":1,"417":1,"450":6}}],["universal",{"2":{"230":1}}],["unpkg",{"2":{"192":1}}],["utf",{"2":{"213":1,"350":2}}],["utils",{"0":{"424":1},"1":{"425":1,"426":1},"2":{"105":3,"409":1,"413":2,"415":1,"418":1,"419":1,"423":1,"424":3,"425":2,"426":1,"499":3,"500":5,"501":2,"503":1,"526":1}}],["ubuntu",{"2":{"135":1,"213":1,"353":1,"408":3,"433":1,"489":1}}],["ux",{"0":{"138":1,"140":1,"150":1,"403":1},"1":{"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":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},"2":{"76":1,"78":1,"88":1,"138":6,"140":2,"141":2,"150":2,"162":1,"189":2,"461":2,"484":1,"492":1,"507":1,"530":1,"544":1}}],["ui",{"0":{"24":1,"27":1,"140":1,"454":1,"459":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":{"20":2,"26":1,"67":1,"78":1,"99":1,"138":3,"140":2,"189":1,"256":1,"267":1,"272":1,"314":1,"427":1,"429":4,"443":1,"445":2,"450":1,"451":3,"452":2,"454":1,"456":1,"459":10,"484":1,"492":1,"496":1,"501":1,"520":1,"521":1}}],["uml",{"2":{"14":1,"230":2}}],["og",{"2":{"540":6}}],["old",{"2":{"448":2}}],["ok",{"2":{"448":2}}],["okta",{"2":{"386":1}}],["otp",{"0":{"387":1},"2":{"387":5,"388":2,"390":1}}],["othervalue",{"2":{"54":1,"55":1}}],["other",{"2":{"54":1,"55":1,"449":1}}],["output",{"2":{"425":1,"444":1}}],["out",{"2":{"422":1,"444":2,"448":1}}],["outlook",{"2":{"381":1}}],["our",{"2":{"194":1}}],["o",{"2":{"361":1}}],["overflow",{"2":{"504":1}}],["overwrite",{"2":{"489":2}}],["overrides",{"2":{"444":1}}],["over",{"0":{"270":1},"2":{"266":1}}],["obj",{"2":{"448":1}}],["object",{"2":{"83":1,"198":1,"236":1,"273":1,"286":1,"378":1,"414":1}}],["observe",{"2":{"162":1}}],["observerclass",{"2":{"298":3}}],["observerpattern",{"2":{"298":1}}],["observer",{"0":{"297":1,"298":1,"340":1},"1":{"298":1,"341":1,"342":1},"2":{"161":1,"162":2,"266":1,"280":1,"302":2,"306":1,"335":1,"340":1,"342":1,"448":1}}],["opera",{"2":{"213":1}}],["open=",{"2":{"522":1}}],["opengraph",{"2":{"489":1}}],["openclose",{"2":{"444":1}}],["opencart",{"2":{"16":2,"61":1}}],["openid",{"0":{"383":1},"2":{"383":6,"384":2,"388":1}}],["opennote",{"2":{"325":2}}],["open",{"2":{"12":1,"39":1,"61":1,"103":1,"261":1,"306":1,"487":1,"489":1,"494":1,"503":1,"530":1,"540":1}}],["option",{"2":{"206":1}}],["options",{"0":{"195":1,"346":1},"2":{"110":1,"112":1,"113":1,"130":1,"195":6,"246":1,"345":2,"346":1,"349":1,"371":1,"380":1,"381":1,"408":1,"444":1,"448":1}}],["ontaskerrors",{"2":{"444":1}}],["once",{"2":{"420":1,"421":1}}],["onmesssage",{"2":{"316":1}}],["onmessage=",{"2":{"322":1}}],["onmessage",{"2":{"315":2,"316":2,"317":1,"319":1,"321":1,"322":1}}],["onmounted",{"2":{"162":2,"241":2,"260":2,"273":3,"342":3,"544":1}}],["onbeforeunmount",{"2":{"260":1,"273":3,"342":3,"374":1}}],["onboarding",{"2":{"175":1}}],["onunmounted",{"2":{"241":2}}],["onlyenabledextensions",{"2":{"444":1}}],["only",{"2":{"172":1,"444":2}}],["online",{"2":{"14":1,"366":1}}],["onecolumnlayout",{"0":{"536":1}}],["onecomponent",{"2":{"235":3}}],["onerror",{"2":{"315":2}}],["one",{"2":{"145":1,"380":2,"461":1}}],["on",{"0":{"202":1},"2":{"103":1,"106":1,"130":1,"202":2,"298":3,"332":1,"342":1,"374":1,"408":5,"426":1,"444":2,"489":1}}],["oreilly",{"2":{"460":1}}],["orientation",{"2":{"257":1,"258":1,"262":1,"542":1}}],["origins",{"2":{"332":1}}],["origin",{"2":{"108":7,"332":2,"350":2,"439":5}}],["or",{"2":{"238":1,"360":5,"489":1,"497":1}}],["oracle",{"2":{"107":1,"407":1}}],["organizeimports",{"2":{"444":1}}],["org",{"2":{"89":1,"116":2,"120":1,"125":1,"147":1,"202":1,"203":2,"213":1,"219":1,"240":1,"241":1,"242":1,"255":1,"275":1,"349":1,"350":1,"380":1,"384":1,"500":1}}],["orders",{"2":{"12":1}}],["odezhda",{"2":{"88":1}}],["official",{"2":{"360":1}}],["office",{"2":{"145":1,"366":1}}],["off",{"2":{"298":4,"342":1,"374":1,"444":1,"449":1}}],["of",{"0":{"269":1},"2":{"83":5,"103":1,"237":1,"266":1,"412":1,"421":1,"422":1,"444":1,"461":1}}],["oauth",{"2":{"40":1,"106":2,"383":1,"390":1}}],["ozon",{"2":{"23":1}}],["eex",{"2":{"444":1}}],["eol",{"2":{"444":1}}],["e88a22df",{"2":{"412":1}}],["echo",{"2":{"408":8}}],["ecosystem",{"2":{"360":1}}],["ecommerce",{"2":{"41":1}}],["eager",{"2":{"414":2}}],["easingthemes",{"2":{"408":2}}],["eat",{"2":{"300":1}}],["eyjzdwiioiixmjm0nty3odkwiiwibmftzsi6ilbhymxviequiedhcmfndxnviiwiawf0ijoxnte2mjm5mdiyfq",{"2":{"383":1}}],["eyjhbgcioijiuzi1niisinr5cci6ikpxvcj9",{"2":{"383":1}}],["err=>",{"2":{"325":1,"382":1,"387":2}}],["err",{"2":{"309":1,"315":1,"322":2,"323":1,"326":1,"389":2}}],["errorcomponent",{"2":{"235":3}}],["error",{"2":{"54":3,"309":1,"330":1,"385":2,"408":1,"421":1,"422":1,"436":1}}],["esbenp",{"2":{"444":4}}],["esbuild",{"2":{"219":2,"443":1}}],["esnext",{"2":{"443":1}}],["es6",{"2":{"286":1,"448":1,"451":1}}],["eslint",{"2":{"20":1,"443":3,"444":17,"460":1,"492":2}}],["education",{"2":{"542":1}}],["editorconfig",{"2":{"444":2}}],["editortab",{"2":{"444":1}}],["editorgroup",{"2":{"444":1}}],["editor",{"2":{"444":29}}],["edit",{"2":{"203":1,"231":1,"483":1}}],["edititem",{"2":{"203":4}}],["edge",{"2":{"40":1,"107":2,"213":1,"360":1}}],["effective",{"2":{"149":1}}],["eff",{"2":{"135":2}}],["eth",{"2":{"389":1}}],["ethjs",{"2":{"389":1}}],["ethereum",{"2":{"389":4}}],["etc",{"0":{"132":1},"2":{"131":1,"545":1}}],["etsy",{"2":{"23":1}}],["engine",{"2":{"448":1}}],["enablesmartcommit",{"2":{"444":1}}],["enable",{"2":{"444":3,"448":1}}],["enabled",{"2":{"262":1,"444":9}}],["end",{"2":{"417":2,"418":2,"450":2}}],["endpoints",{"2":{"383":1}}],["endpoint",{"2":{"382":1,"384":1}}],["entity",{"2":{"449":2}}],["entire",{"2":{"414":1}}],["entry",{"2":{"380":2}}],["enter=",{"2":{"222":2}}],["enter",{"2":{"214":2,"220":1,"222":1,"426":1}}],["encapsulation",{"0":{"272":1},"2":{"266":1}}],["encryption",{"2":{"383":1}}],["encrypt",{"0":{"135":1},"2":{"122":1,"135":3,"136":1,"254":1,"402":1}}],["en",{"2":{"147":1,"275":1,"350":1,"384":1,"444":3}}],["envrc",{"2":{"444":12}}],["envs",{"2":{"408":2}}],["environment",{"2":{"408":1,"424":1}}],["environments",{"2":{"407":1}}],["env",{"2":{"105":1,"408":26,"444":38,"500":1}}],["eventbus",{"2":{"374":3}}],["event",{"2":{"260":3,"261":5,"298":13,"315":4,"316":2,"317":1,"321":2,"322":2,"339":1,"426":2,"444":1}}],["eventname",{"2":{"236":2}}],["events",{"0":{"115":1},"2":{"236":1,"298":9,"418":2}}],["everybody",{"2":{"449":1}}],["every",{"2":{"105":1}}],["electron",{"2":{"371":1}}],["electronic",{"2":{"135":1}}],["elements",{"2":{"203":1,"242":1}}],["element",{"2":{"162":1}}],["elem",{"2":{"162":3}}],["el",{"2":{"111":1}}],["else",{"0":{"199":2},"2":{"97":1,"235":1,"261":1,"293":1,"308":2,"309":2,"321":1,"328":2,"346":1,"347":1,"352":1,"385":1,"387":2,"413":1}}],["embla",{"2":{"447":1}}],["emmet",{"2":{"444":2}}],["emma",{"2":{"114":1}}],["email",{"2":{"387":3}}],["email=ref",{"2":{"387":1}}],["emitted",{"2":{"426":1}}],["emit",{"2":{"115":1,"298":3,"342":1,"374":1,"426":1}}],["emits",{"2":{"110":1,"115":1,"195":1,"237":1,"337":2}}],["empty",{"2":{"103":1}}],["e2e2e3",{"2":{"545":2}}],["e2e",{"2":{"71":1,"417":1,"450":5}}],["eq",{"2":{"54":1}}],["exs",{"2":{"444":5}}],["ex",{"2":{"444":1}}],["exclude",{"2":{"408":1,"444":1}}],["exiting",{"2":{"408":1}}],["extractor",{"2":{"444":11}}],["extractdomain",{"2":{"0":1}}],["extension",{"2":{"444":1}}],["extensions",{"2":{"255":1,"436":1,"444":3}}],["expand",{"2":{"444":1}}],["expandmode",{"2":{"444":1}}],["expected",{"2":{"421":1}}],["expect",{"2":{"421":12,"422":1,"423":3,"425":2,"426":4,"427":1}}],["experience",{"2":{"140":1,"418":1,"484":2}}],["express",{"2":{"331":2,"332":7,"461":1}}],["explorer",{"2":{"215":1,"435":1,"444":6}}],["explain",{"0":{"83":1},"2":{"83":1}}],["exports",{"2":{"414":1}}],["export",{"2":{"97":1,"105":2,"195":2,"241":1,"246":2,"262":1,"286":1,"287":1,"289":1,"290":1,"291":1,"294":1,"321":1,"323":1,"326":1,"328":1,"341":1,"344":1,"346":1,"352":1,"371":1,"411":1,"414":1,"443":1,"449":1,"500":2}}],["examplecomponent",{"2":{"235":1}}],["example",{"2":{"14":1,"414":2}}],["e",{"2":{"12":2,"16":1,"61":1,"62":1,"75":1,"78":1}}],["2fa",{"0":{"388":1},"2":{"387":1,"388":4}}],["299",{"2":{"382":1}}],["2979ff",{"2":{"258":1}}],["29",{"2":{"185":1,"444":1}}],["28",{"2":{"178":1}}],["27",{"0":{"468":1},"1":{"469":1,"470":1},"2":{"177":1}}],["26",{"2":{"174":1,"412":1}}],["25",{"2":{"173":1,"302":2}}],["255",{"2":{"125":1,"545":2}}],["245",{"2":{"545":3}}],["24",{"0":{"463":1},"1":{"464":1,"465":1},"2":{"173":1,"413":2}}],["235",{"2":{"545":4}}],["23",{"2":{"172":1}}],["22+",{"2":{"444":1}}],["22",{"2":{"169":1,"173":1,"213":1}}],["21",{"2":{"169":1,"173":1,"308":2}}],["2px",{"2":{"160":1}}],["2022",{"2":{"485":1}}],["2023",{"0":{"463":1,"466":1,"468":1,"471":1,"474":1},"1":{"464":1,"465":1,"467":1,"469":1,"470":1,"472":1,"473":1,"475":1},"2":{"444":1,"460":1,"485":1}}],["2016",{"2":{"460":1}}],["20~30",{"2":{"443":1}}],["20",{"2":{"99":1,"135":1,"162":1,"168":1,"408":1,"449":1,"460":1}}],["200",{"2":{"47":1,"235":1,"382":1,"407":1,"444":1,"461":1,"522":1}}],["2",{"0":{"110":1,"230":1,"287":1,"289":1,"290":2,"291":1,"292":1,"293":1,"294":1,"295":1,"298":1,"300":1,"302":1,"304":1,"305":2,"308":1,"385":1,"394":1,"404":1,"468":1},"1":{"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"469":1,"470":1},"2":{"10":1,"89":1,"91":1,"108":1,"109":1,"110":2,"111":2,"112":1,"113":1,"115":2,"116":6,"117":1,"119":1,"121":2,"128":1,"132":2,"135":1,"143":1,"162":1,"165":2,"190":1,"195":4,"200":1,"214":1,"216":1,"220":1,"222":4,"226":1,"229":1,"230":1,"234":1,"240":2,"241":4,"246":6,"247":1,"255":1,"260":1,"269":1,"271":2,"294":1,"297":2,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"304":2,"305":2,"306":1,"307":1,"308":10,"309":10,"314":2,"318":1,"319":1,"321":2,"322":2,"325":2,"326":2,"332":2,"338":3,"339":2,"340":2,"342":1,"344":4,"346":3,"347":3,"349":3,"350":1,"351":1,"352":2,"366":1,"369":1,"371":3,"383":2,"404":1,"419":2,"421":4,"425":2,"426":4,"435":2,"444":3,"448":5,"449":2,"451":1,"459":1,"460":3,"461":1,"480":2,"500":1,"545":2}}],["c2c2c4",{"2":{"545":1}}],["czrc",{"2":{"444":2}}],["cz",{"2":{"444":2}}],["cxx",{"2":{"444":1}}],["cjs",{"2":{"444":4}}],["cc",{"2":{"444":1}}],["csproj",{"2":{"444":1}}],["cspell",{"2":{"444":2}}],["cshtml",{"2":{"444":2}}],["cs",{"2":{"444":12}}],["csshtml",{"2":{"504":1}}],["cssnano",{"2":{"444":10}}],["cssnanorc",{"2":{"444":10}}],["css",{"0":{"216":1,"217":1,"459":1,"480":1,"504":1},"1":{"217":1,"221":1,"222":1,"223":1},"2":{"20":2,"35":3,"152":1,"153":1,"154":1,"159":1,"172":3,"190":4,"192":1,"193":1,"194":4,"198":1,"203":1,"212":1,"215":4,"216":5,"217":9,"218":9,"221":2,"222":4,"224":1,"225":1,"240":1,"253":1,"257":1,"262":3,"272":1,"325":1,"360":1,"372":1,"407":1,"444":5,"445":1,"451":1,"456":1,"459":9,"460":1,"461":1,"492":1,"496":1,"533":1,"536":1,"543":1,"544":1,"545":4}}],["css3",{"0":{"456":1},"2":{"20":1,"456":1,"457":1,"459":1,"492":1}}],["cypress",{"2":{"426":1,"444":10,"450":1}}],["cycle",{"2":{"195":1}}],["cpp",{"2":{"444":1}}],["cp",{"2":{"408":1}}],["cpu",{"2":{"360":1}}],["c++",{"2":{"273":1}}],["certification",{"2":{"460":1}}],["certbot",{"2":{"135":6,"137":1,"407":1}}],["central",{"2":{"351":1}}],["center",{"2":{"221":1}}],["celsius",{"2":{"302":9}}],["ctrlcmd",{"2":{"444":1}}],["ctrl",{"2":{"149":1}}],["c>",{"2":{"130":2}}],["cname",{"2":{"125":1}}],["cheat",{"0":{"476":1},"1":{"477":1,"478":1,"479":1,"480":1,"481":1,"482":1},"2":{"477":1,"478":1,"479":1,"480":4}}],["check",{"2":{"425":1,"426":1,"444":1}}],["checkout",{"2":{"408":4,"437":2,"438":2}}],["checkotp",{"2":{"387":3}}],["checkbox",{"2":{"222":2}}],["checked",{"2":{"222":6}}],["chia",{"2":{"421":1}}],["children",{"2":{"375":2,"376":1,"411":2}}],["childsession",{"0":{"353":1}}],["childsimple",{"2":{"344":1}}],["childpinia",{"0":{"349":1}}],["child",{"0":{"339":1,"342":1},"2":{"237":1,"338":4}}],["childcomponent>",{"2":{"237":1,"338":3}}],["childcomponent",{"2":{"237":1,"338":4}}],["chgrp",{"2":{"408":2}}],["choice",{"2":{"408":1}}],["choose",{"2":{"103":1}}],["chrome",{"2":{"213":1,"259":2,"263":1,"350":1,"353":1,"360":2,"448":2,"461":1}}],["chromium",{"2":{"116":1,"213":1,"360":1,"448":1}}],["changelocale",{"2":{"526":2}}],["changelog",{"2":{"444":1}}],["changes",{"2":{"120":1}}],["chain",{"2":{"389":1}}],["chainable",{"2":{"303":1}}],["chapter09",{"2":{"416":1}}],["chapter05",{"2":{"365":1}}],["chapter07",{"2":{"336":1}}],["chapter08",{"2":{"313":1}}],["chapter06",{"2":{"252":1}}],["chapter11",{"2":{"139":1}}],["chapter",{"0":{"127":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"298":1,"300":1,"302":1,"304":1,"305":1,"308":1,"436":1},"2":{"214":1,"262":3}}],["clangd",{"2":{"444":1}}],["clang",{"2":{"444":2}}],["classes",{"2":{"481":1}}],["classpath",{"2":{"444":1}}],["class",{"2":{"287":1,"444":1}}],["class=",{"2":{"97":1,"99":2,"160":1,"218":1,"221":1,"222":17,"240":3,"246":2,"339":1,"349":1,"374":3,"377":1,"413":1,"497":4,"501":2}}],["clearcase",{"2":{"430":1}}],["clearinterval",{"2":{"387":1}}],["clear",{"2":{"350":1}}],["cleartodo",{"2":{"222":3}}],["clean",{"0":{"273":1},"2":{"241":1,"266":1,"273":1,"298":1,"408":1}}],["clippy",{"2":{"444":2}}],["clipboard",{"2":{"222":1,"444":4}}],["click=",{"2":{"202":2,"203":1,"222":3,"246":2,"260":1,"325":3,"330":1,"338":1,"339":1,"342":1,"344":2,"349":2,"501":1,"526":1}}],["click",{"2":{"202":2,"246":1,"338":1,"426":3}}],["cli",{"2":{"117":1,"443":1,"444":2}}],["client",{"2":{"54":2,"55":9,"108":6,"383":1,"384":1,"499":1}}],["closeonfiledelete",{"2":{"444":1}}],["closemodal",{"2":{"246":3}}],["cloud",{"2":{"107":2,"460":1}}],["clone",{"2":{"102":1,"261":1,"491":1}}],["custom",{"2":{"444":2,"448":3,"545":1}}],["customer",{"2":{"78":1}}],["cursorstyle",{"2":{"444":1}}],["cursorsmoothcaretanimation",{"2":{"444":1}}],["cursorblinking",{"2":{"444":1}}],["cursor",{"2":{"222":1}}],["currentcolor",{"2":{"413":2}}],["current",{"2":{"103":1,"165":2,"246":11}}],["curl",{"2":{"55":2}}],["cdn",{"2":{"192":1}}],["cd",{"0":{"405":1},"2":{"70":1,"103":1,"405":5,"408":4,"440":2,"441":1,"442":1,"450":1,"460":1,"470":1,"490":1,"491":1,"533":1}}],["citation",{"2":{"444":1}}],["city",{"2":{"375":1,"377":1}}],["cities",{"2":{"375":1}}],["circleci",{"2":{"444":2}}],["circle",{"2":{"296":4}}],["ci",{"0":{"405":1},"2":{"70":1,"405":5,"408":1,"440":3,"441":1,"442":1,"450":1,"460":1,"470":1,"533":1}}],["cmakepresets",{"2":{"444":1}}],["cmake",{"2":{"444":3}}],["cmakelists",{"2":{"444":1}}],["cmv",{"0":{"100":1},"2":{"63":1}}],["cms",{"0":{"37":1,"39":1},"1":{"38":1,"39":1,"40":1,"41":1},"2":{"6":1,"12":2,"39":1,"62":1}}],["crm",{"2":{"496":1}}],["crowdin",{"2":{"444":2}}],["cross",{"2":{"108":1,"332":1,"444":1}}],["credits",{"2":{"444":1}}],["credo",{"2":{"444":1}}],["creator",{"2":{"126":1}}],["created",{"2":{"438":1}}],["createpinia",{"2":{"348":2}}],["createshape",{"2":{"296":3}}],["createrouter",{"2":{"127":1,"371":3}}],["creatememoryhistory",{"2":{"118":1}}],["createwebhistory",{"2":{"118":1,"127":3}}],["createwebhashhistory",{"2":{"118":1,"127":1,"371":3}}],["createapp",{"2":{"111":2,"112":4,"192":4,"234":2,"238":1,"246":2,"348":2,"372":2}}],["create",{"0":{"489":1},"1":{"490":1},"2":{"54":1,"103":1,"214":1,"231":1,"443":1,"483":1,"487":1,"489":4,"494":1,"495":1}}],["createclient",{"2":{"54":2}}],["crypto",{"2":{"321":1}}],["crafty",{"0":{"60":1},"2":{"79":2,"86":1,"102":1,"103":5}}],["crud",{"2":{"58":1,"107":1,"231":2,"273":1,"288":1,"324":2,"325":1,"327":2}}],["c",{"2":{"17":1,"191":3,"195":1,"273":1,"309":7,"377":4,"444":1,"489":1,"496":1,"545":9}}],["capture",{"2":{"444":95}}],["caption",{"2":{"160":2}}],["capacitor",{"2":{"371":1}}],["calc",{"2":{"504":1}}],["calculation",{"2":{"421":1}}],["calculatecelsius",{"2":{"302":2}}],["calculatefahrenheit",{"2":{"302":2}}],["callback",{"0":{"307":1,"308":1},"1":{"308":1},"2":{"307":1,"308":7,"309":1,"315":2}}],["callbacks",{"2":{"266":1,"282":1}}],["call",{"0":{"174":1},"2":{"174":1}}],["called",{"2":{"83":1}}],["categories",{"2":{"542":1}}],["category",{"0":{"45":1,"47":1},"2":{"18":1,"43":1,"88":4,"94":1}}],["categoryid",{"2":{"18":1,"88":2}}],["catch",{"2":{"293":1,"309":5,"326":3,"328":2,"382":1,"386":1,"387":2,"422":1}}],["caches",{"2":{"261":2}}],["cache",{"2":{"261":4,"444":1,"543":1}}],["can",{"2":{"449":1,"497":1}}],["cancel",{"2":{"246":3}}],["caniuse",{"2":{"116":1}}],["carousel",{"2":{"447":1}}],["cargo",{"2":{"444":2}}],["card",{"2":{"222":1,"540":1}}],["cart",{"2":{"12":1,"88":1}}],["camelcase",{"2":{"208":1,"241":1}}],["cases",{"0":{"410":1}}],["case",{"0":{"14":1},"2":{"14":4,"44":1,"206":1,"230":1,"247":3,"253":1,"296":2,"300":3,"302":2,"458":1}}],["coolcosmos",{"2":{"449":1}}],["cookies",{"2":{"350":2}}],["cookie",{"2":{"106":3,"260":1}}],["copying",{"2":{"444":1}}],["copilot",{"2":{"81":1}}],["coverage",{"2":{"420":2,"428":4}}],["coinflip",{"2":{"242":1}}],["couchdb",{"2":{"324":2}}],["count`",{"2":{"408":1}}],["count=5",{"2":{"408":1}}],["countries",{"2":{"377":1}}],["country",{"2":{"375":1,"377":3}}],["count++",{"2":{"346":1}}],["count>=0",{"2":{"346":2}}],["counter++",{"2":{"344":1}}],["counter=",{"2":{"338":3}}],["counter",{"0":{"347":1},"2":{"338":8,"339":3,"344":2,"346":1,"347":1,"349":1,"353":2}}],["count",{"2":{"205":1,"346":3,"347":7}}],["coupled",{"2":{"2":1}}],["colortheme",{"2":{"444":1}}],["color",{"2":{"142":1,"160":1,"194":1,"257":2,"258":2,"262":2,"305":2,"349":1,"413":3}}],["column=eq",{"2":{"55":1}}],["column",{"2":{"54":3,"55":2,"172":1,"497":1}}],["core",{"2":{"383":1,"433":1}}],["cordova",{"2":{"371":1}}],["corporation",{"2":{"125":1,"542":1}}],["cors",{"0":{"108":1},"2":{"108":10,"331":1,"332":5,"467":1}}],["coding",{"2":{"63":1,"100":1}}],["codesandbox",{"2":{"444":1}}],["codeowners",{"2":{"444":1}}],["codecov",{"2":{"444":10}}],["codelens",{"2":{"444":4}}],["codeaction",{"2":{"444":1}}],["codeactions",{"2":{"444":1}}],["codeactionsonsave",{"2":{"444":2}}],["code=ref",{"2":{"387":2}}],["code>",{"2":{"349":1}}],["codeium",{"0":{"80":1},"1":{"81":1,"82":1,"83":1,"84":1},"2":{"81":3,"82":1,"83":1,"84":1,"444":1}}],["code",{"0":{"204":1,"276":1},"1":{"205":1,"206":1,"207":1,"208":1,"209":1,"279":1,"280":1,"281":1,"282":1},"2":{"39":1,"81":1,"83":2,"103":1,"195":1,"206":1,"213":2,"215":1,"266":1,"300":1,"349":1,"360":1,"377":2,"385":3,"386":2,"387":3,"409":1,"432":1,"439":1,"444":9,"451":1,"489":1,"494":1,"515":1,"526":4,"527":1}}],["conduct",{"2":{"444":1}}],["conf",{"2":{"444":1}}],["confirmsync",{"2":{"444":1}}],["confirmdraganddrop",{"2":{"444":1}}],["confirmdelete",{"2":{"444":1}}],["confirm",{"0":{"185":1}}],["configs",{"2":{"444":1}}],["config",{"2":{"103":1,"215":1,"219":3,"262":1,"424":1,"427":1,"428":1,"443":2,"444":225,"489":4,"492":1,"503":1,"516":1,"517":1}}],["connection",{"2":{"444":1}}],["connect",{"2":{"383":1}}],["concerns",{"0":{"269":1},"2":{"266":1}}],["console",{"2":{"238":1,"287":1,"302":1,"308":5,"309":7,"315":1,"316":1,"332":1,"382":2,"389":2,"408":1,"448":2}}],["constructor",{"2":{"287":1,"293":1,"298":1}}],["constant",{"2":{"195":2}}],["const",{"2":{"54":4,"97":2,"98":1,"105":3,"111":2,"112":2,"114":1,"160":1,"162":1,"192":1,"195":2,"203":1,"206":1,"209":1,"222":1,"235":1,"238":3,"241":2,"246":3,"260":1,"261":4,"289":1,"293":1,"295":1,"304":1,"305":1,"317":1,"321":2,"322":2,"325":1,"326":2,"327":1,"328":1,"329":1,"330":1,"332":5,"338":1,"339":1,"341":1,"342":1,"344":2,"346":1,"347":2,"348":1,"349":1,"352":1,"353":1,"371":1,"377":1,"382":1,"385":1,"411":2,"413":3,"414":5,"425":1,"427":1,"448":1,"449":1,"497":1,"499":2,"500":2,"501":1,"526":2}}],["conventions",{"0":{"204":1},"1":{"205":1,"206":1,"207":1,"208":1,"209":1}}],["convention",{"2":{"195":1}}],["convert",{"2":{"83":1}}],["contributors",{"2":{"444":1}}],["contributing",{"2":{"444":1}}],["controller",{"2":{"444":1,"449":3,"451":2}}],["control",{"0":{"430":1},"2":{"106":1,"108":4,"430":3,"442":1,"481":1}}],["continuous",{"2":{"405":2,"440":3}}],["continue",{"2":{"103":1}}],["container",{"2":{"222":6,"457":1,"497":2}}],["content=",{"2":{"540":11}}],["contentlayer",{"2":{"444":10}}],["contents",{"2":{"408":1}}],["content>",{"2":{"240":1}}],["content",{"2":{"55":1,"221":1,"240":2,"500":1}}],["co",{"2":{"54":1,"55":3}}],["commitlint",{"2":{"444":4}}],["commit",{"2":{"405":1,"435":1,"436":3,"438":1}}],["common",{"2":{"386":1}}],["commands",{"2":{"444":1}}],["commandinvoker",{"2":{"300":1}}],["command",{"0":{"299":1,"300":1},"1":{"300":1},"2":{"213":1,"266":1,"280":1,"300":4,"318":1,"319":1,"321":4,"322":2,"323":1}}],["commerce",{"2":{"12":2,"16":1,"61":1,"62":1,"75":1,"78":1}}],["compile",{"2":{"444":1}}],["compileroptions",{"2":{"443":1}}],["compare",{"2":{"444":6}}],["completed",{"2":{"247":2}}],["completion",{"2":{"213":1,"444":1}}],["computed",{"2":{"195":1,"222":7,"246":4,"344":1,"347":3,"413":3}}],["computer",{"2":{"149":1}}],["component>",{"2":{"203":1,"242":1}}],["components",{"0":{"160":1,"162":1,"325":1,"330":1},"2":{"99":1,"195":1,"203":1,"215":1,"219":5,"221":3,"240":1,"374":2,"377":2,"409":1,"420":1,"425":1,"426":1,"443":1,"444":1,"501":1}}],["component",{"0":{"242":1,"377":1},"2":{"88":3,"112":4,"203":2,"234":3,"242":3,"246":1,"338":3,"349":1,"353":1,"371":3,"375":3,"377":1,"411":4,"425":1,"426":1,"444":7,"449":3}}],["compose",{"2":{"444":1}}],["composer",{"2":{"444":2}}],["composables",{"0":{"241":1},"1":{"242":1},"2":{"97":2,"105":1,"195":1,"241":1,"409":1,"449":1,"497":1,"501":1,"526":2}}],["composable",{"2":{"34":1,"449":9,"451":2,"492":1,"497":1,"507":1,"524":1}}],["composition",{"0":{"195":1,"270":1},"2":{"20":1,"96":1,"110":2,"112":1,"114":1,"116":2,"121":1,"195":10,"241":2,"266":1,"343":1,"345":1,"346":1,"347":2,"349":1,"380":2,"448":3,"449":2,"460":1,"470":1,"492":1}}],["com",{"2":{"23":3,"79":1,"102":1,"107":1,"108":9,"116":2,"125":1,"126":2,"127":2,"132":3,"139":1,"168":1,"186":2,"192":1,"213":1,"217":3,"218":1,"219":1,"226":1,"246":1,"247":1,"252":1,"253":1,"298":1,"313":1,"336":1,"340":1,"362":1,"363":1,"365":1,"383":1,"407":5,"408":10,"416":1,"444":2,"491":1,"499":1,"516":1,"517":1}}],["dprint",{"2":{"444":4}}],["dlint",{"2":{"444":4}}],["ds",{"2":{"436":1}}],["dx",{"2":{"418":1,"426":1,"459":1,"484":1}}],["dynamic",{"2":{"412":1}}],["dt",{"2":{"408":1}}],["dash",{"2":{"500":1}}],["day",{"2":{"445":2,"448":2}}],["dangerfile",{"2":{"444":2}}],["dart",{"2":{"444":6}}],["dark",{"2":{"444":1,"531":1,"545":1}}],["dapp",{"2":{"389":2}}],["dapps",{"2":{"389":1,"390":1}}],["datalayer",{"2":{"517":3}}],["data>",{"2":{"240":1}}],["data=json",{"2":{"350":1}}],["data=localstorage",{"2":{"350":1}}],["data=",{"2":{"240":1}}],["database",{"2":{"54":1}}],["data",{"0":{"113":1},"2":{"17":1,"18":2,"19":1,"47":3,"48":1,"54":2,"110":1,"113":6,"114":5,"192":2,"195":6,"238":6,"240":3,"298":3,"300":4,"315":2,"316":1,"321":6,"322":7,"323":1,"325":1,"328":6,"330":9,"332":4,"345":1,"350":4,"382":1,"384":2,"386":1,"387":1,"408":2,"443":1,"448":1}}],["date=`date",{"2":{"408":1}}],["date",{"2":{"0":1,"222":1,"408":7,"444":1,"517":1}}],["db",{"2":{"326":5}}],["dbservice",{"0":{"326":1},"2":{"325":1,"327":3,"329":1}}],["dbnotes",{"0":{"325":1}}],["dbmanager",{"2":{"288":1,"289":3,"290":3,"291":2,"292":4,"293":10,"295":6}}],["döner",{"2":{"167":1}}],["dns",{"0":{"125":2},"1":{"127":2},"2":{"125":6,"136":1,"137":2}}],["doublecount",{"2":{"346":1,"347":2}}],["don",{"0":{"274":1},"2":{"266":1}}],["done",{"2":{"222":5,"223":1}}],["dosignin",{"2":{"382":1}}],["dos",{"2":{"221":1}}],["dosubscribe",{"2":{"208":1}}],["download",{"2":{"218":1}}],["downloads",{"2":{"217":1}}],["docs",{"2":{"366":1,"384":1,"407":1,"408":1}}],["documentscroll",{"2":{"241":2}}],["document",{"2":{"162":1,"198":1,"241":2,"273":1,"324":1,"460":1}}],["dockerignore",{"2":{"444":1}}],["dockerfile",{"2":{"444":2}}],["docker",{"0":{"406":1},"2":{"40":1,"444":2}}],["do",{"0":{"127":1,"220":1,"223":1,"247":1,"248":1,"369":1},"1":{"221":1,"222":1,"223":1},"2":{"212":1,"214":1,"219":1,"220":2,"222":2,"223":1,"224":1,"229":1,"242":1,"246":1,"247":3,"248":1,"250":1,"364":2,"369":1,"374":2}}],["domain",{"2":{"540":1}}],["dom",{"2":{"119":1,"162":2,"198":1,"199":2,"201":1,"273":1,"314":1,"423":2}}],["doe",{"2":{"114":2,"236":1}}],["dropdown",{"2":{"459":1}}],["draw",{"2":{"296":3}}],["drawers",{"0":{"505":1},"1":{"506":1,"507":1}}],["drawer",{"2":{"103":1,"489":1,"496":1,"501":1,"530":1}}],["drilling",{"2":{"238":1,"411":2}}],["drive",{"2":{"106":3}}],["dry",{"0":{"274":1},"2":{"234":1,"241":1,"266":1}}],["diffeditor",{"2":{"444":1}}],["diffdecorationsgutterwidth",{"2":{"444":1}}],["di",{"2":{"339":1}}],["dialyzer",{"2":{"444":1}}],["dialogstyle",{"2":{"444":1}}],["dialog",{"2":{"246":1}}],["diagram",{"0":{"5":1}}],["dirs",{"2":{"408":1}}],["dir=`echo",{"2":{"408":2}}],["dir=your",{"2":{"408":1}}],["dir=dev",{"2":{"408":1}}],["dir=",{"2":{"408":2}}],["dir",{"2":{"408":24,"542":1}}],["dirname",{"2":{"219":1,"443":1}}],["direction",{"2":{"172":2,"497":2}}],["directives",{"2":{"202":1}}],["directive",{"2":{"112":1}}],["directory",{"0":{"377":1},"2":{"103":1,"375":3,"376":1}}],["discord",{"2":{"366":1}}],["disabled=",{"2":{"349":1}}],["dispatch",{"2":{"408":2}}],["dispatcher",{"0":{"319":1},"2":{"298":4,"317":1,"318":1,"319":1,"320":1}}],["displaylanguage",{"2":{"444":1}}],["display",{"2":{"160":1,"172":2,"198":1,"221":1,"222":1,"256":1,"258":1,"262":1,"497":1,"542":1}}],["distributedfooter",{"0":{"513":1}}],["dist",{"2":{"127":1,"134":1,"408":2,"412":1,"436":2,"444":1}}],["divider",{"2":{"545":1}}],["div>",{"2":{"99":1,"160":2,"162":2,"192":1,"195":2,"198":1,"221":1,"222":10,"240":5,"246":2,"305":1,"325":3,"330":4,"338":2,"342":2,"344":2,"374":2,"377":3,"411":6,"497":4,"526":2}}],["div",{"2":{"99":2,"161":1,"162":4,"192":3,"198":2,"221":3,"222":12,"240":4,"246":2,"305":1,"325":1,"374":2,"377":1,"413":1,"438":5,"497":4}}],["d",{"2":{"55":1,"130":1,"383":1,"408":1,"420":1,"424":2,"429":1,"437":1,"444":16}}],["details",{"2":{"457":1}}],["deno",{"2":{"444":2}}],["debounce",{"2":{"453":1}}],["debuganyway",{"2":{"444":1}}],["debug",{"2":{"436":4,"444":1}}],["debian",{"2":{"433":1}}],["deep",{"2":{"413":1}}],["deposit",{"2":{"524":1}}],["deprecated",{"2":{"449":1}}],["deployment",{"0":{"515":1},"2":{"440":1,"515":2}}],["deploy",{"2":{"408":16,"515":2,"530":1}}],["dependencies",{"2":{"294":3,"408":2,"527":1}}],["dependency2",{"2":{"295":1}}],["dependency1",{"2":{"295":1}}],["dependencyservice",{"2":{"294":2,"295":6}}],["dependency",{"0":{"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1},"1":{"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1},"2":{"266":1,"279":1,"293":1,"294":2,"295":2}}],["decoder",{"2":{"383":1}}],["decorator=",{"2":{"352":1}}],["decorator",{"0":{"303":1,"304":1,"305":1},"1":{"304":1,"305":1},"2":{"266":1,"281":1,"305":1,"309":1,"318":1,"351":1,"352":2,"354":1}}],["decrement",{"2":{"346":1,"347":2,"349":1}}],["dexie",{"2":{"324":2,"326":5}}],["dexiejs",{"0":{"324":1},"1":{"325":1,"326":1,"327":1,"328":1,"329":1,"330":1},"2":{"324":2}}],["dexiedb",{"2":{"306":1}}],["degrees",{"2":{"302":6}}],["delivery",{"2":{"405":1,"440":1}}],["delegate",{"0":{"318":1},"2":{"312":1,"317":1,"318":3,"320":1,"334":1}}],["deletenote",{"2":{"325":3,"326":2}}],["delete",{"2":{"54":1,"55":1,"97":1,"231":1,"321":1,"326":1,"327":1,"381":1,"448":1}}],["delay",{"2":{"235":2}}],["de",{"2":{"158":1}}],["definition",{"2":{"421":1}}],["define",{"2":{"427":1}}],["defined",{"2":{"421":2}}],["defineasynccomponent",{"2":{"235":7}}],["defineconfig",{"2":{"219":1,"262":2,"424":1,"427":2,"443":1,"516":1}}],["defineemits",{"2":{"115":1,"236":3,"237":2}}],["defineprops",{"2":{"115":1,"160":1,"236":4,"237":2,"246":1,"304":1,"305":1,"374":1,"413":1}}],["definestore",{"2":{"346":3,"347":2}}],["defines",{"2":{"83":1}}],["defaultformatter",{"2":{"444":4}}],["defaults",{"2":{"328":1,"386":1}}],["default",{"0":{"132":1},"2":{"105":1,"113":1,"195":2,"219":1,"236":3,"240":1,"246":4,"262":1,"286":1,"287":1,"289":1,"290":1,"291":1,"294":1,"321":1,"323":1,"326":1,"328":1,"341":1,"344":1,"371":1,"377":2,"408":2,"413":6,"424":1,"427":2,"443":1,"444":2,"500":1,"516":1}}],["devdependencies",{"2":{"443":1,"444":1}}],["devoptions",{"2":{"262":1}}],["developit",{"2":{"340":1}}],["developer",{"2":{"261":1,"317":1,"350":1,"384":1,"418":1,"484":1}}],["development",{"2":{"66":1,"542":1}}],["dev",{"2":{"79":1,"103":1,"108":1,"214":1,"215":1,"217":1,"219":2,"222":1,"262":1,"407":2,"408":10,"438":5,"443":1,"461":1,"490":1,"491":1,"542":1}}],["devtoolsformatters",{"2":{"448":3}}],["devtools",{"2":{"23":1,"107":1,"448":2,"449":4,"527":1}}],["designer",{"2":{"444":2}}],["designing",{"2":{"149":1}}],["design",{"0":{"357":1},"2":{"139":1,"167":1,"216":2,"217":1,"226":1,"246":1,"247":1,"252":1,"313":1,"336":1,"358":1,"362":1,"365":1,"414":1,"416":1,"460":2,"464":1,"485":1}}],["describe",{"2":{"421":3,"425":2,"426":2,"427":1}}],["description",{"2":{"18":1,"19":1,"127":3,"258":1,"408":1,"540":3,"542":1}}],["desc",{"2":{"47":2}}],["desktop",{"2":{"20":1,"86":1,"147":1,"172":2,"263":1,"497":3,"506":1,"534":2,"536":1}}],["python",{"2":{"460":1,"461":1}}],["pyproject",{"2":{"444":2}}],["pyrightconfig",{"2":{"444":2}}],["psalm",{"2":{"444":1}}],["pm2",{"2":{"444":4}}],["pm",{"2":{"444":1}}],["ppa",{"2":{"433":3}}],["px`",{"2":{"413":4}}],["pdm",{"2":{"444":2}}],["pdf",{"2":{"412":1,"444":1}}],["pdgaraguso",{"2":{"363":1}}],["pwd",{"2":{"408":1}}],["pwas",{"2":{"390":1}}],["pwa",{"0":{"253":1,"254":1,"262":1,"263":1,"461":1,"541":1},"1":{"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"542":1,"543":1},"2":{"50":1,"77":1,"103":1,"122":2,"135":1,"190":1,"251":5,"253":15,"255":1,"258":2,"260":8,"261":5,"262":5,"263":3,"264":3,"265":4,"358":1,"398":1,"461":12,"484":1,"489":2,"494":2,"496":1,"530":1}}],["pnp",{"2":{"444":2}}],["pnpm",{"2":{"53":1,"103":3,"408":12,"436":1,"443":2,"444":6,"489":3,"490":2,"491":2,"494":1}}],["png`",{"2":{"412":1}}],["png",{"2":{"262":8,"412":3,"414":3,"501":1}}],["p>",{"2":{"260":2,"325":2}}],["p",{"2":{"260":2,"374":4,"408":1,"438":2}}],["pending",{"2":{"222":10,"223":1}}],["persistentsessionreviveprocess",{"2":{"444":1}}],["person=",{"2":{"115":1}}],["person",{"2":{"114":5,"115":1,"205":1,"207":1}}],["pereditorgroup",{"2":{"444":1}}],["performance",{"2":{"253":1}}],["permissions",{"2":{"408":1}}],["permission",{"2":{"106":1}}],["pipelines",{"2":{"444":2}}],["picture",{"2":{"197":3}}],["pinia",{"0":{"345":1,"349":1},"1":{"346":1,"347":1,"348":1,"349":1},"2":{"20":1,"98":1,"110":1,"118":2,"335":1,"344":1,"345":6,"346":3,"347":2,"348":2,"349":12,"353":1,"359":1,"360":1,"399":1,"449":14,"470":1}}],["pug",{"2":{"448":1}}],["pugtools",{"2":{"444":1}}],["puppeteer",{"2":{"444":10}}],["pubspec",{"2":{"444":3}}],["pubxml",{"2":{"444":2}}],["pub",{"2":{"297":1,"301":1,"374":2}}],["publishing",{"2":{"103":1,"143":1,"489":1}}],["public",{"2":{"54":1,"57":2,"94":1,"107":1,"117":1,"215":1,"216":1,"217":1,"218":1,"412":4}}],["put",{"2":{"261":1,"327":1,"381":2}}],["push",{"0":{"378":1},"2":{"222":1,"253":3,"298":1,"378":4,"379":1,"405":1,"408":3,"431":1,"439":2,"440":1,"451":1,"517":1}}],["purple",{"2":{"194":1,"305":1}}],["pure",{"2":{"194":1}}],["pullapprove",{"2":{"444":2}}],["pull",{"2":{"134":1,"431":1,"439":1}}],["plugin",{"2":{"246":4,"262":3,"443":2,"444":1,"461":2,"503":1}}],["plugins",{"2":{"219":3,"244":2,"246":5,"247":1,"262":1,"372":1,"424":1,"443":1}}],["plus",{"2":{"222":1}}],["playground",{"2":{"444":1}}],["playwright",{"2":{"444":10}}],["player",{"2":{"186":1}}],["placeholder=",{"2":{"222":1,"325":2}}],["placeholder",{"2":{"107":1}}],["please",{"2":{"103":1,"444":1}}],["pba",{"2":{"106":1}}],["phantom",{"2":{"389":1}}],["photoshop",{"2":{"366":1}}],["photo",{"2":{"106":1}}],["phpcs",{"2":{"444":2}}],["phpunit",{"2":{"444":1}}],["php",{"2":{"61":1,"107":1,"444":2,"460":1,"461":2}}],["polygon",{"2":{"389":1}}],["policy",{"2":{"106":1}}],["policies",{"2":{"58":1}}],["port",{"2":{"332":4,"434":1}}],["portrait",{"2":{"258":1}}],["pouchdb",{"2":{"324":1}}],["pointer",{"2":{"222":1}}],["position",{"2":{"99":1}}],["postcss",{"2":{"444":10}}],["postcssrc",{"2":{"444":10}}],["postmessage",{"2":{"315":2,"316":1,"317":1,"321":1,"322":1}}],["postman",{"2":{"50":2,"108":1,"444":1}}],["posts",{"2":{"116":1}}],["postwoman",{"2":{"50":1}}],["postgresql",{"2":{"107":1}}],["postgres",{"2":{"40":2,"48":1}}],["post",{"2":{"0":3,"55":1,"327":3,"328":2,"329":1,"330":2,"332":3,"381":2,"382":1,"386":1,"387":2}}],["pablo",{"2":{"356":1,"383":1}}],["payload=",{"2":{"322":1,"328":2}}],["payload",{"2":{"321":7,"322":3,"328":4,"383":4}}],["pascal",{"2":{"444":1}}],["pascalcase",{"2":{"207":1,"221":2}}],["password",{"2":{"382":3}}],["passingpropsupward>",{"2":{"240":1}}],["passingpropsupward",{"2":{"240":2}}],["padding",{"2":{"221":1,"222":7,"332":1,"374":1}}],["patterns",{"0":{"357":1,"403":1},"2":{"139":1,"226":1,"246":1,"247":1,"252":1,"313":1,"336":1,"358":1,"362":1,"365":1,"416":1,"444":1,"460":2,"464":1,"485":1}}],["paths",{"2":{"443":1}}],["path",{"2":{"88":3,"219":4,"371":3,"375":3,"377":1,"378":1,"411":4,"413":1,"443":3}}],["packtpub",{"2":{"168":1}}],["packtpublishing",{"2":{"139":1,"226":1,"246":1,"247":1,"252":1,"313":1,"336":1,"362":1,"365":1,"416":1}}],["packt",{"2":{"142":2,"143":1,"144":1,"168":1,"169":2,"363":1}}],["packages",{"2":{"444":1}}],["package",{"0":{"5":1},"2":{"86":1,"213":1,"215":2,"298":1,"331":1,"420":2,"428":1,"429":1,"443":1,"444":7,"492":1,"527":1}}],["parameters",{"2":{"378":1}}],["params",{"2":{"105":2,"328":1,"374":4,"377":1,"378":1,"380":2,"500":1}}],["parentbasic",{"0":{"338":1}}],["parent",{"2":{"237":1,"314":1}}],["parse",{"2":{"98":1,"325":1,"326":1,"350":1}}],["pagespeed",{"2":{"461":2}}],["pages",{"0":{"514":1},"1":{"515":1,"516":1},"2":{"103":3,"405":1,"407":3,"408":11,"460":1,"489":1,"515":6,"530":2}}],["page",{"2":{"87":2,"108":1,"165":2,"461":1}}],["panel",{"0":{"31":1}}],["pr",{"2":{"483":1}}],["practices",{"0":{"357":1},"2":{"139":1,"226":1,"246":1,"247":1,"252":1,"313":1,"336":1,"362":1,"365":1,"416":1,"460":2,"464":1,"485":1}}],["primevue",{"2":{"445":1}}],["print",{"2":{"448":1}}],["printwidth",{"2":{"444":1}}],["printf",{"2":{"408":1}}],["printpage",{"2":{"202":3}}],["principle",{"0":{"271":1},"2":{"275":1}}],["privacy",{"0":{"180":1}}],["private",{"2":{"128":1,"408":5,"409":1,"449":1}}],["price",{"2":{"18":1,"461":1}}],["problem",{"2":{"461":1}}],["procfile",{"2":{"444":2}}],["processmessage",{"2":{"321":4}}],["process",{"2":{"314":1}}],["processqueue",{"2":{"208":1}}],["proceed",{"2":{"103":1}}],["proj",{"2":{"444":2}}],["projectname",{"2":{"489":1}}],["projects",{"2":{"288":2,"289":3,"290":4,"291":3,"292":4,"293":9,"374":1}}],["projectservice",{"2":{"209":1}}],["projectservice=new",{"2":{"209":1}}],["project",{"2":{"103":2,"371":4,"374":1,"408":5,"444":1,"489":5,"490":1,"494":2}}],["prod",{"2":{"408":5}}],["producs",{"2":{"97":1}}],["production",{"2":{"443":1}}],["productid",{"2":{"88":1,"97":6}}],["productcard",{"2":{"93":1}}],["productcategoryview",{"2":{"87":2,"88":2}}],["productview",{"2":{"87":2,"88":1}}],["products",{"2":{"41":2,"83":1,"86":1,"87":1,"94":1,"97":1,"105":3}}],["product",{"0":{"46":1,"47":1},"2":{"16":1,"17":1,"43":1,"47":1,"48":1,"54":4,"55":3,"58":1,"83":2,"88":3,"126":1}}],["proxies",{"0":{"351":1},"1":{"352":1,"353":1}}],["proxy",{"0":{"301":1,"302":1},"1":{"302":1},"2":{"108":1,"114":1,"116":1,"266":1,"281":1,"301":1,"302":3,"303":2,"318":1,"351":1,"352":3,"448":2,"451":1}}],["provision",{"2":{"238":5}}],["provider",{"2":{"383":1}}],["provide",{"0":{"238":1},"2":{"237":1,"238":8,"246":1,"294":3,"295":4,"339":2,"409":1,"411":3,"449":2}}],["promised",{"2":{"311":1}}],["promises",{"2":{"266":1,"282":1,"308":1}}],["promise",{"0":{"309":1},"2":{"232":1,"235":1,"246":1,"309":9,"321":3,"322":2,"323":2,"326":3,"328":2,"423":2,"499":1}}],["prompt",{"0":{"260":1},"2":{"213":1,"259":1,"260":6}}],["profile",{"2":{"197":3,"238":1}}],["progressive",{"2":{"253":1,"263":1,"358":1,"461":1}}],["progress",{"0":{"159":1},"1":{"160":1},"2":{"159":1,"247":2}}],["protocol",{"2":{"125":1,"134":2,"135":1}}],["prop",{"2":{"115":2,"237":1,"246":1,"338":1,"352":12,"374":2,"411":2}}],["props",{"0":{"115":1},"2":{"110":1,"115":3,"195":1,"236":1,"237":2,"238":2,"240":1,"246":1,"337":2,"352":6,"371":2,"374":1,"375":2,"377":1,"413":11,"418":2,"419":1,"425":3}}],["property=",{"2":{"540":7}}],["properties",{"2":{"380":1}}],["proper",{"2":{"83":1}}],["prerenderer",{"2":{"461":1}}],["prettier",{"2":{"444":14}}],["pretty",{"2":{"371":1}}],["pre>",{"2":{"344":2}}],["pre",{"2":{"308":14,"309":7}}],["preventdefault",{"2":{"260":1}}],["preview",{"2":{"215":1,"420":2,"444":1}}],["press",{"2":{"174":2}}],["prestashop",{"2":{"41":1}}],["preferredtagnamecase",{"2":{"444":1}}],["prefer",{"2":{"55":1,"262":1}}],["ящики",{"2":{"272":1}}],["ячеек",{"2":{"269":1}}],["ярким",{"2":{"350":1,"381":1}}],["яркий",{"2":{"272":1}}],["ярких",{"2":{"153":1}}],["ярлыков",{"2":{"169":1}}],["ярлыка",{"2":{"155":1,"258":1}}],["ядра",{"2":{"116":1,"431":2}}],["языком",{"2":{"270":1,"314":1}}],["языков",{"0":{"457":1},"2":{"191":1,"216":1,"285":1,"287":1,"448":1,"452":1,"524":1}}],["языке",{"2":{"107":2,"140":1,"147":1,"154":1,"195":1,"217":1,"266":1,"361":1,"460":1}}],["языках",{"2":{"271":2,"410":1,"451":1,"452":1}}],["языками",{"2":{"194":1,"273":1}}],["языка",{"2":{"67":1,"108":1,"140":1,"216":1,"270":1,"278":1,"421":1,"448":1,"460":1,"524":1}}],["язык",{"0":{"357":1},"2":{"67":2,"109":1,"138":1,"190":2,"209":1,"257":1,"270":1,"403":1,"449":1,"460":2}}],["явная",{"2":{"274":1}}],["явным",{"2":{"105":1}}],["явные",{"2":{"55":1}}],["явного",{"2":{"292":1}}],["явное",{"2":{"248":1}}],["явном",{"2":{"194":1}}],["явно",{"2":{"99":1,"179":1,"195":1,"203":1,"215":1,"492":1}}],["явен",{"2":{"99":1}}],["являющееся",{"2":{"156":2}}],["являются",{"2":{"14":1,"107":1,"112":1,"115":1,"143":1,"147":2,"149":1,"161":1,"173":1,"178":1,"204":1,"209":1,"213":1,"216":1,"234":1,"253":1,"261":1,"268":1,"273":1,"276":1,"284":1,"286":1,"302":1,"308":1,"314":1,"337":1,"346":2,"350":2,"366":2,"380":1,"381":1,"382":3,"386":1,"389":3,"394":1,"411":1,"415":1,"421":1,"448":1,"487":1}}],["является",{"0":{"113":1},"2":{"41":1,"50":1,"107":1,"110":1,"113":1,"114":1,"116":1,"125":1,"128":1,"134":1,"135":2,"141":1,"147":1,"148":1,"155":1,"158":1,"161":2,"162":1,"165":1,"169":1,"172":1,"173":3,"177":1,"185":2,"188":1,"191":1,"192":1,"194":3,"195":4,"197":1,"211":1,"212":1,"214":1,"215":3,"218":2,"219":2,"223":1,"225":2,"226":1,"229":1,"231":1,"232":1,"235":1,"236":1,"237":3,"238":3,"247":3,"251":1,"255":1,"258":1,"260":1,"261":2,"263":1,"266":1,"270":1,"271":1,"272":1,"274":1,"275":1,"282":1,"286":1,"290":1,"297":1,"298":1,"301":2,"302":2,"306":3,"307":2,"308":1,"309":1,"314":3,"319":1,"321":1,"323":1,"325":1,"327":2,"328":1,"337":2,"343":2,"344":2,"345":1,"349":2,"350":4,"352":4,"366":1,"369":1,"371":1,"374":1,"376":1,"377":1,"381":2,"382":1,"383":3,"387":4,"389":3,"411":1,"415":1,"418":2,"419":1,"421":3,"423":1,"424":1,"430":2,"431":2,"432":1,"435":2,"436":2,"449":2,"451":2,"452":1,"461":1,"500":1}}],["являться",{"2":{"6":1,"328":1}}],["я",{"2":{"4":1,"61":2,"110":1,"175":1,"192":1,"195":2,"203":1,"213":4,"230":1,"240":1,"246":1,"258":1,"271":1,"273":1,"298":2,"301":1,"302":1,"308":1,"309":2,"328":1,"339":1,"349":1,"352":1,"363":1,"374":1,"449":2,"452":2,"460":2}}],["едят",{"2":{"527":1}}],["единицы",{"2":{"417":1}}],["единиц",{"2":{"306":1}}],["единицей",{"2":{"229":1}}],["единую",{"2":{"287":1,"299":1,"318":1}}],["единый",{"2":{"274":1,"344":1,"345":1,"459":1}}],["единая",{"2":{"253":1,"266":1,"269":1,"297":1}}],["единой",{"0":{"271":1},"2":{"271":1,"318":1,"320":1,"343":1}}],["единое",{"2":{"193":1,"272":1,"417":1}}],["единовременно",{"2":{"135":1}}],["единственным",{"2":{"290":1,"332":1}}],["единственный",{"2":{"195":2,"349":1,"374":1}}],["единственные",{"2":{"145":1,"349":1,"350":1}}],["единственному",{"2":{"421":1}}],["единственной",{"2":{"176":1}}],["единственное",{"2":{"61":1,"309":1,"421":1}}],["единственная",{"2":{"161":1,"492":1}}],["ежедневно",{"2":{"354":1}}],["ею",{"2":{"337":2}}],["е",{"2":{"124":1,"174":1}}],["еvent",{"2":{"109":1}}],["ему",{"2":{"106":1,"143":1,"155":1,"230":1,"231":1,"298":1,"309":1,"323":1,"374":1,"387":1,"405":1,"449":1,"461":1}}],["ей",{"2":{"61":1,"277":1,"459":1}}],["ее",{"2":{"20":1,"68":1,"131":1,"140":1,"150":1,"154":2,"162":1,"184":1,"191":1,"192":1,"194":2,"195":2,"213":2,"216":2,"220":1,"222":1,"223":1,"231":1,"235":1,"237":1,"241":3,"242":2,"248":1,"260":1,"269":1,"273":2,"275":1,"290":1,"292":1,"293":2,"298":1,"307":1,"314":2,"315":1,"322":1,"324":1,"326":2,"333":1,"337":1,"338":1,"340":1,"344":1,"346":1,"350":3,"366":1,"375":1,"385":1,"389":1,"422":1,"425":1,"426":1,"428":1,"430":1,"438":1,"452":1}}],["её",{"0":{"215":1},"2":{"20":1,"41":1,"81":1,"88":1,"89":2,"93":1,"106":2,"197":1,"409":1,"412":1,"448":1,"451":2,"453":2}}],["еще",{"0":{"240":1},"2":{"10":1,"27":1,"41":1,"125":1,"134":1,"138":1,"140":1,"143":1,"145":1,"158":1,"182":1,"191":1,"193":1,"202":1,"203":1,"210":1,"213":1,"214":2,"215":1,"218":2,"219":1,"230":1,"234":1,"237":1,"238":1,"240":1,"246":1,"247":3,"248":1,"249":1,"259":1,"269":2,"275":1,"276":1,"295":1,"305":1,"314":1,"317":2,"318":1,"322":1,"332":1,"333":1,"366":2,"386":1,"388":3,"417":1,"420":2,"421":2,"423":1,"427":1,"428":1,"429":1,"436":1,"438":1,"439":1,"444":4,"448":1,"451":1,"460":1,"461":3,"524":1}}],["ещё",{"2":{"4":1,"366":1}}],["естественный",{"2":{"367":1}}],["естественным",{"2":{"145":1,"237":1}}],["естественные",{"0":{"145":1}}],["естественных",{"2":{"144":1,"421":1}}],["естественной",{"2":{"144":1}}],["естественном",{"2":{"140":1}}],["естественно",{"2":{"103":1,"121":1,"271":1,"408":1,"449":1}}],["есть",{"0":{"486":1},"2":{"9":1,"10":1,"12":1,"13":1,"16":3,"17":2,"23":2,"43":1,"47":1,"48":1,"58":1,"75":1,"81":1,"82":1,"88":1,"96":3,"99":1,"103":1,"106":3,"107":4,"110":1,"113":1,"114":1,"116":1,"125":2,"127":1,"133":1,"135":1,"149":1,"156":1,"158":1,"159":3,"162":1,"164":1,"173":1,"175":2,"178":1,"190":1,"191":4,"194":2,"195":3,"203":1,"211":1,"214":2,"218":1,"222":4,"223":3,"229":1,"234":1,"235":1,"237":1,"239":1,"240":1,"242":1,"246":1,"247":1,"249":1,"250":1,"253":2,"259":1,"260":2,"261":3,"262":1,"270":2,"273":1,"275":1,"298":1,"299":1,"301":2,"303":3,"305":1,"308":1,"309":4,"314":4,"316":1,"320":1,"337":3,"339":2,"341":1,"342":1,"344":3,"345":1,"347":1,"349":1,"350":1,"366":1,"368":1,"371":1,"372":1,"374":2,"375":1,"377":3,"383":3,"387":1,"389":1,"408":3,"409":2,"414":1,"420":3,"421":1,"424":2,"426":1,"427":1,"428":1,"430":1,"436":1,"439":1,"444":1,"445":2,"446":1,"449":4,"451":3,"452":1,"453":1,"459":1,"460":6,"461":3,"495":1,"527":2,"528":1}}],["если",{"2":{"3":1,"9":1,"12":2,"20":1,"26":1,"34":1,"36":1,"40":1,"41":1,"58":2,"67":1,"83":1,"84":2,"94":1,"99":2,"106":5,"107":2,"108":5,"112":1,"116":4,"122":1,"125":1,"126":4,"127":2,"128":1,"130":1,"132":2,"134":1,"135":4,"136":1,"138":1,"141":1,"143":3,"145":2,"147":1,"148":1,"149":1,"150":1,"156":1,"159":1,"161":1,"164":1,"169":1,"175":1,"177":2,"182":1,"186":1,"187":1,"190":1,"191":1,"193":1,"194":4,"195":2,"197":2,"199":2,"200":1,"203":1,"209":1,"211":2,"213":1,"214":8,"215":2,"216":3,"217":1,"218":2,"222":2,"223":1,"229":1,"230":1,"234":2,"235":2,"237":1,"238":1,"240":6,"241":1,"246":1,"253":3,"255":1,"260":2,"261":3,"262":1,"263":1,"264":1,"269":2,"271":1,"273":3,"274":2,"276":2,"283":1,"286":2,"287":1,"290":1,"292":2,"293":2,"294":1,"298":2,"299":1,"300":1,"301":1,"302":1,"303":1,"307":1,"314":8,"315":2,"317":1,"319":1,"323":1,"325":1,"326":1,"327":1,"336":1,"339":2,"342":5,"344":3,"345":1,"346":1,"348":1,"349":1,"350":2,"352":2,"353":2,"360":1,"364":1,"366":1,"368":1,"371":1,"374":3,"376":1,"377":1,"380":2,"382":1,"383":1,"388":3,"389":1,"407":1,"408":1,"409":1,"412":2,"414":1,"420":1,"421":3,"423":2,"424":1,"427":1,"428":2,"430":1,"432":1,"433":1,"434":3,"435":4,"439":1,"443":3,"444":1,"448":1,"449":5,"453":2,"454":1,"456":1,"459":1,"460":4,"461":2,"492":1,"515":1,"516":2,"527":1,"536":1}}],["его",{"0":{"284":1},"2":{"3":1,"4":1,"16":1,"20":1,"23":2,"25":1,"41":1,"48":1,"58":1,"63":1,"64":1,"67":1,"68":1,"81":2,"93":1,"98":1,"99":2,"103":1,"106":10,"107":2,"108":1,"112":3,"114":2,"116":1,"125":1,"126":1,"128":1,"131":1,"132":1,"135":2,"138":1,"140":3,"143":2,"148":1,"153":2,"156":1,"157":1,"159":4,"161":1,"162":1,"164":1,"166":1,"168":1,"169":1,"172":1,"174":1,"176":2,"177":1,"178":1,"182":1,"185":1,"187":2,"191":2,"192":2,"194":1,"195":5,"198":2,"202":1,"203":1,"204":1,"212":1,"213":2,"214":2,"215":6,"217":1,"218":1,"220":2,"221":2,"222":3,"223":3,"224":1,"234":2,"235":2,"236":1,"237":1,"238":1,"246":4,"247":2,"249":1,"250":1,"251":1,"253":2,"257":1,"259":1,"260":2,"261":6,"262":1,"264":1,"265":1,"271":1,"273":1,"274":4,"276":1,"287":1,"291":1,"294":1,"295":2,"298":2,"299":1,"301":4,"302":1,"303":4,"304":1,"306":3,"308":2,"309":1,"315":1,"317":1,"318":2,"319":1,"321":1,"322":2,"323":1,"324":2,"325":1,"326":1,"328":2,"332":1,"333":1,"337":2,"339":1,"340":1,"343":2,"345":4,"346":3,"347":1,"349":2,"350":2,"351":3,"352":5,"353":2,"355":1,"367":1,"368":1,"369":1,"371":1,"373":1,"374":3,"375":1,"377":1,"381":1,"382":2,"383":4,"384":1,"387":2,"388":1,"389":6,"402":1,"408":1,"409":1,"415":1,"417":1,"418":2,"419":1,"420":1,"424":1,"426":2,"429":1,"430":1,"431":2,"435":3,"438":3,"439":1,"440":1,"443":1,"444":2,"449":1,"451":1,"452":3,"458":1,"459":1,"460":1,"461":7,"484":2,"496":2,"527":1,"542":1}}],["ie6",{"2":{"459":1}}],["iex",{"2":{"444":1}}],["ie11",{"2":{"414":1}}],["ie",{"2":{"414":1}}],["igzir14e",{"2":{"383":1}}],["ignoredlocales",{"2":{"444":1}}],["ignoretrimwhitespace",{"2":{"444":1}}],["ignorerecommendations",{"2":{"444":1}}],["ignore",{"2":{"103":1,"444":2,"489":1}}],["iat",{"2":{"383":2}}],["i++",{"2":{"298":1,"308":2,"309":1}}],["i>",{"2":{"218":1,"222":3}}],["ico",{"2":{"215":1,"262":1}}],["iconify",{"2":{"414":1,"444":2}}],["icons",{"0":{"414":1},"2":{"256":1,"262":1,"413":2,"414":1,"542":1}}],["iconwithbadge",{"2":{"99":3}}],["iconbadge",{"2":{"99":3}}],["iconbuddy",{"2":{"89":1}}],["icones",{"2":{"89":1}}],["icon",{"2":{"19":1,"99":2,"217":1,"262":3,"413":1}}],["icann",{"2":{"125":2}}],["ipc",{"2":{"309":1,"315":1}}],["ipv6",{"2":{"125":4}}],["ipv4",{"2":{"125":3}}],["ip",{"2":{"106":1,"125":7}}],["iphone",{"2":{"106":1,"153":1}}],["ipo",{"2":{"62":1}}],["i",{"2":{"103":1,"200":4,"218":2,"222":3,"298":6,"308":4,"309":2,"444":1,"490":1,"491":1}}],["isdraweropen",{"2":{"501":3}}],["isn",{"2":{"449":2}}],["isauthenticated",{"2":{"449":1}}],["ist",{"2":{"444":1}}],["issuenumberlabel",{"2":{"444":1}}],["issued",{"2":{"383":1}}],["is=",{"2":{"203":1}}],["is",{"0":{"242":1},"2":{"103":1,"194":1,"203":1,"235":1,"242":2,"444":1,"448":2,"449":2}}],["isinfavourites",{"2":{"97":3}}],["if=",{"2":{"246":1,"413":1}}],["ifmodule>",{"2":{"130":2}}],["ifmodule",{"2":{"130":2}}],["if",{"0":{"199":2},"2":{"97":1,"199":1,"203":1,"222":1,"235":1,"242":1,"260":1,"261":1,"287":1,"293":1,"298":3,"308":2,"309":2,"321":1,"322":1,"325":1,"328":2,"346":1,"347":1,"350":1,"352":3,"385":1,"387":2,"408":3,"421":1}}],["imageresources",{"2":{"414":3}}],["imageraw",{"2":{"412":1}}],["imagenameinvariable",{"2":{"412":1}}],["imageurl",{"2":{"412":1}}],["image",{"2":{"262":3,"412":4,"540":4}}],["images",{"2":{"18":1,"262":4,"408":1,"412":3,"414":2,"501":1,"540":1,"543":1}}],["imgurl",{"2":{"412":2}}],["img",{"2":{"197":1,"412":6,"413":1}}],["importscript",{"2":{"316":2,"317":1}}],["important",{"2":{"305":1}}],["import",{"2":{"97":2,"105":7,"112":3,"114":1,"162":1,"195":2,"203":3,"221":1,"234":2,"235":7,"242":2,"246":5,"262":2,"273":1,"287":1,"292":1,"293":3,"295":3,"305":1,"316":1,"317":1,"325":2,"330":2,"338":2,"342":2,"344":1,"347":2,"348":2,"349":1,"353":1,"371":2,"372":4,"374":1,"375":3,"377":3,"382":1,"412":3,"413":3,"414":6,"421":1,"425":2,"426":2,"427":3,"443":3,"444":2,"497":1,"499":1,"500":6,"501":3,"526":1}}],["ios",{"2":{"253":1}}],["io",{"2":{"79":1,"103":1,"219":1,"383":1,"515":1}}],["i18next",{"0":{"524":1,"527":1},"2":{"448":1,"524":1,"527":3,"528":1}}],["i18n",{"0":{"523":1},"1":{"524":1,"525":1,"526":1,"527":1,"528":1},"2":{"77":1,"87":1,"103":1,"410":1,"444":3,"448":3,"492":1,"494":1,"496":1,"524":2,"526":1,"527":1,"532":2}}],["inplace",{"2":{"444":1}}],["inputevents",{"2":{"426":4}}],["inputevents=wrapper",{"2":{"426":1}}],["inputs",{"2":{"408":5}}],["input",{"2":{"89":1,"152":2,"201":2,"206":1,"222":6,"235":1,"325":1,"330":3,"387":2,"425":2,"426":6,"444":1,"451":1}}],["invisiblecharacters",{"2":{"444":1}}],["invalid",{"2":{"385":1}}],["invoker",{"2":{"299":1,"300":2}}],["inrange",{"2":{"346":1,"347":2}}],["inc",{"2":{"542":1}}],["includesource",{"2":{"427":1}}],["includeassets",{"2":{"262":1}}],["increment=",{"2":{"338":3}}],["increment",{"2":{"338":1,"339":4,"346":1,"347":2,"349":3}}],["incrementcounter",{"2":{"338":7,"339":2}}],["inheritance",{"0":{"270":1},"2":{"266":1}}],["injections",{"2":{"503":1}}],["injection",{"0":{"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1},"1":{"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1},"2":{"266":1,"279":1,"295":2,"503":2}}],["injectregister",{"2":{"262":1}}],["inject",{"0":{"238":1},"2":{"237":1,"238":7,"246":4,"294":2,"295":2,"339":2,"409":1,"411":3,"449":2}}],["instanceof",{"2":{"352":1}}],["instance",{"2":{"287":5}}],["installpwa",{"2":{"260":3}}],["installed",{"2":{"260":5}}],["install",{"0":{"260":1},"2":{"214":1,"243":1,"246":2,"259":1,"260":10,"261":1,"262":1,"324":1,"327":1,"331":1,"340":1,"345":1,"368":1,"381":1,"408":10,"419":1,"420":1,"424":2,"429":1,"433":2,"434":2}}],["insertfinalnewline",{"2":{"444":1}}],["insert",{"2":{"54":1}}],["infinitum",{"2":{"162":1}}],["infinitescroller",{"0":{"162":1}}],["infinite",{"2":{"160":1,"161":1}}],["info",{"2":{"108":3}}],["inlinesuggest",{"2":{"444":1}}],["inline",{"2":{"160":1}}],["ind",{"2":{"444":1}}],["indent",{"2":{"444":1}}],["indexof",{"2":{"298":1}}],["indexeddb",{"0":{"324":1,"350":1},"1":{"325":1,"326":1,"327":1,"328":1,"329":1,"330":1},"2":{"288":2,"306":2,"312":2,"314":1,"318":1,"324":2,"333":1,"350":5}}],["indexedb",{"2":{"260":1}}],["index",{"0":{"127":1,"322":1,"327":1,"329":1,"332":1,"371":1,"503":1},"2":{"111":1,"117":1,"126":1,"127":1,"128":1,"130":2,"132":4,"193":1,"215":3,"216":2,"217":1,"218":1,"246":5,"255":1,"259":1,"321":2,"331":1,"370":1,"408":2,"438":5,"461":2,"500":1,"503":1,"517":1,"540":1,"544":1}}],["individual",{"2":{"238":1}}],["indicating",{"2":{"83":1}}],["initi18n",{"2":{"526":2}}],["initialset",{"2":{"98":2}}],["init",{"2":{"105":1,"331":1,"408":2,"435":1,"500":1}}],["in",{"0":{"427":1},"2":{"103":1,"162":1,"200":1,"202":1,"203":2,"222":2,"242":1,"247":2,"325":1,"346":1,"347":1,"349":3,"374":1,"377":1,"414":2,"420":1,"438":2,"444":1,"449":1,"489":1}}],["intl",{"2":{"445":1,"448":1}}],["integrated",{"2":{"444":5}}],["integration",{"2":{"405":1,"440":1}}],["intel",{"2":{"360":1}}],["intellisense",{"2":{"213":1}}],["inteface",{"2":{"140":1}}],["interval",{"2":{"387":2,"444":1}}],["intersectionobserver",{"2":{"162":3}}],["intersection",{"2":{"161":1,"448":1}}],["interaction",{"2":{"149":1,"385":1}}],["interacting",{"2":{"54":1}}],["interfaces",{"2":{"380":1,"481":1}}],["interface",{"2":{"149":1,"484":1}}],["internet",{"2":{"125":2,"255":1}}],["interceptors",{"2":{"105":1,"499":1,"500":1}}],["into",{"2":{"83":1,"105":1}}],["idx",{"2":{"444":1}}],["idb",{"2":{"324":1}}],["id=g",{"2":{"517":1}}],["id=setinterval",{"2":{"387":1}}],["id=await",{"2":{"326":1}}],["id=",{"2":{"192":3}}],["ids",{"2":{"83":2}}],["idea",{"2":{"436":1}}],["identity",{"2":{"385":1,"386":2}}],["ide",{"0":{"444":1},"2":{"81":1,"212":1,"213":6,"215":2,"224":1,"273":1,"349":1,"439":1,"444":1,"484":1}}],["id",{"2":{"3":2,"18":1,"19":1,"54":1,"55":3,"88":1,"192":1,"200":1,"205":1,"222":4,"321":9,"322":5,"325":5,"326":6,"371":2,"374":5,"383":1,"384":1,"387":1,"408":2,"517":1}}],["items",{"2":{"247":1}}],["item",{"2":{"222":5,"247":1,"350":7}}],["it",{"0":{"273":1,"275":1},"2":{"2":1,"67":1,"83":1,"103":2,"266":2,"273":1,"298":1,"449":2,"489":2,"494":1,"542":1}}],["лёгкое",{"2":{"492":1}}],["лэндинг",{"2":{"369":2,"374":1}}],["лэйаута",{"2":{"496":1,"536":1}}],["лэйаутами",{"2":{"411":1}}],["лэйауте",{"2":{"411":1}}],["лэйаутов",{"2":{"411":1}}],["лэйаут",{"2":{"26":1,"28":1,"221":1,"411":1,"459":1}}],["лайфхак",{"2":{"449":1}}],["ландшафтная",{"2":{"257":1}}],["ландшафте",{"2":{"190":1}}],["лаконичен",{"2":{"235":1,"421":1}}],["лазить",{"2":{"106":1}}],["лепту",{"0":{"483":1}}],["лечь",{"2":{"461":1}}],["лень",{"2":{"461":1}}],["ленивой",{"2":{"262":1}}],["ленивую",{"2":{"235":1}}],["ленточная",{"2":{"145":1}}],["лет",{"2":{"158":1,"218":1,"448":1}}],["лету",{"2":{"140":1,"366":1}}],["левой",{"2":{"143":1,"173":1}}],["левом",{"2":{"141":1,"147":1,"173":1}}],["легкий",{"2":{"460":1}}],["легким",{"2":{"418":1}}],["легкая",{"2":{"191":1,"324":1}}],["легкой",{"2":{"195":1,"451":1}}],["легкого",{"2":{"185":1}}],["легко",{"2":{"35":1,"62":1,"105":1,"149":2,"153":1,"161":1,"164":1,"179":1,"191":1,"216":1,"218":1,"274":1,"275":1,"308":1,"309":1,"327":1,"328":1,"374":1,"383":1,"411":1,"420":1,"421":2,"424":1,"426":1,"460":1,"492":1,"499":1}}],["легче",{"2":{"116":1,"263":1,"460":1}}],["лежат",{"2":{"421":1}}],["лежать",{"2":{"94":1}}],["лежащего",{"2":{"405":1}}],["лежащую",{"2":{"366":1}}],["лежит",{"2":{"107":1,"141":1,"145":1}}],["лучшем",{"2":{"314":1,"418":1}}],["лучшего",{"2":{"192":1,"336":1}}],["лучшее",{"2":{"140":1,"253":1,"444":1}}],["лучшей",{"2":{"58":1,"271":1,"273":1,"368":1,"495":1}}],["лучше",{"2":{"20":1,"35":1,"58":1,"116":1,"117":1,"172":1,"195":1,"203":1,"214":1,"223":1,"224":1,"229":1,"235":1,"261":1,"269":1,"271":1,"273":2,"275":1,"292":1,"293":1,"310":1,"335":1,"342":1,"360":1,"366":1,"373":1,"381":1,"383":1,"391":1,"411":1,"414":1,"419":1,"444":1,"451":1,"456":1,"460":2,"461":1,"527":1}}],["лучшими",{"2":{"460":1}}],["лучшим",{"2":{"381":1,"411":1}}],["лучших",{"2":{"76":1,"212":1,"218":1,"271":1,"276":1,"293":1,"411":1,"460":1,"484":1,"495":2,"496":1}}],["лучший",{"0":{"193":1},"2":{"17":1,"339":1}}],["лучшие",{"0":{"356":1,"411":1},"1":{"357":1,"358":1,"359":1,"360":1,"361":1,"362":1,"363":1},"2":{"9":1,"75":1,"106":1,"190":1,"223":1,"277":1,"426":1,"460":1,"496":1}}],["литерал",{"2":{"286":1,"294":1}}],["литературах",{"2":{"282":1}}],["листов",{"2":{"218":1}}],["лицензией",{"2":{"487":1}}],["лицензии",{"2":{"217":1}}],["лица",{"2":{"388":1}}],["лицом",{"2":{"125":1}}],["линтинга",{"2":{"492":1}}],["линтингом",{"2":{"450":1}}],["линтер",{"2":{"209":1,"444":1}}],["линус",{"2":{"431":1}}],["линусом",{"2":{"431":1}}],["линии",{"2":{"167":2}}],["лишен",{"2":{"388":1}}],["лишающие",{"2":{"188":1}}],["лишь",{"2":{"106":1,"149":1,"173":1,"190":1,"193":1,"218":1,"238":1,"246":1,"253":1,"314":1,"417":1,"425":1}}],["лишние",{"2":{"106":1,"438":1}}],["лимиты",{"2":{"40":1}}],["личное",{"2":{"374":1}}],["личность",{"2":{"179":1,"389":1}}],["личного",{"2":{"36":1,"409":1}}],["личным",{"2":{"58":1}}],["личный",{"2":{"29":1,"33":1,"78":1,"106":1}}],["ли",{"2":{"10":1,"26":1,"106":3,"107":1,"125":1,"126":1,"128":1,"137":1,"155":1,"189":1,"225":3,"229":2,"240":1,"250":1,"259":1,"261":1,"287":1,"307":1,"311":3,"339":1,"342":1,"352":2,"411":1,"415":1,"428":1,"442":3,"449":1,"450":1,"460":4,"461":1}}],["либо",{"2":{"3":1,"31":1,"40":1,"47":3,"52":1,"55":1,"58":1,"81":1,"107":1,"143":2,"154":2,"155":1,"157":2,"159":2,"173":2,"181":2,"183":2,"187":1,"213":1,"215":4,"219":1,"235":1,"242":4,"247":1,"260":4,"299":1,"308":1,"314":1,"318":2,"321":2,"328":2,"344":1,"378":2,"388":1,"389":2,"412":3,"420":2,"428":1,"443":1,"453":1,"459":2,"460":1,"461":1,"492":1,"495":1,"525":1}}],["ложное",{"2":{"421":1}}],["ложится",{"2":{"39":1}}],["ломают",{"2":{"418":1}}],["ловушки",{"2":{"352":1}}],["ловушку",{"2":{"179":1}}],["лотком",{"2":{"157":1}}],["локали",{"2":{"448":1}}],["локализации",{"2":{"448":3,"524":3}}],["локалей",{"2":{"448":1,"492":1,"524":1,"526":1}}],["локальную",{"2":{"431":1}}],["локальных",{"2":{"444":1,"449":1}}],["локальные",{"0":{"234":1,"350":1},"2":{"431":2}}],["локальными",{"2":{"253":2}}],["локальным",{"2":{"215":1,"253":1,"318":1,"439":1,"452":1}}],["локальный",{"2":{"214":1,"435":2,"439":3,"449":1}}],["локальное",{"2":{"240":1,"366":1}}],["локального",{"2":{"132":1,"135":1,"234":1,"350":1,"366":1}}],["локальной",{"2":{"126":1,"153":1,"157":1,"253":3,"306":1,"323":1,"333":1,"350":1,"439":1}}],["локальному",{"2":{"324":1,"353":1}}],["локальном",{"2":{"126":1,"131":1,"134":1}}],["локально",{"2":{"102":1,"190":1,"215":2,"234":1,"350":1,"439":2,"461":1}}],["локация",{"2":{"4":1}}],["логарифмической",{"2":{"148":1}}],["лого",{"2":{"89":1}}],["логотипа",{"2":{"86":1,"173":1}}],["логотип",{"2":{"29":1,"173":2}}],["логирования",{"2":{"303":1}}],["логично",{"2":{"449":1}}],["логичный",{"2":{"367":1,"448":1}}],["логичней",{"2":{"99":1}}],["логическому",{"2":{"461":1}}],["логическом",{"2":{"318":1}}],["логической",{"2":{"273":1}}],["логические",{"2":{"409":1,"418":1}}],["логически",{"2":{"389":1,"455":1}}],["логический",{"2":{"276":1}}],["логических",{"2":{"67":1}}],["логикe",{"2":{"241":1}}],["логикой",{"2":{"203":1,"247":2,"271":1,"273":1,"299":1,"300":1,"387":1}}],["логике",{"2":{"81":1,"222":1,"260":1,"274":1,"309":1}}],["логику",{"2":{"40":1,"107":2,"195":1,"222":2,"235":1,"246":1,"247":2,"261":1,"274":2,"276":1,"300":1,"301":1,"302":1,"303":1,"308":1,"345":1,"421":2,"426":1,"449":2,"451":3,"459":2}}],["логика",{"2":{"34":1,"107":1,"223":1,"240":1,"389":1,"449":4,"451":1}}],["логики",{"2":{"6":1,"241":4,"246":1,"247":3,"274":1,"382":3,"418":1,"421":1,"449":3,"499":1}}],["логине",{"2":{"106":1}}],["логинится",{"2":{"106":1}}],["логина",{"2":{"89":1,"106":1,"450":1,"533":1}}],["логин",{"2":{"33":1,"106":4}}],["люксовый",{"2":{"461":1}}],["людей",{"2":{"187":1}}],["люди",{"2":{"2":1,"143":1,"439":1}}],["любезно",{"2":{"420":1}}],["любую",{"2":{"216":1,"235":1,"269":1,"344":1,"383":1}}],["любимую",{"2":{"105":1}}],["любая",{"2":{"96":1,"257":1,"426":1,"449":1,"459":1}}],["любые",{"2":{"318":1,"326":1,"384":1,"385":1}}],["любым",{"2":{"125":1,"161":1,"314":1,"317":1,"344":1,"350":2,"352":1,"408":1}}],["любыми",{"2":{"62":1}}],["любых",{"2":{"2":1,"175":1,"293":1}}],["любого",{"2":{"20":1,"108":1,"124":1,"232":1,"236":1,"246":2,"302":1,"320":1,"332":2,"368":1,"376":1,"388":1,"389":1,"435":1,"483":1}}],["любом",{"2":{"12":1,"106":1,"147":1,"155":1,"216":1,"218":1,"251":1,"255":1,"303":2,"309":1,"339":1,"374":1,"449":1,"456":1,"461":1}}],["любому",{"2":{"2":1,"114":1,"125":1,"158":1,"339":1,"350":1}}],["любой",{"2":{"2":1,"108":1,"115":1,"128":1,"159":2,"191":1,"193":1,"220":1,"238":2,"243":1,"291":1,"315":1,"319":1,"340":1,"343":1,"366":1,"376":1,"381":1,"389":1,"410":1,"412":1,"439":1,"449":1,"459":1}}],["любое",{"2":{"2":1,"106":1,"173":1,"214":1,"343":1,"349":1,"422":1}}],["vwa",{"2":{"536":1,"545":11}}],["vetur",{"2":{"444":2}}],["vercel",{"2":{"407":1,"444":2,"533":1}}],["vertical",{"2":{"160":1}}],["versionrc",{"2":{"444":2}}],["versions",{"2":{"444":3}}],["version",{"2":{"103":1,"326":1,"360":1,"408":5,"435":1,"444":3,"543":1}}],["vbproj",{"2":{"444":1}}],["vb",{"2":{"444":6}}],["v4значительно",{"2":{"408":1}}],["v4",{"2":{"408":4}}],["v2",{"2":{"408":3}}],["volar",{"2":{"213":1,"444":4}}],["validate",{"2":{"444":1}}],["validateotp",{"2":{"387":1}}],["values",{"2":{"421":1}}],["value>0",{"2":{"387":1}}],["value>=0",{"2":{"347":2}}],["value++",{"2":{"338":1,"347":1}}],["value=true",{"2":{"387":1}}],["value=result",{"2":{"387":1}}],["value=reply",{"2":{"330":1}}],["value=value",{"2":{"342":1}}],["value=data",{"2":{"325":1}}],["value=note",{"2":{"325":1}}],["value=",{"2":{"325":2,"330":3}}],["value=window",{"2":{"241":1}}],["valueof",{"2":{"222":1}}],["value",{"2":{"83":2,"97":5,"105":2,"114":3,"162":5,"195":2,"222":9,"235":1,"236":2,"238":1,"260":6,"302":4,"308":8,"309":6,"325":5,"330":2,"342":1,"347":2,"352":8,"378":2,"382":2,"383":1,"387":3,"421":2,"426":1,"444":1,"448":1,"449":1,"451":2,"499":1,"526":1}}],["vars",{"2":{"545":1}}],["var",{"2":{"408":4}}],["varb",{"2":{"237":1}}],["vara",{"2":{"237":1}}],["variable",{"2":{"195":1,"237":1}}],["variablename",{"2":{"195":1}}],["vlc",{"2":{"186":1}}],["vps",{"2":{"128":4,"131":2,"134":1,"137":1}}],["v3",{"2":{"116":1,"120":1,"408":4}}],["v",{"0":{"115":1,"197":1,"198":1,"199":3,"200":1,"201":1,"202":1,"236":1},"2":{"110":1,"115":5,"153":1,"162":2,"196":1,"197":1,"198":2,"199":4,"200":1,"201":1,"202":2,"203":3,"222":11,"237":9,"240":8,"242":3,"246":1,"260":2,"325":3,"330":3,"374":1,"377":1,"413":3}}],["v0",{"2":{"86":1,"91":1,"100":1}}],["vscode",{"2":{"215":1,"408":1,"436":2,"444":9}}],["vs",{"2":{"81":1,"409":1,"444":7,"451":1,"527":1}}],["v16",{"2":{"360":1}}],["v1",{"0":{"463":1,"466":1,"468":1,"471":1,"474":1},"1":{"464":1,"465":1,"467":1,"469":1,"470":1,"472":1,"473":1,"475":1},"2":{"55":3}}],["visible",{"2":{"444":1}}],["visuals",{"2":{"444":1}}],["visualizer",{"2":{"443":4}}],["visual",{"2":{"213":1,"215":1,"360":1,"432":1,"439":1}}],["vivaldi",{"2":{"213":1}}],["virtual",{"2":{"128":1,"448":1}}],["video",{"2":{"63":1,"100":1}}],["vitepress",{"2":{"408":1,"458":1,"460":1,"495":1}}],["vitepwa",{"2":{"262":3}}],["vitest",{"0":{"420":1,"429":1},"1":{"421":1},"2":{"360":1,"415":1,"418":1,"419":1,"420":12,"421":6,"423":1,"424":3,"425":1,"426":3,"427":6,"428":5,"429":4,"444":10,"450":1}}],["vitejs",{"2":{"219":3,"262":1}}],["vite",{"0":{"219":1,"262":1,"516":1},"2":{"20":1,"103":1,"105":1,"108":1,"110":1,"117":1,"127":1,"193":1,"194":1,"195":1,"212":2,"213":1,"214":8,"215":6,"218":1,"219":10,"222":2,"225":1,"235":1,"251":1,"261":2,"262":9,"264":1,"314":1,"316":1,"317":2,"321":1,"359":1,"360":1,"412":1,"413":1,"420":5,"424":2,"427":1,"428":1,"429":1,"443":13,"444":3,"461":3,"485":1,"492":1,"500":1,"503":2,"516":1}}],["view>",{"2":{"374":2}}],["viewport",{"2":{"246":1}}],["viewitem",{"2":{"203":3}}],["view",{"2":{"11":1,"87":4,"374":1,"375":2,"377":1,"411":4,"449":2,"451":1}}],["views",{"0":{"87":1,"377":1},"2":{"3":1,"87":1,"368":1,"371":2,"375":3,"409":1}}],["vuefaq",{"2":{"486":1}}],["vuetify",{"2":{"459":1}}],["vuejs",{"2":{"116":3,"120":1,"202":1,"203":2,"218":1,"240":1,"242":1,"349":1,"380":1,"449":1,"485":4}}],["vuex",{"2":{"110":1,"118":1,"349":4,"449":6,"470":1}}],["vuesence",{"2":{"79":2,"102":1,"103":2,"491":1}}],["vuestorefront",{"2":{"61":1}}],["vueuse",{"2":{"20":1,"98":1,"241":1}}],["vue",{"0":{"103":1,"110":1,"160":1,"162":1,"190":1,"192":1,"196":1,"221":1,"222":1,"304":1,"305":1,"325":1,"330":1,"338":1,"339":1,"342":1,"349":1,"353":1,"356":1,"357":1,"367":1,"374":1,"377":1,"393":1,"404":2,"424":1,"449":1,"460":1,"477":1,"489":1,"493":1},"1":{"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"191":1,"192":1,"193":2,"194":1,"195":1,"196":1,"197":2,"198":2,"199":2,"200":2,"201":2,"202":2,"203":1,"204":1,"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"357":1,"358":1,"359":1,"360":1,"361":1,"362":1,"363":1,"368":1,"369":1,"370":1,"371":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"425":1,"426":1,"490":1,"494":1,"495":1},"2":{"3":2,"10":2,"11":1,"20":2,"41":1,"50":1,"75":2,"96":1,"97":3,"103":2,"110":6,"111":11,"112":13,"113":2,"114":2,"115":4,"116":9,"117":3,"118":1,"119":4,"121":7,"124":1,"126":2,"127":2,"128":5,"130":1,"133":1,"136":3,"137":1,"139":2,"145":1,"159":1,"160":1,"162":6,"166":1,"174":3,"189":1,"190":4,"191":9,"192":11,"193":7,"194":8,"195":16,"196":3,"198":1,"200":1,"201":1,"202":3,"203":6,"204":1,"210":1,"211":2,"212":2,"213":3,"214":4,"215":9,"216":2,"218":3,"219":5,"220":1,"221":5,"222":4,"225":3,"226":2,"228":1,"229":2,"230":6,"231":2,"232":1,"233":1,"234":7,"235":11,"237":6,"238":6,"240":9,"241":4,"242":5,"243":2,"246":16,"247":4,"252":1,"253":1,"260":3,"262":3,"266":1,"270":1,"271":1,"272":1,"273":4,"277":2,"278":1,"295":2,"300":1,"301":3,"302":1,"303":1,"304":1,"305":3,"306":1,"310":1,"313":1,"314":1,"316":1,"318":1,"320":2,"323":1,"325":4,"330":2,"331":1,"334":1,"335":1,"336":1,"337":2,"338":3,"339":1,"342":3,"343":2,"344":6,"345":2,"347":2,"348":2,"349":5,"352":3,"353":1,"354":1,"358":3,"359":3,"360":4,"362":1,"364":4,"365":1,"366":1,"367":4,"368":2,"369":1,"371":4,"372":2,"373":1,"374":12,"375":3,"376":1,"377":7,"382":2,"383":2,"385":1,"386":1,"389":1,"390":1,"393":1,"394":1,"397":1,"399":1,"401":2,"402":1,"404":1,"408":1,"409":2,"410":1,"411":2,"412":1,"413":2,"415":2,"416":1,"417":2,"418":3,"419":7,"420":2,"423":2,"424":6,"425":4,"426":2,"442":1,"443":4,"444":15,"447":1,"448":7,"449":12,"450":1,"451":16,"459":3,"460":22,"461":1,"464":2,"465":1,"467":1,"477":1,"483":1,"485":2,"486":1,"487":2,"489":7,"490":1,"491":2,"492":3,"494":3,"495":4,"496":2,"497":2,"501":2,"515":2,"516":1,"526":1,"527":2,"535":1,"544":1}}],["эстетики",{"2":{"484":1}}],["эскиза",{"2":{"249":1}}],["эван",{"2":{"451":1}}],["эволюция",{"2":{"459":1}}],["эволюцией",{"2":{"389":1}}],["эволюции",{"2":{"251":1}}],["эра",{"2":{"366":1}}],["эмитент",{"2":{"383":1}}],["эмиттера",{"2":{"341":1}}],["эмиты",{"2":{"115":1}}],["эмпирическое",{"2":{"284":1}}],["эмулятор",{"2":{"213":1}}],["эфемерны",{"2":{"157":1,"248":1}}],["эффектом",{"2":{"371":1}}],["эффектов",{"2":{"89":1,"241":1,"274":1}}],["эффектам",{"2":{"337":1}}],["эффективен",{"2":{"141":1,"342":1,"426":1}}],["эффективней",{"2":{"448":1,"451":2,"461":1}}],["эффективная",{"2":{"366":1,"431":1}}],["эффективна",{"2":{"321":1}}],["эффективные",{"2":{"285":1,"339":1}}],["эффективным",{"2":{"275":1}}],["эффективный",{"2":{"162":1,"314":1}}],["эффективны",{"2":{"140":1,"375":1}}],["эффективной",{"2":{"314":1}}],["эффективности",{"2":{"264":1,"312":1,"448":1}}],["эффективное",{"2":{"249":1,"349":1,"366":1,"492":1}}],["эффективного",{"2":{"200":1,"492":1}}],["эффективно",{"2":{"47":1,"128":1,"251":1,"266":1,"452":1,"495":1,"496":1}}],["эффекты",{"2":{"26":1,"138":1,"158":1}}],["элегантен",{"2":{"421":1}}],["элегантно",{"2":{"276":1}}],["электронных",{"2":{"387":1}}],["электронные",{"2":{"366":1}}],["электронная",{"2":{"387":1}}],["электронной",{"2":{"125":1,"156":1,"387":2,"388":1,"389":1}}],["элементу",{"2":{"162":1,"201":1,"212":1,"234":1,"240":1}}],["элементом",{"2":{"161":1,"162":1,"167":1,"173":1,"201":1,"246":1,"353":1}}],["элементов",{"0":{"229":1,"231":1},"2":{"68":2,"106":1,"128":1,"142":1,"143":1,"144":1,"149":2,"151":1,"154":2,"159":1,"160":1,"161":2,"162":2,"169":1,"190":1,"199":2,"200":2,"203":5,"222":3,"223":1,"228":1,"229":1,"230":1,"237":1,"247":4,"256":1,"263":1,"269":1,"274":1,"298":1,"321":1,"325":1,"339":1,"366":1,"448":4,"450":1,"494":1}}],["элементе",{"2":{"154":2,"155":1,"218":1,"222":3}}],["элементарное",{"2":{"460":1}}],["элементарно",{"2":{"412":1}}],["элементах",{"2":{"242":1}}],["элементам",{"2":{"144":1}}],["элементами",{"0":{"142":1},"2":{"68":1,"114":1,"158":1,"161":1,"199":1,"202":1,"220":1,"222":1,"280":1,"325":1,"335":1}}],["элемента",{"2":{"119":2,"154":1,"155":1,"161":2,"162":1,"167":2,"194":1,"196":2,"200":2,"221":1,"222":5,"230":3,"231":2,"247":4,"249":1,"260":1,"269":1,"350":1,"426":2,"451":1,"461":1}}],["элементы",{"0":{"152":1},"1":{"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1},"2":{"29":1,"68":1,"124":1,"140":1,"142":1,"144":1,"145":1,"151":1,"152":2,"161":5,"162":1,"178":1,"190":1,"194":1,"203":1,"222":1,"223":1,"228":1,"230":1,"231":1,"237":1,"240":1,"248":1,"253":1,"256":1,"260":1,"269":1,"314":1,"326":1,"345":1,"403":1,"405":1,"418":1,"426":2,"451":1,"457":1,"461":1}}],["элемент",{"2":{"9":1,"152":1,"155":1,"159":4,"161":1,"162":1,"170":1,"192":3,"198":2,"199":4,"203":1,"220":1,"221":1,"222":7,"231":1,"240":1,"245":1,"260":2,"304":1,"345":1,"352":1,"353":1,"373":1,"376":1,"415":1,"426":1,"484":1}}],["эндрю",{"2":{"274":1}}],["эндпойнтам",{"2":{"107":1}}],["эндпойнтов",{"2":{"107":1}}],["эндпойнты",{"2":{"52":1}}],["эндпойнту",{"2":{"41":1,"107":2}}],["энергосбережения",{"2":{"106":1}}],["экстремального",{"2":{"460":1}}],["экстраполированного",{"2":{"305":1}}],["экспериментов",{"2":{"461":1}}],["экспериментировал",{"2":{"451":1}}],["экспериментируя",{"2":{"354":1}}],["экспериментируем",{"0":{"351":1},"1":{"352":1,"353":1}}],["экспериментального",{"2":{"351":1}}],["экспериментальной",{"2":{"203":1}}],["эксперименты",{"2":{"335":1}}],["экспозиции",{"2":{"253":1}}],["экспортом",{"2":{"344":1}}],["экспортируем",{"2":{"287":1,"321":1}}],["экспортируете",{"2":{"449":1}}],["экспортирует",{"2":{"194":1,"219":1,"241":1,"288":1}}],["экспортирующий",{"2":{"243":1,"286":1}}],["экспортировать",{"2":{"241":1,"352":1}}],["экспорта",{"2":{"219":1}}],["экспорт",{"2":{"195":1,"428":1}}],["эксплуатационным",{"2":{"68":1}}],["эквивалент",{"2":{"212":1,"221":1,"378":1}}],["эквивалентны",{"2":{"421":1}}],["эквивалентный",{"2":{"125":1}}],["эквивалентно",{"2":{"422":1}}],["эквивалентное",{"2":{"377":1}}],["эквивалентности",{"2":{"309":1}}],["эквивалентная",{"2":{"426":1}}],["эквивалентна",{"2":{"198":1}}],["экземпляром",{"2":{"293":1}}],["экземпляров",{"2":{"236":1,"449":1}}],["экземпляре",{"2":{"246":1}}],["экземпляры",{"0":{"209":1},"2":{"203":1,"209":1,"374":1}}],["экземпляр",{"2":{"192":1,"246":1,"283":1,"287":2,"321":1}}],["экземпляру",{"2":{"112":1,"162":1,"195":1,"243":1}}],["экосистемой",{"2":{"496":1}}],["экосистеме",{"2":{"262":1,"444":1,"448":1}}],["экосистему",{"2":{"110":1}}],["экосистемы",{"2":{"75":1,"212":1,"367":1}}],["экономии",{"2":{"218":1}}],["экономичным",{"2":{"107":1}}],["экономит",{"2":{"84":1}}],["экранов",{"2":{"172":2}}],["экран",{"2":{"141":1,"173":1,"174":1,"247":1,"271":1,"461":1,"530":1,"542":1}}],["экранах",{"2":{"507":1}}],["экрана",{"2":{"9":1,"20":1,"93":1,"141":1,"142":1,"143":1,"147":4,"157":1,"164":4,"172":3,"174":1,"214":1,"221":1,"343":1,"377":1,"436":1,"504":1,"506":1,"544":1}}],["экране",{"2":{"3":1,"149":1,"203":1,"260":1,"314":5,"329":1,"330":1}}],["эталонный",{"2":{"312":1}}],["эта",{"0":{"359":1,"392":1},"1":{"393":1,"394":1,"395":1,"396":1,"397":1,"398":1,"399":1,"400":1,"401":1,"402":1,"403":1,"404":1},"2":{"113":1,"123":1,"128":1,"139":1,"144":1,"162":1,"172":1,"180":1,"184":1,"188":1,"191":1,"195":1,"198":1,"201":1,"202":1,"212":1,"213":1,"214":2,"215":2,"216":1,"218":1,"229":1,"235":1,"238":1,"242":1,"246":1,"247":2,"255":1,"266":1,"271":1,"272":1,"273":1,"300":1,"301":1,"302":1,"307":1,"310":1,"313":1,"315":1,"321":1,"323":1,"326":1,"342":1,"344":1,"358":1,"359":1,"360":1,"366":1,"367":1,"388":1,"396":1,"399":1,"400":1,"403":1,"416":1,"420":2,"421":1,"440":1,"444":1}}],["этап",{"0":{"229":1},"2":{"229":1}}],["этапов",{"2":{"63":1}}],["этапах",{"2":{"417":1}}],["этапами",{"2":{"228":1}}],["этапам",{"2":{"14":1,"78":1}}],["этапа",{"2":{"11":1,"17":1,"78":1}}],["этапы",{"0":{"78":1},"2":{"10":1,"136":1,"417":1,"435":2}}],["этапе",{"2":{"6":1,"7":1,"11":2,"12":1,"17":1,"23":1,"39":1,"71":1,"159":1,"162":1,"230":1,"232":1,"242":1,"266":1,"374":1,"387":1,"420":1,"452":1}}],["эту",{"2":{"109":1,"125":1,"126":1,"134":1,"138":1,"145":1,"159":1,"162":1,"164":1,"170":1,"174":1,"177":1,"195":1,"215":1,"216":1,"218":1,"221":1,"229":1,"231":1,"238":1,"240":2,"241":2,"247":2,"274":2,"297":1,"303":1,"308":1,"314":1,"320":1,"330":1,"331":1,"338":1,"340":1,"344":1,"366":1,"368":1,"383":1,"389":1,"412":1,"417":3,"428":2,"438":1,"449":1,"450":1,"460":1}}],["этическая",{"2":{"187":1}}],["этичный",{"2":{"175":1}}],["этим",{"2":{"110":1,"132":1,"135":1,"140":1,"142":1,"151":1,"158":1,"191":1,"194":1,"218":1,"219":1,"229":1,"231":1,"237":1,"238":1,"246":2,"247":2,"274":1,"304":1,"314":1,"317":1,"329":1,"364":1,"366":1,"369":1,"382":1,"417":1,"430":1,"495":1}}],["этими",{"2":{"68":1,"140":1,"246":1,"301":1,"424":1,"439":1}}],["этих",{"2":{"68":2,"108":1,"110":1,"113":1,"142":1,"147":1,"149":1,"163":1,"169":1,"175":1,"176":1,"190":1,"191":4,"201":1,"216":1,"219":1,"222":1,"251":1,"253":2,"261":1,"266":2,"267":1,"269":1,"276":1,"297":1,"298":1,"306":1,"308":1,"314":1,"332":1,"350":4,"368":1,"374":1,"381":1,"383":3,"389":3,"415":1,"420":1,"424":1,"426":2,"427":1,"433":1,"435":1,"436":1,"439":1,"450":1,"460":1,"461":2}}],["эти",{"2":{"3":1,"68":1,"117":1,"125":3,"126":2,"132":1,"140":1,"141":1,"144":1,"145":1,"147":2,"149":2,"152":2,"153":1,"154":1,"157":2,"158":2,"163":1,"164":1,"180":1,"193":2,"194":1,"195":2,"199":1,"200":1,"209":1,"210":1,"211":1,"213":1,"216":2,"218":3,"228":2,"230":2,"232":2,"235":1,"242":1,"253":1,"297":1,"305":1,"308":1,"310":2,"314":2,"317":1,"319":2,"321":1,"323":1,"324":1,"326":1,"327":1,"332":1,"337":1,"340":1,"344":1,"350":2,"354":1,"355":1,"366":1,"369":1,"373":1,"377":2,"380":1,"381":1,"382":1,"383":2,"389":2,"390":1,"415":2,"418":1,"420":1,"421":1,"423":1,"427":1,"436":1,"439":1,"440":1,"441":1,"449":2}}],["этой",{"0":{"360":1},"2":{"23":1,"48":1,"106":1,"115":1,"122":2,"124":1,"133":1,"135":1,"136":2,"138":2,"142":1,"150":1,"153":1,"162":1,"164":1,"174":2,"176":1,"187":2,"188":1,"189":1,"190":4,"191":1,"195":3,"202":2,"203":1,"204":2,"210":1,"211":1,"213":4,"214":1,"215":2,"218":2,"224":1,"226":4,"227":2,"230":2,"231":1,"235":1,"237":1,"238":3,"240":3,"241":2,"246":1,"247":3,"249":1,"250":1,"251":2,"252":1,"264":2,"265":1,"266":1,"269":3,"271":1,"272":1,"277":1,"278":1,"294":1,"296":1,"298":3,"302":3,"303":2,"308":1,"310":1,"312":4,"314":1,"315":1,"318":1,"328":1,"333":1,"335":3,"336":3,"347":1,"350":1,"351":1,"353":1,"354":1,"355":1,"360":3,"362":1,"363":3,"364":2,"365":1,"366":1,"368":1,"374":1,"377":1,"380":1,"383":1,"389":2,"390":1,"391":1,"393":1,"394":1,"395":1,"398":1,"401":1,"402":1,"408":1,"415":4,"416":1,"417":2,"419":1,"420":2,"425":1,"429":1,"430":2,"431":1,"435":1,"436":1,"438":1,"439":1,"441":1,"445":1,"448":1,"449":1,"459":1,"492":1}}],["этого",{"2":{"12":1,"27":1,"41":1,"58":1,"61":1,"86":1,"96":1,"112":1,"115":1,"125":3,"131":1,"147":2,"148":2,"155":2,"156":1,"159":1,"161":3,"164":2,"172":2,"173":2,"174":1,"193":1,"194":3,"195":1,"196":1,"199":1,"213":1,"220":1,"221":1,"222":3,"230":1,"231":1,"232":1,"234":2,"240":3,"241":1,"242":2,"246":1,"247":2,"253":1,"260":2,"261":1,"263":1,"269":1,"271":2,"273":2,"274":1,"276":1,"285":2,"286":1,"294":1,"297":1,"298":1,"299":1,"300":1,"301":1,"303":2,"304":1,"306":1,"307":1,"314":1,"317":1,"319":2,"323":1,"328":1,"331":1,"332":1,"337":1,"338":1,"339":2,"343":1,"344":2,"347":1,"349":1,"350":3,"351":1,"369":1,"371":1,"374":2,"377":1,"381":2,"383":2,"386":2,"387":1,"388":2,"389":1,"407":1,"418":1,"419":1,"420":1,"421":1,"425":1,"426":1,"427":1,"428":1,"430":1,"434":1,"435":1,"436":1,"440":1,"443":1,"448":1,"449":1,"451":1,"452":1,"460":2,"461":1}}],["этом",{"2":{"12":1,"39":1,"41":1,"61":1,"68":1,"125":2,"127":1,"128":1,"134":1,"147":1,"148":1,"154":1,"156":1,"158":1,"159":1,"160":1,"161":1,"162":1,"165":1,"186":1,"187":1,"191":2,"192":2,"193":1,"195":2,"201":1,"203":1,"215":1,"218":2,"220":1,"222":1,"230":1,"233":1,"237":1,"242":1,"243":1,"246":1,"251":1,"252":1,"255":1,"260":1,"262":1,"272":1,"273":1,"276":1,"291":2,"297":1,"301":1,"302":1,"303":1,"304":1,"305":1,"306":2,"307":1,"309":2,"321":1,"327":1,"330":1,"332":1,"336":1,"337":1,"338":1,"342":1,"345":1,"346":2,"347":1,"352":1,"353":1,"374":3,"375":1,"377":1,"381":1,"382":2,"383":1,"386":1,"404":1,"407":1,"411":1,"412":1,"417":2,"419":1,"420":1,"423":1,"427":1,"433":1,"435":1,"438":2,"443":1,"449":2,"450":2,"451":3,"460":2,"495":1}}],["этому",{"2":{"2":1,"16":1,"149":1,"173":1,"212":1,"228":1,"235":2,"263":1,"272":1,"273":1,"282":1,"288":1,"326":2,"332":1,"345":1,"369":1,"371":1,"380":1,"421":1,"460":1}}],["этот",{"2":{"9":1,"13":1,"97":1,"103":2,"106":1,"110":1,"114":1,"125":3,"128":2,"135":1,"142":1,"143":1,"144":1,"145":1,"147":1,"148":1,"149":1,"154":1,"155":2,"156":2,"157":1,"158":1,"159":1,"162":2,"167":2,"168":1,"169":3,"172":3,"173":2,"177":2,"178":2,"179":1,"182":1,"185":1,"191":2,"192":3,"193":1,"195":3,"198":1,"213":1,"214":2,"215":4,"219":1,"220":1,"221":1,"222":1,"229":2,"230":2,"231":2,"232":1,"234":1,"235":2,"238":1,"240":1,"241":1,"242":1,"246":1,"247":1,"251":1,"255":1,"262":1,"269":2,"270":2,"271":2,"272":2,"273":1,"274":1,"275":2,"276":2,"282":1,"283":1,"284":1,"286":2,"287":3,"288":1,"289":1,"292":1,"293":1,"295":2,"296":1,"297":1,"299":2,"300":1,"301":2,"303":1,"306":3,"309":3,"316":1,"317":1,"318":3,"319":1,"321":1,"322":2,"323":1,"328":2,"330":2,"339":1,"340":1,"342":3,"343":1,"344":4,"346":2,"347":1,"348":2,"350":1,"352":2,"353":2,"371":1,"373":1,"374":1,"376":1,"377":3,"380":1,"382":1,"383":4,"387":1,"388":4,"408":1,"409":1,"417":1,"419":1,"420":1,"425":1,"426":2,"427":1,"428":3,"435":1,"436":1,"440":1,"444":1,"452":1,"460":2,"516":1}}],["это",{"0":{"218":1,"275":1},"2":{"2":1,"3":1,"11":1,"12":2,"13":1,"20":1,"26":1,"29":1,"33":1,"34":1,"39":1,"40":1,"47":1,"48":1,"50":1,"58":2,"67":1,"81":1,"88":1,"96":1,"97":1,"98":1,"99":1,"106":3,"107":3,"108":3,"113":1,"115":2,"116":1,"118":1,"121":2,"122":1,"125":6,"126":2,"127":1,"128":1,"129":1,"132":1,"134":1,"136":2,"138":1,"140":1,"141":1,"142":2,"143":2,"145":3,"150":3,"153":1,"154":1,"158":1,"159":4,"161":3,"162":1,"163":1,"164":1,"165":1,"166":1,"168":1,"169":4,"170":1,"174":1,"176":2,"178":1,"182":1,"186":1,"188":1,"190":1,"191":9,"192":4,"193":1,"194":7,"195":16,"199":1,"200":1,"201":1,"202":1,"203":4,"209":2,"213":4,"214":6,"215":9,"216":5,"218":2,"219":4,"221":2,"222":7,"223":2,"225":2,"226":1,"229":2,"230":1,"232":1,"233":1,"234":1,"235":2,"236":2,"237":2,"240":2,"241":3,"243":1,"244":1,"245":1,"246":4,"247":7,"248":1,"249":1,"251":1,"253":4,"254":3,"255":2,"257":1,"258":1,"260":5,"261":2,"262":1,"263":1,"266":4,"267":2,"269":1,"270":2,"271":3,"272":2,"273":2,"274":3,"277":3,"283":1,"286":1,"287":1,"288":1,"290":3,"291":1,"292":3,"293":5,"294":1,"295":4,"297":2,"298":2,"299":1,"300":1,"301":5,"302":6,"303":6,"304":1,"306":2,"307":6,"308":4,"309":7,"310":2,"314":15,"315":3,"316":2,"317":1,"318":1,"322":2,"324":3,"325":2,"326":2,"327":1,"328":2,"330":1,"332":5,"333":1,"334":1,"337":6,"339":2,"340":2,"341":1,"342":5,"343":2,"344":5,"345":3,"346":5,"347":2,"349":3,"350":8,"352":4,"353":2,"358":2,"366":4,"367":2,"371":5,"374":4,"375":2,"377":3,"378":1,"380":1,"382":2,"383":4,"385":2,"386":1,"387":2,"388":1,"389":3,"390":1,"397":1,"405":1,"407":1,"409":1,"411":1,"412":2,"417":4,"418":1,"419":1,"420":2,"421":4,"422":2,"423":2,"426":1,"428":1,"429":1,"430":2,"431":3,"435":4,"436":5,"438":6,"439":6,"440":2,"442":1,"443":1,"448":1,"449":8,"450":1,"451":10,"452":5,"453":2,"454":1,"455":1,"456":1,"458":1,"459":1,"460":4,"461":4,"495":1,"543":1}}],["ухудшает",{"2":{"459":1}}],["уязвимость",{"2":{"453":1}}],["уязвимости",{"2":{"449":1}}],["ушли",{"2":{"431":1}}],["ушло",{"2":{"149":1}}],["укрепить",{"2":{"544":1}}],["украдут",{"2":{"388":1}}],["укоряет",{"2":{"459":1}}],["укоренилась",{"2":{"366":1}}],["укажет",{"2":{"426":1}}],["укажу",{"2":{"213":1}}],["указателей",{"2":{"195":1}}],["указателями",{"2":{"195":1}}],["указателя",{"2":{"147":1}}],["указать",{"2":{"126":2,"350":1,"421":1,"427":1,"439":1,"451":1}}],["указано",{"2":{"240":2,"263":1}}],["указанные",{"2":{"436":1}}],["указанных",{"2":{"236":1}}],["указанный",{"2":{"236":1,"332":1,"385":1}}],["указанными",{"2":{"260":1,"380":1,"384":1}}],["указанным",{"2":{"217":1}}],["указанную",{"2":{"108":1,"384":1}}],["указаны",{"2":{"214":1}}],["указаниям",{"2":{"246":1}}],["указания",{"2":{"222":1,"423":1,"531":1}}],["указанием",{"2":{"387":1,"417":1,"421":1,"489":1}}],["указание",{"2":{"134":1}}],["указании",{"2":{"127":1}}],["указана",{"2":{"108":1}}],["указывали",{"2":{"174":1}}],["указывают",{"2":{"255":1}}],["указываются",{"2":{"135":1}}],["указывающие",{"2":{"438":1}}],["указывающих",{"2":{"421":1}}],["указывающий",{"2":{"159":1}}],["указывающей",{"2":{"162":1}}],["указывающее",{"2":{"156":1,"222":1}}],["указывающая",{"2":{"125":1,"156":1}}],["указываем",{"2":{"131":1,"132":1,"219":1}}],["указывает",{"2":{"125":1,"127":1,"134":1,"143":1,"155":1,"159":1,"167":3,"192":1,"195":2,"368":1,"371":3,"374":1,"435":1,"436":1}}],["указывать",{"2":{"125":2,"371":1}}],["унаследован",{"2":{"195":1}}],["универсальный",{"2":{"412":2}}],["уникален",{"2":{"389":1,"449":1}}],["уникальному",{"2":{"389":1}}],["уникального",{"2":{"321":1,"389":1,"421":1}}],["уникальная",{"2":{"383":1}}],["уникальным",{"2":{"321":1,"346":1,"350":1}}],["уникальный",{"2":{"125":1,"200":1,"222":1,"371":1,"374":1,"383":1}}],["унификации",{"2":{"109":1}}],["утвердить",{"2":{"426":1}}],["утверждаем",{"2":{"421":1}}],["утверждает",{"2":{"180":1,"288":1}}],["утверждениях",{"2":{"426":1}}],["утверждения",{"0":{"422":1,"423":1},"2":{"421":3,"422":1}}],["утверждений",{"2":{"421":4,"425":1}}],["утверждение",{"2":{"288":1,"421":1,"422":2,"423":1,"426":2}}],["утерянных",{"2":{"389":1}}],["утеряны",{"2":{"383":1}}],["утечек",{"2":{"273":1}}],["утечку",{"2":{"194":1}}],["уточняет",{"2":{"255":1}}],["утилит",{"0":{"454":1}}],["утилитами",{"2":{"454":1}}],["утилита",{"2":{"263":3}}],["утилитарных",{"2":{"216":1}}],["утилиту",{"2":{"98":1}}],["утилиты",{"2":{"86":1,"322":1,"409":2,"419":1,"449":1,"501":1}}],["узлов",{"2":{"389":1}}],["узлами",{"2":{"389":1}}],["узких",{"2":{"172":1}}],["узнаете",{"2":{"195":1,"359":1,"395":1}}],["узнает",{"2":{"162":1,"259":1}}],["узнаем",{"2":{"138":1,"226":1,"235":1,"251":1,"288":1,"312":1,"364":1}}],["узнаваемость",{"2":{"140":1,"150":1,"544":1}}],["узнали",{"2":{"136":1,"143":1,"189":1,"224":1,"249":2,"351":1,"355":1,"441":1}}],["узнать",{"2":{"126":1,"192":1,"317":2,"369":1,"389":1}}],["уж",{"2":{"170":1,"192":1,"209":1,"246":1,"274":1,"327":1}}],["уже",{"2":{"3":1,"16":1,"27":1,"36":1,"38":1,"39":1,"47":1,"103":1,"107":1,"109":1,"125":1,"134":2,"141":1,"144":1,"159":1,"162":1,"166":1,"174":1,"194":1,"195":2,"209":1,"214":1,"215":1,"216":1,"218":1,"221":1,"222":1,"228":1,"231":1,"238":1,"247":2,"253":1,"254":1,"262":2,"293":1,"294":1,"298":1,"303":2,"306":2,"312":1,"335":2,"343":1,"344":1,"358":1,"374":1,"375":1,"380":1,"389":2,"408":1,"417":1,"420":1,"428":1,"436":1,"439":1,"448":1,"450":1,"451":1,"452":1,"460":1,"461":3,"489":1,"524":1}}],["угрозой",{"2":{"350":1}}],["уголкам",{"2":{"176":1}}],["угодно",{"2":{"125":1}}],["угла",{"2":{"147":1}}],["углов",{"2":{"147":1}}],["углубление",{"2":{"428":1}}],["углубляться",{"2":{"269":1}}],["углубляясь",{"2":{"165":1}}],["углубиться",{"2":{"215":1}}],["углу",{"2":{"141":2,"143":1,"147":2,"173":1,"263":2}}],["уважает",{"2":{"420":1}}],["увидели",{"2":{"333":1,"461":1}}],["увидеть",{"2":{"125":2,"139":1,"158":1,"166":1,"174":1,"213":1,"214":1,"215":1,"222":2,"227":1,"252":1,"277":1,"302":1,"313":2,"320":1,"322":1,"323":1,"336":1,"338":1,"344":1,"347":1,"353":1,"355":1,"365":1,"374":1,"416":1}}],["увидит",{"2":{"314":1}}],["увидите",{"2":{"191":1,"214":3,"269":1,"272":1,"335":1,"353":1,"377":1}}],["увидим",{"2":{"193":1,"195":1,"202":2,"217":1,"222":1,"230":1,"242":1,"261":1,"270":1,"296":1,"300":1,"313":1,"325":1,"342":1,"346":1,"366":1,"369":1,"371":1,"382":1,"388":1,"436":1}}],["уверенным",{"2":{"460":1}}],["уверенный",{"2":{"419":1}}],["уверенную",{"2":{"149":1}}],["уверены",{"2":{"309":1,"332":1}}],["увеличили",{"2":{"314":1}}],["увеличивая",{"2":{"335":1}}],["увеличивает",{"2":{"235":1,"412":1,"453":1}}],["увеличивается",{"2":{"214":1,"326":1,"412":1}}],["увеличиваем",{"2":{"162":1}}],["увеличивать",{"2":{"162":1}}],["увеличения",{"2":{"190":1}}],["увеличение",{"0":{"254":1},"1":{"255":1,"256":1,"257":1,"258":1,"259":1,"260":1},"2":{"116":1,"366":3}}],["уведомить",{"2":{"159":1,"260":1,"339":1}}],["уведомлять",{"2":{"235":1}}],["уведомляется",{"2":{"297":1}}],["уведомляет",{"2":{"231":1}}],["уведомляющие",{"0":{"156":1}}],["уведомлений",{"0":{"231":1}}],["уведомление",{"2":{"157":3,"260":1}}],["уведомления",{"0":{"157":1},"2":{"157":2,"253":3}}],["уведомлении",{"2":{"156":1}}],["увесистыми",{"2":{"138":1}}],["упаковывает",{"2":{"332":1}}],["упакованных",{"2":{"386":1}}],["упакованные",{"2":{"298":1}}],["упакован",{"2":{"193":1}}],["упакует",{"2":{"193":1}}],["упала",{"2":{"116":1}}],["упорядоченной",{"2":{"420":1}}],["упорядочиваете",{"2":{"273":1}}],["упоминалось",{"2":{"222":1,"238":1,"343":1}}],["упоминали",{"2":{"134":1,"215":1,"262":1,"303":1,"306":1,"328":1}}],["упомянутую",{"2":{"320":1}}],["упомянутый",{"2":{"194":1}}],["упомянутых",{"2":{"120":1,"157":1,"360":1,"440":1}}],["упомянуть",{"2":{"149":1,"247":1,"276":1}}],["упомянутого",{"2":{"135":1,"292":1}}],["уполномоченной",{"2":{"125":1}}],["упражнением",{"2":{"387":1}}],["упражнение",{"2":{"293":1}}],["упражнения",{"2":{"220":2,"223":1,"327":1,"375":1,"419":1}}],["управлению",{"2":{"191":1,"240":1,"275":1,"335":1,"342":1,"374":1}}],["управления",{"2":{"118":1,"127":1,"128":3,"163":1,"215":1,"221":1,"235":1,"237":1,"243":1,"247":1,"256":2,"260":1,"290":1,"298":1,"323":1,"336":1,"343":1,"344":1,"345":1,"349":2,"354":1,"359":1,"399":2,"437":2,"442":1,"449":3}}],["управлении",{"2":{"110":1,"128":1}}],["управлением",{"2":{"213":1}}],["управление",{"0":{"335":1,"399":1,"431":1,"437":1},"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,"349":1,"350":1,"351":1,"352":1,"353":1,"354":1,"355":1},"2":{"78":1,"110":1,"118":2,"140":1,"191":1,"195":1,"230":3,"237":1,"240":1,"242":1,"249":1,"251":1,"260":1,"261":1,"271":1,"288":1,"295":1,"345":2,"355":1,"374":1,"415":1,"430":1,"439":1}}],["управляло",{"2":{"248":1}}],["управляемое",{"2":{"461":1}}],["управляемым",{"2":{"543":1}}],["управляемые",{"2":{"269":2}}],["управляемый",{"2":{"128":1}}],["управляет",{"2":{"128":1,"215":1,"231":1,"241":1,"246":1,"247":1,"260":1,"271":1,"431":1}}],["управляется",{"2":{"2":1,"125":1,"507":1}}],["управляются",{"2":{"545":1}}],["управляют",{"2":{"125":1,"163":1}}],["управляющему",{"2":{"2":1}}],["управляться",{"2":{"435":1}}],["управлять",{"2":{"2":1,"148":1,"172":1,"192":1,"194":1,"223":1,"253":1,"311":1,"334":1,"337":1,"367":2,"371":1,"441":1,"451":2}}],["упростит",{"2":{"454":1}}],["упростить",{"2":{"125":1,"240":1,"284":1,"306":1,"389":1}}],["упрощенную",{"2":{"461":1}}],["упрощенно",{"2":{"451":1}}],["упрощенного",{"2":{"388":1}}],["упрощенное",{"2":{"193":1,"306":1,"383":1}}],["упрощенный",{"2":{"306":1,"309":1,"340":1,"388":1}}],["упрощенным",{"2":{"260":1}}],["упрощения",{"2":{"260":1,"275":1,"277":1,"306":2}}],["упрощение",{"0":{"2":1}}],["упрощать",{"2":{"306":1}}],["упрощающий",{"2":{"306":1}}],["упрощают",{"2":{"47":1}}],["упрощает",{"2":{"78":1,"109":1,"390":1,"408":1}}],["умирает",{"2":{"449":1}}],["умными",{"2":{"389":1}}],["умных",{"2":{"366":1}}],["умны",{"2":{"286":1}}],["умные",{"2":{"276":1}}],["умён",{"2":{"222":1}}],["ума",{"2":{"220":1}}],["ум",{"2":{"161":1}}],["умолчанию",{"0":{"531":1},"2":{"114":1,"115":3,"116":1,"127":1,"132":1,"135":1,"162":1,"214":1,"236":2,"237":1,"240":6,"246":1,"256":1,"293":1,"328":1,"332":1,"349":1,"374":1,"377":3,"386":1,"436":1,"526":1}}],["умеет",{"2":{"461":1}}],["умеешь",{"2":{"84":2}}],["умел",{"2":{"460":1}}],["умело",{"2":{"190":1}}],["уместен",{"2":{"342":1}}],["уместно",{"2":{"310":1}}],["умеют",{"2":{"306":1}}],["умеющий",{"2":{"50":1}}],["умение",{"2":{"460":1}}],["умении",{"2":{"459":1}}],["умения",{"2":{"266":1}}],["уменьшить",{"2":{"367":1,"371":1}}],["уменьшение",{"2":{"116":1,"121":1}}],["уме",{"2":{"23":1,"125":1,"211":1}}],["уровень",{"2":{"106":2,"135":2,"218":1,"375":1,"388":1,"452":1,"458":1,"485":1}}],["уровни",{"2":{"306":1}}],["уровней",{"2":{"165":1,"169":1}}],["уровне",{"2":{"127":1,"172":1,"237":1,"238":1,"243":1,"246":1,"253":1,"301":1,"316":1,"410":2,"448":1,"450":1,"460":2}}],["уровнем",{"2":{"105":1}}],["уровнями",{"2":{"375":1,"521":1}}],["уровнях",{"2":{"266":1,"301":1,"318":1}}],["уровня",{"0":{"254":1},"1":{"255":1,"256":1,"257":1,"258":1,"259":1,"260":1},"2":{"64":1,"106":1,"111":1,"116":1,"125":3,"137":1,"267":1,"368":1,"369":1,"390":1,"418":1,"419":1,"451":1,"460":1}}],["удивительная",{"2":{"333":1}}],["удивительных",{"2":{"306":1}}],["удивительные",{"2":{"126":1}}],["уделяя",{"2":{"360":1}}],["уделять",{"2":{"264":1}}],["уделите",{"2":{"421":1}}],["уделить",{"2":{"232":1,"253":1}}],["уделили",{"2":{"354":2,"390":1}}],["удерживать",{"2":{"149":1}}],["удержание",{"2":{"141":1}}],["удачные",{"2":{"309":1}}],["удастся",{"2":{"235":1,"438":1}}],["удается",{"2":{"132":1}}],["удалась",{"2":{"385":1}}],["удалить",{"2":{"178":1,"216":1,"218":1,"221":1,"438":1}}],["удалось",{"2":{"159":1,"421":1}}],["удаляет",{"2":{"350":2}}],["удаляем",{"2":{"241":1,"321":1,"374":1}}],["удаляют",{"2":{"199":1,"327":1}}],["удаляя",{"2":{"125":1,"198":1}}],["удалять",{"2":{"116":1,"324":1,"437":1}}],["удалении",{"2":{"185":1,"203":1}}],["удалением",{"2":{"149":1,"273":1}}],["удаление",{"2":{"149":1,"230":2,"380":1,"437":1,"448":1}}],["удаления",{"2":{"106":1,"116":1,"154":1,"223":1,"273":1,"324":2}}],["удаленно",{"2":{"439":1}}],["удаленном",{"2":{"408":1,"440":1}}],["удаленного",{"2":{"134":1,"431":1,"439":1}}],["удаленные",{"2":{"439":1}}],["удаленных",{"2":{"431":1}}],["удаленный",{"2":{"134":1,"135":1,"327":1,"408":4,"431":1,"438":1,"439":3}}],["удаленными",{"0":{"439":1},"2":{"324":1}}],["удаленным",{"2":{"128":1,"274":1,"318":1,"327":1,"439":5}}],["удалена",{"0":{"116":1},"2":{"116":1}}],["удовлетворения",{"2":{"415":1}}],["удовлетворение",{"2":{"141":1}}],["удовлетворить",{"2":{"228":1,"232":1}}],["удовлетворительный",{"2":{"188":1}}],["удовлетворяющее",{"2":{"68":1,"260":1}}],["удостоверяющим",{"2":{"179":1}}],["удостоверяется",{"2":{"106":2}}],["удостовериться",{"2":{"106":1}}],["удобен",{"2":{"109":1,"141":1,"305":1,"309":1,"428":1,"500":1}}],["удобство",{"2":{"146":1,"150":1,"439":1,"484":2}}],["удобством",{"2":{"17":1}}],["удобства",{"2":{"106":1,"125":1,"167":1,"188":1,"203":1,"213":1,"218":1,"222":2,"294":1,"324":1,"420":1,"429":1,"484":1}}],["удобную",{"0":{"445":1},"2":{"161":1,"444":1,"459":1}}],["удобнее",{"2":{"109":1,"261":1}}],["удобней",{"2":{"20":1,"449":1,"459":1}}],["удобная",{"2":{"218":1,"409":1,"426":1}}],["удобна",{"2":{"75":1,"444":1}}],["удобны",{"2":{"247":1,"407":1}}],["удобным",{"2":{"209":1,"290":1}}],["удобные",{"2":{"61":1,"327":1}}],["удобных",{"2":{"50":1,"202":1,"306":1,"373":1,"377":1}}],["удобный",{"2":{"17":1,"23":1,"389":1,"408":1,"444":1,"448":1,"458":1,"460":1}}],["удобного",{"2":{"381":1}}],["удобное",{"2":{"317":1,"409":1}}],["удобной",{"2":{"213":1,"381":1,"400":1}}],["удобно",{"2":{"44":1,"68":1,"81":1,"97":1,"105":2,"114":1,"129":1,"142":1,"195":1,"200":1,"214":1,"292":2,"295":1,"307":1,"327":1,"411":1,"444":1,"449":2,"459":1,"491":1,"495":1}}],["убить",{"2":{"460":1}}],["убирать",{"2":{"273":1}}],["убирается",{"2":{"96":1,"544":1}}],["убираем",{"2":{"87":2}}],["убывающей",{"2":{"428":1}}],["убедились",{"2":{"389":1}}],["убедимся",{"2":{"314":1}}],["убедитесь",{"2":{"216":1,"263":1,"306":1,"436":1}}],["убедиться",{"2":{"211":1,"222":1,"284":1,"309":1,"325":1,"371":1,"386":1,"422":1}}],["убрать",{"2":{"103":1}}],["улицам",{"2":{"460":1}}],["улице",{"2":{"26":1}}],["уложенные",{"2":{"172":1}}],["улучшайте",{"2":{"460":1}}],["улучшая",{"2":{"455":1}}],["улучшать",{"2":{"64":1}}],["улучшила",{"2":{"417":1}}],["улучшили",{"2":{"390":1}}],["улучшить",{"2":{"223":1,"224":1,"333":1,"342":1,"371":1,"417":1,"461":1,"543":1}}],["улучшит",{"2":{"199":1}}],["улучшена",{"2":{"349":2}}],["улучшению",{"2":{"421":1}}],["улучшение",{"2":{"248":1,"448":1}}],["улучшения",{"2":{"73":1,"191":1,"324":1,"530":1}}],["учит",{"2":{"460":2}}],["учителем",{"2":{"460":1}}],["учите",{"2":{"276":2}}],["учиться",{"2":{"452":1}}],["учить",{"2":{"276":1}}],["учитывают",{"2":{"461":1}}],["учитывая",{"2":{"228":1,"229":1,"232":1,"240":1,"247":1,"254":1,"346":1,"387":2}}],["учитывать",{"2":{"141":1,"215":1,"253":1,"261":1,"382":1,"443":1}}],["учреждения",{"2":{"174":1}}],["участию",{"2":{"487":1}}],["участие",{"0":{"487":1}}],["участника",{"2":{"383":2}}],["участниками",{"2":{"383":2}}],["участки",{"2":{"126":1,"222":1,"229":1,"273":1}}],["учатся",{"2":{"143":1}}],["ученика",{"2":{"460":1}}],["учебники",{"2":{"460":1}}],["учебник",{"2":{"460":3}}],["учебного",{"2":{"327":1,"375":1,"419":1}}],["учетной",{"2":{"389":1}}],["учетным",{"2":{"388":1}}],["учетными",{"2":{"383":1}}],["учетные",{"2":{"382":2,"383":1,"389":1}}],["учетных",{"2":{"382":3,"383":1,"387":1}}],["учетом",{"2":{"43":1,"110":1,"212":1,"231":1,"232":1,"418":1}}],["учесть",{"2":{"124":1,"315":1}}],["учтем",{"2":{"40":1}}],["усваивать",{"2":{"276":1}}],["усвоить",{"2":{"150":1}}],["усовершенствование",{"2":{"253":1}}],["усовершенствовать",{"2":{"248":1}}],["усмотрению",{"2":{"215":1,"314":1,"438":1}}],["ускоряет",{"2":{"459":1}}],["ускорение",{"2":{"253":1}}],["ускорению",{"2":{"195":1}}],["ускорить",{"2":{"148":1,"266":1,"452":1,"459":1}}],["усилий",{"2":{"253":1,"258":1,"262":1,"333":1,"417":1}}],["усилия",{"2":{"191":1,"314":1,"327":1,"428":1}}],["усиливает",{"2":{"140":1}}],["услышать",{"2":{"140":1}}],["услуг",{"2":{"179":2,"180":1,"381":1,"452":1}}],["услугу",{"2":{"135":1}}],["услуги",{"2":{"125":1,"181":1,"183":1,"185":2,"187":1,"440":1}}],["услугам",{"2":{"269":1}}],["услуга",{"2":{"124":1,"140":1}}],["усложнению",{"2":{"271":1}}],["усложнение",{"2":{"179":1}}],["усложняться",{"2":{"461":1}}],["усложнять",{"2":{"99":1}}],["условные",{"2":{"199":1,"246":1}}],["условна",{"2":{"14":1}}],["условию",{"2":{"420":1,"421":1}}],["условие",{"2":{"309":1}}],["условием",{"2":{"179":1,"188":1,"349":1}}],["условии",{"2":{"240":1,"287":1,"303":1,"382":1,"383":1,"421":1}}],["условий",{"2":{"157":1,"247":1,"253":2,"309":1,"412":1}}],["условиям",{"2":{"277":1}}],["условиями",{"2":{"122":1}}],["условиях",{"2":{"180":1,"191":1,"417":1}}],["условия",{"2":{"140":1,"232":1,"305":1}}],["устраняет",{"2":{"442":1}}],["устраняя",{"2":{"277":1}}],["устранения",{"2":{"438":1}}],["устранению",{"2":{"417":1}}],["устранить",{"2":{"438":1}}],["устройстве",{"2":{"255":1}}],["устройств",{"2":{"164":1,"251":1,"506":1}}],["устройством",{"2":{"272":1}}],["устройство",{"2":{"141":1,"388":2}}],["устройствами",{"2":{"253":1}}],["устройствам",{"2":{"253":2}}],["устройствах",{"2":{"253":3,"256":1,"257":1,"260":1,"314":1,"366":1}}],["устройства",{"2":{"93":1,"140":1,"251":1,"253":2,"388":1,"460":1}}],["устроена",{"2":{"94":1}}],["устойчивым",{"2":{"223":1}}],["устоявшихся",{"2":{"138":1,"495":1}}],["уступают",{"2":{"152":1}}],["устареть",{"2":{"459":1}}],["устареет",{"2":{"453":1}}],["устаревающих",{"2":{"495":1}}],["устаревает",{"2":{"449":1}}],["устаревший",{"2":{"443":1}}],["устаревшими",{"2":{"366":1}}],["устаревшие",{"2":{"121":1,"444":1}}],["устаревшем",{"2":{"116":1,"253":1}}],["устарели",{"2":{"460":1}}],["устарел",{"2":{"445":1,"448":1,"449":1}}],["устанавливающихся",{"2":{"497":1}}],["устанавливаются",{"2":{"214":1,"261":1,"497":1}}],["устанавливать",{"2":{"245":1,"264":1,"298":1,"441":1,"542":1}}],["устанавливаться",{"2":{"190":1,"253":1,"366":1}}],["устанавливается",{"2":{"443":1,"536":1}}],["устанавливает",{"2":{"172":1,"260":1,"323":1,"500":1}}],["устанавливаемые",{"0":{"253":1}}],["устанавливаем",{"2":{"20":1,"261":1,"262":1,"386":2}}],["установят",{"2":{"433":1}}],["установливаем",{"2":{"374":1}}],["установлены",{"2":{"432":1,"489":1}}],["установленную",{"2":{"408":1}}],["установленный",{"2":{"260":1}}],["установленным",{"2":{"213":1}}],["установлена",{"2":{"327":1,"461":1}}],["установлено",{"2":{"255":1,"259":1,"260":7,"491":1}}],["установлен",{"2":{"162":1,"214":1,"340":1,"434":2,"435":1}}],["установим",{"2":{"419":1,"420":1}}],["установив",{"2":{"213":1,"254":1}}],["установили",{"2":{"215":1,"428":1,"434":1}}],["установил",{"2":{"142":1,"261":1}}],["установит",{"2":{"214":1,"368":1}}],["установите",{"2":{"135":1,"260":1,"368":1,"420":1,"460":1}}],["установить",{"2":{"107":1,"135":3,"213":3,"214":1,"219":1,"253":2,"260":1,"261":1,"368":1,"381":1,"407":1,"419":1,"423":1,"424":3,"426":1,"428":2,"429":1}}],["установкой",{"2":{"136":1,"195":1,"259":1}}],["установке",{"0":{"260":1},"2":{"135":1,"213":1,"214":1,"222":1,"260":6,"261":2,"461":2}}],["установку",{"2":{"124":1,"135":1,"214":1,"215":1,"260":8,"433":1,"435":1}}],["установки",{"2":{"108":1,"114":1,"135":2,"148":1,"214":1,"217":1,"221":1,"246":1,"253":2,"260":10,"262":1,"327":1,"331":1,"345":1,"352":1,"360":1,"368":1,"408":1,"419":1,"424":1,"426":1,"431":1,"432":4,"433":1,"434":1,"435":1,"444":1,"448":1,"524":1}}],["установка",{"0":{"53":1,"212":1,"320":1,"368":1,"420":1,"424":1,"432":1,"433":1,"434":1,"488":1,"489":1,"491":1},"1":{"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"223":1,"224":1,"225":1,"321":1,"322":1,"323":1,"421":1,"425":1,"426":1,"489":1,"490":2,"491":1},"2":{"111":1,"117":1,"131":1,"193":1,"194":1,"195":1,"214":1,"226":1,"227":1,"244":1,"253":1,"298":1,"336":1,"368":1,"415":2,"424":1,"433":1,"489":2}}],["успевает",{"2":{"444":1}}],["успешным",{"2":{"307":1}}],["успешными",{"2":{"253":1}}],["успешный",{"2":{"140":1,"385":1}}],["успешности",{"2":{"409":1}}],["успешностью",{"2":{"23":1}}],["успешной",{"2":{"384":1,"385":1}}],["успешном",{"2":{"309":1}}],["успешного",{"2":{"309":1,"423":1}}],["успешно",{"2":{"217":1,"263":1,"385":1}}],["успехом",{"2":{"382":1}}],["успехов",{"2":{"363":1}}],["успех",{"2":{"68":1,"157":1,"307":1,"415":1}}],["успеха",{"2":{"41":1,"309":3,"382":1,"387":1,"418":1}}],["у",{"0":{"486":1},"2":{"3":1,"12":1,"13":1,"16":3,"17":2,"23":1,"28":1,"29":1,"36":1,"41":1,"43":1,"47":3,"48":1,"58":1,"81":1,"86":1,"88":1,"96":2,"103":1,"106":3,"107":4,"109":1,"114":1,"125":2,"128":1,"135":2,"138":1,"140":1,"143":1,"147":1,"149":3,"157":1,"162":1,"175":1,"177":1,"184":1,"194":2,"195":1,"209":1,"211":1,"214":1,"222":4,"230":1,"234":1,"235":1,"237":1,"240":1,"242":1,"244":1,"248":1,"260":1,"261":1,"270":1,"273":1,"297":1,"305":1,"307":1,"308":1,"309":2,"316":1,"320":1,"321":2,"337":1,"339":2,"342":1,"347":1,"349":1,"350":2,"374":1,"375":1,"377":3,"383":2,"387":1,"389":3,"408":1,"411":1,"420":2,"423":1,"424":1,"431":2,"434":2,"435":1,"436":1,"439":1,"448":1,"449":5,"452":1,"459":1,"460":1,"461":2,"495":1,"516":2,"527":1}}],["флексбокса",{"2":{"456":1}}],["флагманом",{"2":{"451":1}}],["флаг",{"2":{"260":1,"350":2}}],["флажок",{"2":{"153":1,"177":1}}],["флажка",{"2":{"153":1,"177":1,"222":2}}],["форсирует",{"2":{"408":1}}],["форумах",{"2":{"165":1}}],["форм",{"2":{"533":1}}],["формочки",{"2":{"461":1}}],["формой",{"2":{"315":1}}],["формы",{"2":{"148":1,"350":1,"449":1}}],["формируя",{"2":{"193":1}}],["формируется",{"2":{"174":1}}],["формирует",{"2":{"107":1,"214":1,"461":1}}],["формирование",{"2":{"105":1}}],["формуле",{"2":{"383":1}}],["формулы",{"2":{"172":1}}],["формулу",{"2":{"124":1,"191":1,"307":2}}],["формулировки",{"2":{"185":1}}],["формулировок",{"2":{"185":1}}],["формулировать",{"2":{"4":1}}],["формулируется",{"2":{"2":1}}],["форму",{"2":{"106":1,"177":1,"382":1,"387":1,"483":1}}],["форме",{"2":{"75":1,"154":1}}],["формальная",{"2":{"230":1}}],["формальный",{"2":{"195":1}}],["формах",{"2":{"152":1}}],["форма",{"2":{"48":1,"161":1}}],["форматирует",{"2":{"444":1}}],["форматируете",{"2":{"273":1}}],["форматировании",{"2":{"461":1}}],["форматирование",{"2":{"444":1}}],["форматирования",{"2":{"327":1,"492":1}}],["форматированию",{"2":{"152":1}}],["форматов",{"2":{"236":1}}],["форматом",{"2":{"153":1,"428":1}}],["формата",{"2":{"109":1,"461":1}}],["формате",{"2":{"107":1,"195":1,"213":1,"230":1,"241":1,"332":1,"350":1,"382":1,"414":2,"427":1,"461":1}}],["формат",{"2":{"17":1,"143":1,"195":1,"309":1,"327":1,"383":1,"414":1,"489":1}}],["фоне",{"2":{"451":1}}],["фон",{"2":{"414":1}}],["фонт",{"2":{"261":1}}],["фоновые",{"2":{"327":1}}],["фоновыми",{"2":{"314":1}}],["фоновый",{"2":{"261":1}}],["фоновом",{"2":{"159":1}}],["фона",{"2":{"221":1,"257":1,"260":1}}],["фонд",{"2":{"135":1}}],["фондом",{"2":{"135":1}}],["фокус",{"2":{"166":1}}],["фокусироваться",{"2":{"153":1,"166":1}}],["фокусировки",{"2":{"142":1}}],["фокусной",{"2":{"142":1}}],["ферме",{"2":{"128":1}}],["фибоначчи",{"0":{"308":1},"2":{"307":1,"309":1,"419":3,"422":1}}],["фигура",{"2":{"342":1}}],["фигуру",{"2":{"296":1}}],["фигурных",{"2":{"222":1}}],["фигурные",{"2":{"192":1}}],["финальном",{"2":{"452":1}}],["финальную",{"2":{"234":1}}],["финансы",{"2":{"389":1}}],["финляндия",{"2":{"169":1}}],["фиксит",{"2":{"452":1}}],["фиксируют",{"2":{"440":1}}],["фиксируются",{"2":{"426":1}}],["фиксируем",{"2":{"222":1}}],["фиксированного",{"2":{"161":1}}],["фиксация",{"2":{"436":1}}],["фиксации",{"2":{"209":1,"435":2,"436":2}}],["философию",{"2":{"172":1}}],["фильтрасобытия",{"2":{"230":1}}],["фильтрасостояние",{"2":{"230":1}}],["фильтрации",{"2":{"169":1,"222":1,"230":1,"247":1,"302":1}}],["фильтрация",{"2":{"16":1,"23":1}}],["фильтрами",{"2":{"30":1,"35":1}}],["фильтры",{"2":{"4":1,"33":1}}],["фишек",{"2":{"154":1}}],["фитта",{"0":{"147":1}}],["физических",{"2":{"128":1}}],["фидбеки",{"2":{"63":1}}],["фулстек",{"2":{"109":1,"444":1}}],["фулстеков",{"2":{"109":1}}],["футеров",{"2":{"508":1}}],["футером",{"2":{"409":1,"534":1}}],["футер",{"2":{"32":1}}],["функций",{"2":{"144":1,"153":1,"191":2,"195":1,"237":1,"238":1,"241":1,"246":1,"273":2,"277":1,"283":1,"291":1,"295":1,"297":1,"303":1,"304":1,"306":1,"309":1,"311":1,"318":1,"346":1,"419":1,"423":1,"424":1,"426":1,"449":3}}],["функциях",{"2":{"309":1,"337":1,"426":1,"451":1}}],["функциям",{"2":{"240":1,"269":1}}],["функциями",{"2":{"215":1,"238":1,"337":1,"343":1,"449":1}}],["функция",{"2":{"115":1,"135":1,"142":1,"148":1,"195":1,"202":1,"218":1,"222":3,"230":1,"235":2,"241":4,"246":1,"247":2,"271":1,"273":1,"294":2,"296":1,"302":1,"303":1,"307":3,"308":1,"314":1,"318":1,"326":1,"342":3,"344":3,"346":1,"352":3,"383":1,"387":1,"421":4,"422":2,"425":1,"448":1,"449":1,"452":1,"453":1}}],["функцию",{"2":{"113":1,"116":1,"126":1,"142":1,"162":2,"164":1,"192":1,"202":1,"222":1,"232":1,"235":3,"236":1,"238":2,"241":5,"243":1,"246":1,"247":1,"271":2,"273":3,"287":1,"292":1,"293":2,"296":1,"297":1,"298":3,"299":1,"302":1,"308":3,"309":3,"314":1,"321":1,"322":2,"332":1,"338":3,"339":2,"344":1,"347":2,"349":1,"352":2,"374":2,"381":1,"413":1,"417":1,"421":3,"422":1,"423":1,"425":2,"426":1,"435":1,"449":1,"453":1,"499":1}}],["функцией",{"0":{"113":1},"2":{"83":1,"113":1,"148":1,"161":1,"195":1,"202":1,"214":1,"222":1,"236":1,"269":1,"303":1,"308":1,"352":1,"415":1,"421":1,"524":1}}],["функции",{"0":{"208":1,"241":1},"1":{"242":1},"2":{"40":1,"41":1,"81":2,"83":2,"97":2,"98":1,"107":2,"116":1,"131":1,"140":1,"141":1,"146":1,"147":1,"153":1,"162":1,"191":1,"192":1,"195":6,"206":1,"209":1,"216":1,"235":2,"241":4,"242":1,"246":1,"247":1,"260":1,"269":1,"271":2,"273":2,"278":1,"288":1,"290":1,"292":1,"294":1,"295":1,"298":1,"302":2,"307":5,"308":3,"309":8,"314":2,"316":1,"318":1,"319":1,"323":1,"324":1,"325":2,"326":1,"337":1,"344":1,"346":1,"347":3,"352":1,"386":1,"387":2,"409":1,"418":3,"420":1,"421":6,"422":1,"423":3,"427":1,"449":6,"451":1,"492":1,"497":1,"507":1}}],["функционируют",{"2":{"22":1}}],["функционалом",{"2":{"25":1,"318":1,"489":1,"495":1}}],["функциональную",{"2":{"269":1}}],["функциональным",{"2":{"270":1,"303":1}}],["функциональный",{"2":{"219":1}}],["функциональные",{"0":{"77":1},"2":{"269":1,"275":1,"381":1,"496":1}}],["функциональных",{"2":{"3":1,"145":1,"496":1}}],["функциональной",{"2":{"449":1}}],["функциональном",{"2":{"271":1}}],["функциональному",{"2":{"247":1}}],["функциональности",{"2":{"191":3,"209":1,"216":1,"226":1,"229":1,"230":1,"232":1,"243":1,"247":1,"270":1,"301":1,"303":3,"366":1,"441":1,"492":2}}],["функциональностью",{"2":{"152":1,"195":1,"243":1,"271":2,"303":1}}],["функциональность",{"2":{"11":1,"76":1,"191":1,"195":1,"196":1,"221":1,"224":1,"234":1,"238":1,"249":1,"253":1,"262":1,"270":2,"274":1,"297":3,"303":2,"304":1,"324":1,"339":1,"340":1,"349":1,"491":1,"507":1}}],["функционально",{"2":{"23":1}}],["функционал",{"2":{"9":1,"13":1,"26":1,"50":1,"339":1,"452":1,"458":1,"492":1,"496":1,"524":1,"528":1}}],["функционала",{"2":{"9":1,"32":1,"78":1,"99":1,"448":2,"459":1,"491":1,"492":1,"494":1,"496":1,"524":1,"525":1,"533":1}}],["фундаментальное",{"2":{"429":1,"451":1}}],["фундаментальной",{"2":{"191":1}}],["фундаментальными",{"2":{"364":1}}],["фундаментальный",{"2":{"308":1}}],["фундаментальную",{"2":{"266":1}}],["фундаментальная",{"2":{"240":1}}],["фундамента",{"2":{"26":1}}],["фракционирование",{"2":{"390":1}}],["фрагментов",{"2":{"503":1}}],["фрагментом",{"2":{"161":1,"267":1}}],["фрагменте",{"2":{"277":1,"376":1}}],["фрагменты",{"2":{"240":1,"496":1,"503":1}}],["фрагментам",{"2":{"312":1}}],["фрагментах",{"2":{"247":1}}],["фрагмента",{"2":{"192":1,"308":1,"377":1,"421":1}}],["фрагмент",{"2":{"145":1,"157":1,"161":1,"241":1,"247":1,"273":1,"322":1,"375":1}}],["фреймворку",{"2":{"199":1,"253":1}}],["фреймворке",{"2":{"191":1,"448":1,"451":1}}],["фреймворков",{"2":{"190":1,"191":2,"210":1,"212":1,"216":1,"219":1,"350":1,"358":1,"451":1,"492":1,"495":1}}],["фреймворком",{"2":{"115":1,"136":1,"190":1,"194":1,"196":1,"209":1,"211":2,"216":1,"222":1,"448":1,"524":1}}],["фреймворки",{"2":{"190":1,"191":2,"193":1,"203":1,"215":2,"216":2,"225":1,"253":1,"451":2}}],["фреймворк",{"0":{"190":1,"191":1,"217":1,"393":1},"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,"221":1,"222":1,"223":1},"2":{"110":2,"190":1,"191":6,"192":1,"193":1,"202":2,"203":1,"214":1,"215":1,"216":2,"217":1,"233":1,"242":1,"261":1,"266":1,"272":1,"312":1,"324":1,"331":1,"358":1,"367":1,"389":1,"393":1,"399":1,"420":1,"449":1,"495":1}}],["фреймворках",{"0":{"451":1},"2":{"345":1,"350":1,"371":1,"470":1}}],["фреймворками",{"0":{"216":1},"1":{"217":1},"2":{"215":1,"417":1}}],["фреймворка",{"2":{"20":1,"108":1,"110":1,"190":1,"191":3,"192":1,"212":1,"216":1,"222":2,"233":1,"249":2,"273":1,"297":1,"335":1,"358":2,"359":1,"368":1,"393":1,"418":1,"448":2,"495":1}}],["фронте",{"2":{"106":3,"109":2,"450":2,"451":1,"452":2,"460":1}}],["фронтендом",{"2":{"108":1}}],["фронтенды",{"2":{"61":1}}],["фронтенда",{"2":{"10":1,"11":1,"23":1,"41":2,"58":1,"449":3,"460":1,"496":2}}],["фронтенд",{"0":{"451":1},"2":{"4":1,"6":1,"20":1,"41":1,"47":1,"107":1,"312":1,"388":1,"389":1,"407":1,"444":1,"450":1,"451":1,"452":1,"461":1,"465":1,"467":1,"470":2,"495":1}}],["фронтендеру",{"2":{"405":1}}],["фронтендера",{"0":{"107":1}}],["фронтенде",{"2":{"3":1,"6":1,"13":1,"44":1,"96":1,"387":1,"449":2,"450":1,"451":2,"452":1,"460":1}}],["фронту",{"2":{"106":1,"107":1}}],["фронт",{"2":{"106":3,"107":2,"444":1}}],["фронта",{"2":{"106":1,"107":1,"451":1}}],["фронтэнде",{"2":{"451":1}}],["фронтэндер",{"2":{"107":1}}],["фронтэнд",{"0":{"452":1},"1":{"453":1,"454":1,"455":1,"456":1,"457":1,"458":1},"2":{"106":1,"107":1,"109":1,"485":1}}],["фабричной",{"2":{"344":1}}],["фабрики",{"2":{"296":2}}],["фабрика",{"0":{"296":1}}],["фаренгейта",{"2":{"301":1,"302":2}}],["фасадов",{"2":{"306":1}}],["фасадный",{"2":{"306":1}}],["фасада",{"2":{"305":1,"306":1}}],["фасад",{"0":{"306":1},"2":{"266":1,"302":1,"306":1}}],["фантазийный",{"2":{"228":1}}],["фактического",{"2":{"408":1,"417":1,"461":1}}],["фактические",{"2":{"337":1}}],["фактически",{"2":{"238":1,"324":1}}],["факт",{"2":{"155":1,"449":1}}],["факто",{"2":{"109":1,"368":1,"500":1}}],["фактора",{"2":{"390":1}}],["фактор",{"2":{"303":1,"388":1,"451":1}}],["фактором",{"2":{"247":1,"301":1,"319":1,"382":1}}],["факторов",{"2":{"41":1,"307":1,"415":1,"418":2}}],["факторизация",{"2":{"13":1}}],["файлом",{"2":{"130":1,"215":1,"259":1}}],["файловой",{"2":{"253":1}}],["файловый",{"2":{"128":1}}],["файлов",{"0":{"117":1,"134":1,"208":1},"2":{"11":2,"38":1,"75":1,"94":1,"110":1,"123":1,"126":2,"132":1,"136":2,"186":1,"193":1,"214":1,"216":1,"220":1,"235":2,"247":1,"262":1,"377":1,"407":1,"408":1,"413":1,"420":2,"427":1,"435":3,"443":1}}],["файлу",{"2":{"126":1,"219":1,"273":1,"315":1}}],["файле",{"2":{"103":1,"194":1,"217":1,"234":2,"247":1,"255":1,"261":1,"315":1,"321":1,"327":1,"345":1,"374":2,"377":1,"427":1,"428":1,"438":1,"542":1,"545":2}}],["файл",{"0":{"255":1},"1":{"256":1,"257":1,"258":1},"2":{"103":1,"126":1,"127":1,"128":1,"130":1,"131":2,"132":2,"143":2,"149":1,"186":2,"193":3,"194":3,"215":12,"216":2,"217":3,"218":2,"219":5,"221":1,"235":2,"246":2,"247":2,"251":1,"253":1,"255":4,"259":3,"261":2,"262":2,"288":1,"290":1,"321":1,"325":1,"326":1,"331":1,"344":1,"347":1,"348":1,"366":1,"370":1,"371":4,"374":1,"408":4,"413":1,"419":1,"420":5,"424":5,"425":1,"427":1,"428":2,"429":1,"435":4,"436":2,"438":6,"442":1,"444":1,"461":2,"503":1}}],["файлам",{"2":{"126":1,"215":1}}],["файлами",{"2":{"11":1,"38":1,"131":1,"246":1,"435":1}}],["файлах",{"2":{"94":1,"420":2,"421":1,"426":2,"427":3,"444":1}}],["файла",{"2":{"17":1,"108":1,"111":1,"127":1,"129":1,"131":1,"215":1,"217":1,"218":1,"235":1,"246":2,"253":1,"255":2,"258":2,"289":1,"315":1,"316":1,"328":2,"331":1,"408":3,"421":2,"427":1,"435":1,"461":1,"489":2}}],["файлы",{"0":{"38":1,"362":1},"2":{"6":1,"11":1,"17":1,"117":1,"127":2,"128":1,"133":1,"134":2,"135":1,"193":1,"213":1,"214":2,"215":4,"218":2,"227":1,"246":1,"253":1,"261":1,"262":1,"327":1,"362":1,"366":1,"368":1,"408":1,"412":1,"420":1,"430":2,"431":1,"435":5,"436":3,"437":1,"438":1,"443":1,"461":1,"501":1,"526":1}}],["зря",{"2":{"459":1}}],["зрения",{"2":{"11":1,"23":1,"97":1,"114":1,"140":1,"307":1,"318":2,"333":1,"374":1,"449":3,"484":1}}],["зерна",{"2":{"460":1}}],["зеркально",{"2":{"329":2,"330":1}}],["зеркальное",{"2":{"126":1}}],["зеленого",{"2":{"421":1}}],["звездочка",{"2":{"436":1}}],["звеном",{"2":{"328":1}}],["звучало",{"2":{"419":1}}],["звучит",{"2":{"193":1}}],["звуков",{"2":{"140":1}}],["зону",{"2":{"269":1}}],["зона",{"2":{"191":1}}],["змеином",{"2":{"206":1}}],["злоупотреблять",{"2":{"314":1,"411":1}}],["злоупотребление",{"2":{"158":1}}],["злой",{"2":{"138":1}}],["знал",{"2":{"460":1}}],["знатоков",{"2":{"444":1}}],["знать",{"2":{"110":1,"121":1,"126":1,"188":1,"191":1,"193":1,"195":1,"214":1,"242":1,"251":1,"260":1,"291":1,"301":1,"364":1,"380":1,"443":1,"460":2}}],["знающих",{"2":{"460":1}}],["знают",{"2":{"337":1,"459":1}}],["знаю",{"2":{"309":1}}],["знанию",{"2":{"460":1}}],["знаний",{"2":{"354":1,"460":1}}],["знание",{"2":{"266":1,"359":1}}],["знаниями",{"2":{"364":1}}],["знания",{"2":{"188":1,"190":1,"226":1,"242":1,"250":1,"266":1,"312":1,"359":1,"364":1,"391":1,"460":2}}],["знаем",{"2":{"195":1,"242":1,"307":1,"314":1,"380":1,"426":1,"428":1}}],["знает",{"2":{"193":1,"195":2,"301":1,"327":1}}],["знаете",{"2":{"107":1,"388":1}}],["знаки",{"2":{"436":1}}],["знаку",{"2":{"371":1}}],["знаке",{"2":{"220":1}}],["знаками",{"2":{"389":1}}],["знака",{"2":{"206":1,"305":1}}],["знак",{"2":{"192":1,"326":1,"371":1,"436":1}}],["знакомимся",{"2":{"401":1}}],["знакомиться",{"2":{"419":1}}],["знакомит",{"2":{"396":1,"399":1}}],["знакомясь",{"2":{"364":1}}],["знакома",{"2":{"213":1,"247":1}}],["знаком",{"2":{"205":1,"240":1,"380":1}}],["знакомым",{"2":{"194":1}}],["знакомы",{"2":{"144":1,"272":1,"360":1}}],["знакомой",{"2":{"273":1}}],["знакомо",{"2":{"141":1}}],["знакомого",{"2":{"75":1}}],["знакомстве",{"2":{"310":1}}],["знакомство",{"2":{"122":1}}],["знакомства",{"2":{"122":2,"136":1,"282":1}}],["знаменитая",{"2":{"145":1}}],["значимых",{"2":{"218":1}}],["значимое",{"2":{"215":1}}],["значителен",{"2":{"327":1}}],["значительную",{"2":{"191":1,"366":1}}],["значительный",{"2":{"191":1,"323":1,"461":1}}],["значительные",{"2":{"190":1,"303":1,"314":1}}],["значительными",{"2":{"295":1}}],["значительным",{"2":{"116":1}}],["значительных",{"2":{"61":1}}],["значительной",{"2":{"141":1,"145":1,"190":1,"307":1,"366":1,"430":1}}],["значительно",{"2":{"125":1,"191":1,"192":1,"253":1,"309":1,"312":1,"333":1,"390":1,"409":1,"444":1,"459":1,"461":1,"495":1}}],["значительного",{"2":{"116":1,"249":1}}],["значительное",{"2":{"68":1,"417":1,"448":1}}],["значит",{"2":{"12":1,"387":1}}],["значков",{"2":{"174":1,"218":2}}],["значком",{"2":{"154":1,"156":1,"164":1}}],["значке",{"2":{"156":1,"258":1}}],["значками",{"2":{"218":2}}],["значка",{"2":{"156":2,"256":1}}],["значки",{"0":{"156":1},"2":{"145":1,"216":1,"218":5,"253":1,"386":1}}],["значок",{"2":{"141":1,"143":1,"156":1,"164":1,"167":2,"218":2}}],["значению",{"2":{"195":2,"222":1,"236":1,"349":1,"421":2,"426":2}}],["значений",{"2":{"195":1,"236":1,"314":1,"325":1,"343":1,"345":1,"349":1,"350":1,"426":1}}],["значением",{"2":{"197":1,"222":1,"236":1,"237":1,"241":1,"293":1,"302":1,"337":1,"338":1,"421":1,"425":1,"426":1,"451":1}}],["значение",{"2":{"115":1,"125":2,"162":1,"182":1,"191":4,"192":1,"195":6,"197":2,"198":2,"200":1,"201":2,"203":1,"222":2,"236":3,"237":3,"241":1,"242":1,"246":1,"257":1,"287":1,"302":5,"304":1,"307":1,"308":1,"309":2,"324":1,"325":1,"330":2,"337":1,"342":1,"344":2,"352":2,"353":1,"374":2,"383":1,"408":1,"421":1,"422":1,"425":1,"426":4,"517":1,"543":1}}],["значения",{"2":{"114":1,"115":1,"127":1,"128":1,"162":1,"191":1,"192":1,"195":1,"197":1,"199":1,"201":1,"203":1,"206":1,"222":3,"235":1,"236":2,"238":1,"255":1,"260":1,"307":1,"309":4,"326":1,"345":1,"349":1,"350":2,"351":1,"353":1,"380":1,"382":1,"418":1,"423":1,"426":1,"451":1,"489":1,"540":1}}],["значениями",{"2":{"236":1,"246":1,"352":1,"384":1}}],["значениям",{"2":{"114":1}}],["значении",{"2":{"107":1,"223":1}}],["зная",{"2":{"58":1,"220":1,"253":1}}],["здравом",{"2":{"275":1}}],["здравым",{"2":{"16":1}}],["здесь",{"0":{"63":1,"357":1},"2":{"3":1,"5":1,"12":1,"60":1,"63":1,"109":1,"110":2,"116":1,"120":1,"123":1,"125":2,"126":1,"128":2,"130":1,"131":1,"133":1,"135":2,"142":2,"144":1,"147":1,"149":1,"152":1,"170":1,"174":1,"179":1,"190":1,"193":1,"194":2,"195":2,"202":1,"203":2,"212":1,"213":1,"214":3,"215":5,"216":1,"219":1,"227":1,"240":3,"246":1,"247":1,"253":2,"259":1,"260":1,"271":1,"273":4,"286":1,"293":1,"294":2,"295":1,"298":2,"300":4,"302":3,"303":1,"307":1,"315":2,"320":1,"321":2,"324":1,"337":1,"339":1,"344":1,"345":1,"349":1,"350":2,"368":1,"374":1,"377":1,"380":2,"383":1,"387":1,"388":1,"389":1,"418":1,"423":1,"426":1,"427":2,"438":1,"441":1,"449":2}}],["зазываниях",{"2":{"453":1}}],["зажимает",{"2":{"451":1}}],["зафиксирован",{"2":{"438":1}}],["зафиксированное",{"2":{"33":1}}],["зашифрованных",{"2":{"383":1}}],["зашифрованном",{"2":{"382":1}}],["заинтересованные",{"2":{"360":1}}],["заимствован",{"2":{"270":1}}],["займет",{"2":{"308":1}}],["застывший",{"2":{"314":1}}],["застыть",{"2":{"314":1}}],["заставки",{"2":{"544":1}}],["заставка",{"2":{"260":1,"530":1,"544":2}}],["заставим",{"2":{"301":1}}],["заставив",{"2":{"185":1}}],["заставить",{"2":{"176":1,"177":1,"182":1,"186":1,"337":1,"351":1}}],["заставили",{"2":{"23":1,"349":1}}],["заставляя",{"2":{"162":1}}],["заставляет",{"2":{"148":1,"314":1}}],["заставлять",{"2":{"106":1}}],["заслуживает",{"2":{"293":1}}],["заумной",{"2":{"276":1}}],["заодно",{"2":{"224":1}}],["заложим",{"2":{"310":1}}],["заложили",{"2":{"212":1}}],["залог",{"2":{"150":1}}],["залогинился",{"2":{"106":1,"449":1}}],["заняв",{"2":{"215":1}}],["занят",{"2":{"314":1}}],["занятость",{"2":{"159":1}}],["занято",{"2":{"159":1}}],["занять",{"2":{"159":1,"450":1}}],["занята",{"2":{"159":2}}],["заново",{"2":{"143":1}}],["занимающие",{"2":{"448":1,"524":1}}],["занимающиеся",{"2":{"417":1}}],["занимаются",{"2":{"450":1}}],["занимают",{"2":{"116":1,"164":1,"226":1,"443":1}}],["занимать",{"2":{"350":2}}],["заниматься",{"2":{"64":1}}],["занимается",{"2":{"140":1,"218":1}}],["занимает",{"2":{"117":1,"190":1,"301":1,"314":2}}],["заботу",{"2":{"451":1}}],["заботы",{"2":{"441":1}}],["заботитесь",{"2":{"414":1}}],["забот",{"2":{"297":1}}],["заботятся",{"2":{"128":1,"359":1}}],["забыл",{"2":{"456":1}}],["забыть",{"2":{"274":1,"293":1,"448":1}}],["забывает",{"2":{"169":1}}],["забывать",{"2":{"135":1}}],["заблокировать",{"2":{"246":1}}],["забудьте",{"2":{"217":1}}],["забрасывается",{"2":{"187":1}}],["защищенную",{"2":{"387":1}}],["защищенному",{"2":{"254":1,"387":1}}],["защищенное",{"2":{"253":1}}],["защищать",{"2":{"135":1}}],["защитить",{"2":{"402":1}}],["защит",{"2":{"371":1,"382":1}}],["защите",{"2":{"136":1}}],["защита",{"0":{"135":1},"2":{"122":1,"382":1}}],["защиты",{"2":{"108":1,"122":1,"383":1}}],["зачем",{"0":{"430":1},"2":{"116":1,"265":1,"301":1,"374":1,"449":1}}],["зачастую",{"2":{"44":1,"180":1,"187":1,"188":1,"231":1,"418":1,"450":1}}],["замаскированная",{"0":{"186":1}}],["замаскирована",{"2":{"181":1}}],["замаскировать",{"2":{"153":1}}],["заманить",{"2":{"179":1}}],["заморозить",{"2":{"308":1}}],["заморожено",{"2":{"307":1}}],["заморочки",{"2":{"106":1}}],["заморачиваться",{"2":{"107":1}}],["замедление",{"2":{"366":1}}],["замечаем",{"2":{"302":1}}],["замечаниями",{"2":{"240":1}}],["замечание",{"2":{"4":1,"64":1,"87":1,"326":1,"350":1}}],["замечательную",{"2":{"381":1}}],["замечательно",{"0":{"218":1}}],["замечательным",{"2":{"192":1}}],["заметка",{"2":{"460":1}}],["заметку",{"2":{"325":1}}],["заметки",{"2":{"230":1,"324":1,"325":1,"461":1}}],["заметок",{"2":{"324":1,"325":2}}],["заметите",{"2":{"325":1}}],["заметить",{"2":{"195":1,"303":1,"309":1,"327":1,"368":1,"377":2,"421":1,"435":1}}],["заметили",{"2":{"293":1,"421":1}}],["заметим",{"2":{"255":1}}],["заметьте",{"2":{"185":1,"229":1,"294":1,"308":1,"353":1,"438":1}}],["заметным",{"2":{"160":1}}],["заметное",{"2":{"117":1}}],["замену",{"2":{"448":2,"451":1,"454":1}}],["замены",{"2":{"270":1,"448":1}}],["заменяет",{"2":{"379":1}}],["заменяются",{"2":{"205":1}}],["заменяющий",{"2":{"110":1}}],["заменяя",{"2":{"125":1}}],["замена",{"2":{"110":2,"309":1,"448":1}}],["заменив",{"2":{"308":1,"349":1}}],["заменится",{"2":{"203":1}}],["замените",{"2":{"202":1}}],["заменить",{"2":{"105":1,"114":1,"452":1,"459":2,"517":1}}],["заменим",{"2":{"86":2}}],["заменой",{"2":{"86":1}}],["заменено",{"2":{"192":1}}],["заменен",{"2":{"114":2,"240":1}}],["замене",{"2":{"41":1}}],["загуглите",{"2":{"453":1}}],["заглянуть",{"2":{"348":1,"444":1}}],["заглавными",{"2":{"206":1,"209":1}}],["загрязнять",{"2":{"374":1}}],["загромождает",{"2":{"195":1}}],["загрузился",{"2":{"259":2}}],["загрузит",{"2":{"193":2,"368":1}}],["загрузить",{"2":{"127":1,"134":1,"186":1,"235":2,"362":1,"366":1,"424":1,"428":1}}],["загрузчик",{"2":{"235":1}}],["загрузку",{"2":{"215":1,"235":1,"263":1,"293":1,"371":1,"385":1}}],["загрузке",{"2":{"162":1,"173":1,"174":2,"295":1,"374":1,"408":1,"419":1,"444":1,"461":1}}],["загрузка",{"2":{"112":1,"235":2,"366":1,"367":1,"374":1,"408":1,"432":1}}],["загрузки",{"0":{"111":1},"2":{"110":1,"111":1,"161":2,"186":3,"215":1,"216":1,"235":2,"262":1,"314":2,"366":2,"371":1,"408":2,"412":1,"419":1,"448":1,"524":1,"544":1}}],["загружен",{"2":{"161":1,"218":1,"371":1}}],["загружено",{"2":{"123":1}}],["загружают",{"2":{"374":1}}],["загружаются",{"2":{"161":1}}],["загружаясь",{"2":{"412":1}}],["загружая",{"2":{"374":1}}],["загружает",{"2":{"186":1,"214":1,"235":1}}],["загружаем",{"2":{"86":1,"91":1,"100":1,"103":1}}],["загружать",{"2":{"128":1,"193":1,"203":1,"218":1}}],["загружаться",{"2":{"116":1,"215":1,"235":1}}],["заголовки",{"2":{"328":1,"386":2}}],["заголовках",{"2":{"386":1}}],["заголовка",{"2":{"246":1,"257":1,"383":1}}],["заголовком",{"2":{"168":1,"177":1,"260":1,"303":1,"515":1}}],["заголовков",{"2":{"108":1}}],["заголовок",{"2":{"222":3,"246":1,"247":1,"342":1,"377":1,"386":1}}],["загорается",{"2":{"96":1}}],["захваченного",{"2":{"426":1}}],["захват",{"2":{"426":1}}],["захватывая",{"2":{"166":1}}],["захвата",{"2":{"147":1,"222":1}}],["захостите",{"2":{"460":1}}],["захостить",{"2":{"107":1,"407":1}}],["захотеть",{"2":{"191":1}}],["захотим",{"2":{"48":1,"99":1}}],["захардкодим",{"2":{"90":1}}],["заранее",{"2":{"461":1}}],["заработать",{"2":{"61":1,"62":1}}],["зародились",{"2":{"190":1}}],["заряде",{"2":{"106":1}}],["зарекомендовавшие",{"2":{"190":1}}],["зарекомендовавшую",{"2":{"39":1}}],["зарегистрируйте",{"2":{"460":1}}],["зарегистрирует",{"2":{"173":1}}],["зарегистрировали",{"2":{"384":1,"385":1}}],["зарегистрировать",{"2":{"246":1,"262":1,"294":1,"298":1}}],["зарегистрироваться",{"2":{"57":1,"383":1,"460":1}}],["зарегистрировано",{"2":{"383":1}}],["зарегистрированной",{"2":{"388":1}}],["зарегистрированное",{"2":{"294":1}}],["зарегистрированным",{"2":{"246":1}}],["зарегистрированных",{"2":{"58":1,"380":1}}],["зарегистрирован",{"2":{"125":1,"261":1,"387":1}}],["зарезервированный",{"2":{"167":1}}],["зарезервированных",{"2":{"125":1}}],["зарезервированное",{"2":{"125":1,"195":1,"316":1}}],["запятыми",{"2":{"326":1}}],["запятой",{"2":{"125":1}}],["запланированных",{"2":{"321":1}}],["запланированы",{"2":{"299":1}}],["запишем",{"2":{"230":1}}],["записывается",{"2":{"389":1}}],["записываются",{"2":{"207":1}}],["записью",{"2":{"326":1}}],["запись",{"2":{"125":2,"326":1}}],["записать",{"2":{"125":1,"350":1}}],["записанный",{"2":{"106":1}}],["записи",{"0":{"125":1},"1":{"127":1},"2":{"58":1,"106":1,"125":4,"137":1,"195":1,"321":1,"352":1,"389":1}}],["записей",{"2":{"48":1,"125":2,"136":1,"167":1,"420":1}}],["запасного",{"2":{"203":1}}],["заполнено",{"2":{"449":1}}],["заполнен",{"2":{"377":1}}],["заполнения",{"2":{"148":1,"246":1}}],["заполнителя",{"2":{"325":1}}],["заполнить",{"2":{"294":1}}],["заполним",{"2":{"222":1}}],["заполняется",{"2":{"375":1}}],["заполнять",{"2":{"258":1}}],["заполнял",{"2":{"240":1}}],["заполняющего",{"2":{"177":1}}],["запоминается",{"2":{"545":1}}],["запоминаемость",{"2":{"150":1}}],["запоминанием",{"2":{"383":1}}],["запоминать",{"2":{"212":1}}],["запомните",{"2":{"194":1}}],["запомнить",{"2":{"155":1,"301":1}}],["запутывающее",{"2":{"449":1}}],["запутывает",{"2":{"148":1}}],["запутанным",{"2":{"426":1}}],["запутать",{"2":{"346":1}}],["запущен",{"2":{"314":1,"450":1}}],["запустили",{"2":{"426":1}}],["запустив",{"2":{"377":2}}],["запустим",{"2":{"193":1,"261":1}}],["запустится",{"2":{"429":1}}],["запустит",{"2":{"214":1,"215":1}}],["запустите",{"2":{"135":1,"222":1,"417":1,"432":1}}],["запустить",{"2":{"58":1,"107":2,"134":1,"214":3,"217":1,"260":1,"323":1,"332":1,"342":1,"421":2,"423":1,"429":2,"433":1,"435":1,"439":1,"444":1}}],["запуском",{"2":{"440":1}}],["запуске",{"2":{"234":1,"235":1,"253":1,"257":1,"353":1,"368":1,"424":1,"461":2}}],["запуск",{"0":{"490":1},"2":{"215":1,"260":1,"345":1,"415":1,"417":1,"421":1,"475":1}}],["запуску",{"2":{"135":1}}],["запускалось",{"2":{"461":1}}],["запускают",{"2":{"440":1}}],["запускаются",{"2":{"195":1,"444":1}}],["запускается",{"2":{"314":1,"388":1,"443":1}}],["запускает",{"2":{"193":1,"260":2,"374":1,"380":1,"440":1}}],["запускаем",{"2":{"103":1,"246":1,"338":1,"339":1}}],["запускаться",{"2":{"314":1}}],["запускать",{"2":{"162":1,"215":3,"314":1,"377":2,"389":1,"421":1,"424":1,"432":1,"542":1}}],["запуска",{"0":{"111":1},"2":{"110":1,"111":1,"114":2,"260":1,"327":1,"337":1,"342":1,"360":1,"387":2,"419":1,"420":2,"429":1}}],["запрограммировать",{"2":{"440":1}}],["запрограммированной",{"2":{"261":1}}],["запрошенное",{"2":{"302":1}}],["запрошен",{"2":{"108":1}}],["запросом",{"2":{"461":1}}],["запросов",{"2":{"11":1,"40":1,"58":1,"105":1,"108":1,"109":2,"128":1,"129":1,"332":3,"380":1,"381":1,"500":1}}],["запросу",{"2":{"170":1,"381":1,"431":1}}],["запросить",{"2":{"157":1,"389":1}}],["запросами",{"2":{"282":1}}],["запросам",{"2":{"108":1}}],["запроса",{"2":{"105":1,"108":4,"260":1,"318":1,"321":1,"325":1,"328":1,"329":1,"330":2,"332":3,"374":2,"376":1,"380":1,"381":1,"383":1,"384":2,"385":2,"388":1,"391":1,"461":1}}],["запросы",{"2":{"47":1,"50":1,"55":2,"58":2,"109":1,"126":1,"128":1,"129":1,"286":1,"332":2,"444":2,"461":2}}],["запросе",{"2":{"47":1,"106":2,"332":1}}],["запрос",{"2":{"41":1,"58":1,"108":3,"126":1,"128":1,"130":1,"214":1,"260":3,"261":1,"323":1,"327":2,"328":1,"330":1,"332":1,"382":1,"388":1,"428":1}}],["запрашивают",{"2":{"350":1}}],["запрашивающий",{"2":{"106":1,"389":1}}],["запрашиваем",{"2":{"389":1}}],["запрашиваемая",{"2":{"386":1}}],["запрашиваемого",{"2":{"108":1,"352":1}}],["запрашиваемому",{"2":{"106":1}}],["запрашивает",{"2":{"108":1,"187":1}}],["запрашивать",{"2":{"107":1}}],["запрещены",{"2":{"106":1}}],["завернуть",{"2":{"308":1}}],["завершится",{"2":{"438":1}}],["завершиться",{"2":{"417":1}}],["завершить",{"2":{"246":3}}],["завершая",{"2":{"438":1}}],["завершают",{"2":{"350":1}}],["завершаться",{"2":{"314":1}}],["завершает",{"2":{"266":1,"421":1}}],["завершена",{"2":{"314":1}}],["завершенного",{"2":{"261":1}}],["завершенные",{"2":{"222":2}}],["завершенных",{"2":{"222":1}}],["завершение",{"2":{"343":1}}],["завершении",{"2":{"307":1}}],["завершению",{"2":{"246":1}}],["завершения",{"2":{"220":1,"307":1,"314":1,"315":1,"331":1,"424":1,"432":1}}],["зависеть",{"2":{"307":1,"385":1}}],["зависанию",{"2":{"307":1}}],["завис",{"2":{"159":1}}],["зависящих",{"2":{"307":1}}],["зависящие",{"2":{"222":1,"451":1}}],["зависящей",{"2":{"148":1}}],["зависят",{"2":{"141":1,"253":1,"266":1}}],["зависимой",{"2":{"288":1,"295":1}}],["зависимое",{"2":{"191":1}}],["зависимость",{"2":{"245":1,"246":2,"262":1,"290":1,"292":1,"293":3,"294":3,"295":1,"428":1,"429":1,"449":1,"453":1,"459":2,"492":1}}],["зависимостями",{"2":{"215":1,"290":1,"311":1}}],["зависимостей",{"0":{"288":1,"453":1},"1":{"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1},"2":{"191":1,"206":1,"214":1,"215":2,"232":1,"237":1,"238":1,"239":1,"243":1,"249":1,"266":1,"288":1,"289":1,"290":1,"292":2,"293":3,"294":2,"296":1,"302":1,"339":1,"419":1,"420":1,"448":1,"451":2,"492":1,"525":1}}],["зависимости",{"0":{"238":1},"2":{"20":2,"55":1,"106":1,"110":1,"125":1,"134":1,"157":1,"172":1,"191":2,"194":1,"195":1,"199":1,"214":3,"215":1,"216":1,"222":1,"234":1,"235":1,"240":1,"242":1,"260":1,"268":1,"278":2,"282":1,"288":1,"289":1,"290":1,"292":2,"293":4,"295":2,"298":1,"300":1,"310":1,"314":2,"324":2,"327":1,"331":1,"350":1,"368":1,"382":1,"412":1,"415":1,"420":1,"424":1,"428":2,"433":1,"436":1,"460":1,"461":1,"495":1}}],["зависит",{"2":{"93":1,"108":1,"112":1,"147":1,"191":1,"192":1,"266":1,"292":1,"382":2,"383":1,"388":1,"415":1,"430":1,"440":1,"495":1}}],["завязанные",{"2":{"39":1}}],["закэшировать",{"2":{"461":1}}],["закладывающих",{"2":{"251":1}}],["заключаться",{"2":{"351":1}}],["заключает",{"2":{"277":1}}],["заключается",{"2":{"155":1,"156":2,"157":1,"162":1,"169":1,"172":1,"178":1,"179":1,"180":1,"182":1,"191":4,"195":1,"203":1,"218":1,"220":1,"229":1,"242":1,"247":1,"251":1,"273":1,"274":1,"276":1,"290":1,"295":2,"299":1,"303":1,"309":1,"332":1,"350":2,"374":2,"387":1,"388":1,"422":1,"423":1,"425":1,"426":1,"427":1}}],["заключенного",{"2":{"193":1}}],["заключена",{"2":{"34":1}}],["закрепления",{"2":{"265":1}}],["закрепить",{"2":{"211":1,"310":1,"391":1}}],["закрываем",{"2":{"248":1}}],["закрывать",{"2":{"246":1}}],["закрытый",{"2":{"408":1}}],["закрытых",{"2":{"389":1}}],["закрытым",{"2":{"382":1}}],["закрытие",{"2":{"246":1}}],["закрытия",{"2":{"141":1,"147":1}}],["закрыть",{"2":{"184":2}}],["закомитьте",{"2":{"438":1}}],["закоммичен",{"2":{"438":1}}],["закоммитьте",{"2":{"438":1}}],["закоммитили",{"2":{"436":1}}],["закомментируем",{"2":{"103":1}}],["закодированное",{"2":{"322":1}}],["закодированные",{"2":{"295":1,"383":1}}],["законченный",{"2":{"460":1}}],["закончите",{"2":{"358":1}}],["закончить",{"2":{"330":1}}],["закончила",{"2":{"344":1}}],["закончилась",{"2":{"122":1}}],["закончили",{"2":{"246":1,"264":1}}],["законодательством",{"2":{"382":1}}],["закономерности",{"2":{"188":1}}],["законом",{"2":{"149":1}}],["законе",{"2":{"147":1,"148":1}}],["закона",{"2":{"147":2,"148":2}}],["закон",{"0":{"147":1,"148":1},"2":{"147":1,"148":1,"191":1,"428":1}}],["законы",{"0":{"146":1},"2":{"146":1,"149":1}}],["заканчивается",{"2":{"350":1}}],["заканчивая",{"2":{"75":2,"136":1,"174":1,"194":1,"229":1,"267":1,"269":1,"390":1}}],["заказа",{"2":{"178":2}}],["заказами",{"2":{"58":1}}],["заказчик",{"2":{"452":1,"456":1}}],["заказчика",{"2":{"67":1}}],["заказчиком",{"2":{"9":1,"12":1}}],["заказ",{"2":{"12":1}}],["заказов",{"2":{"12":1,"36":1,"78":1}}],["заказываете",{"2":{"26":1}}],["заказы",{"2":{"4":1,"58":1,"99":1}}],["закупаете",{"2":{"26":1}}],["зато",{"2":{"307":1}}],["затушевывает",{"2":{"234":1}}],["затруднение",{"2":{"366":1}}],["затруднена",{"2":{"344":1}}],["затрудняет",{"2":{"169":1,"337":1,"349":1,"350":1}}],["затронуть",{"2":{"377":1}}],["затронуты",{"2":{"326":1}}],["затронуло",{"2":{"118":1}}],["затраченные",{"2":{"327":1}}],["затрагиваемым",{"2":{"485":1}}],["затрагивает",{"2":{"118":1}}],["затрагивая",{"2":{"436":1,"437":1}}],["затрагивают",{"2":{"110":1}}],["затраты",{"2":{"284":1}}],["затратно",{"2":{"41":1}}],["затратами",{"2":{"40":1,"452":1}}],["затрат",{"2":{"12":1,"253":1,"314":1}}],["затем",{"2":{"6":1,"81":1,"106":1,"107":1,"111":1,"113":1,"114":1,"125":1,"134":1,"141":1,"172":2,"180":1,"193":2,"215":1,"222":1,"231":1,"241":3,"246":2,"249":1,"261":4,"269":1,"287":2,"289":1,"295":1,"299":2,"305":1,"309":1,"312":1,"314":2,"322":2,"325":1,"344":1,"347":1,"350":1,"352":2,"358":1,"374":2,"375":1,"381":1,"383":2,"385":1,"386":1,"387":3,"388":1,"389":1,"414":1,"421":2,"425":1,"426":2,"429":1,"432":1,"438":2,"440":1,"461":3}}],["задумываемся",{"2":{"173":1}}],["задуман",{"2":{"219":1}}],["задумал",{"2":{"150":1,"177":1,"184":1}}],["задуматься",{"2":{"114":1}}],["задает",{"2":{"448":1}}],["задаем",{"2":{"160":1,"328":1}}],["зададим",{"2":{"374":1}}],["задаст",{"2":{"331":1}}],["задаются",{"2":{"215":1}}],["заданными",{"2":{"377":1}}],["заданный",{"2":{"256":1}}],["заданное",{"2":{"421":1}}],["заданного",{"2":{"307":1,"387":1}}],["заданном",{"2":{"193":1}}],["заданному",{"2":{"107":1,"246":1}}],["задания",{"2":{"292":1}}],["заданиями",{"2":{"248":1}}],["заданий",{"2":{"222":1}}],["задание",{"2":{"159":2,"302":1}}],["задавать",{"2":{"328":1}}],["задаваемые",{"2":{"168":1,"485":1}}],["задав",{"2":{"127":1}}],["задать",{"2":{"106":1,"451":2}}],["задачу",{"2":{"222":1,"417":1,"496":1}}],["задачей",{"2":{"374":1,"430":1,"451":1}}],["задаче",{"2":{"220":1,"223":1}}],["задач",{"2":{"14":1,"67":1,"69":1,"97":1,"149":2,"156":1,"159":1,"172":1,"215":1,"220":1,"222":6,"248":1,"269":1,"277":1,"299":1,"300":1,"318":1,"321":1,"380":1,"389":1,"495":3}}],["задачи",{"0":{"74":1},"1":{"75":1,"76":1,"77":1,"78":1},"2":{"12":1,"67":1,"78":1,"148":1,"220":2,"222":3,"223":1,"271":1,"277":1,"305":1,"314":2,"319":1,"389":1,"415":1,"417":1,"430":1}}],["задачами",{"2":{"138":1}}],["задача",{"2":{"11":1,"12":1,"141":1,"142":1,"143":1,"166":1,"222":1,"242":1,"306":1,"367":1,"388":1,"418":1,"420":2,"444":1}}],["задержка",{"2":{"323":1}}],["задержкам",{"2":{"235":1}}],["задеплоится",{"2":{"103":1}}],["задействовано",{"2":{"415":1}}],["задействовать",{"0":{"107":1},"2":{"20":1,"461":1}}],["задействуем",{"2":{"17":1}}],["задокументированный",{"2":{"76":1}}],["задокументировать",{"2":{"9":1}}],["за",{"0":{"144":1},"2":{"2":1,"6":1,"41":1,"50":1,"99":1,"103":1,"106":1,"109":1,"114":1,"124":1,"126":1,"140":1,"144":1,"157":1,"161":1,"162":3,"172":3,"178":1,"190":1,"191":1,"195":1,"199":1,"203":3,"209":1,"213":1,"215":1,"216":1,"218":1,"226":1,"228":2,"230":1,"240":1,"249":1,"251":1,"261":1,"262":1,"271":1,"272":1,"273":3,"274":1,"275":1,"276":1,"292":1,"293":1,"297":1,"298":1,"302":1,"306":2,"307":1,"314":4,"318":1,"325":1,"327":1,"335":1,"339":1,"350":2,"363":2,"371":1,"374":2,"380":1,"381":1,"382":7,"386":1,"389":2,"395":1,"411":2,"418":1,"421":1,"430":1,"436":1,"439":3,"444":1,"448":2,"449":4,"451":6,"460":1,"496":1,"524":1,"545":1}}],["тёмной",{"2":{"545":1}}],["тише",{"2":{"444":1}}],["типизировать",{"2":{"411":1}}],["типизированным",{"2":{"271":1}}],["типизируем",{"2":{"20":1}}],["типичными",{"2":{"216":1}}],["типичный",{"2":{"161":1}}],["типичного",{"2":{"161":2}}],["типом",{"2":{"236":1,"255":1}}],["типографика",{"2":{"145":1}}],["типографики",{"2":{"140":1,"142":1,"144":1}}],["типов",{"2":{"114":1,"152":2,"154":1,"240":1,"288":1,"314":1,"417":1,"449":1,"450":1,"543":1}}],["типе",{"2":{"128":1,"251":1}}],["тип",{"2":{"125":1,"128":2,"135":1,"145":1,"236":1,"258":1,"315":1,"327":2,"330":1,"332":1,"374":1,"377":1,"381":1,"383":3,"435":1,"459":1}}],["типу",{"2":{"114":1}}],["типыref",{"2":{"449":1}}],["типы",{"0":{"17":1},"1":{"18":1,"19":1},"2":{"16":1,"26":1,"83":1,"115":1,"125":1,"154":1,"167":1,"201":1,"236":1,"238":1,"315":1,"337":1,"421":1,"449":1,"508":1}}],["типам",{"2":{"140":1}}],["типами",{"2":{"114":1}}],["типах",{"2":{"136":1,"236":1}}],["типа",{"2":{"11":1,"17":2,"50":1,"61":1,"108":1,"135":1,"194":1,"236":1,"238":1,"278":1,"307":1,"324":1,"327":1,"366":1,"389":1,"407":1,"412":1,"443":1,"452":1,"459":3,"460":2,"461":1,"516":1,"543":1}}],["твердые",{"2":{"312":1}}],["творчества",{"2":{"277":1}}],["творческим",{"2":{"232":1}}],["творчески",{"2":{"26":1,"420":1}}],["творческие",{"0":{"26":1}}],["твой",{"2":{"106":1,"107":1,"444":1}}],["твоего",{"2":{"106":1}}],["твоему",{"2":{"106":1,"107":1}}],["твоем",{"2":{"106":1,"444":1}}],["тканей",{"2":{"269":1}}],["тяжеловеса",{"2":{"448":1,"524":1}}],["тяжеловесности",{"2":{"445":1}}],["тяжелые",{"2":{"314":1}}],["тяжелыми",{"2":{"314":1}}],["тяжелым",{"2":{"152":1}}],["тяжесть",{"2":{"134":1}}],["тщательно",{"2":{"150":1,"176":1,"418":1}}],["тщательную",{"2":{"90":1}}],["тысячи",{"2":{"175":1,"306":1}}],["тысяч",{"2":{"125":1,"271":1}}],["ты",{"2":{"81":2,"106":1,"452":1}}],["тупиковой",{"2":{"461":1}}],["ту",{"2":{"222":1,"298":1,"342":1,"420":1}}],["тумблер",{"2":{"153":4}}],["тумблеры",{"0":{"153":1},"2":{"153":1}}],["туда",{"2":{"44":1,"107":1,"194":1,"455":1}}],["туториал",{"2":{"60":1}}],["тут",{"2":{"41":1,"64":1,"99":1,"107":1}}],["тэгов",{"2":{"459":1}}],["тэг",{"2":{"20":1,"86":1,"91":1,"100":1,"497":1}}],["тэги",{"2":{"16":1,"154":1,"530":1,"540":1}}],["тайлвинде",{"2":{"456":1}}],["таймстемпа",{"2":{"408":1}}],["таймер",{"2":{"323":1}}],["таймера",{"2":{"158":1,"387":1}}],["тайм",{"2":{"143":1,"321":1}}],["тарифы",{"2":{"407":1}}],["тарифных",{"2":{"181":1}}],["тараканов",{"0":{"179":1}}],["таблетками",{"2":{"154":1}}],["таблетки",{"0":{"154":1}}],["таблицу",{"2":{"215":1,"218":1}}],["таблицы",{"2":{"48":1,"58":1,"190":1,"215":1,"218":1,"230":1,"288":1,"366":1}}],["таблиц",{"2":{"47":3,"161":1,"216":1,"326":1}}],["таблицам",{"2":{"52":1,"58":1}}],["таблицами",{"2":{"47":1}}],["таблица",{"2":{"17":1,"114":1,"125":1,"128":1,"217":1,"258":1,"366":1}}],["таблицах",{"2":{"17":2,"47":1}}],["таблицей",{"2":{"43":1}}],["таблице",{"2":{"16":1,"48":2,"58":1,"258":1,"366":1}}],["та",{"2":{"143":1,"170":1,"183":1,"386":1}}],["там",{"2":{"29":1,"107":1,"247":1,"339":1,"408":2,"444":1,"449":1,"450":1,"503":1}}],["такая",{"2":{"138":1,"165":1,"180":1,"274":1,"374":1,"382":1,"383":1}}],["таком",{"2":{"235":1}}],["такому",{"2":{"125":1}}],["таковые",{"2":{"246":1,"380":1}}],["таковы",{"2":{"191":1}}],["таковыми",{"2":{"459":1}}],["таковым",{"2":{"185":1}}],["такова",{"2":{"186":1}}],["такового",{"2":{"106":1}}],["такого",{"2":{"161":1,"176":1,"195":1,"253":1,"269":1,"282":1,"293":1,"327":1,"334":1,"350":1,"366":2}}],["такое",{"0":{"277":1,"366":1,"417":1,"430":1},"2":{"106":2,"107":1,"108":1,"109":1,"137":4,"138":1,"143":1,"173":1,"180":1,"189":2,"190":1,"191":2,"193":1,"203":1,"211":1,"231":2,"250":1,"251":1,"253":1,"265":2,"308":1,"311":1,"314":2,"318":1,"319":1,"334":1,"355":2,"366":2,"389":1,"405":1,"408":1,"442":2,"449":1,"450":1,"451":1,"452":1,"459":1,"461":1}}],["такой",{"2":{"17":1,"129":1,"135":1,"138":1,"158":1,"165":2,"174":1,"176":1,"178":1,"195":1,"226":1,"237":1,"241":1,"253":1,"270":1,"271":1,"292":1,"296":1,"309":1,"317":1,"342":1,"375":1,"383":1,"423":1,"426":1,"427":1,"461":1}}],["такую",{"2":{"88":1,"193":1,"340":1,"381":1,"383":1,"430":1}}],["также",{"2":{"62":1,"90":1,"91":1,"99":1,"103":1,"106":3,"107":1,"110":3,"111":1,"118":2,"119":2,"124":1,"125":3,"130":1,"134":1,"135":4,"136":2,"138":1,"144":2,"145":1,"147":1,"149":1,"150":2,"153":1,"156":1,"168":1,"174":1,"187":1,"188":2,"190":2,"191":3,"194":3,"195":1,"196":2,"202":2,"203":2,"209":1,"213":2,"215":5,"217":1,"219":2,"221":1,"222":8,"223":1,"224":3,"226":1,"236":1,"238":2,"240":2,"242":1,"245":1,"246":1,"247":2,"249":1,"251":1,"253":1,"255":1,"258":1,"260":1,"261":2,"262":1,"263":3,"264":1,"267":1,"270":1,"271":2,"273":1,"276":1,"277":1,"282":1,"286":1,"287":1,"292":2,"295":1,"297":2,"299":3,"301":1,"302":2,"303":1,"304":1,"305":2,"306":1,"308":1,"309":2,"312":4,"314":2,"316":1,"318":1,"320":1,"321":2,"322":1,"324":2,"325":1,"326":1,"327":2,"332":3,"333":2,"337":1,"339":3,"340":1,"342":2,"344":1,"345":2,"347":1,"350":5,"353":2,"354":1,"358":2,"360":1,"364":1,"366":1,"369":3,"371":5,"374":2,"375":2,"377":7,"380":1,"382":1,"383":4,"384":1,"386":1,"387":2,"389":5,"390":3,"398":1,"400":1,"401":2,"407":1,"411":1,"418":2,"420":1,"421":1,"423":1,"426":2,"427":1,"428":2,"429":1,"430":1,"431":1,"436":3,"438":1,"439":3,"440":1,"441":3,"443":1,"444":1,"449":2,"450":1,"451":2,"454":1,"459":2,"460":5,"461":1,"483":1,"489":1,"496":1,"536":1}}],["таки",{"2":{"58":1,"460":1,"461":1}}],["такие",{"2":{"43":1,"61":1,"68":1,"119":1,"125":2,"140":1,"141":1,"158":1,"167":1,"178":2,"191":1,"201":2,"216":1,"227":1,"235":2,"236":1,"238":1,"240":2,"267":1,"306":1,"327":1,"381":1,"389":2,"390":1,"421":1,"426":1,"436":1,"439":1,"496":1}}],["такими",{"2":{"140":1,"158":1,"218":1,"240":1,"269":1,"273":1,"360":1,"366":1,"500":1}}],["таким",{"2":{"17":1,"36":1,"106":2,"107":1,"117":1,"140":1,"142":1,"144":1,"167":1,"180":1,"181":1,"192":1,"193":1,"200":1,"217":1,"219":1,"222":1,"234":1,"237":1,"238":1,"241":1,"261":1,"287":2,"293":1,"301":1,"304":1,"309":1,"315":1,"326":1,"328":1,"337":1,"367":1,"371":1,"375":1,"380":1,"383":1,"420":1,"423":1,"424":1,"426":1,"439":1,"459":1}}],["таких",{"2":{"2":1,"4":1,"23":1,"66":1,"134":1,"140":1,"141":1,"146":1,"149":1,"151":1,"152":1,"159":1,"162":2,"174":1,"178":1,"216":2,"242":1,"253":1,"260":1,"271":1,"309":2,"344":1,"350":1,"366":1,"371":1,"374":1,"381":2,"383":2,"415":1,"421":1,"422":1,"430":1,"436":1}}],["так",{"0":{"112":1},"2":{"9":2,"11":1,"14":1,"16":1,"23":1,"26":2,"32":1,"44":1,"61":1,"62":1,"77":1,"86":1,"88":1,"96":1,"97":1,"98":1,"105":1,"106":1,"109":1,"110":1,"117":1,"126":1,"134":1,"138":1,"140":2,"143":1,"147":1,"148":1,"149":1,"154":1,"158":1,"165":1,"170":1,"173":2,"180":1,"185":1,"190":1,"191":1,"192":2,"195":3,"199":2,"209":1,"212":2,"213":2,"214":1,"215":3,"216":1,"217":1,"218":3,"219":2,"221":1,"222":4,"223":1,"225":1,"235":1,"240":4,"241":1,"246":2,"251":1,"253":3,"263":1,"264":1,"269":1,"271":1,"274":2,"276":1,"277":1,"295":1,"296":1,"298":1,"303":3,"307":1,"309":1,"310":1,"311":2,"314":2,"316":1,"318":1,"321":1,"324":1,"327":2,"328":1,"330":1,"332":2,"340":1,"343":1,"344":3,"346":1,"349":1,"350":2,"351":1,"353":1,"366":3,"382":2,"383":2,"385":1,"386":1,"387":2,"389":1,"408":3,"417":1,"418":1,"420":2,"421":2,"422":1,"423":1,"424":1,"426":2,"428":1,"431":2,"435":1,"436":1,"438":1,"443":1,"444":1,"448":1,"449":3,"450":1,"460":4,"461":3,"485":2,"495":1,"497":1,"499":1,"527":2,"533":1}}],["теcты",{"2":{"450":1}}],["теряете",{"2":{"449":1}}],["термины",{"2":{"442":1}}],["терминологией",{"2":{"191":1}}],["терминов",{"2":{"191":1,"383":1}}],["термина",{"2":{"140":1}}],["терминала",{"2":{"213":1,"214":1,"331":1,"435":2}}],["терминал",{"2":{"134":1,"213":1,"432":1}}],["терминалом",{"2":{"128":1}}],["терминале",{"2":{"127":1,"214":3,"222":1,"262":1,"327":1,"340":1,"368":1,"434":2,"438":1}}],["терминами",{"2":{"122":2,"188":1,"191":1}}],["терминах",{"2":{"67":1}}],["термин",{"2":{"87":1,"124":1,"172":1,"251":1,"253":1}}],["теоретическая",{"2":{"320":1}}],["теоретические",{"2":{"212":1,"452":1}}],["теоретически",{"2":{"191":1,"213":1,"350":1,"426":1}}],["теории",{"2":{"307":2}}],["тесно",{"2":{"410":1}}],["тесной",{"2":{"258":1,"411":1}}],["тесную",{"2":{"295":1}}],["тестам",{"2":{"449":1}}],["тестами",{"2":{"428":2}}],["теста",{"2":{"417":1,"420":1,"425":2}}],["тестироваться",{"2":{"424":1}}],["тестировать",{"0":{"418":1},"2":{"417":1,"418":2,"423":1}}],["тестированию",{"2":{"415":1,"423":1}}],["тестировании",{"2":{"366":1,"422":1,"426":1,"427":1}}],["тестированием",{"2":{"136":1,"450":2}}],["тестирование",{"0":{"71":1,"259":1,"263":1,"401":1,"415":1,"417":1,"427":1,"450":1},"1":{"416":1,"417":1,"418":1,"419":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,"442":1},"2":{"66":1,"71":1,"134":1,"213":1,"215":1,"332":1,"415":1,"417":4,"418":1,"426":1,"440":1,"442":1,"450":2}}],["тестирования",{"0":{"331":1},"1":{"332":1},"2":{"50":1,"70":1,"107":1,"232":1,"263":1,"312":2,"329":1,"331":1,"333":1,"358":1,"389":1,"401":1,"405":1,"408":1,"415":1,"417":5,"418":4,"419":2,"420":2,"421":1,"422":1,"423":1,"424":3,"425":1,"429":1,"430":1,"442":2,"450":2,"491":1,"533":1}}],["тестирующее",{"2":{"417":1}}],["тестируемый",{"2":{"420":1}}],["тестируем",{"2":{"331":1}}],["тест",{"2":{"263":1,"329":1,"417":1,"421":3,"423":1,"426":1,"460":1}}],["тестовая",{"2":{"421":1}}],["тестовую",{"2":{"421":1}}],["тестового",{"2":{"415":1,"417":2,"418":1,"421":1,"429":1}}],["тестовой",{"2":{"415":1,"425":2}}],["тестовое",{"2":{"323":1}}],["тестовыми",{"2":{"421":1,"429":1}}],["тестовые",{"2":{"401":1,"420":1,"427":1}}],["тестовый",{"2":{"323":1,"329":1,"330":2,"419":2,"420":4,"422":1,"424":1,"427":2,"429":1}}],["тестовых",{"2":{"135":1,"418":1,"420":1,"421":2}}],["тестов",{"2":{"263":1,"415":2,"417":2,"418":1,"419":1,"420":3,"421":10,"425":1,"426":2,"429":1,"441":1,"450":3}}],["тесты",{"2":{"71":1,"263":1,"417":1,"420":1,"421":3,"423":2,"424":1,"426":1,"427":4,"429":1,"440":1,"450":7,"461":1}}],["телеграм",{"0":{"486":1},"2":{"485":1}}],["телефонную",{"2":{"388":1}}],["телефона",{"2":{"387":1,"388":1}}],["телефон",{"2":{"387":1}}],["телефоны",{"2":{"253":1}}],["теле",{"2":{"332":1}}],["телодвижения",{"2":{"106":1}}],["тело",{"2":{"81":1,"347":1}}],["тень",{"2":{"452":1}}],["тенденции",{"2":{"459":1}}],["тенденцию",{"2":{"271":1,"430":1}}],["тенденция",{"2":{"177":1}}],["теневым",{"2":{"176":1}}],["тегом",{"2":{"374":1,"438":1}}],["тегов",{"2":{"154":1,"240":1,"304":1}}],["теге",{"2":{"196":1,"216":1}}],["тег",{"2":{"192":1,"194":3,"195":1,"215":1,"216":2,"218":1,"234":1,"303":1,"347":1,"374":1}}],["тегами",{"2":{"240":1}}],["тега",{"2":{"192":2,"215":1,"217":1}}],["теги",{"0":{"154":1},"2":{"240":1}}],["те",{"2":{"128":1,"196":1,"218":1,"234":1,"243":1,"245":1,"267":1,"298":1,"303":1,"310":1,"337":1,"366":1,"372":1,"379":1,"409":2,"428":1,"430":1}}],["течение",{"2":{"125":1,"195":1,"314":1,"350":2,"387":1,"388":1}}],["течением",{"2":{"116":1,"241":1}}],["текущим",{"2":{"241":1}}],["текущий",{"2":{"214":1,"223":1,"247":1,"379":1}}],["текущей",{"2":{"389":1,"408":1,"435":1,"437":3,"438":2,"448":1,"489":1}}],["текущем",{"2":{"214":1,"261":1,"377":1,"380":1}}],["текущему",{"2":{"195":1,"246":1,"380":1,"431":1}}],["текущего",{"2":{"167":1,"245":1,"246":2,"389":1}}],["текущее",{"2":{"159":1,"165":1,"380":1}}],["текущую",{"2":{"156":1,"214":1}}],["текущая",{"2":{"79":1}}],["тексты",{"2":{"387":1}}],["тексте",{"2":{"336":1,"438":1}}],["текстом",{"2":{"164":1,"213":1,"218":1}}],["текстов",{"0":{"401":1},"2":{"213":1,"215":2,"226":1,"429":1,"430":1}}],["текстовые",{"2":{"341":1,"366":1}}],["текстовых",{"2":{"252":1,"387":1}}],["текстовым",{"2":{"159":1}}],["текстовый",{"2":{"143":1,"157":1,"194":1,"213":1,"436":1,"461":1}}],["текстового",{"2":{"167":1,"387":1}}],["текстовом",{"2":{"155":1}}],["текстовое",{"2":{"83":1,"461":1}}],["текстовую",{"2":{"152":1}}],["текстовая",{"2":{"125":1}}],["текст",{"2":{"152":1,"154":1,"155":1,"170":1,"177":1,"201":1,"248":1,"375":1,"383":1,"410":1,"425":1,"461":2}}],["текстами",{"0":{"431":1}}],["текста",{"2":{"142":1,"152":1,"160":1,"219":1,"222":3,"248":1,"309":1,"324":1,"421":1,"524":1}}],["тебе",{"2":{"81":1,"452":1}}],["техноологии",{"2":{"448":1}}],["технологиям",{"2":{"366":1}}],["технологиями",{"2":{"360":1}}],["технология",{"2":{"253":1,"306":1,"314":1,"333":1,"366":1,"405":1}}],["технологии",{"2":{"190":1,"241":1,"251":1,"253":2,"266":1,"359":1,"366":2,"389":1,"443":1,"460":2}}],["технологий",{"2":{"190":1,"251":2,"253":4,"264":1,"306":2,"366":3,"381":1,"389":3,"440":1,"495":1}}],["технического",{"2":{"458":1,"460":1}}],["техническим",{"2":{"68":1}}],["технический",{"0":{"20":1}}],["технически",{"2":{"12":1,"36":1}}],["технические",{"0":{"123":1,"139":1,"213":1,"227":1,"252":1,"313":1,"336":1,"365":1,"416":1},"2":{"9":1}}],["техник",{"2":{"496":1}}],["техника",{"2":{"162":2}}],["технику",{"2":{"162":1}}],["техники",{"2":{"139":1,"266":1,"325":1}}],["тех",{"2":{"63":1,"133":1,"152":1,"166":1,"179":1,"191":1,"203":1,"215":1,"229":1,"232":2,"234":1,"256":1,"270":1,"276":1,"290":1,"307":1,"309":1,"314":1,"343":1,"366":1,"374":2,"387":1,"389":1,"424":1,"431":1,"461":1}}],["теперь",{"0":{"113":1},"2":{"41":1,"83":1,"86":1,"96":1,"103":2,"110":1,"111":2,"113":1,"115":1,"116":1,"117":2,"118":1,"119":1,"127":2,"134":2,"162":1,"191":1,"195":3,"203":1,"213":1,"215":2,"216":1,"217":2,"218":1,"221":1,"222":3,"229":1,"235":1,"237":2,"240":2,"242":1,"246":1,"247":1,"253":1,"260":2,"289":1,"290":1,"301":1,"303":2,"306":3,"308":2,"309":3,"314":1,"320":2,"321":1,"323":1,"329":1,"332":1,"335":1,"338":1,"348":1,"352":1,"353":1,"364":1,"366":3,"371":1,"372":1,"374":2,"377":1,"380":1,"386":1,"417":1,"419":1,"424":2,"425":1,"427":1,"436":1,"438":2}}],["темой",{"2":{"240":1,"260":1}}],["темам",{"2":{"485":1}}],["тема",{"2":{"216":1,"259":1,"349":1,"531":1,"545":1}}],["темная",{"2":{"175":1,"179":1,"180":1,"531":1}}],["темный",{"2":{"178":1,"253":1}}],["темные",{"0":{"176":1},"1":{"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1},"2":{"176":1,"189":1}}],["темными",{"2":{"185":1}}],["темным",{"2":{"150":1}}],["темных",{"2":{"138":1,"175":1,"187":1,"188":1}}],["темном",{"2":{"187":1}}],["темно",{"2":{"142":1}}],["теми",{"2":{"140":1,"190":1,"295":1,"332":1}}],["тему",{"2":{"109":1,"126":1,"134":1,"149":1,"240":1,"366":1,"417":1,"450":1}}],["теме",{"2":{"106":1,"108":1,"134":1,"277":1,"430":1,"439":1,"449":1}}],["темы",{"0":{"545":1},"2":{"77":1,"136":1,"190":1,"312":2,"335":1,"389":1,"410":2,"452":1,"494":1,"496":1,"533":1,"545":2}}],["тем",{"2":{"2":1,"6":1,"39":1,"109":2,"127":1,"128":1,"147":1,"159":1,"173":1,"191":2,"193":1,"194":1,"195":2,"201":1,"214":1,"215":1,"218":1,"221":1,"261":1,"275":1,"297":1,"302":1,"306":1,"307":1,"308":1,"309":1,"318":1,"325":1,"326":1,"332":1,"350":1,"377":2,"383":1,"389":1,"391":1,"417":1,"426":1,"438":2,"449":1,"495":1,"531":1,"545":3}}],["трагедия",{"2":{"459":1}}],["трафика",{"2":{"253":1}}],["традиционными",{"2":{"366":1}}],["традиционным",{"2":{"309":1}}],["традиционном",{"2":{"191":1,"253":1}}],["традиционно",{"2":{"155":1,"194":1,"287":1,"309":1,"382":1}}],["традиции",{"2":{"218":1}}],["тратить",{"2":{"148":1,"276":1}}],["траекторию",{"2":{"121":1}}],["транзакционной",{"2":{"350":1}}],["транзакционность",{"2":{"17":1}}],["транспорт",{"2":{"499":1}}],["транспортного",{"2":{"499":1}}],["транспортные",{"2":{"109":1,"460":1}}],["транспортным",{"2":{"105":1}}],["транспиляции",{"2":{"443":1}}],["трансформацию",{"2":{"190":1}}],["трансформация",{"2":{"172":1}}],["труднее",{"2":{"275":1}}],["трудночитаемый",{"2":{"276":1}}],["трудности",{"2":{"219":1}}],["трудностями",{"2":{"191":1}}],["трудностей",{"2":{"109":1}}],["трудно",{"2":{"141":1,"195":1,"213":1,"271":1,"428":1}}],["трудозатратней",{"2":{"461":1}}],["трудозатратам",{"2":{"461":1}}],["трудов",{"2":{"214":1}}],["трудоемко",{"2":{"12":1}}],["труда",{"2":{"58":1}}],["трем",{"2":{"265":1}}],["тремя",{"2":{"158":1,"309":1,"322":1}}],["трехуровневая",{"2":{"375":1}}],["трехуровневых",{"2":{"6":1}}],["трех",{"2":{"164":1,"169":1,"321":2,"391":1}}],["трехмесячные",{"2":{"138":1}}],["третьего",{"2":{"388":1}}],["третьей",{"2":{"230":1,"383":1}}],["третье",{"2":{"223":1}}],["третьему",{"2":{"99":1}}],["третий",{"2":{"66":1,"235":1}}],["требовать",{"2":{"292":1}}],["требоваться",{"2":{"161":1}}],["требование",{"2":{"254":1}}],["требованием",{"2":{"135":1}}],["требованиях",{"2":{"417":2}}],["требованиями",{"2":{"128":1,"222":1,"333":1,"417":1}}],["требованиям",{"2":{"68":1,"228":1,"232":1,"253":1,"263":1,"265":1,"360":1,"417":1}}],["требования",{"0":{"76":1,"77":1,"123":1,"139":1,"213":1,"227":1,"252":1,"313":1,"336":1,"365":1,"416":1},"2":{"67":1,"128":1,"225":1,"227":1,"254":1,"360":1,"415":1,"418":1,"459":1,"461":1}}],["требований",{"2":{"66":1,"68":1,"106":1,"313":1,"324":1,"360":1,"415":1,"416":1}}],["требуемого",{"2":{"327":1,"492":1}}],["требуемой",{"2":{"216":1,"327":1}}],["требуеться",{"2":{"443":1}}],["требует",{"2":{"109":1,"121":1,"122":2,"129":1,"215":1,"253":1,"255":1,"258":1,"261":1,"266":1,"333":1,"366":1,"371":1,"388":1,"417":1,"435":1,"443":1}}],["требуется",{"2":{"107":1,"111":1,"113":1,"128":1,"148":1,"232":1,"239":1,"327":2,"410":1}}],["требуются",{"2":{"448":1,"524":1}}],["требуют",{"2":{"179":1,"203":1,"314":1,"407":1}}],["требующее",{"2":{"156":1}}],["требующий",{"2":{"96":1,"371":1}}],["требующих",{"2":{"17":1,"157":1,"159":1}}],["тривиален",{"2":{"386":1}}],["тривиальными",{"2":{"387":1}}],["тривиальность",{"2":{"387":1,"421":1}}],["тривиально",{"2":{"374":1}}],["тривиального",{"2":{"195":1,"337":1}}],["тривиальную",{"2":{"158":1}}],["тривиальна",{"2":{"131":1,"154":1,"159":1,"260":1,"319":1,"330":1,"377":1,"388":1}}],["триггерного",{"2":{"260":1}}],["триггерную",{"2":{"170":1}}],["три",{"2":{"7":1,"11":1,"97":2,"167":4,"194":1,"215":1,"216":1,"271":1,"301":1,"302":1,"305":1,"309":1,"321":1,"330":1,"337":1,"352":1,"383":2,"389":1,"408":2,"419":1,"421":1,"543":1}}],["т",{"0":{"231":1},"2":{"4":1,"38":1,"67":2,"94":1,"107":1,"110":1,"111":1,"115":1,"124":1,"140":5,"144":2,"149":2,"153":1,"155":1,"156":1,"157":2,"161":2,"174":1,"191":1,"192":1,"194":1,"195":2,"201":1,"203":1,"213":1,"215":3,"218":1,"240":1,"241":1,"248":2,"253":3,"255":1,"256":1,"257":1,"269":1,"294":1,"297":1,"301":1,"304":1,"309":1,"314":1,"315":1,"327":1,"337":1,"366":3,"371":1,"380":1,"381":1,"382":1,"386":1,"387":1,"388":2,"415":1,"417":3,"418":1,"421":3,"423":1,"424":1,"436":1,"437":1,"440":1,"450":1,"452":1,"457":1,"461":1,"484":1,"494":2,"495":1,"496":4}}],["торопитесь",{"2":{"453":1}}],["тормозит",{"2":{"452":1}}],["тормозящим",{"2":{"314":1}}],["торвальдс",{"2":{"431":1}}],["торвальдсом",{"2":{"431":1}}],["торговые",{"2":{"158":1,"191":1}}],["тонкая",{"2":{"496":1}}],["тонкую",{"2":{"444":1}}],["тонкий",{"2":{"195":2,"219":1,"262":1}}],["тонкостей",{"2":{"138":1}}],["толку",{"2":{"182":1,"308":1,"420":1}}],["только",{"2":{"4":1,"16":1,"20":2,"23":1,"34":1,"39":1,"41":3,"57":1,"58":1,"70":1,"73":1,"83":1,"86":1,"88":1,"93":1,"96":1,"97":1,"99":1,"106":2,"107":1,"108":2,"110":1,"114":2,"118":1,"125":3,"135":1,"140":1,"143":1,"144":2,"147":1,"152":1,"153":1,"157":1,"160":1,"166":1,"168":3,"172":2,"186":1,"191":1,"192":1,"193":1,"194":1,"195":2,"197":2,"199":1,"204":1,"214":4,"216":1,"218":4,"219":3,"221":2,"222":4,"223":4,"225":1,"230":2,"234":1,"235":1,"236":1,"238":1,"246":1,"247":2,"248":2,"253":1,"260":4,"261":2,"264":1,"266":1,"271":1,"272":2,"274":2,"276":1,"283":1,"284":1,"300":1,"309":2,"313":1,"314":1,"318":2,"326":1,"327":1,"328":1,"337":2,"344":1,"345":2,"350":5,"352":1,"366":1,"371":1,"374":4,"376":1,"377":4,"383":3,"387":1,"389":1,"405":1,"410":1,"414":1,"421":1,"426":1,"428":1,"429":1,"438":1,"444":3,"448":2,"449":4,"451":1,"456":1,"459":2,"460":1,"489":1,"492":2}}],["тостах",{"2":{"157":1}}],["тостер",{"2":{"492":1}}],["тосте",{"2":{"157":1}}],["тостовое",{"2":{"157":2}}],["тостовые",{"0":{"157":1}}],["той",{"2":{"125":1,"126":1,"144":1,"184":1,"199":1,"222":1,"260":1,"269":1,"275":1,"276":1,"303":1,"314":1,"350":2,"367":1,"408":1,"418":1,"430":1,"439":1,"449":1,"495":1}}],["тобой",{"2":{"107":1}}],["токены",{"2":{"386":1,"410":1}}],["токенов",{"2":{"383":1,"386":1}}],["токеном",{"2":{"106":1}}],["токенами",{"2":{"383":2}}],["токена",{"2":{"106":2,"383":5}}],["токенах",{"2":{"106":2,"533":1}}],["токену",{"2":{"106":1}}],["токен",{"2":{"106":7,"383":3,"386":1,"484":2}}],["тот",{"2":{"41":1,"114":1,"115":1,"116":1,"155":1,"182":1,"191":2,"195":1,"253":1,"274":1,"286":1,"296":1,"301":3,"302":1,"303":2,"304":1,"305":1,"306":1,"308":1,"309":1,"317":1,"347":3,"350":1,"352":1,"383":1,"384":1,"389":2,"424":1,"451":1,"460":1}}],["тоже",{"2":{"16":1,"43":1,"48":1,"103":1,"164":1,"451":1,"461":1}}],["точек",{"2":{"331":1,"350":1,"383":1}}],["точечной",{"2":{"158":1}}],["точка",{"2":{"172":1,"214":1,"215":1,"244":1,"255":1,"328":1,"332":1,"461":1}}],["точками",{"2":{"125":1,"172":1,"327":1}}],["точке",{"2":{"128":1,"275":1,"327":1}}],["точкой",{"2":{"125":2,"156":1,"215":1,"229":1,"251":1,"320":2,"383":2}}],["точку",{"2":{"110":1,"142":2,"192":1,"214":2,"228":1,"287":1,"299":1,"318":1,"382":1,"384":1,"385":1,"388":2}}],["точки",{"0":{"156":1},"2":{"11":1,"23":1,"97":1,"114":1,"140":1,"142":1,"167":2,"194":1,"215":1,"307":1,"318":3,"332":1,"333":1,"349":1,"439":1,"449":3,"484":1}}],["точное",{"2":{"161":1}}],["точностью",{"2":{"141":1}}],["точно",{"2":{"81":1,"99":1,"108":1,"209":1,"303":1,"344":1,"415":1,"421":1}}],["точней",{"2":{"4":1,"461":1}}],["томасу",{"2":{"274":1}}],["тому",{"2":{"172":1,"177":1,"273":1,"276":1,"316":1,"366":1,"389":1,"390":1,"439":1}}],["том",{"2":{"7":1,"13":1,"23":1,"25":2,"67":2,"96":1,"116":1,"127":1,"135":1,"136":1,"138":1,"140":1,"147":2,"155":1,"156":1,"159":1,"168":1,"169":1,"172":1,"178":1,"179":1,"180":1,"188":1,"190":1,"191":4,"192":1,"193":1,"195":1,"199":1,"215":2,"218":1,"222":1,"223":1,"229":1,"232":1,"237":1,"242":1,"247":1,"251":1,"253":1,"260":2,"272":1,"274":1,"276":2,"277":1,"290":1,"295":1,"300":1,"302":2,"306":1,"309":1,"312":1,"314":1,"318":1,"320":1,"325":2,"328":1,"332":1,"335":1,"350":3,"374":1,"387":1,"388":1,"389":1,"418":1,"420":1,"422":1,"423":1,"426":1,"427":1,"428":2,"438":1,"449":1,"461":1,"496":1}}],["тогдашний",{"2":{"117":1}}],["тогда",{"2":{"3":1,"44":1,"98":1,"105":1,"130":1,"202":1,"296":1,"303":1,"309":1,"314":1,"340":1,"383":1}}],["того",{"2":{"2":1,"7":1,"23":1,"43":1,"68":1,"96":1,"103":1,"106":1,"109":1,"114":1,"121":1,"125":1,"126":1,"127":1,"140":1,"141":1,"148":1,"151":1,"155":1,"160":1,"161":1,"167":1,"185":1,"191":2,"192":1,"195":7,"202":1,"211":1,"214":2,"216":1,"218":1,"219":1,"222":2,"229":1,"232":2,"238":1,"240":2,"246":1,"247":1,"249":2,"253":5,"258":1,"259":1,"260":5,"261":1,"266":2,"269":1,"270":1,"272":1,"275":1,"287":1,"291":1,"292":1,"294":1,"298":3,"299":1,"300":1,"302":1,"303":1,"308":1,"309":1,"312":1,"314":3,"317":1,"318":1,"321":1,"326":1,"332":1,"337":1,"339":1,"344":1,"347":1,"352":1,"353":1,"355":1,"358":1,"367":1,"368":1,"371":1,"374":2,"380":1,"388":1,"389":1,"402":1,"408":3,"409":1,"415":1,"417":1,"418":1,"419":1,"424":1,"427":1,"431":1,"432":1,"435":2,"436":1,"441":1,"443":2,"449":1,"451":1,"453":1,"461":3,"515":1,"522":1}}],["то",{"2":{"3":2,"9":1,"12":2,"17":1,"20":3,"26":2,"30":1,"33":1,"35":3,"40":2,"41":2,"48":1,"58":3,"60":1,"61":1,"75":1,"84":1,"86":1,"88":2,"94":1,"96":1,"106":4,"107":3,"113":2,"114":1,"116":1,"118":1,"125":2,"126":3,"127":2,"128":1,"132":1,"135":2,"138":2,"141":2,"143":3,"144":1,"145":1,"147":2,"149":1,"150":4,"156":1,"158":2,"159":1,"161":1,"164":1,"167":1,"174":2,"177":1,"179":1,"180":1,"185":1,"187":1,"189":1,"191":7,"193":1,"194":2,"195":3,"197":2,"198":1,"203":1,"211":2,"213":1,"214":5,"215":1,"216":1,"217":1,"218":3,"219":1,"221":1,"222":2,"223":1,"228":1,"229":1,"230":2,"234":1,"237":1,"238":1,"240":2,"246":1,"247":1,"253":3,"261":3,"262":1,"263":1,"269":1,"271":1,"273":4,"274":3,"276":4,"277":1,"286":1,"287":1,"288":1,"290":3,"292":1,"293":2,"300":1,"301":5,"302":3,"303":3,"307":1,"309":1,"314":10,"315":3,"319":2,"322":1,"323":2,"327":2,"337":4,"340":1,"341":1,"342":6,"344":3,"345":1,"346":1,"348":1,"349":1,"351":1,"352":2,"353":1,"360":1,"364":1,"366":2,"368":1,"371":2,"374":2,"377":1,"380":2,"382":1,"383":5,"388":1,"389":1,"407":1,"408":1,"409":1,"411":1,"417":1,"418":1,"420":4,"421":1,"422":1,"424":2,"427":2,"430":1,"435":2,"443":1,"444":1,"448":2,"449":5,"450":4,"451":1,"452":2,"454":2,"460":4,"461":6,"495":1,"516":2,"524":1}}],["товару",{"2":{"174":1}}],["товаров",{"0":{"38":1,"92":1},"1":{"93":1,"94":1},"2":{"4":1,"23":1,"30":1,"31":1,"41":1,"47":1,"78":2,"86":1,"93":2,"96":1,"158":1,"409":1}}],["товаре",{"2":{"4":1,"31":1}}],["товары",{"2":{"4":1,"7":1,"16":1,"96":1,"178":2}}],["товар",{"0":{"16":1},"2":{"3":2,"16":2,"96":1,"174":1,"178":2}}],["товарам",{"2":{"47":1,"78":1,"86":1}}],["товарами",{"2":{"3":1,"43":1}}],["товара",{"0":{"96":1},"2":{"3":3,"4":2,"7":1,"16":2,"17":1,"23":1,"30":1,"47":2,"48":1,"93":1,"94":1,"96":1,"106":1,"183":1,"409":1,"461":1}}],["мгновенную",{"2":{"436":1}}],["мгновений",{"2":{"327":1}}],["мб",{"2":{"350":2}}],["мучается",{"2":{"456":1}}],["мутировать",{"2":{"271":1}}],["мутный",{"2":{"10":1}}],["мусора",{"2":{"273":1}}],["мусор",{"2":{"203":1}}],["множественного",{"2":{"448":1}}],["множественном",{"2":{"377":1}}],["множественность",{"2":{"343":1}}],["множестве",{"2":{"371":1}}],["множеством",{"2":{"128":1,"214":1,"218":1,"264":1,"382":1,"431":1}}],["множество",{"2":{"125":1,"133":1,"134":1,"152":1,"158":1,"165":1,"217":1,"228":1,"229":1,"230":1,"243":1,"247":1,"270":1,"278":1,"285":1,"290":1,"318":1,"324":1,"327":1,"375":1,"383":2,"389":2,"391":1,"417":1,"418":1,"421":1,"430":1,"444":2,"451":1,"461":1}}],["множества",{"2":{"16":1,"172":1,"269":1}}],["многим",{"2":{"276":1}}],["многих",{"2":{"138":1,"148":1,"157":1,"170":1,"178":1,"209":1,"217":1,"219":1,"271":1,"314":1,"380":1,"415":1,"495":1}}],["многие",{"2":{"116":1,"176":1,"273":1,"368":1,"407":1,"444":1,"452":1,"460":1}}],["многолетним",{"2":{"461":1}}],["многолетние",{"2":{"138":1}}],["многочисленные",{"2":{"284":1}}],["многочисленных",{"2":{"220":1}}],["многого",{"2":{"274":1}}],["многоцелевые",{"2":{"271":1}}],["многопоточной",{"2":{"451":1}}],["многопоточности",{"2":{"400":1}}],["многопоточность",{"0":{"312":1,"400":1},"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,"334":1},"2":{"251":1,"274":1,"277":1,"300":1,"306":1,"312":1,"313":1,"333":1,"350":2,"381":1}}],["многопоточным",{"2":{"358":1}}],["многоплатформенностью",{"2":{"253":1}}],["многостраничные",{"2":{"366":1}}],["многостраничное",{"2":{"253":1}}],["многословны",{"2":{"349":1}}],["многословным",{"2":{"261":1,"309":1,"435":1}}],["многословно",{"2":{"301":1,"309":1,"339":1}}],["многословность",{"2":{"195":1}}],["многословной",{"2":{"195":1}}],["многословен",{"2":{"195":1,"309":1}}],["многом",{"2":{"192":1,"266":1}}],["многократно",{"2":{"191":1,"193":1,"226":1,"232":1,"320":1}}],["много",{"2":{"62":1,"66":1,"84":1,"106":1,"107":1,"108":1,"116":1,"125":1,"218":1,"219":1,"246":1,"269":1,"271":1,"301":1,"314":3,"317":1,"327":1,"344":1,"347":1,"412":1,"444":1,"445":1,"448":1,"451":1,"495":1,"524":1}}],["многое",{"2":{"26":1,"131":1,"191":1,"230":1,"233":1,"248":1,"389":1,"439":1}}],["мнению",{"2":{"334":1}}],["мнение",{"2":{"214":1,"485":1}}],["мнения",{"2":{"158":1}}],["мне",{"2":{"23":1,"93":1}}],["мягкое",{"2":{"350":1}}],["мягкие",{"2":{"19":1}}],["мягкая",{"2":{"18":1}}],["м",{"2":{"16":1}}],["мидл",{"2":{"452":1}}],["микрософт",{"2":{"461":1}}],["микросервисов",{"2":{"452":1}}],["микросервиса",{"2":{"451":1}}],["микро",{"2":{"444":1}}],["миксинов",{"2":{"195":1,"241":1}}],["миксины",{"0":{"241":1},"1":{"242":1},"2":{"195":2,"241":1,"448":4}}],["миллисекундах",{"2":{"235":1}}],["миллисекунд",{"2":{"235":1}}],["миллисекунды",{"2":{"214":1,"314":1}}],["миллионами",{"2":{"125":1}}],["миллионов",{"2":{"48":1,"62":1}}],["мир",{"2":{"459":1}}],["мира",{"2":{"439":1}}],["миру",{"2":{"430":1,"461":1}}],["миров",{"2":{"253":1}}],["миром",{"2":{"3":1,"34":1}}],["мире",{"2":{"116":1,"193":1,"303":1,"360":1,"431":1}}],["миграции",{"2":{"110":2,"116":1,"195":1,"349":1,"404":1}}],["миграция",{"0":{"110":1,"404":1},"1":{"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1},"2":{"195":1}}],["минут",{"2":{"460":1,"496":1}}],["минуточку",{"2":{"314":1}}],["минуты",{"2":{"235":1}}],["минуя",{"2":{"191":1}}],["минусы",{"2":{"459":2}}],["минусов",{"2":{"449":1}}],["минус",{"2":{"99":1,"449":1}}],["минисервере",{"2":{"444":1}}],["мини",{"2":{"324":1,"444":2}}],["миниатюр",{"2":{"158":1}}],["миниатюре",{"2":{"107":1}}],["минималистичным",{"2":{"495":1}}],["минимален",{"2":{"162":1}}],["минимальную",{"2":{"222":1,"492":1}}],["минимальным",{"2":{"342":1}}],["минимальны",{"2":{"215":1}}],["минимальный",{"2":{"161":1,"255":1}}],["минимальной",{"2":{"47":1,"294":1}}],["минимальна",{"2":{"23":1}}],["минимуму",{"2":{"148":1}}],["минимум",{"2":{"12":1,"253":1,"256":1,"258":1,"271":1,"301":1,"318":1,"327":1,"360":2,"371":1,"387":1,"444":1,"449":1,"458":1,"460":2}}],["мае",{"2":{"460":1}}],["маяк",{"2":{"263":1}}],["манифест",{"2":{"265":1,"461":3}}],["манифестом",{"2":{"262":1}}],["манифесте",{"2":{"260":1}}],["манифеста",{"0":{"255":1,"259":1},"1":{"256":1,"257":1,"258":1},"2":{"251":1,"253":2,"255":2,"258":2,"259":2,"261":1,"262":2,"530":1,"542":1}}],["манипулирование",{"2":{"188":1}}],["манипулирования",{"2":{"182":1,"190":1,"199":1}}],["манипулироваться",{"2":{"337":1}}],["манипулировать",{"2":{"176":1,"337":2,"426":1}}],["манипулятивный",{"2":{"185":1}}],["манипулятивных",{"2":{"175":1}}],["манипулятивная",{"2":{"185":1}}],["манипуляций",{"2":{"162":1}}],["манипуляции",{"2":{"106":1,"337":1}}],["манере",{"2":{"209":1}}],["магические",{"2":{"448":1}}],["магия",{"2":{"201":1}}],["магию",{"2":{"194":1,"218":1,"421":1}}],["магазине",{"2":{"461":1}}],["магазины",{"2":{"23":1,"27":1,"78":1,"94":1,"253":2}}],["магазином",{"2":{"23":1}}],["магазинов",{"2":{"22":1,"28":1,"78":1,"94":1,"253":1}}],["магазинах",{"2":{"88":1,"255":1}}],["магазинами",{"2":{"99":1}}],["магазинам",{"2":{"23":1}}],["магазина",{"2":{"14":1,"23":1,"39":2,"77":1,"158":1,"174":1,"253":1,"409":1}}],["магазин",{"0":{"12":1},"2":{"9":1,"12":1,"23":2,"43":1,"60":1,"62":1,"106":1,"494":1,"495":1,"496":1}}],["машине",{"2":{"214":1,"300":1,"460":1}}],["машин",{"2":{"190":1}}],["машиной",{"2":{"128":1}}],["машина",{"2":{"128":1,"149":1}}],["машины",{"2":{"128":1,"247":1,"444":1}}],["максимальная",{"2":{"536":1}}],["максимальную",{"0":{"360":1},"2":{"222":1,"360":1}}],["максимального",{"2":{"415":1}}],["максимально",{"2":{"188":1,"251":1,"266":1,"459":1,"461":1,"500":1}}],["максимум",{"2":{"174":1,"218":1}}],["максимизации",{"2":{"147":1}}],["макрос",{"2":{"115":1}}],["макросами",{"2":{"115":1}}],["макете",{"2":{"530":2}}],["макетов",{"0":{"229":1},"2":{"375":1}}],["макетом",{"2":{"221":1,"229":1}}],["макетами",{"2":{"411":1}}],["макета",{"2":{"222":1,"240":1,"373":1,"494":1}}],["макеты",{"2":{"145":1,"260":1,"377":1,"496":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,"143":1,"172":1,"228":1,"229":2,"530":1,"534":1}}],["материал",{"2":{"94":1}}],["материалах",{"2":{"486":1}}],["материала",{"2":{"64":1,"295":1,"483":1}}],["масштабируемых",{"2":{"451":1}}],["масштабируемой",{"2":{"333":1}}],["масштабирования",{"2":{"191":1,"312":1}}],["масштаб",{"2":{"314":1}}],["масштабе",{"2":{"300":1,"318":1}}],["масштабах",{"2":{"199":1}}],["массовый",{"2":{"436":1}}],["массовых",{"2":{"324":1}}],["массовой",{"2":{"187":1,"439":1}}],["массу",{"2":{"218":1}}],["массиву",{"2":{"298":1,"322":1,"426":1}}],["массива",{"2":{"222":2,"236":1,"375":1,"426":1,"448":3,"451":1,"460":1}}],["массивам",{"2":{"114":2}}],["массиве",{"2":{"200":1,"222":1,"236":1,"426":1}}],["массивы",{"2":{"115":1,"201":1,"236":1,"238":1,"315":1,"337":1,"524":1}}],["массивов",{"2":{"114":1}}],["массив",{"2":{"41":1,"222":5,"236":3,"237":1,"247":1,"256":1,"258":3,"298":2,"299":1,"322":2,"326":1,"328":1,"371":1,"376":1,"389":1,"426":3,"448":3,"451":1}}],["мастере",{"2":{"420":1}}],["мастер",{"2":{"135":1,"331":1}}],["мастером",{"2":{"61":1}}],["маске",{"2":{"413":1}}],["маскируемый",{"2":{"262":1}}],["маскирует",{"2":{"181":1,"184":1}}],["маскируются",{"2":{"186":1}}],["маскировка",{"2":{"186":1}}],["маскироваться",{"2":{"186":1}}],["маску",{"2":{"125":1}}],["маска",{"2":{"108":2}}],["малая",{"2":{"417":1}}],["маленьких",{"2":{"193":1,"269":1}}],["маленький",{"2":{"106":1,"156":2}}],["маленьком",{"2":{"377":1}}],["маленькой",{"2":{"178":1}}],["маленького",{"2":{"156":1,"412":1}}],["маленькая",{"2":{"23":1,"156":1}}],["маломощных",{"2":{"314":1}}],["малого",{"2":{"191":2}}],["мало",{"2":{"38":1,"223":1,"261":1,"374":1,"376":1}}],["маркерами",{"2":{"438":1}}],["маркером",{"2":{"386":1}}],["маркетинговые",{"2":{"141":1}}],["маркетинг",{"2":{"140":1}}],["маркетплейсом",{"2":{"23":1,"75":1}}],["маркетплейсов",{"2":{"22":1}}],["маркетплейс",{"0":{"13":1,"59":1},"1":{"60":1,"61":1,"62":1,"63":1,"64":1},"2":{"9":1,"23":2,"60":1,"78":1}}],["маркетплейса",{"2":{"4":1,"12":1,"23":2,"43":1,"60":1,"77":1,"78":1}}],["маршруте",{"2":{"371":2,"377":3}}],["маршруту",{"2":{"368":1,"371":1,"376":2,"387":1,"391":1}}],["маршрутов",{"0":{"370":1,"376":1},"1":{"371":1,"372":1},"2":{"235":1,"369":1,"373":1,"375":2,"376":1,"377":2,"380":2,"382":1,"383":1}}],["маршрут",{"2":{"127":1,"369":1,"371":5,"374":1,"376":1,"387":1,"388":2}}],["маршрутизации",{"2":{"127":1,"300":1,"364":1}}],["маршрутизацию",{"2":{"11":1}}],["маршрутизатору",{"2":{"377":1}}],["маршрутизатором",{"2":{"118":1,"376":1,"377":1}}],["маршрутизатора",{"0":{"373":1},"2":{"118":1,"364":1,"367":4,"368":1,"374":1,"390":1,"391":1}}],["маршрутизатор",{"2":{"118":1,"366":1,"368":3,"371":1,"372":1,"374":1,"375":1,"376":1,"377":1,"385":1,"397":1}}],["маршрутизаторе",{"2":{"110":1,"118":2,"128":1}}],["маршруты",{"0":{"375":1},"1":{"376":1,"377":1},"2":{"88":1,"261":1,"367":2,"368":3,"370":1,"371":3,"375":2,"376":2,"380":1,"535":1}}],["маршрутам",{"2":{"373":1,"374":1,"377":1,"382":1}}],["маршрутами",{"2":{"127":1,"368":1,"371":1,"380":1}}],["маршрута",{"2":{"7":1,"371":1,"373":1,"374":3,"377":4,"380":3}}],["мыслить",{"2":{"452":1}}],["мыслит",{"2":{"266":1}}],["мышку",{"2":{"444":1}}],["мышление",{"2":{"417":1}}],["мышления",{"2":{"191":1}}],["мыши",{"2":{"155":1,"169":1,"170":1,"202":1,"241":1,"247":2,"258":1}}],["мышью",{"2":{"147":1,"161":1}}],["мышь",{"2":{"143":1,"147":1,"314":1}}],["мы",{"2":{"6":1,"9":1,"12":3,"13":1,"17":2,"18":1,"20":2,"23":4,"36":2,"40":1,"41":4,"48":1,"55":1,"58":1,"83":1,"86":1,"88":1,"97":1,"99":1,"111":2,"112":3,"113":1,"115":2,"122":2,"124":2,"125":5,"126":4,"127":3,"128":7,"130":1,"131":2,"132":8,"134":3,"135":1,"136":5,"137":1,"138":2,"141":2,"143":1,"144":2,"145":2,"148":1,"150":1,"160":1,"161":1,"162":10,"166":1,"172":1,"173":1,"174":2,"188":3,"190":3,"191":2,"192":10,"193":4,"194":13,"195":14,"196":1,"197":1,"201":3,"202":8,"203":3,"204":1,"209":1,"210":3,"212":5,"213":4,"214":7,"215":10,"216":4,"217":2,"218":12,"219":8,"220":4,"221":11,"222":22,"223":10,"224":4,"226":7,"228":4,"229":4,"230":4,"232":6,"233":2,"234":3,"235":6,"236":1,"237":7,"238":8,"239":1,"240":11,"241":10,"242":5,"243":3,"245":1,"246":19,"247":18,"248":4,"249":8,"250":3,"251":3,"253":1,"254":1,"255":4,"259":3,"260":8,"261":13,"262":6,"264":3,"266":1,"269":4,"270":1,"272":1,"273":4,"274":2,"277":3,"278":1,"287":5,"288":1,"289":1,"292":1,"293":7,"294":6,"295":2,"296":1,"298":8,"300":3,"301":2,"302":15,"303":5,"304":4,"305":5,"306":6,"307":2,"308":6,"309":11,"310":5,"312":8,"313":1,"314":4,"315":1,"316":3,"317":6,"318":5,"319":4,"320":6,"321":7,"322":7,"323":2,"324":2,"325":6,"326":8,"327":3,"328":6,"329":1,"330":7,"331":1,"332":13,"333":4,"335":7,"336":1,"337":4,"338":3,"339":8,"340":4,"341":1,"342":7,"343":3,"344":7,"345":3,"346":4,"347":8,"348":1,"349":5,"350":8,"351":6,"352":10,"353":5,"354":4,"355":1,"364":5,"366":9,"367":1,"368":4,"369":9,"371":15,"373":2,"374":20,"375":5,"376":3,"377":11,"380":4,"381":4,"382":7,"383":4,"384":5,"385":3,"386":8,"387":6,"388":2,"389":8,"390":4,"391":1,"395":1,"401":1,"408":2,"415":2,"417":2,"418":3,"419":3,"420":7,"421":10,"422":1,"423":5,"424":1,"425":10,"426":21,"427":3,"428":5,"429":1,"430":2,"432":1,"435":1,"436":5,"438":3,"439":2,"441":2,"452":5}}],["молчаливая",{"2":{"489":1}}],["морган",{"2":{"460":1}}],["морскими",{"2":{"275":1}}],["мотивации",{"2":{"460":1}}],["мощь",{"2":{"449":1,"452":1}}],["мощную",{"2":{"350":1}}],["мощного",{"0":{"345":1},"1":{"346":1,"347":1,"348":1,"349":1},"2":{"335":1}}],["мощной",{"2":{"213":1}}],["мощности",{"2":{"190":1,"239":1,"251":1,"312":1,"323":1,"366":1}}],["мощность",{"2":{"128":1,"389":1}}],["мощная",{"2":{"191":1,"324":1}}],["мощный",{"2":{"239":1}}],["мощные",{"2":{"237":1,"253":1}}],["мощных",{"2":{"190":1}}],["мощным",{"2":{"169":1,"308":1}}],["мощными",{"2":{"134":1,"411":1}}],["мой",{"2":{"277":1}}],["моем",{"2":{"443":1}}],["моему",{"2":{"271":1,"278":1,"314":1}}],["мое",{"2":{"214":1}}],["моей",{"2":{"23":1}}],["мошенническими",{"2":{"178":1}}],["могущие",{"2":{"485":1}}],["могу",{"2":{"380":1}}],["могут",{"2":{"17":1,"47":1,"108":2,"119":1,"125":1,"145":1,"154":1,"157":1,"158":3,"159":1,"163":1,"176":1,"190":1,"191":2,"195":1,"199":1,"203":1,"213":1,"215":1,"216":1,"219":1,"229":2,"230":1,"232":1,"236":2,"238":1,"249":1,"250":1,"251":1,"253":4,"255":1,"264":1,"267":2,"295":1,"299":1,"303":1,"310":1,"314":3,"316":1,"319":1,"334":2,"340":2,"346":1,"350":2,"351":1,"358":1,"360":1,"366":1,"371":1,"376":1,"380":1,"383":2,"388":1,"389":1,"390":1,"409":1,"411":1,"412":1,"415":1,"417":1,"418":1,"444":1,"451":2,"453":1,"460":2,"496":1}}],["могла",{"2":{"325":1}}],["могло",{"2":{"315":1}}],["могли",{"2":{"223":1,"226":1,"246":1,"248":1,"293":2,"302":1,"332":1,"339":1,"351":2,"352":1,"366":1,"368":1,"369":1,"381":1,"388":1,"426":1}}],["мог",{"2":{"149":1,"194":1,"345":1,"366":1,"375":1,"389":1,"461":1,"495":1}}],["мои",{"2":{"109":1}}],["монитора",{"2":{"444":1}}],["монитор",{"2":{"444":1}}],["мониторинг",{"2":{"180":1}}],["мониторингом",{"2":{"106":1}}],["монолитных",{"2":{"271":1}}],["монополистом",{"2":{"50":1}}],["монтируется",{"2":{"273":1}}],["монтируем",{"2":{"111":1,"234":1}}],["монтирования",{"2":{"112":1,"273":1,"374":1,"426":1}}],["монетизация",{"2":{"63":1}}],["мобильную",{"2":{"260":1}}],["мобильный",{"2":{"388":1}}],["мобильных",{"2":{"164":3,"167":1,"172":1,"217":1,"251":1,"253":1,"256":1,"257":1,"260":2,"366":1,"383":1,"506":1}}],["мобильные",{"2":{"140":1,"253":1,"387":1,"389":1}}],["мобильное",{"2":{"461":1}}],["мобильного",{"2":{"172":1}}],["мобильном",{"2":{"86":1,"93":1,"172":1,"255":1}}],["мобильной",{"2":{"29":1,"30":1,"33":2,"35":1}}],["мобильная",{"0":{"33":1},"2":{"260":1}}],["модернизируем",{"2":{"253":1}}],["моделям",{"2":{"264":1,"456":1}}],["модели",{"2":{"153":1,"172":1,"191":1,"223":1,"237":1,"314":1,"344":1,"374":1}}],["моделей",{"2":{"115":1,"209":1,"237":1,"349":1}}],["моделью",{"2":{"115":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,"191":2,"320":2,"324":1,"374":1,"449":2,"451":1,"459":1}}],["модал",{"2":{"246":2,"247":1}}],["модала",{"2":{"246":4}}],["модалы",{"2":{"231":1}}],["модалов",{"0":{"243":1},"1":{"244":1,"245":1,"246":1},"2":{"230":1}}],["модальное",{"2":{"245":1,"492":1}}],["модального",{"2":{"245":4,"246":3}}],["модальной",{"2":{"232":1}}],["модальном",{"2":{"167":1}}],["модальных",{"2":{"166":1,"230":1,"231":1,"232":1,"238":1,"249":1}}],["модальный",{"2":{"166":1,"231":1,"232":2,"245":2,"246":6}}],["модальные",{"0":{"166":1},"2":{"166":1,"229":1,"232":1,"243":1,"247":1,"369":1}}],["модифицировали",{"2":{"374":1}}],["модифицировать",{"2":{"68":1,"131":1,"342":1,"373":1}}],["модифицирует",{"2":{"231":1,"304":1}}],["модифицируем",{"2":{"214":1,"217":1,"222":1,"367":1}}],["модификаций",{"2":{"308":1,"369":1}}],["модификация",{"2":{"212":1,"374":1}}],["модификации",{"0":{"215":1},"2":{"126":1,"198":1,"344":1,"368":1}}],["модификатор",{"2":{"194":1,"237":1}}],["модули",{"2":{"247":1,"271":1,"286":2,"306":1,"409":1,"449":2,"452":1,"455":1}}],["модулях",{"2":{"349":1}}],["модуля",{"2":{"87":1,"344":1,"449":1,"500":1,"530":1,"533":1}}],["модуле",{"2":{"86":1,"88":1,"216":1,"352":1,"370":1,"409":1,"449":1,"451":1}}],["модулей",{"2":{"5":1,"81":1,"272":1}}],["модульная",{"2":{"409":1}}],["модульными",{"2":{"191":1}}],["модульности",{"2":{"118":1}}],["модульной",{"2":{"86":1}}],["модуль",{"0":{"498":1},"1":{"499":1,"500":1},"2":{"4":2,"41":1,"105":2,"129":1,"194":1,"241":1,"243":1,"274":2,"286":2,"295":1,"345":1,"349":1,"409":6,"452":1,"494":2,"496":2,"530":1}}],["моменты",{"2":{"460":1,"485":1}}],["моментов",{"2":{"450":1}}],["моментом",{"2":{"128":1,"247":1,"337":1,"495":1}}],["моментами",{"2":{"382":1}}],["момента",{"2":{"222":1,"314":1,"386":1}}],["момент",{"2":{"9":1,"16":1,"36":1,"43":1,"114":1,"125":1,"162":1,"203":1,"215":1,"219":1,"242":1,"246":1,"247":1,"253":1,"260":1,"268":1,"292":1,"293":1,"374":1,"424":1,"435":1,"448":1,"461":1,"505":1,"508":1,"530":1,"537":1}}],["можем",{"2":{"20":2,"23":1,"36":1,"112":1,"115":1,"125":1,"126":1,"127":1,"132":1,"134":1,"136":1,"137":1,"148":1,"162":1,"192":1,"194":5,"195":3,"196":1,"201":1,"202":2,"203":1,"215":3,"216":1,"218":4,"219":3,"221":1,"222":2,"223":2,"228":3,"229":1,"232":2,"234":2,"235":2,"237":2,"238":3,"241":1,"246":2,"247":2,"248":1,"250":2,"260":2,"261":3,"262":1,"269":1,"294":1,"295":1,"302":1,"303":1,"304":1,"308":3,"314":1,"317":4,"318":2,"325":1,"328":1,"332":4,"337":3,"340":1,"343":2,"344":3,"350":2,"352":1,"353":2,"355":1,"367":1,"369":3,"371":5,"373":1,"374":2,"375":1,"376":1,"377":3,"384":1,"385":1,"386":1,"387":1,"389":1,"418":1,"420":2,"421":3,"423":1,"425":1,"426":3,"427":3,"428":1,"429":1}}],["можете",{"2":{"114":2,"116":1,"125":2,"134":1,"145":1,"153":1,"166":1,"172":1,"189":1,"191":5,"193":1,"195":2,"204":1,"209":2,"211":2,"214":1,"215":3,"216":1,"225":1,"253":3,"259":1,"277":1,"286":1,"292":1,"301":2,"308":1,"311":2,"314":2,"323":1,"325":1,"350":1,"369":1,"374":1,"381":1,"410":2,"412":1,"421":1,"431":1,"435":1,"436":2,"437":1,"439":1,"440":1,"483":1}}],["может",{"2":{"2":2,"3":1,"4":1,"14":1,"16":1,"17":1,"18":1,"26":1,"43":1,"44":1,"66":1,"67":1,"68":1,"87":1,"89":1,"94":1,"99":2,"106":2,"107":2,"108":1,"109":1,"110":1,"114":2,"115":2,"116":1,"125":2,"128":1,"131":1,"138":1,"140":1,"148":1,"149":1,"153":1,"154":2,"155":2,"156":1,"157":1,"158":1,"159":4,"161":4,"168":1,"169":3,"170":2,"177":1,"181":2,"185":2,"186":2,"187":1,"189":1,"190":1,"191":4,"193":1,"194":3,"195":3,"198":1,"203":2,"214":3,"215":1,"219":1,"220":1,"223":1,"226":1,"229":2,"230":1,"232":3,"235":3,"238":1,"240":3,"242":2,"243":2,"247":2,"251":1,"252":1,"253":3,"255":2,"259":1,"260":7,"261":1,"269":1,"270":1,"271":1,"273":2,"274":1,"275":1,"282":1,"283":1,"287":2,"294":1,"297":1,"300":2,"301":4,"303":3,"308":1,"309":2,"314":9,"315":3,"318":1,"319":2,"322":1,"324":1,"330":2,"335":1,"337":1,"339":1,"340":2,"343":1,"344":1,"346":1,"347":1,"350":7,"352":1,"360":1,"375":1,"382":1,"383":2,"388":1,"389":3,"408":1,"411":3,"412":1,"415":1,"417":4,"420":3,"426":2,"428":2,"433":1,"438":2,"439":1,"440":1,"443":1,"444":1,"448":1,"449":6,"450":1,"451":3,"453":1,"459":3,"460":1,"461":6,"489":1,"495":2,"499":1,"522":1,"536":1,"544":1}}],["можно",{"2":{"3":1,"4":1,"9":1,"10":1,"12":1,"16":2,"23":1,"25":1,"26":1,"27":1,"29":2,"35":1,"36":1,"40":4,"43":1,"44":1,"52":1,"58":1,"62":2,"63":1,"66":1,"81":1,"83":1,"89":1,"93":1,"94":1,"96":1,"98":2,"99":1,"105":1,"106":4,"107":2,"109":1,"115":1,"118":1,"120":1,"123":1,"125":4,"131":1,"133":1,"134":1,"135":2,"139":1,"140":1,"143":1,"144":1,"147":1,"148":1,"149":1,"152":1,"153":1,"158":1,"159":1,"167":1,"169":2,"170":1,"172":1,"176":1,"186":1,"191":2,"192":1,"193":3,"202":1,"203":3,"209":1,"213":5,"216":4,"217":2,"218":3,"219":3,"223":1,"224":1,"226":1,"227":1,"235":1,"237":3,"239":1,"240":3,"242":1,"245":1,"246":1,"247":2,"248":1,"253":1,"260":1,"261":2,"262":1,"264":1,"265":1,"269":2,"271":3,"274":1,"277":2,"290":1,"294":1,"298":1,"300":1,"301":1,"303":3,"306":1,"308":2,"309":2,"311":1,"312":2,"314":2,"315":1,"316":1,"317":1,"318":2,"319":1,"320":1,"323":1,"324":2,"325":1,"327":2,"334":1,"339":1,"345":1,"347":1,"348":1,"349":1,"350":3,"353":1,"355":1,"362":1,"363":1,"365":1,"366":1,"374":3,"375":1,"377":3,"380":4,"381":1,"383":4,"385":1,"387":1,"388":2,"389":1,"390":1,"391":2,"407":3,"409":1,"411":1,"412":1,"415":2,"416":1,"417":3,"418":1,"419":1,"420":1,"421":3,"424":2,"425":1,"426":1,"428":1,"429":1,"433":2,"434":1,"435":3,"439":1,"440":2,"444":2,"448":2,"449":3,"451":3,"452":2,"459":1,"460":5,"461":3,"489":1,"492":1,"497":1,"505":1,"508":1,"524":1,"537":1,"543":1}}],["механической",{"2":{"460":1}}],["механизмы",{"2":{"449":1}}],["механизм",{"2":{"343":1}}],["медленней",{"2":{"449":1}}],["медиазапросов",{"2":{"172":1}}],["медиазапросами",{"2":{"172":1}}],["межпроцессное",{"2":{"327":1}}],["межпроцессного",{"2":{"315":1}}],["межпроцессные",{"2":{"309":1}}],["межстрочные",{"2":{"276":1}}],["между",{"0":{"98":1,"142":1},"2":{"3":1,"17":1,"23":1,"34":1,"43":2,"67":2,"68":1,"98":1,"108":1,"110":1,"114":1,"135":1,"138":1,"140":1,"147":1,"158":1,"161":1,"167":1,"190":3,"191":3,"194":1,"195":2,"211":1,"215":1,"222":2,"228":1,"229":1,"234":1,"237":1,"238":1,"240":1,"241":2,"243":1,"247":1,"253":1,"265":1,"274":1,"277":1,"280":1,"281":1,"295":1,"297":1,"300":1,"301":1,"302":1,"303":1,"306":1,"311":2,"314":2,"318":2,"319":2,"327":1,"335":1,"336":1,"337":1,"345":1,"346":1,"349":1,"354":1,"355":2,"367":1,"371":1,"374":1,"382":1,"383":3,"388":1,"390":1,"403":1,"411":2,"429":1,"431":1,"444":1,"449":2,"460":2,"461":1}}],["мелких",{"2":{"275":1,"449":1}}],["мелкие",{"2":{"148":1,"269":1}}],["мельчайшей",{"2":{"269":1}}],["мечом",{"2":{"185":1}}],["мегабайт",{"2":{"525":1}}],["мега",{"2":{"169":4}}],["мегаменю",{"0":{"169":1},"2":{"29":1,"169":2,"170":1}}],["мета",{"2":{"530":1,"540":1}}],["метасервисы",{"2":{"386":1}}],["метрике",{"2":{"461":1}}],["метрики",{"2":{"461":1}}],["метка",{"2":{"383":1}}],["метку",{"2":{"337":1}}],["метки",{"0":{"156":1},"2":{"438":1}}],["методом",{"2":{"388":1,"461":1}}],["методологии",{"2":{"366":1,"367":1}}],["методов",{"2":{"14":1,"293":1,"295":1,"322":1,"340":1,"346":1,"349":1,"376":1,"377":1,"380":2,"383":1,"388":1,"421":3,"448":1}}],["методу",{"2":{"309":1}}],["методе",{"2":{"195":1,"287":1,"332":1,"371":1}}],["метод",{"0":{"286":1,"287":1},"2":{"106":1,"114":1,"172":3,"192":3,"195":1,"234":2,"238":1,"243":1,"246":2,"247":1,"260":2,"271":1,"287":3,"293":2,"296":2,"298":3,"300":1,"309":3,"316":1,"321":3,"326":1,"327":1,"329":1,"332":1,"371":1,"378":1,"380":1,"383":2,"388":3,"426":2,"489":1}}],["методы",{"0":{"208":1},"2":{"78":1,"108":1,"112":1,"114":1,"190":1,"192":1,"193":1,"238":1,"243":1,"246":1,"272":1,"273":1,"287":1,"298":1,"301":1,"309":1,"321":2,"327":2,"328":1,"332":2,"333":1,"342":1,"345":1,"347":2,"349":1,"350":1,"354":1,"355":1,"364":1,"371":1,"380":1,"381":2,"426":2,"449":1}}],["методах",{"2":{"350":1}}],["методами",{"2":{"309":1,"388":1,"449":1,"460":1}}],["методам",{"2":{"195":1,"328":1,"381":1,"425":1}}],["метода",{"2":{"3":1,"246":1,"285":1,"298":1,"303":1,"316":1,"326":1,"327":2,"328":2,"330":1,"332":2,"352":1,"354":1,"371":1,"388":1,"461":1}}],["месяцев",{"2":{"135":1}}],["месяца",{"2":{"135":1}}],["местным",{"2":{"382":1}}],["места",{"2":{"256":1,"342":1,"350":2,"360":1,"436":1,"448":1}}],["местах",{"2":{"148":1,"352":1}}],["местом",{"2":{"169":1,"174":1,"369":1}}],["местоположение",{"2":{"161":1}}],["место",{"2":{"117":1,"169":1,"190":1,"203":1,"215":1,"226":1,"350":2,"373":1,"451":1}}],["мест",{"2":{"99":1,"461":1}}],["месте",{"2":{"83":1,"99":1,"194":1,"219":1,"260":1,"274":1,"295":1,"327":1,"339":1,"374":1,"440":1,"451":1}}],["мешает",{"2":{"103":1}}],["мер",{"2":{"332":1,"417":1}}],["меры",{"2":{"106":1,"149":1,"385":1}}],["меру",{"2":{"20":1}}],["мере",{"2":{"12":2,"124":1,"161":1,"167":1,"190":2,"193":1,"195":2,"202":1,"210":1,"212":2,"223":1,"229":1,"235":1,"253":1,"258":1,"272":1,"290":1,"294":1,"302":1,"307":1,"310":1,"314":1,"320":1,"360":1,"366":1,"383":1,"415":1}}],["ментор",{"2":{"460":2}}],["менталитета",{"2":{"121":1}}],["меньшим",{"2":{"366":1,"389":1}}],["меньших",{"2":{"253":1}}],["меньший",{"2":{"195":1,"451":1}}],["меньшего",{"2":{"235":1}}],["меньше",{"2":{"158":1,"276":1,"314":1,"451":1,"528":1}}],["менеджера",{"2":{"408":1,"433":1}}],["менеджер",{"2":{"106":3,"214":1,"351":1,"420":1}}],["менее",{"2":{"2":1,"143":1,"221":1,"302":1,"306":1,"307":1,"309":1,"332":1,"349":1,"350":1,"377":1,"391":1,"417":1,"461":1,"495":1}}],["меня",{"2":{"449":1}}],["меняющими",{"2":{"199":1}}],["меняются",{"2":{"200":1,"212":1,"448":1}}],["меняют",{"2":{"191":1}}],["меняете",{"2":{"449":1}}],["меняет",{"2":{"195":1}}],["меняется",{"2":{"105":1,"328":1,"374":1,"377":1}}],["меняем",{"2":{"130":1,"452":1}}],["меняя",{"2":{"17":1,"496":1}}],["меняться",{"2":{"371":1,"415":1,"448":1}}],["менять",{"2":{"17":1,"41":1,"99":1,"388":1,"412":1,"533":1}}],["меню",{"0":{"164":1,"167":1,"168":1,"170":1},"2":{"3":2,"4":1,"29":1,"30":1,"33":1,"86":1,"89":2,"141":1,"142":1,"143":2,"144":1,"149":1,"155":5,"161":1,"164":4,"165":1,"167":7,"168":3,"169":8,"170":3,"172":2,"174":2,"214":1,"229":1,"240":2,"258":2,"259":1,"260":3,"263":2,"368":1,"374":1,"409":1,"411":2,"515":1,"530":1}}],["ах",{"2":{"448":1}}],["аудио",{"2":{"412":1}}],["аутентифицирует",{"2":{"388":1}}],["аутентифицирующему",{"2":{"383":1}}],["аутентификаторы",{"2":{"387":1}}],["аутентификацию",{"2":{"107":1,"383":2,"384":1}}],["аутентификацией",{"2":{"106":1}}],["аутентификация",{"0":{"106":1,"382":1,"383":1,"387":2,"388":1,"389":1},"2":{"78":1,"106":5,"381":1,"382":1,"385":2,"387":2,"388":1}}],["аутентификации",{"0":{"381":1},"1":{"382":1,"383":1,"384":1,"385":1,"386":1,"387":1,"388":1,"389":1},"2":{"58":1,"106":1,"328":2,"364":2,"371":1,"380":1,"381":1,"382":4,"383":5,"384":4,"385":2,"386":1,"388":5,"389":1,"390":2,"391":2,"410":3,"449":1,"484":2,"533":1}}],["аутентификаций",{"2":{"40":1}}],["аута",{"2":{"321":1}}],["апгрейд",{"2":{"461":1}}],["апдейта",{"2":{"408":1}}],["апплеты",{"2":{"190":1}}],["аппаратного",{"2":{"307":1}}],["аппаратное",{"2":{"253":1,"360":1}}],["аппаратному",{"2":{"128":1,"360":1}}],["аппаратных",{"2":{"333":1}}],["аппаратные",{"2":{"140":1}}],["аппаратным",{"2":{"140":1}}],["аппарате",{"2":{"67":1}}],["ами",{"2":{"321":1}}],["азы",{"2":{"191":1}}],["аварийно",{"2":{"350":1}}],["авиабилетов",{"2":{"182":1}}],["авиабилеты",{"2":{"178":1}}],["автошколе",{"2":{"460":1}}],["автономным",{"2":{"358":1}}],["автономной",{"2":{"261":1}}],["автономности",{"2":{"260":1}}],["автономное",{"2":{"251":1,"253":1}}],["автономного",{"2":{"192":1,"253":2,"260":1}}],["автозаполнения",{"2":{"349":1}}],["автор",{"2":{"356":1}}],["авторство",{"2":{"274":1}}],["авторизации",{"2":{"383":2}}],["авторизационный",{"2":{"106":1}}],["авторизация",{"0":{"106":1},"2":{"78":1,"106":4}}],["автоматы",{"2":{"247":1}}],["автомат",{"2":{"247":2}}],["автоматического",{"2":{"135":1,"191":1,"262":1,"333":1,"408":1}}],["автоматические",{"2":{"440":1}}],["автоматически",{"2":{"52":1,"103":2,"125":1,"178":1,"190":1,"195":1,"214":1,"215":1,"218":1,"222":1,"235":2,"260":2,"301":1,"302":1,"303":1,"326":2,"349":1,"353":1,"367":1,"371":1,"374":2,"377":1,"380":2,"389":1,"408":1,"421":1,"424":1,"451":1,"515":1}}],["автоматизацией",{"2":{"460":1}}],["автоматизацию",{"2":{"215":1}}],["автоматизации",{"2":{"70":1,"251":1,"405":1,"408":2}}],["автоматизированный",{"2":{"440":1}}],["автоматизированными",{"2":{"428":1}}],["автоматизированных",{"2":{"417":1,"441":1}}],["автоматизированное",{"2":{"417":1,"442":1}}],["автоматизировано",{"2":{"417":1}}],["автоматизировать",{"2":{"134":1}}],["автоматизирует",{"2":{"135":1}}],["автообновление",{"2":{"135":1}}],["автокомплита",{"2":{"81":1}}],["автокомплит",{"0":{"81":1},"2":{"81":1}}],["ассоциируют",{"2":{"439":1}}],["ассоциируются",{"2":{"140":1}}],["асинхронная",{"2":{"308":1,"314":1}}],["асинхронную",{"2":{"274":1,"307":1,"308":1,"314":1,"423":1,"499":1}}],["асинхронно",{"2":{"350":1}}],["асинхронное",{"2":{"311":1}}],["асинхронном",{"2":{"309":1}}],["асинхронного",{"2":{"235":1,"299":1,"314":1,"381":1,"415":1}}],["асинхронной",{"2":{"157":1,"307":1,"308":1,"326":1}}],["асинхронным",{"2":{"309":1,"344":1}}],["асинхронными",{"2":{"282":1,"309":1,"314":1,"327":1}}],["асинхронных",{"2":{"306":1,"307":2,"308":1,"381":1}}],["асинхронный",{"0":{"235":1,"423":1},"2":{"314":1,"423":1}}],["асинхронные",{"0":{"282":1},"2":{"203":1,"307":2,"314":1,"366":1,"418":1}}],["аспекте",{"2":{"450":1,"451":1}}],["аспекты",{"2":{"140":1,"393":1}}],["аспект",{"2":{"64":1,"141":1}}],["аспиранты",{"2":{"64":1}}],["абзаца",{"2":{"145":1,"155":1,"177":1}}],["абзацев",{"2":{"145":1}}],["абы",{"2":{"109":1}}],["абсолютно",{"2":{"460":2}}],["абсолютном",{"2":{"107":1}}],["абсолютный",{"2":{"132":1}}],["абстрагированный",{"2":{"277":1}}],["абстрагирование",{"2":{"105":1,"274":1}}],["абстрагировать",{"2":{"274":1}}],["абстракции",{"2":{"266":1,"288":1}}],["абстракция",{"0":{"3":1,"104":1},"1":{"105":1},"2":{"269":1,"499":1}}],["абстрактный",{"2":{"530":1}}],["абстрактны",{"2":{"210":1}}],["абстрактное",{"2":{"209":1}}],["анонсы",{"2":{"486":1}}],["аномалией",{"2":{"430":1}}],["антипаттерн",{"2":{"337":1}}],["антипаттерны",{"2":{"277":1}}],["антипаттерном",{"2":{"277":1,"411":1}}],["анимация",{"2":{"241":1}}],["анимацию",{"2":{"190":1,"461":1}}],["анимации",{"2":{"140":1,"203":3,"367":1}}],["английского",{"2":{"460":1}}],["английском",{"2":{"361":1,"460":2}}],["англ",{"2":{"108":1,"389":1}}],["аналогу",{"2":{"461":1}}],["аналогов",{"2":{"451":1}}],["аналогом",{"2":{"449":1}}],["аналогами",{"2":{"346":1}}],["аналог",{"2":{"115":1,"420":1,"449":1}}],["аналогию",{"2":{"460":1}}],["аналогией",{"2":{"452":1}}],["аналогичен",{"2":{"240":1,"276":1,"507":1,"536":1}}],["аналогичную",{"2":{"426":1}}],["аналогичные",{"2":{"449":1}}],["аналогичным",{"2":{"222":1,"418":1}}],["аналогичных",{"2":{"89":1,"253":1}}],["аналогичный",{"2":{"81":1,"143":1,"240":1,"345":1,"389":1,"460":1}}],["аналогичного",{"2":{"495":1}}],["аналогичном",{"2":{"23":1}}],["аналогично",{"2":{"2":1,"18":1,"256":1,"316":1}}],["аналогии",{"2":{"240":1}}],["аналоги",{"0":{"23":1},"2":{"5":1,"449":1}}],["аналитика",{"2":{"67":1}}],["анализировать",{"2":{"263":1}}],["анализа",{"2":{"14":1,"314":1,"391":1}}],["анализ",{"0":{"8":1,"21":1,"67":1},"1":{"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"22":1,"23":1},"2":{"12":1,"66":1,"142":1,"172":1}}],["академическое",{"2":{"293":1}}],["академических",{"2":{"190":1}}],["аккуратней",{"2":{"450":1}}],["аккуратно",{"2":{"420":1}}],["аккордеона",{"2":{"168":1,"169":1}}],["аккордеонное",{"2":{"168":1,"170":2}}],["аккордеонные",{"0":{"168":1}}],["аккаунт",{"2":{"106":1}}],["аккаунтом",{"2":{"106":1}}],["аккаунта",{"2":{"89":1,"409":1}}],["акт",{"2":{"435":1}}],["актуальность",{"2":{"366":1,"485":1}}],["актуальные",{"2":{"349":1}}],["актуальных",{"2":{"320":1,"366":1}}],["актуальны",{"2":{"149":1,"390":1}}],["актуален",{"2":{"195":1}}],["активен",{"2":{"374":1}}],["активных",{"2":{"325":1}}],["активными",{"2":{"314":1}}],["активного",{"2":{"246":1}}],["активности",{"2":{"180":1}}],["активно",{"2":{"135":1,"230":1,"451":1}}],["активы",{"2":{"216":1,"261":1}}],["активизируется",{"2":{"387":1}}],["активизируются",{"2":{"170":1}}],["активировать",{"2":{"260":1,"435":1}}],["активированным",{"2":{"261":1}}],["активирован",{"2":{"153":1,"350":1}}],["активирует",{"2":{"155":1}}],["активации",{"2":{"153":2,"155":1,"261":1,"316":1}}],["акции",{"2":{"4":1}}],["атомарного",{"2":{"216":1,"269":1}}],["аттрибутах",{"2":{"459":1}}],["аттрибута",{"2":{"235":1}}],["аттрибут",{"2":{"192":1}}],["аттрибуту",{"2":{"13":1}}],["атрибутом",{"2":{"242":1}}],["атрибутов",{"2":{"146":1,"154":1,"181":1,"242":1,"246":1,"255":3,"380":1,"417":1}}],["атрибутами",{"2":{"235":1,"378":1}}],["атрибутам",{"2":{"222":1,"415":1}}],["атрибута",{"2":{"197":1,"198":1,"200":1,"222":2,"240":1,"256":1,"293":1,"352":1,"374":1,"376":1,"377":2}}],["атрибуту",{"2":{"152":1,"195":1,"293":2}}],["атрибут",{"2":{"113":2,"115":1,"191":2,"194":3,"195":1,"197":1,"200":2,"236":1,"255":1,"256":1,"257":1,"258":1,"304":1,"305":1,"374":4,"376":2,"377":1}}],["атрибуте",{"2":{"113":1,"321":1}}],["атрибуты",{"2":{"68":1,"114":2,"195":1,"196":1,"235":2,"236":2,"255":2,"267":1,"380":1}}],["ат",{"2":{"106":2}}],["алиаса",{"2":{"443":1}}],["алиасы",{"2":{"443":1}}],["алиас",{"2":{"443":2}}],["алгоритму",{"2":{"383":1}}],["алгоритмы",{"2":{"275":1}}],["алгоритм",{"2":{"273":1,"383":2}}],["алгоритмов",{"2":{"67":1}}],["альтернативной",{"2":{"293":1}}],["альтернативный",{"2":{"195":1,"234":1,"240":1,"316":1}}],["альтернативные",{"2":{"67":1,"182":1}}],["альтернативы",{"2":{"218":1,"427":1,"434":1}}],["альтернативой",{"2":{"161":1,"169":1,"235":2,"271":1}}],["альтернативах",{"2":{"153":1}}],["альтернатива",{"2":{"81":1,"107":1,"135":1,"301":1,"337":1,"426":1,"428":1}}],["альтернатив",{"2":{"50":1,"172":1,"314":1,"335":1,"337":1}}],["аргумент",{"2":{"236":1,"240":1,"346":1}}],["аргументов",{"2":{"236":1,"337":1,"426":2}}],["аргументы",{"2":{"219":1,"352":1}}],["аргументами",{"2":{"421":1,"426":1}}],["аргумента",{"2":{"114":1,"192":1,"234":1,"235":1,"236":1,"253":1,"294":1,"302":1,"332":1,"346":2,"352":1,"421":2,"425":1}}],["арендовать",{"2":{"136":1}}],["арендуем",{"2":{"128":1}}],["артефакты",{"2":{"67":1}}],["архитектур",{"2":{"333":1,"358":1}}],["архитектуру",{"2":{"333":1}}],["архитектурой",{"2":{"191":1,"213":1}}],["архитектуре",{"2":{"86":1,"312":1,"322":1}}],["архитектурные",{"0":{"409":1},"1":{"410":1,"411":1}}],["архитектурный",{"2":{"269":1}}],["архитектурными",{"2":{"191":1,"318":1}}],["архитектурных",{"2":{"68":1,"212":1,"318":1}}],["архитектурная",{"2":{"191":1}}],["архитектурной",{"2":{"448":1}}],["архитектурное",{"2":{"68":1}}],["архитектурно",{"2":{"6":1,"449":1}}],["архитектуры",{"2":{"40":1,"75":1,"128":1,"138":1,"267":1,"269":1,"278":1,"314":1,"333":1,"360":1,"381":1,"394":1,"400":1,"496":1}}],["архитектура",{"0":{"1":1,"6":1,"68":1,"452":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"453":1,"454":1,"455":1,"456":1,"457":1,"458":1},"2":{"66":1,"68":2,"229":1,"320":1,"349":1,"409":2,"452":2,"484":1}}],["адресом",{"2":{"214":1}}],["адресов",{"2":{"125":2}}],["адресе",{"2":{"125":1,"127":1,"375":2}}],["адресное",{"2":{"125":1}}],["адресата",{"2":{"125":1}}],["адресату",{"2":{"125":1}}],["адресах",{"2":{"125":1,"127":1}}],["адреса",{"2":{"125":5,"135":1,"174":1,"215":1,"367":1}}],["адрес",{"2":{"125":8,"127":1,"197":1,"214":1,"222":1,"256":1,"258":1,"332":1,"366":1,"374":1,"384":1,"389":2,"429":1}}],["адресу",{"2":{"103":1,"108":1,"120":1,"125":1,"139":1,"147":1,"213":1,"226":1,"240":1,"242":1,"246":1,"252":1,"332":2,"349":1,"362":1,"365":1,"380":2,"389":1,"416":1,"515":1}}],["администратора",{"2":{"435":1}}],["административного",{"2":{"125":1}}],["административная",{"2":{"78":1}}],["администрирования",{"2":{"129":1}}],["админ",{"2":{"106":1,"409":1}}],["админке",{"2":{"13":1,"106":1}}],["админка",{"2":{"12":1}}],["адаптацию",{"2":{"271":1}}],["адаптация",{"2":{"261":1}}],["адаптации",{"2":{"253":1,"277":1}}],["адаптировать",{"2":{"275":1,"372":1}}],["адаптированная",{"2":{"213":1}}],["адаптируется",{"2":{"172":2}}],["адаптивны",{"2":{"518":1}}],["адаптивный",{"2":{"251":1}}],["адаптивного",{"2":{"495":1}}],["адаптивноcти",{"2":{"456":1}}],["адаптивность",{"0":{"35":1,"497":1},"2":{"452":1,"459":1,"497":2}}],["адаптивностью",{"2":{"25":1}}],["адаптивности",{"2":{"20":1,"89":1}}],["адаптивная",{"2":{"36":1}}],["адаптер",{"2":{"41":2,"500":2,"530":1}}],["адаптеры",{"0":{"41":1},"2":{"41":1}}],["а",{"2":{"4":1,"11":1,"12":2,"16":1,"20":1,"25":1,"39":1,"64":1,"87":2,"96":1,"98":1,"99":1,"106":2,"107":1,"108":2,"110":2,"111":1,"113":1,"114":2,"115":1,"119":1,"125":3,"134":2,"135":2,"138":1,"140":1,"141":2,"142":2,"143":1,"144":2,"149":1,"150":1,"161":2,"165":1,"167":1,"168":1,"172":2,"174":1,"178":1,"180":1,"182":1,"186":1,"191":4,"192":1,"193":1,"194":1,"195":4,"202":1,"203":1,"205":1,"212":1,"214":2,"215":6,"216":2,"219":6,"222":5,"223":1,"224":2,"225":1,"226":1,"236":1,"237":2,"238":2,"240":1,"241":1,"245":2,"246":2,"247":1,"248":1,"251":1,"253":3,"255":1,"258":2,"260":3,"261":4,"262":1,"263":3,"269":2,"270":1,"273":3,"276":1,"277":2,"282":1,"287":3,"288":2,"292":1,"297":1,"299":1,"300":1,"301":3,"303":1,"304":1,"305":1,"306":1,"308":1,"312":3,"314":2,"316":2,"318":2,"320":1,"321":1,"322":1,"324":2,"327":1,"332":2,"333":2,"334":1,"335":1,"337":3,"339":1,"341":1,"345":1,"346":1,"347":4,"349":2,"350":3,"352":2,"353":1,"358":2,"369":1,"371":3,"374":4,"375":1,"376":1,"377":3,"380":1,"382":2,"383":3,"384":1,"387":5,"388":1,"389":3,"390":1,"398":1,"401":2,"411":1,"418":1,"421":3,"422":1,"423":3,"425":2,"426":2,"427":2,"430":3,"432":1,"436":1,"438":3,"439":2,"440":1,"441":2,"448":2,"449":5,"451":1,"452":1,"454":1,"460":4,"461":5,"492":1,"496":1,"506":1,"522":1}}],["ощущениям",{"2":{"461":1}}],["ощущение",{"2":{"144":1}}],["ощутим",{"2":{"333":1}}],["ощутить",{"2":{"314":1}}],["оцените",{"2":{"411":1}}],["оценить",{"2":{"264":1,"323":1}}],["оценки",{"2":{"263":2,"398":1,"417":1}}],["охватить",{"2":{"253":2,"418":1}}],["охватывают",{"2":{"240":1,"390":1}}],["охватывает",{"2":{"135":1,"140":1,"154":1,"485":1}}],["оживают",{"2":{"253":1}}],["ожидая",{"2":{"307":1,"387":1}}],["ожиданий",{"2":{"430":1}}],["ожидание",{"2":{"323":1}}],["ожидания",{"2":{"235":1,"309":1,"387":1}}],["ожидании",{"2":{"223":1}}],["ожидалось",{"2":{"222":1,"304":1,"308":1,"323":1,"422":1,"426":1}}],["ожидающие",{"2":{"220":1,"222":1}}],["ожидаемую",{"2":{"426":1}}],["ожидаемому",{"2":{"290":1,"421":1}}],["ожидаемых",{"2":{"417":1}}],["ожидаемый",{"2":{"293":1}}],["ожидаемым",{"2":{"237":1}}],["ожидаемые",{"2":{"195":1}}],["ожидает",{"2":{"198":1,"202":1,"308":1,"322":1,"377":1,"387":1}}],["ожидается",{"2":{"116":1,"417":1,"422":1}}],["ожидать",{"2":{"167":1,"344":1,"347":1,"349":1}}],["ом",{"2":{"215":1,"435":1,"438":1,"441":1,"442":1,"451":1,"461":1}}],["оговорками",{"2":{"195":1}}],["огромен",{"2":{"216":1}}],["огромный",{"2":{"414":1,"438":1}}],["огромные",{"2":{"191":1}}],["огромного",{"2":{"274":1}}],["огромном",{"2":{"125":1}}],["огромная",{"2":{"191":1}}],["ограничивают",{"2":{"253":1}}],["ограничивает",{"2":{"194":1,"222":1}}],["ограничить",{"2":{"218":1}}],["ограничимся",{"2":{"389":1}}],["ограничим",{"2":{"141":1}}],["ограничен",{"2":{"350":1}}],["ограничено",{"2":{"309":1}}],["ограниченным",{"2":{"382":1}}],["ограниченный",{"2":{"302":1}}],["ограниченного",{"2":{"125":1,"159":1,"161":1}}],["ограниченное",{"2":{"125":1,"142":1}}],["ограничены",{"2":{"216":1}}],["ограничений",{"2":{"195":1,"350":2,"418":1,"449":1,"461":1}}],["ограничением",{"2":{"162":1,"237":1}}],["ограничение",{"2":{"137":1,"350":2,"366":1}}],["ограничения",{"2":{"119":1,"191":1,"239":1,"306":1,"334":2,"339":1,"342":1,"350":3,"459":1}}],["оффлайн",{"2":{"461":2}}],["оффлайном",{"2":{"253":1}}],["оформить",{"2":{"409":1}}],["оформлении",{"2":{"178":1}}],["оформлением",{"2":{"342":1}}],["оформление",{"2":{"78":1}}],["оформления",{"2":{"25":1,"178":1,"325":1}}],["официальная",{"2":{"255":1,"449":1,"485":1}}],["официальную",{"2":{"212":1,"349":1}}],["официальные",{"2":{"418":1,"432":1,"441":1,"444":1}}],["официальными",{"2":{"401":1}}],["официальным",{"2":{"193":1,"219":1,"349":1}}],["официальных",{"2":{"125":1,"219":1,"417":1}}],["официальный",{"2":{"110":1,"116":1,"169":1,"213":5,"242":1,"367":1,"399":1,"433":1}}],["официально",{"2":{"345":1,"449":1}}],["официального",{"2":{"213":1,"432":1}}],["официальному",{"2":{"344":1}}],["официальном",{"2":{"169":1,"217":1,"349":1,"416":1}}],["официальное",{"2":{"118":1}}],["официальной",{"2":{"110":1,"119":1,"120":1,"128":1,"129":1,"133":1,"202":1,"203":1,"213":1,"240":1,"242":1,"328":1,"371":1,"380":2,"411":1,"421":1,"424":1,"425":1,"433":1,"434":1}}],["очищен",{"2":{"325":1}}],["очищаются",{"2":{"203":1}}],["очищаться",{"2":{"106":1}}],["очистит",{"2":{"543":1}}],["очистить",{"2":{"217":1,"223":1,"298":1}}],["очистки",{"2":{"429":1}}],["очистке",{"2":{"297":1}}],["очереди",{"2":{"176":1,"223":1,"300":1}}],["очередь",{"2":{"25":1,"192":1,"247":1,"269":2,"299":2,"300":1,"309":2,"314":1,"318":1,"366":1,"376":1,"409":1,"449":2}}],["очевидны",{"2":{"231":1}}],["очевидным",{"2":{"141":1,"192":1,"194":1,"325":1,"371":1}}],["очевидной",{"2":{"242":1,"381":1,"418":1}}],["очевидно",{"2":{"16":1,"23":1,"142":1,"193":1,"371":1}}],["очень",{"2":{"3":1,"12":1,"14":1,"39":1,"40":1,"41":1,"44":1,"50":1,"61":1,"106":3,"107":2,"121":1,"128":4,"129":1,"133":1,"140":1,"145":1,"150":1,"153":1,"158":1,"159":1,"167":1,"169":1,"173":1,"179":1,"180":1,"191":1,"192":1,"193":2,"195":1,"200":1,"213":3,"214":3,"215":1,"223":1,"232":1,"235":1,"237":1,"238":1,"239":1,"240":1,"243":1,"247":1,"271":3,"273":1,"275":1,"283":1,"288":1,"290":1,"293":1,"295":2,"297":1,"299":1,"303":2,"305":2,"306":1,"307":2,"308":1,"315":1,"316":1,"324":3,"325":1,"327":1,"328":1,"333":1,"340":1,"344":2,"350":1,"366":1,"369":1,"374":1,"387":1,"389":1,"407":1,"411":1,"419":1,"420":1,"426":2,"428":2,"430":2,"436":1,"437":1,"441":1,"443":1,"444":4,"447":1,"448":3,"449":1,"450":1,"451":1,"458":1,"459":1,"460":4,"461":3,"500":1,"524":2}}],["ооп",{"2":{"97":1,"270":4,"271":1,"449":1,"451":1,"452":3}}],["ошибетесь",{"2":{"194":1}}],["ошибемся",{"2":{"40":1}}],["ошибку",{"2":{"292":1,"293":1,"309":1,"315":2,"325":1,"421":2,"422":1}}],["ошибкам",{"2":{"346":1,"415":2}}],["ошибка",{"0":{"422":1},"2":{"157":1,"195":1,"309":1,"315":1,"326":1,"389":1,"426":1,"452":1}}],["ошибке",{"2":{"149":1,"307":1,"422":1,"438":1}}],["ошибки",{"2":{"108":1,"308":1,"315":2,"326":1,"381":1,"385":1,"386":1,"417":1,"421":1,"422":2,"444":1}}],["ошибок",{"2":{"73":1,"149":3,"293":2,"298":1,"301":1,"386":1,"387":1,"417":2,"421":1,"470":1}}],["оригинал",{"2":{"436":1}}],["оригинальный",{"2":{"301":1}}],["оригинального",{"2":{"153":1}}],["ориентацию",{"2":{"257":1}}],["ориентация",{"2":{"191":1}}],["ориентации",{"2":{"172":1}}],["ориентированных",{"2":{"452":1}}],["ориентированными",{"2":{"194":1}}],["ориентированное",{"2":{"318":1,"451":1}}],["ориентированного",{"2":{"3":1,"270":1,"451":1}}],["ориентироваться",{"2":{"23":1,"164":1}}],["ориентируемся",{"2":{"12":1,"13":1}}],["оранжевого",{"2":{"142":1}}],["органами",{"2":{"269":1}}],["органом",{"2":{"135":1}}],["организм",{"2":{"269":1}}],["организовываться",{"2":{"247":1}}],["организовывать",{"2":{"195":1}}],["организован",{"2":{"420":1}}],["организованными",{"2":{"390":1}}],["организованности",{"2":{"144":1}}],["организованы",{"2":{"117":1,"169":1}}],["организовать",{"2":{"109":1,"193":1,"195":1,"224":1,"320":1,"364":1,"373":1,"390":1,"411":1,"440":1}}],["организация",{"2":{"195":1}}],["организациям",{"2":{"187":1}}],["организациях",{"2":{"169":1,"368":1}}],["организаций",{"2":{"125":2}}],["организацией",{"2":{"125":1,"171":1}}],["организацию",{"2":{"117":1,"214":1,"420":1}}],["организации",{"0":{"117":1,"171":1},"1":{"172":1,"173":1,"174":1,"175":1},"2":{"63":1,"110":1,"125":1,"192":1,"273":1,"342":1,"388":1,"389":1,"407":1,"415":1,"420":1,"451":1}}],["ов",{"2":{"48":1,"63":1}}],["одинаковую",{"2":{"349":1}}],["одинаковым",{"2":{"302":1}}],["одинаковыми",{"2":{"223":1,"443":1}}],["одинаковы",{"2":{"223":1,"332":1,"442":1}}],["одинаковых",{"2":{"222":1}}],["одинаковый",{"2":{"144":1,"350":1}}],["одинакового",{"2":{"161":1}}],["одинаковое",{"2":{"143":1}}],["одинаково",{"2":{"113":1,"222":1,"340":1}}],["один",{"2":{"36":1,"41":1,"43":1,"57":1,"97":1,"98":1,"106":2,"114":1,"125":1,"143":1,"153":1,"158":1,"165":1,"182":1,"186":1,"193":1,"194":1,"197":1,"203":1,"213":1,"214":1,"221":1,"222":2,"230":1,"234":1,"235":3,"240":1,"242":1,"246":2,"247":2,"248":1,"260":3,"271":1,"274":1,"275":1,"283":2,"284":1,"286":1,"296":1,"297":2,"303":1,"304":1,"305":1,"318":1,"329":1,"332":1,"340":1,"347":1,"349":1,"366":1,"371":1,"375":1,"377":2,"382":1,"386":1,"388":2,"389":1,"411":1,"419":1,"421":2,"423":1,"424":1,"429":1,"443":1,"449":4,"450":1,"461":1}}],["одаренный",{"2":{"26":1}}],["одних",{"2":{"343":1}}],["одни",{"2":{"267":1,"366":1,"375":1,"409":2,"430":1,"431":1}}],["одним",{"2":{"14":1,"41":1,"121":1,"169":1,"187":1,"194":1,"195":1,"218":3,"223":1,"232":1,"237":1,"240":1,"247":2,"306":1,"314":1,"327":2,"334":1,"381":1,"383":1,"418":1}}],["одними",{"2":{"3":1,"218":1}}],["одну",{"2":{"140":1,"172":1,"184":1,"218":1,"271":1,"298":1,"303":1,"330":1,"332":1,"342":1,"350":1,"352":1,"371":1,"388":1,"420":1,"451":1}}],["одна",{"2":{"93":1,"94":1,"143":2,"161":1,"168":1,"186":1,"247":1,"259":1,"314":1,"377":1,"428":1}}],["однажды",{"2":{"61":1}}],["однако",{"2":{"12":1,"13":1,"20":1,"50":1,"61":2,"121":1,"123":1,"133":1,"135":1,"139":1,"141":1,"158":1,"161":1,"165":1,"167":1,"169":2,"173":1,"175":1,"191":2,"194":1,"195":5,"209":1,"210":1,"212":1,"213":1,"214":1,"216":1,"218":1,"223":1,"232":1,"234":1,"235":2,"236":2,"242":1,"246":1,"253":2,"255":1,"260":1,"261":2,"271":1,"273":1,"275":1,"285":1,"302":1,"303":2,"308":2,"309":1,"313":1,"314":2,"324":1,"325":1,"337":1,"342":1,"344":1,"346":2,"349":1,"366":1,"368":1,"371":1,"374":1,"376":1,"377":1,"382":1,"383":3,"415":1,"417":1,"418":2,"421":1,"423":1,"426":2,"433":1,"435":1,"445":1,"448":1,"449":2,"459":1,"460":2,"461":2,"491":1,"492":1,"524":1}}],["однократный",{"2":{"421":1}}],["однокомпонентного",{"2":{"324":1}}],["однокомпонентное",{"2":{"225":1,"324":1}}],["одноразового",{"2":{"387":1}}],["одноразовому",{"0":{"387":1}}],["одноименный",{"2":{"374":1}}],["однозначно",{"2":{"350":1,"444":1,"451":1}}],["однозначных",{"2":{"314":1}}],["однопоточным",{"2":{"314":1}}],["однопоточными",{"2":{"307":1}}],["однопоточных",{"2":{"282":1}}],["однофайловыми",{"2":{"420":1}}],["однофайловый",{"2":{"194":1}}],["однофайловых",{"0":{"194":1},"2":{"192":1,"272":1,"424":1,"442":1}}],["однофайловые",{"2":{"190":1,"211":1,"215":1,"423":1}}],["одновременно",{"2":{"128":1,"149":1,"168":1,"214":1,"223":1,"243":1,"301":1,"409":1,"421":1,"427":1}}],["одновременного",{"2":{"115":1,"342":1}}],["одновременных",{"2":{"128":1}}],["одностраничными",{"2":{"364":1}}],["одностраничных",{"2":{"312":1,"397":1}}],["одностраничные",{"0":{"364":1,"397":1},"1":{"365":1,"366":1,"367":1,"368":1,"369":1,"370":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},"2":{"118":1,"126":2,"166":1,"235":1,"242":1,"328":1,"366":1}}],["одностраничное",{"2":{"249":1,"251":1}}],["одностраничного",{"2":{"122":1}}],["одного",{"2":{"119":1,"129":1,"167":1,"225":1,"226":1,"247":1,"283":1,"307":1,"322":1,"345":1,"350":1,"389":1,"415":1,"420":1,"431":1,"436":1,"449":2}}],["одномоментное",{"2":{"349":1}}],["одному",{"2":{"125":1,"293":1,"420":1}}],["одном",{"2":{"97":1,"99":1,"125":1,"147":1,"154":1,"158":1,"166":1,"172":1,"194":1,"219":1,"220":1,"223":1,"274":1,"277":1,"295":1,"307":1,"314":1,"346":1,"350":1,"419":1,"427":1,"451":1}}],["одно",{"2":{"48":1,"159":1,"191":1,"195":1,"236":1,"240":1,"247":1,"270":1,"274":1,"275":1,"298":1,"301":1,"303":1,"309":2,"342":1,"343":1,"374":1,"382":1,"408":1,"418":1,"420":1,"421":1,"426":1,"439":1,"451":1}}],["одной",{"2":{"16":1,"34":1,"50":1,"144":1,"160":1,"172":1,"191":3,"222":1,"239":1,"248":1,"253":1,"260":1,"271":1,"292":1,"297":1,"306":1,"307":1,"314":1,"335":1,"350":1,"366":1,"389":1,"412":1,"426":1,"430":1,"439":1,"449":1,"495":1}}],["означают",{"2":{"366":1,"442":1}}],["означает",{"2":{"11":2,"135":1,"141":1,"142":1,"169":1,"191":2,"195":1,"216":1,"219":1,"230":1,"236":1,"237":1,"241":1,"266":1,"275":2,"297":1,"301":1,"303":1,"314":2,"342":1,"345":1,"371":1,"381":1,"386":1,"421":1,"431":1,"489":1,"492":1}}],["ознакомления",{"2":{"349":1,"491":1}}],["ознакомьтесь",{"2":{"320":1,"353":1,"389":1,"460":1}}],["ознакомительный",{"2":{"441":1}}],["ознакомиться",{"2":{"106":1,"123":1,"125":1,"142":1,"238":1,"241":1,"336":1,"352":1,"380":1,"495":1,"496":1}}],["ознакомились",{"2":{"193":1}}],["озон",{"2":{"4":1}}],["осущестляется",{"2":{"412":1}}],["осуществляет",{"2":{"378":1}}],["осуществляется",{"2":{"128":1,"135":2,"284":1,"346":1,"350":1}}],["осуществляются",{"2":{"283":1}}],["осуществляться",{"2":{"237":1,"296":1,"382":1,"383":1,"389":1}}],["осуществлять",{"2":{"237":1,"315":1}}],["осуществления",{"2":{"105":1,"381":1}}],["освоения",{"2":{"441":1}}],["освоении",{"2":{"253":1}}],["освобождаем",{"2":{"273":1}}],["освобождать",{"2":{"273":1}}],["освобождения",{"2":{"273":1}}],["освободить",{"2":{"273":1}}],["осваивать",{"2":{"212":1}}],["осведомлен",{"2":{"180":1}}],["освежить",{"2":{"126":1}}],["оскорбления",{"2":{"185":1}}],["острова",{"2":{"229":1}}],["осторожность",{"2":{"314":1}}],["осторожно",{"2":{"173":1}}],["остаться",{"2":{"437":1,"449":1}}],["останемся",{"2":{"322":1}}],["останова",{"2":{"172":2}}],["остановится",{"2":{"161":1}}],["остановиться",{"2":{"116":1}}],["остановимся",{"2":{"12":1,"222":1,"230":1,"288":1,"320":1,"371":1,"417":1}}],["осталось",{"2":{"218":1,"348":1}}],["остальная",{"2":{"330":1}}],["остальной",{"2":{"246":1}}],["остальное",{"2":{"50":1,"194":1,"347":1,"444":1}}],["остальным",{"2":{"218":1}}],["остальными",{"2":{"166":1}}],["остальных",{"2":{"113":1,"143":1,"266":1,"310":2,"328":1,"442":1}}],["остальные",{"2":{"17":1,"91":1,"113":1,"167":1,"186":1,"374":1}}],["остается",{"2":{"87":1,"105":1,"110":1,"214":1,"374":1}}],["оставьте",{"2":{"411":1}}],["оставались",{"2":{"314":1}}],["оставаться",{"2":{"275":1,"293":1}}],["оставшихся",{"2":{"273":1}}],["оставшейся",{"2":{"214":1}}],["оставить",{"2":{"177":1}}],["оставим",{"2":{"7":1,"90":1}}],["оставляем",{"2":{"88":1}}],["оставлять",{"2":{"63":1,"159":1}}],["остаются",{"2":{"17":1,"415":1,"500":1}}],["ос",{"2":{"153":1,"157":3,"159":1,"213":1,"215":1,"257":1,"444":1}}],["особый",{"2":{"423":1}}],["особых",{"2":{"237":1,"258":1,"262":1,"333":1,"360":1}}],["особенного",{"2":{"323":1}}],["особенностей",{"2":{"303":1,"307":1,"314":1}}],["особенностью",{"2":{"302":1}}],["особенность",{"2":{"121":1,"451":1}}],["особенно",{"2":{"109":1,"128":1,"149":1,"213":1,"271":1,"276":1,"296":1,"299":1,"307":1,"309":1,"312":1,"327":1,"450":1,"496":1}}],["особого",{"2":{"255":1,"293":1}}],["особому",{"2":{"253":1}}],["особое",{"2":{"125":1,"253":1}}],["особо",{"2":{"63":1}}],["основополагающих",{"2":{"306":1}}],["основополагающим",{"2":{"135":1}}],["основу",{"2":{"251":1,"266":1,"441":1}}],["основ",{"2":{"210":1,"297":1,"358":1,"419":1,"460":1}}],["основательным",{"2":{"449":1}}],["основателя",{"2":{"180":1}}],["основа",{"2":{"211":1,"439":1}}],["основано",{"2":{"439":1}}],["основанное",{"2":{"419":1}}],["основанного",{"2":{"290":1,"417":1}}],["основанные",{"2":{"448":1}}],["основанным",{"2":{"223":1}}],["основанный",{"2":{"213":1,"217":1}}],["основанных",{"2":{"128":1}}],["основана",{"2":{"275":1}}],["основан",{"2":{"143":1,"261":1,"383":1,"429":1}}],["основаны",{"2":{"138":1,"191":1,"260":1,"441":1}}],["основании",{"2":{"81":1,"300":1,"321":1}}],["основе",{"2":{"141":1,"181":1,"190":1,"191":1,"203":1,"214":1,"220":1,"235":1,"263":1,"324":3,"350":1,"366":1,"377":1,"381":1,"387":1,"398":1,"421":1,"437":1,"440":1,"449":1}}],["основываясь",{"2":{"246":1,"296":1}}],["основы",{"2":{"136":1,"212":1,"298":1,"310":1,"395":1}}],["основную",{"2":{"340":1,"374":1}}],["основная",{"2":{"34":1,"64":1,"122":1,"125":1,"140":1,"142":1,"150":1,"156":1,"159":1,"169":1,"172":1,"179":1,"203":1,"222":1,"251":1,"274":1,"283":1,"299":1,"387":1,"388":1}}],["основное",{"0":{"337":1},"1":{"338":1,"339":1},"2":{"241":1,"264":1,"290":1,"306":1,"350":1,"449":1}}],["основной",{"2":{"35":1,"110":1,"142":1,"165":1,"172":2,"178":1,"215":1,"218":1,"221":2,"235":1,"257":1,"260":2,"307":2,"314":1,"350":1,"371":1,"383":1,"389":1,"436":1,"444":1,"449":1,"458":1}}],["основного",{"2":{"29":2,"105":1,"221":1,"297":1,"351":1}}],["основном",{"2":{"10":1,"123":1,"139":1,"144":1,"155":1,"158":1,"159":1,"164":1,"168":1,"188":1,"203":1,"212":1,"257":1,"293":1,"294":1,"303":1,"316":1,"330":1,"342":1,"366":1,"371":1,"382":1,"383":1,"495":1}}],["основным",{"2":{"165":1,"192":1,"229":1,"265":1}}],["основными",{"2":{"39":1,"138":1,"226":1}}],["основные",{"0":{"28":1},"1":{"29":1,"30":1,"31":1,"32":1},"2":{"20":1,"58":1,"68":1,"87":1,"106":1,"136":1,"145":1,"231":1,"236":1,"315":1,"324":1,"405":1,"450":1,"452":1,"485":1}}],["основных",{"2":{"17":1,"63":1,"68":1,"110":1,"164":1,"247":1,"432":1,"450":1}}],["о",{"0":{"126":1,"451":1},"1":{"127":1},"2":{"4":1,"10":1,"11":3,"31":1,"57":1,"67":1,"81":1,"110":1,"118":1,"119":1,"121":1,"125":2,"128":1,"136":4,"138":2,"140":1,"149":1,"155":1,"157":3,"159":3,"169":1,"172":1,"173":1,"174":1,"188":2,"190":1,"191":1,"192":2,"193":1,"194":1,"195":1,"214":1,"215":1,"216":1,"222":1,"223":1,"226":2,"232":1,"236":1,"242":2,"247":2,"249":1,"253":4,"254":1,"260":2,"262":2,"272":1,"276":2,"302":1,"303":1,"304":1,"312":1,"314":1,"317":1,"319":1,"320":2,"325":1,"328":2,"332":1,"350":3,"359":1,"374":1,"377":1,"380":2,"386":1,"394":1,"411":1,"414":1,"418":2,"420":1,"421":1,"423":1,"428":6,"430":1,"436":1,"438":1,"439":2,"441":1,"448":2,"451":2,"461":2,"470":1,"486":1,"542":1}}],["окажется",{"2":{"388":1}}],["оказывается",{"2":{"183":1}}],["оказывают",{"2":{"175":1}}],["оказание",{"2":{"73":1}}],["оказать",{"2":{"68":1}}],["оказаться",{"2":{"4":1,"214":1,"261":1}}],["оказалось",{"2":{"61":1}}],["окошко",{"2":{"308":1}}],["окончательный",{"2":{"416":1}}],["окончательные",{"2":{"127":1}}],["окончательном",{"2":{"221":1}}],["окончания",{"2":{"421":1}}],["окончании",{"2":{"217":1,"247":1}}],["окончанием",{"2":{"149":1}}],["окружению",{"2":{"408":1}}],["окружений",{"2":{"408":1}}],["окружения",{"2":{"407":1,"408":1,"495":1}}],["окружение",{"2":{"203":1,"424":1}}],["окружении",{"2":{"157":1,"314":1}}],["окружающей",{"2":{"241":1}}],["окружающим",{"2":{"3":1,"34":1}}],["окружает",{"2":{"194":2}}],["окружности",{"2":{"160":1}}],["окне",{"2":{"157":1,"167":1,"184":1,"253":1,"426":1}}],["окном",{"2":{"409":1}}],["окно",{"2":{"155":1,"166":1,"184":1,"214":1,"245":1,"331":1,"371":1,"389":1,"423":1,"425":1,"435":1,"492":1}}],["окна",{"2":{"141":1,"143":1,"147":2,"148":1,"157":1,"229":1,"241":2,"245":1,"257":1,"260":1,"273":2,"350":1,"435":1,"542":1}}],["опен",{"2":{"460":1}}],["оперировать",{"2":{"302":1,"321":1}}],["оперирующие",{"2":{"39":1}}],["оперируют",{"2":{"3":1}}],["оперативной",{"2":{"444":1}}],["оператора",{"2":{"352":1}}],["оператор",{"2":{"247":1,"316":1}}],["операциях",{"2":{"350":1}}],["операциям",{"2":{"327":1}}],["операциями",{"2":{"273":1,"309":1}}],["операция",{"2":{"235":1,"302":2,"308":1,"326":2,"386":1,"388":1}}],["операцией",{"2":{"235":1}}],["операций",{"2":{"199":1,"301":2,"307":2,"308":1,"309":2,"324":1,"327":1,"352":2,"374":1,"389":2,"432":1,"439":1,"448":1}}],["операции",{"2":{"157":1,"230":1,"231":1,"232":1,"235":1,"288":2,"303":2,"307":3,"308":1,"309":1,"314":1,"321":1,"324":2,"325":2,"326":2,"327":5,"350":1,"382":1,"385":1,"418":1,"437":1}}],["операцию",{"2":{"149":1,"185":1,"271":1,"307":1,"309":2}}],["операционные",{"2":{"253":1}}],["операционных",{"2":{"253":1,"260":1,"333":1}}],["операционными",{"2":{"251":1,"253":1}}],["операционной",{"2":{"135":1,"253":3,"255":1,"258":1,"350":1,"360":1,"432":1}}],["операционная",{"2":{"128":1,"253":1}}],["операционную",{"2":{"128":1}}],["опираться",{"2":{"426":1}}],["опираясь",{"2":{"303":1}}],["описательные",{"0":{"258":1},"2":{"258":1}}],["описательным",{"2":{"238":1,"251":1,"255":1}}],["описательная",{"2":{"230":1}}],["описать",{"2":{"194":1}}],["описан",{"2":{"408":1}}],["описанная",{"2":{"320":1}}],["описанных",{"2":{"174":1,"213":1,"272":1}}],["описанным",{"2":{"78":1}}],["описаны",{"2":{"111":1,"117":1,"190":1}}],["описаний",{"2":{"222":1}}],["описании",{"2":{"174":1}}],["описания",{"2":{"67":1,"112":1,"167":1,"195":1,"222":1,"255":1,"421":1,"426":1}}],["описанию",{"2":{"48":1}}],["описание",{"0":{"494":1},"2":{"47":1,"63":1,"67":3,"83":1,"86":1,"93":1,"94":1,"125":1,"183":1,"194":1,"203":1,"220":1,"222":2,"258":1,"282":1,"315":1,"380":1,"421":2,"461":1}}],["описанием",{"2":{"11":1,"151":1,"258":1}}],["описываются",{"2":{"485":1}}],["описывающий",{"2":{"325":1}}],["описывающие",{"2":{"195":1}}],["описывайте",{"2":{"458":1}}],["описывает",{"2":{"68":2}}],["описываться",{"2":{"60":1}}],["оповестить",{"2":{"451":1}}],["оповещение",{"2":{"351":1}}],["оповещения",{"2":{"297":1,"342":2}}],["оповещает",{"2":{"297":1}}],["опору",{"2":{"149":1}}],["опытным",{"2":{"496":1}}],["опытный",{"2":{"460":1}}],["опытных",{"2":{"109":1,"143":1,"404":1,"485":2}}],["опытному",{"2":{"460":1,"495":1}}],["опыту",{"2":{"150":1,"271":1,"278":1,"314":1}}],["опытом",{"2":{"140":1}}],["опыт",{"2":{"136":1,"140":1,"159":1,"175":1,"188":1,"194":1,"308":1,"460":3,"461":1,"484":2,"543":1}}],["опыта",{"2":{"109":1,"138":1,"175":1,"188":1,"192":1,"318":1,"336":1,"403":1,"420":1}}],["опционально",{"2":{"258":1,"483":1}}],["опциональными",{"2":{"255":1}}],["опция",{"2":{"214":2,"215":1,"271":1,"435":1}}],["опциями",{"2":{"103":1,"111":1,"135":1,"148":2,"246":1,"262":1,"328":1,"489":1}}],["опцию",{"2":{"177":1,"184":1,"368":1,"420":1,"428":1}}],["опций",{"2":{"135":1,"148":1,"169":3,"170":2,"182":1,"215":1,"218":1,"426":1,"530":1}}],["опции",{"0":{"128":1,"219":1,"529":1,"530":1},"1":{"129":1,"130":1,"131":1,"132":1,"133":1,"530":1,"531":1,"532":1,"533":1},"2":{"16":1,"135":1,"167":1,"194":1,"195":1,"219":1,"240":1,"328":1,"448":1,"489":1}}],["опубликовывать",{"2":{"297":1}}],["опубликовала",{"2":{"349":1}}],["опубликовал",{"2":{"149":1}}],["опубликовать",{"2":{"86":1,"122":1,"298":1,"340":1,"402":1}}],["опущены",{"2":{"260":1,"373":1,"386":1}}],["опущено",{"2":{"246":1}}],["опускаю",{"2":{"246":1}}],["опустили",{"2":{"387":1}}],["опустил",{"2":{"230":1}}],["опустим",{"2":{"226":1}}],["опустить",{"2":{"9":1,"350":1}}],["оптимизируют",{"2":{"418":1}}],["оптимизируя",{"2":{"68":1}}],["оптимизирован",{"2":{"235":1}}],["оптимизировать",{"2":{"193":1,"215":1,"417":1}}],["оптимизаций",{"2":{"193":1,"314":1}}],["оптимизация",{"2":{"78":1,"461":1}}],["оптимизации",{"2":{"48":1,"162":1,"314":1}}],["опять",{"2":{"55":1,"128":1,"298":1,"337":1,"339":1,"346":1,"426":1,"439":1}}],["оправдали",{"2":{"430":1}}],["оправдан",{"2":{"121":1}}],["оправдывает",{"2":{"327":1}}],["опробованы",{"2":{"61":1}}],["опрятностью",{"2":{"17":1}}],["определённых",{"2":{"452":1}}],["определил",{"2":{"371":1,"374":1}}],["определились",{"2":{"238":1,"246":1}}],["определили",{"2":{"209":1,"224":1,"229":1}}],["определите",{"2":{"246":1}}],["определиться",{"2":{"191":1}}],["определить",{"2":{"16":1,"67":1,"115":1,"144":1,"160":1,"222":1,"238":1,"246":2,"261":1,"266":1,"326":1,"358":1,"370":1,"374":1,"377":1,"389":1,"415":1}}],["определим",{"2":{"221":2,"228":1}}],["определяя",{"2":{"345":1}}],["определяю",{"2":{"195":1}}],["определяют",{"2":{"192":2,"195":2,"236":1}}],["определяются",{"2":{"67":1}}],["определяющая",{"2":{"257":1}}],["определяющих",{"2":{"258":1}}],["определяющим",{"2":{"247":1,"319":1}}],["определяющий",{"2":{"215":1,"327":1}}],["определяющие",{"2":{"191":1,"194":2}}],["определяющую",{"2":{"125":1}}],["определять",{"2":{"115":1,"195":1,"216":1,"238":1,"350":1,"374":1}}],["определяемой",{"2":{"235":1}}],["определяемого",{"2":{"199":1}}],["определяемое",{"2":{"68":1}}],["определяем",{"2":{"160":1,"192":2,"222":1,"246":1,"260":1,"322":2,"326":1,"345":1,"371":1,"374":1,"377":1}}],["определяете",{"2":{"194":1,"449":1}}],["определяется",{"2":{"106":1,"195":1,"261":1,"321":1}}],["определяет",{"2":{"68":1,"106":1,"147":1,"190":1,"191":1,"192":1,"194":1,"215":1,"257":1,"260":1,"283":1,"286":1,"297":2}}],["определено",{"2":{"203":1,"421":1}}],["определен",{"2":{"195":1,"319":1,"377":1,"422":1}}],["определены",{"2":{"146":1,"235":1,"236":1,"371":1,"545":1}}],["определений",{"2":{"236":1}}],["определении",{"2":{"162":1,"235":1,"236":1,"377":2,"389":1}}],["определение",{"0":{"229":1,"230":1,"231":1,"370":1,"376":1},"1":{"371":1,"372":1},"2":{"126":1,"140":1,"237":1,"240":1,"301":1,"346":1,"374":1,"377":2,"449":1,"495":1}}],["определением",{"2":{"113":1,"140":1,"234":1,"242":1,"246":1,"373":1}}],["определению",{"2":{"118":1,"191":1,"232":1,"377":2}}],["определения",{"2":{"3":1,"161":1,"176":1,"191":1,"222":1,"233":1,"236":3,"237":1,"240":1,"260":2,"314":1,"339":1,"346":1,"375":2,"377":1,"391":1,"452":1}}],["определенную",{"2":{"215":1,"253":1,"382":1,"388":1,"440":1}}],["определенный",{"2":{"261":1,"272":1,"293":1,"321":1,"345":1,"385":1,"387":1}}],["определенных",{"2":{"146":1,"253":1,"366":1,"383":1,"449":1,"495":1}}],["определенными",{"2":{"127":1,"141":1,"194":1,"195":2,"228":1,"495":1,"496":1}}],["определенным",{"2":{"106":1,"107":1,"303":1,"318":1}}],["определенные",{"2":{"83":1,"172":1,"191":1,"192":1,"195":1,"217":1,"231":1,"240":1,"271":1,"277":1,"377":1,"427":1,"436":1,"439":1}}],["определенном",{"2":{"260":1}}],["определенному",{"2":{"41":1,"107":1,"191":1,"421":1}}],["определенное",{"2":{"260":1,"340":1}}],["определенного",{"2":{"7":1,"219":1,"303":1,"388":1,"448":1}}],["определенной",{"2":{"7":1,"11":1,"170":1,"437":1,"492":2}}],["оплаты",{"2":{"4":1,"12":1,"78":1,"183":1}}],["обёртку",{"2":{"492":1}}],["обзора",{"2":{"355":1}}],["обзор",{"2":{"335":1,"349":1,"445":1}}],["обхода",{"2":{"277":1,"332":1}}],["обходимся",{"2":{"20":1}}],["обиход",{"2":{"275":1}}],["обучающие",{"2":{"460":2}}],["обучающего",{"2":{"223":1}}],["обучение",{"2":{"223":1,"459":1,"460":1}}],["обучением",{"2":{"138":1}}],["обучения",{"2":{"62":1,"138":1}}],["обман",{"2":{"461":1}}],["обмануть",{"2":{"176":1,"177":1}}],["обманных",{"2":{"175":1}}],["обменять",{"2":{"385":1}}],["обмена",{"2":{"256":1,"315":1,"321":1,"335":1,"343":1,"355":1,"374":1,"382":1,"383":3,"439":1}}],["обмену",{"2":{"195":1,"339":1}}],["обмен",{"2":{"135":1,"237":1,"382":1,"383":1}}],["обмениваются",{"2":{"335":1}}],["обмениваться",{"2":{"41":1,"241":1,"243":1}}],["обменивается",{"2":{"3":1}}],["обсуждение",{"2":{"449":1}}],["обсуждали",{"2":{"253":1}}],["обсуждать",{"2":{"242":1}}],["обсуждается",{"2":{"141":1}}],["обсервер",{"2":{"266":1}}],["обслуживается",{"2":{"214":1}}],["обслуживании",{"2":{"219":1,"295":1,"400":1}}],["обслуживанием",{"2":{"303":1}}],["обслуживание",{"2":{"135":1,"140":1,"254":1}}],["обслуживания",{"2":{"126":1,"128":1,"132":1,"136":1,"261":1,"301":1,"328":1,"332":1}}],["обслуживать",{"2":{"128":1,"275":1}}],["обслуживаться",{"2":{"126":1,"253":1}}],["обстоятельствах",{"2":{"170":1}}],["обстоятельств",{"2":{"12":1}}],["общая",{"2":{"183":1,"270":1}}],["общую",{"2":{"140":1,"195":1,"230":1,"234":1,"251":1}}],["общепризнанная",{"2":{"485":1}}],["общедоступным",{"2":{"389":1}}],["общее",{"2":{"222":1,"320":1,"337":1,"484":1}}],["общения",{"2":{"187":1}}],["общение",{"2":{"109":1,"335":1,"467":1}}],["общей",{"2":{"165":1,"171":1,"191":1,"230":1,"236":1,"269":1,"314":1,"350":1,"448":1}}],["общего",{"2":{"143":1,"269":1,"303":1,"320":1,"496":2}}],["общем",{"2":{"124":1,"191":1,"241":1,"269":1,"366":1}}],["общим",{"2":{"343":1}}],["общих",{"2":{"149":1,"191":2,"358":1}}],["общий",{"2":{"68":1,"135":1,"138":1,"209":1,"228":1,"296":1,"318":1,"343":1,"387":1,"403":1}}],["общие",{"0":{"77":1,"151":1,"163":1,"171":1},"1":{"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"172":1,"173":1,"174":1,"175":1},"2":{"68":1,"77":1,"86":1,"154":1,"224":1,"380":1,"381":1,"391":1,"403":2,"410":1}}],["оба",{"2":{"107":1,"235":1,"296":1,"308":1,"314":1,"332":1,"380":1,"440":1,"443":1,"527":1}}],["обновят",{"2":{"433":2}}],["обновим",{"2":{"353":1}}],["обновилось",{"2":{"302":1}}],["обновить",{"2":{"261":1,"424":1}}],["обновится",{"2":{"214":1,"451":1}}],["обновляют",{"2":{"327":1}}],["обновляться",{"2":{"369":2,"450":1}}],["обновлять",{"2":{"247":1,"388":1}}],["обновляется",{"2":{"247":1,"375":2}}],["обновляет",{"2":{"106":1,"222":1,"241":1,"303":1,"374":1}}],["обновляем",{"2":{"88":1,"248":1}}],["обновлено",{"2":{"237":1}}],["обновлении",{"2":{"301":1,"350":1,"351":1,"451":1}}],["обновлением",{"2":{"220":1}}],["обновление",{"2":{"197":1,"223":1,"302":1,"349":1,"408":1,"451":1}}],["обновления",{"2":{"135":2,"214":1,"253":1,"273":1,"324":1,"374":1}}],["обнаружении",{"2":{"439":1}}],["обнаружения",{"2":{"114":2,"273":1,"366":1,"374":2}}],["обнаружились",{"2":{"461":1}}],["обнаружили",{"2":{"276":1,"314":1}}],["обнаруживает",{"2":{"260":1,"440":1}}],["обнаруживаем",{"2":{"214":1}}],["обнаружить",{"2":{"240":1,"453":1}}],["обнаружите",{"2":{"215":1}}],["обнуляет",{"2":{"106":1}}],["обязательная",{"2":{"492":1}}],["обязательно",{"2":{"235":1,"460":2}}],["обязательной",{"2":{"214":1}}],["обязательные",{"2":{"267":1,"384":1}}],["обязательными",{"2":{"209":1}}],["обязательным",{"2":{"195":1,"349":1}}],["обязательных",{"2":{"20":1}}],["обязанность",{"2":{"187":1}}],["обязанности",{"2":{"140":1}}],["обязаны",{"2":{"64":1}}],["объявим",{"2":{"344":1}}],["объявивший",{"2":{"337":1}}],["объявили",{"2":{"221":1,"222":1}}],["объявить",{"2":{"194":1,"234":1}}],["объявляя",{"2":{"342":1}}],["объявляют",{"2":{"195":2}}],["объявлять",{"2":{"113":1,"195":1,"222":1,"233":1}}],["объявляете",{"2":{"314":1}}],["объявляется",{"2":{"108":1,"195":1,"196":1}}],["объявляем",{"2":{"112":1,"132":2,"192":1,"195":1,"222":1,"247":1,"293":1,"294":1,"298":1,"302":3,"304":1,"330":1,"338":1,"344":1,"346":1,"347":1,"352":1,"383":1}}],["объявлены",{"2":{"449":1}}],["объявлено",{"2":{"202":1}}],["объявленным",{"2":{"195":1}}],["объявленного",{"2":{"108":1}}],["объявления",{"2":{"186":1,"309":1}}],["объявление",{"2":{"108":1,"235":1,"237":2,"309":1}}],["объяснить",{"2":{"366":2,"460":1}}],["объяснимо",{"2":{"439":1}}],["объясним",{"2":{"221":1,"419":1}}],["объяснению",{"2":{"461":1}}],["объяснения",{"2":{"178":1}}],["объяснение",{"2":{"63":1,"83":1}}],["объясняющие",{"2":{"276":1}}],["объясняя",{"2":{"124":1}}],["объясняет",{"2":{"67":1,"460":1}}],["объем",{"2":{"222":1,"277":1}}],["объемном",{"2":{"180":1}}],["объему",{"2":{"47":1}}],["объединению",{"2":{"430":1}}],["объединением",{"2":{"430":1}}],["объединение",{"2":{"17":1,"68":1,"387":1,"388":1}}],["объединены",{"2":{"269":1}}],["объединен",{"2":{"215":1}}],["объединяющие",{"2":{"418":1}}],["объединяются",{"2":{"125":1,"140":1}}],["объединяет",{"2":{"388":1,"421":1}}],["объединять",{"2":{"16":1,"431":3}}],["объединить",{"2":{"98":1,"438":1}}],["объективная",{"2":{"485":1}}],["объективных",{"2":{"12":1}}],["объектах",{"2":{"293":1,"448":1}}],["объекта",{"2":{"195":2,"198":1,"200":1,"236":2,"238":1,"247":2,"273":1,"283":1,"290":1,"291":1,"292":1,"293":1,"295":1,"299":1,"301":2,"302":4,"303":4,"304":1,"306":2,"325":2,"330":1,"332":1,"344":1,"347":1,"350":1,"352":2,"353":1,"377":1,"423":1,"425":1,"448":2,"449":1,"451":1,"452":1}}],["объектами",{"2":{"280":1,"297":1,"301":1,"343":1,"448":1}}],["объектам",{"2":{"108":2,"114":2,"314":1}}],["объектом",{"2":{"195":1,"286":1,"297":1,"298":1,"301":1,"302":1,"306":1,"332":1,"344":2,"350":1,"352":1,"371":1}}],["объектов",{"2":{"17":1,"114":1,"209":1,"247":1,"256":1,"258":2,"270":1,"279":1,"296":1,"301":1,"332":1,"350":1,"352":1,"448":1}}],["объекту",{"2":{"155":1,"195":1,"216":1,"240":1,"292":2,"293":1,"295":1,"299":1,"301":1,"303":1,"350":1,"371":1,"377":1}}],["объекты",{"2":{"115":1,"195":2,"201":1,"206":1,"216":1,"222":1,"236":1,"238":1,"315":1,"332":1,"337":1,"349":1,"350":1,"380":2,"421":1,"448":1,"449":1,"451":1}}],["объект",{"0":{"370":1},"1":{"371":1,"372":1},"2":{"97":1,"98":1,"111":1,"113":2,"114":6,"192":3,"194":1,"195":9,"234":1,"235":1,"236":3,"238":2,"240":1,"241":1,"243":1,"246":2,"247":2,"256":1,"258":1,"262":1,"270":1,"283":1,"284":1,"286":2,"288":2,"294":3,"295":1,"296":1,"297":2,"298":1,"300":1,"301":5,"302":6,"303":2,"306":2,"309":3,"315":1,"321":1,"325":2,"326":2,"328":1,"332":1,"337":1,"340":1,"342":1,"343":2,"345":1,"346":5,"347":1,"349":1,"350":3,"352":5,"353":2,"371":3,"374":2,"376":1,"377":3,"378":1,"380":3,"381":1,"383":3,"384":2,"389":4,"421":1,"425":2,"426":1,"448":2}}],["объекте",{"2":{"97":1,"192":1,"260":1,"292":1,"315":1,"377":1,"448":1,"460":1}}],["объектным",{"2":{"452":1}}],["объектный",{"2":{"286":1,"294":1}}],["объектные",{"2":{"17":1}}],["объектной",{"2":{"314":1}}],["объектного",{"2":{"301":1}}],["объектно",{"2":{"3":1,"194":1,"270":1,"451":1,"452":1}}],["об",{"2":{"61":1,"125":1,"147":1,"148":1,"149":1,"157":1,"180":1,"191":1,"193":1,"195":2,"201":1,"215":1,"237":1,"238":1,"241":1,"260":1,"276":1,"287":1,"288":1,"291":1,"297":1,"306":1,"320":1,"332":1,"346":1,"351":1,"381":1,"383":1,"410":1,"435":1,"438":1,"451":2,"460":1}}],["образец",{"2":{"408":1}}],["образу",{"2":{"191":1}}],["образованную",{"2":{"383":1}}],["образовательный",{"2":{"64":1}}],["образом",{"2":{"17":1,"36":1,"106":2,"107":1,"117":1,"125":2,"126":1,"142":1,"145":1,"148":1,"161":2,"174":1,"180":1,"181":1,"193":2,"200":2,"216":1,"217":3,"219":3,"220":1,"221":1,"222":2,"228":1,"229":2,"232":1,"234":1,"237":2,"238":3,"240":1,"241":1,"245":1,"246":2,"247":1,"260":1,"261":1,"262":1,"273":1,"287":1,"290":1,"293":2,"295":1,"300":1,"301":2,"303":1,"304":1,"306":1,"308":1,"309":2,"315":2,"326":1,"328":2,"329":1,"337":1,"340":1,"341":1,"367":1,"369":1,"371":1,"375":2,"377":1,"382":1,"389":1,"418":1,"420":2,"423":1,"424":1,"426":1,"428":1,"429":2,"433":1,"438":1,"439":1,"459":1,"499":1}}],["обработать",{"2":{"327":1}}],["обработана",{"2":{"203":1,"325":1}}],["обработчика",{"2":{"351":1}}],["обработчиком",{"2":{"302":1}}],["обработчиков",{"2":{"114":1}}],["обработчике",{"2":{"302":1}}],["обработчики",{"2":{"301":1}}],["обработчик",{"2":{"293":1,"322":1,"352":1}}],["обработка",{"2":{"314":2,"332":1,"386":1,"452":1}}],["обработке",{"2":{"314":1,"452":1}}],["обработкой",{"2":{"273":1}}],["обработку",{"2":{"149":1,"253":1,"314":1,"343":1,"382":1}}],["обработки",{"2":{"132":1,"191":1,"219":1,"247":1,"293":1,"298":1,"299":2,"300":1,"306":1,"308":1,"314":1,"322":1,"381":1,"382":1}}],["обрабатывающий",{"2":{"383":1}}],["обрабатывают",{"2":{"235":1}}],["обрабатываются",{"2":{"67":1,"332":1,"460":1}}],["обрабатываем",{"2":{"315":2}}],["обрабатывает",{"2":{"241":1,"288":2,"382":1}}],["обрабатывается",{"2":{"118":1}}],["обрабатывать",{"2":{"215":1,"221":1,"301":1,"308":1,"317":1,"328":1,"342":1,"366":1,"386":1,"412":1,"461":2}}],["обрабатываться",{"2":{"215":1,"300":1}}],["обратимся",{"2":{"344":1}}],["обратился",{"2":{"179":1}}],["обратит",{"2":{"186":1}}],["обратитесь",{"2":{"119":1,"317":1}}],["обратите",{"2":{"113":1,"114":1,"127":1,"130":1,"144":1,"145":1,"169":1,"172":1,"174":1,"192":3,"194":1,"195":1,"215":1,"221":2,"222":3,"237":1,"246":1,"247":3,"287":1,"302":2,"307":1,"309":1,"314":1,"316":1,"325":1,"328":1,"339":1,"342":1,"346":1,"349":1,"371":2,"377":1,"383":1,"387":1,"421":1,"423":1,"426":3,"436":1}}],["обратиться",{"2":{"203":1,"262":1,"313":1}}],["обратить",{"2":{"99":1,"156":1,"174":1,"177":1,"190":1,"191":1,"297":1,"314":1,"374":1}}],["обратных",{"2":{"309":1}}],["обратными",{"2":{"309":1}}],["обратный",{"0":{"307":1},"1":{"308":1},"2":{"307":1}}],["обратные",{"2":{"266":1}}],["обратную",{"2":{"125":1,"149":1,"301":1}}],["обратная",{"2":{"116":1}}],["обратное",{"2":{"302":1}}],["обратном",{"2":{"238":1}}],["обратного",{"2":{"131":1,"307":3,"308":1,"309":3,"316":1,"332":1}}],["обратной",{"2":{"73":1,"159":1,"195":1,"241":1,"312":1,"366":1,"376":1,"417":1}}],["обратно",{"2":{"44":1,"106":1,"154":1,"301":1,"314":1,"329":1,"350":1,"385":1}}],["обращаясь",{"2":{"425":1}}],["обращающегося",{"2":{"315":1}}],["обращаются",{"2":{"235":1,"350":1}}],["обращались",{"2":{"314":1}}],["обращаемся",{"2":{"321":1,"322":1,"349":1,"425":1}}],["обращается",{"2":{"108":1,"215":1,"366":1}}],["обращаешься",{"2":{"107":1}}],["обращаться",{"2":{"52":1,"107":1,"190":1,"215":1,"216":1,"222":1,"253":1,"332":2,"337":1,"344":1,"350":2,"351":1,"371":1,"426":1,"460":1}}],["обращений",{"2":{"287":1,"321":1,"352":2,"499":1}}],["обращения",{"2":{"195":1,"261":1,"332":1,"461":1,"499":1}}],["обращении",{"2":{"107":1,"316":1,"461":2}}],["обращением",{"2":{"501":1}}],["обращение",{"2":{"41":1,"374":1}}],["обложка",{"2":{"140":1}}],["обладают",{"2":{"264":1}}],["обладает",{"2":{"191":1}}],["область",{"2":{"164":1,"170":1,"246":2,"261":2,"373":1,"387":1,"415":1}}],["областью",{"2":{"161":1}}],["области",{"2":{"128":1,"138":1,"162":2,"172":1,"195":2,"260":1,"268":1,"277":1,"420":1,"449":1}}],["облачном",{"2":{"405":1,"407":1}}],["облачное",{"2":{"107":1}}],["облачные",{"2":{"389":1,"407":1}}],["облачных",{"2":{"39":1,"107":1}}],["облегчили",{"2":{"451":1}}],["облегчит",{"2":{"322":1,"454":1}}],["облегчения",{"2":{"312":1,"492":1}}],["облегчен",{"2":{"29":1}}],["облегчающего",{"2":{"430":1}}],["облегчают",{"2":{"418":1}}],["облегчат",{"2":{"215":1,"312":1}}],["облегчать",{"2":{"20":1}}],["облегчает",{"2":{"3":1,"145":1,"271":1}}],["обычная",{"2":{"125":1,"177":1,"255":1,"438":1}}],["обычное",{"2":{"253":2,"461":1}}],["обычном",{"2":{"195":1,"216":1,"292":1,"297":1,"309":1,"310":1,"421":1,"422":1}}],["обычной",{"2":{"96":1,"106":1,"418":1,"451":1}}],["обычного",{"2":{"39":1,"57":1,"142":1,"144":1,"154":1,"167":1,"191":1,"194":1,"253":1,"307":1,"308":2,"309":1,"325":1}}],["обычно",{"2":{"28":1,"30":1,"50":1,"94":1,"106":1,"109":1,"125":1,"128":3,"131":1,"135":1,"141":1,"154":1,"155":1,"161":3,"163":1,"164":1,"165":1,"167":1,"174":1,"178":1,"184":1,"191":1,"193":1,"203":1,"212":1,"229":2,"230":1,"232":1,"241":1,"247":1,"257":1,"258":1,"299":1,"302":1,"314":1,"318":2,"321":1,"383":1,"388":1,"411":1,"435":1,"439":1,"448":1,"449":2,"450":1,"451":1,"460":1,"461":1,"495":1,"524":1}}],["обычным",{"2":{"213":1,"216":1,"425":1,"461":1}}],["обычными",{"2":{"97":1,"218":1,"343":1,"412":1}}],["обычный",{"2":{"152":1,"194":2,"214":1,"248":1,"286":1,"318":1,"337":1,"425":1,"436":1,"443":1}}],["обычных",{"2":{"23":1,"209":1,"253":1,"364":1,"424":1,"461":1}}],["обычные",{"2":{"17":1,"240":1,"303":1,"349":1,"437":1,"451":1}}],["обещанных",{"2":{"309":1}}],["обещанной",{"2":{"309":2}}],["обещаний",{"2":{"309":2}}],["обещаниe",{"0":{"309":1}}],["обещаниями",{"2":{"309":1}}],["обещания",{"2":{"246":2,"308":1,"309":4,"321":1,"326":1}}],["обещание",{"2":{"235":1,"245":2,"246":1,"309":2,"321":1,"330":1}}],["оберток",{"2":{"461":1}}],["обертывания",{"2":{"309":1}}],["обертку",{"2":{"425":1,"426":1,"499":1}}],["обертка",{"2":{"105":1,"203":1,"451":1}}],["обертки",{"0":{"454":1},"2":{"20":1,"221":1,"222":1,"324":1,"425":1,"426":2,"454":1,"461":1}}],["обернуть",{"2":{"287":1,"308":1,"309":1,"343":1,"422":1,"452":1}}],["обернутых",{"2":{"426":1}}],["обернуты",{"2":{"272":1}}],["обернутый",{"2":{"203":1}}],["обернутую",{"2":{"241":1}}],["обернем",{"2":{"222":1,"340":1,"351":1}}],["обеспечат",{"2":{"232":1,"407":1}}],["обеспечит",{"2":{"417":1}}],["обеспечить",{"2":{"150":1,"161":1,"191":1,"287":1,"298":1,"403":1}}],["обеспечим",{"2":{"323":1}}],["обеспечивает",{"2":{"190":1,"195":1,"213":2,"223":1,"235":1,"299":1,"308":1,"337":1,"366":1,"373":1,"383":1,"428":1}}],["обеспечивается",{"2":{"135":1,"535":1}}],["обеспечивая",{"2":{"159":1,"253":1}}],["обеспечивающая",{"2":{"324":1}}],["обеспечивающие",{"2":{"125":2,"333":1,"415":1}}],["обеспечивают",{"2":{"121":1,"234":1,"323":1,"350":1}}],["обеспечьте",{"2":{"149":1}}],["обеспечении",{"2":{"148":1,"269":1}}],["обеспечению",{"2":{"128":1,"333":1,"360":1,"417":1}}],["обеспечением",{"2":{"140":1,"417":1,"428":1}}],["обеспечение",{"2":{"124":1,"128":2,"138":1,"140":2,"186":1,"318":1,"358":1,"360":1,"415":1,"417":2,"430":1}}],["обеспечения",{"0":{"266":1,"267":1,"277":1,"394":1},"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,"306":1,"307":1,"308":1,"309":1,"310":1,"311":1},"2":{"66":1,"68":1,"75":1,"109":1,"116":1,"138":1,"140":1,"146":1,"148":1,"186":1,"190":1,"191":1,"203":1,"216":1,"220":1,"225":1,"226":1,"230":1,"234":1,"241":2,"266":1,"267":2,"275":1,"276":1,"277":1,"307":1,"310":1,"312":1,"319":1,"340":1,"351":1,"394":2,"415":4,"417":2,"419":1,"430":2,"440":1,"450":1}}],["обе",{"2":{"111":1,"140":1,"260":1,"350":1,"427":1,"438":1}}],["обеих",{"2":{"9":1,"438":1}}],["обобщение",{"2":{"496":1}}],["обобщить",{"2":{"189":1}}],["оболочку",{"2":{"461":1}}],["оболочки",{"2":{"409":1}}],["обоснование",{"0":{"495":1}}],["обоснования",{"2":{"452":1}}],["обоснованное",{"2":{"181":1}}],["обоих",{"2":{"287":1,"350":2,"352":1,"420":1,"536":1}}],["обоими",{"2":{"230":1}}],["обоюдоострым",{"2":{"185":1}}],["обоюдная",{"2":{"64":1}}],["обо",{"2":{"143":1}}],["обороты",{"2":{"388":1}}],["оборудовании",{"2":{"138":1,"253":1}}],["оборудование",{"2":{"128":1}}],["оборачивайте",{"2":{"459":1}}],["оборачивает",{"2":{"317":1}}],["оборачивать",{"2":{"99":1,"309":1}}],["оборачивая",{"2":{"20":1}}],["обозначение",{"2":{"240":1,"371":1}}],["обозначениях",{"2":{"380":1}}],["обозначения",{"2":{"125":1,"167":1,"246":1,"377":1}}],["обозначить",{"2":{"229":1,"260":1}}],["обозначают",{"2":{"222":1}}],["обозначаются",{"2":{"153":1,"206":1}}],["обозначающий",{"2":{"143":1}}],["обозначается",{"2":{"161":1}}],["обозначает",{"2":{"125":1,"269":1}}],["обойтись",{"2":{"20":1,"213":1,"219":1}}],["обширен",{"2":{"13":1}}],["оно",{"2":{"130":1,"143":1,"150":1,"155":1,"157":2,"168":1,"169":2,"173":1,"191":1,"195":1,"214":1,"220":1,"223":1,"235":1,"238":1,"248":1,"251":1,"253":3,"257":1,"298":1,"309":2,"311":1,"316":2,"328":1,"345":1,"346":1,"353":1,"371":1,"377":1,"383":1,"417":3,"419":2,"426":1,"442":1,"461":1}}],["она",{"2":{"34":1,"36":1,"68":2,"116":1,"134":1,"180":1,"186":1,"187":1,"188":1,"191":1,"194":1,"197":1,"198":2,"201":1,"202":1,"203":2,"218":1,"219":1,"220":1,"241":1,"247":1,"253":1,"260":1,"266":1,"269":1,"273":2,"293":1,"294":1,"298":1,"303":1,"321":1,"324":1,"325":1,"342":1,"344":2,"350":1,"355":1,"389":1,"408":1,"417":2,"421":3,"430":1,"448":2,"449":2,"451":1,"453":1,"524":2}}],["онлайновыми",{"2":{"441":1}}],["онлайном",{"2":{"253":1}}],["онлайн",{"0":{"59":1},"1":{"60":1,"61":1,"62":1,"63":1,"64":1},"2":{"12":1,"14":1,"27":1,"60":1,"106":1,"133":1,"136":1,"155":1,"409":1,"415":1,"439":1,"443":1,"444":1,"461":1,"495":1,"496":1,"533":1}}],["они",{"2":{"3":3,"22":1,"44":1,"94":1,"125":1,"126":1,"128":1,"138":2,"139":1,"141":2,"143":1,"147":1,"148":1,"151":1,"152":1,"154":2,"157":1,"158":1,"164":1,"167":1,"169":1,"170":1,"174":1,"190":1,"191":2,"199":3,"200":1,"203":3,"204":1,"205":1,"207":1,"208":1,"209":1,"212":1,"215":1,"216":1,"238":1,"240":1,"248":1,"249":1,"251":1,"253":4,"255":1,"258":1,"260":2,"261":1,"264":1,"266":1,"267":1,"269":1,"271":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"292":1,"295":1,"302":1,"306":1,"307":1,"308":1,"309":2,"314":4,"321":1,"324":1,"325":2,"327":1,"328":1,"332":1,"342":1,"349":2,"371":1,"373":1,"376":1,"380":4,"387":2,"389":1,"390":2,"408":1,"410":2,"412":3,"417":1,"418":2,"421":3,"424":1,"426":2,"438":1,"439":2,"441":2,"442":1,"443":1,"449":1,"451":2,"455":1,"460":2,"461":1}}],["он",{"0":{"430":1},"2":{"2":1,"30":1,"32":1,"50":1,"67":1,"81":1,"99":1,"106":3,"109":1,"110":1,"111":1,"114":2,"115":1,"117":1,"125":4,"131":2,"137":2,"140":3,"142":2,"143":2,"147":1,"149":1,"150":1,"153":3,"154":1,"157":1,"159":1,"161":1,"162":2,"166":1,"167":1,"168":1,"169":1,"172":1,"173":1,"177":2,"178":1,"179":1,"182":1,"184":1,"185":2,"190":1,"191":2,"194":2,"195":1,"203":2,"213":1,"214":3,"215":4,"216":1,"217":2,"218":1,"219":2,"222":1,"228":1,"230":2,"234":1,"235":2,"242":2,"245":2,"247":3,"251":1,"253":1,"255":1,"259":1,"260":3,"261":3,"262":1,"265":1,"270":1,"271":2,"272":1,"274":2,"275":1,"276":1,"277":1,"286":1,"287":1,"290":1,"292":1,"293":1,"295":1,"296":1,"297":4,"299":1,"301":2,"303":1,"304":3,"306":1,"307":2,"314":5,"315":1,"316":2,"318":1,"319":1,"321":3,"322":1,"324":2,"328":1,"329":1,"337":2,"344":1,"345":1,"346":1,"350":3,"352":1,"360":1,"371":1,"373":1,"374":5,"375":1,"377":3,"378":2,"380":1,"382":1,"383":2,"388":1,"408":2,"417":2,"420":3,"421":2,"424":2,"426":1,"427":1,"428":1,"429":1,"431":3,"432":1,"435":2,"440":1,"442":3,"443":1,"444":2,"448":1,"449":1,"450":1,"451":1,"452":1,"461":3}}],["отчетности",{"2":{"428":1}}],["отчета",{"2":{"428":1}}],["отчет",{"2":{"421":1,"428":3}}],["отходят",{"2":{"415":1}}],["отец",{"2":{"339":1}}],["отовсюду",{"2":{"449":1}}],["отодвигает",{"2":{"290":1}}],["отобрав",{"2":{"418":1}}],["отобразим",{"2":{"246":1}}],["отобразит",{"2":{"214":1,"220":2}}],["отобразить",{"2":{"157":1,"161":1,"198":1,"203":1,"218":1}}],["отобразится",{"2":{"155":1}}],["отображен",{"2":{"374":1}}],["отображено",{"2":{"200":1}}],["отображении",{"2":{"143":1,"156":1,"157":1,"199":1,"203":2,"215":1,"222":1,"314":1}}],["отображения",{"2":{"89":1,"143":1,"144":1,"154":1,"155":3,"158":4,"166":1,"168":1,"170":1,"191":1,"192":1,"199":2,"200":1,"222":4,"235":1,"238":1,"242":1,"246":2,"247":1,"256":1,"325":1,"342":1,"369":1,"429":1,"461":1}}],["отображением",{"2":{"235":1,"256":1}}],["отображение",{"2":{"23":1,"126":1,"167":1,"314":1,"449":1}}],["отображая",{"2":{"367":1}}],["отображаемому",{"2":{"425":1}}],["отображаемый",{"2":{"246":1,"314":1}}],["отображаемые",{"2":{"195":1}}],["отображаем",{"2":{"235":1,"246":1,"339":1}}],["отображается",{"2":{"155":1,"167":1,"174":1,"184":1,"203":1,"235":1,"240":1,"271":1,"369":1,"377":1}}],["отображает",{"2":{"143":1,"158":1,"222":1,"230":2,"345":1,"369":1}}],["отображать",{"2":{"161":1,"329":1,"341":1,"368":1,"369":1,"371":1,"374":1,"410":1,"412":1}}],["отображаться",{"2":{"157":1,"167":1,"168":1,"214":1,"235":2,"256":1,"260":2,"263":1,"373":1,"376":2,"377":1}}],["отображающего",{"2":{"429":1}}],["отображающий",{"2":{"159":1,"303":1,"449":1}}],["отображающая",{"2":{"155":1,"222":1}}],["отображаются",{"2":{"164":1,"167":1,"174":1,"195":1,"218":2,"349":1}}],["отображают",{"2":{"154":1,"170":1,"174":1,"337":1}}],["отбрасывании",{"2":{"273":1}}],["отладка",{"2":{"344":1}}],["отложено",{"2":{"223":1,"314":1}}],["отложенных",{"2":{"222":2}}],["отличную",{"2":{"262":1}}],["отличный",{"2":{"213":1,"262":1,"367":1,"426":1,"460":1}}],["отличным",{"2":{"134":1,"263":1}}],["отличного",{"2":{"318":1}}],["отличной",{"2":{"314":1}}],["отличное",{"2":{"186":1,"295":1,"443":1}}],["отлично",{"2":{"125":1,"309":1,"451":1}}],["отличает",{"2":{"364":1}}],["отличается",{"2":{"23":1,"108":1,"124":1,"137":1,"374":1,"425":1,"442":1,"450":1}}],["отличать",{"2":{"241":1}}],["отличаться",{"2":{"213":1,"215":1,"282":1}}],["отличалась",{"2":{"142":1}}],["отличающим",{"2":{"247":1}}],["отличающий",{"2":{"125":1}}],["отличаются",{"2":{"135":1,"448":1}}],["отличия",{"2":{"451":1}}],["отличительных",{"2":{"303":1}}],["отличительной",{"2":{"302":1}}],["отличить",{"2":{"186":1}}],["отличимы",{"2":{"142":1}}],["отличий",{"2":{"124":1}}],["отличием",{"2":{"223":1,"332":1}}],["отличие",{"2":{"26":1,"39":1,"131":1,"135":1,"148":1,"153":1,"199":1,"212":1,"215":1,"218":1,"222":1,"236":1,"290":1,"343":1,"349":1,"350":2,"417":1,"440":1,"448":1,"449":2,"451":1}}],["отнимают",{"2":{"450":1}}],["отнести",{"2":{"380":1}}],["отнесены",{"2":{"163":1}}],["относящаяся",{"2":{"486":1}}],["относящейся",{"2":{"381":1}}],["относятся",{"2":{"176":2,"366":1}}],["относительно",{"2":{"321":1,"322":1,"461":1}}],["относительные",{"2":{"219":1}}],["относить",{"2":{"255":2}}],["относиться",{"2":{"230":1}}],["относится",{"2":{"2":1,"20":1,"86":1,"140":1,"144":1,"172":1,"195":4,"240":1,"251":1,"271":1,"273":2,"309":1,"314":1}}],["отношений",{"2":{"230":1,"340":1}}],["отношении",{"2":{"199":1}}],["отношению",{"2":{"195":1}}],["отношения",{"2":{"43":1,"234":1,"260":1,"297":1,"337":1}}],["отношение",{"2":{"43":1}}],["оттенок",{"2":{"253":1}}],["отторжение",{"2":{"149":1}}],["оттуда",{"2":{"96":1}}],["отредактирован",{"2":{"542":1}}],["отредактированы",{"2":{"435":1,"438":1}}],["отредактировать",{"2":{"438":1}}],["отредактируйте",{"2":{"438":1}}],["отрендерит",{"2":{"385":1}}],["отреагировать",{"2":{"202":1}}],["отрисовкой",{"2":{"461":1}}],["отрисованные",{"2":{"426":1}}],["отрисовываться",{"2":{"371":1}}],["отрицательных",{"2":{"309":2,"422":1}}],["отрицательные",{"2":{"138":1,"380":1}}],["отрицательного",{"2":{"309":1,"422":1}}],["отражение",{"2":{"353":1}}],["отражалось",{"2":{"375":1}}],["отражаются",{"2":{"190":1}}],["отражается",{"2":{"343":1,"353":1}}],["отражает",{"2":{"142":1,"231":1,"329":1}}],["отражаться",{"2":{"197":1}}],["отражать",{"2":{"117":1,"142":1,"329":1,"330":1}}],["отразятся",{"2":{"236":1}}],["отраслевым",{"2":{"213":1}}],["отраслевыми",{"2":{"141":1}}],["отрасли",{"2":{"151":1,"187":1,"264":1,"368":1}}],["откуда",{"2":{"451":1}}],["отката",{"2":{"408":1}}],["отказа",{"2":{"388":1,"389":1}}],["отказаться",{"2":{"387":1}}],["отказывается",{"2":{"260":1}}],["отказ",{"2":{"135":1,"179":1,"185":1,"245":1,"423":1}}],["отключить",{"2":{"448":1}}],["отключена",{"2":{"435":1}}],["откладывается",{"2":{"314":1}}],["отклоняется",{"2":{"383":1}}],["отклоняем",{"2":{"309":1}}],["отклоняющий",{"2":{"381":1}}],["отклонив",{"2":{"322":1}}],["отклонить",{"2":{"232":1,"260":1,"321":1}}],["отклонения",{"2":{"246":2}}],["отклонение",{"2":{"156":1,"246":1}}],["отклонено",{"2":{"235":1,"309":1}}],["откроем",{"2":{"218":1,"331":1}}],["откройте",{"2":{"214":2,"219":1,"222":1,"263":1,"435":1}}],["откровенного",{"2":{"185":1}}],["открыла",{"2":{"274":1}}],["открыв",{"2":{"219":1}}],["открываемость",{"2":{"349":1}}],["открываем",{"2":{"261":1}}],["открывает",{"2":{"192":1,"231":1,"246":1,"247":1,"288":1,"290":1,"421":1,"426":1}}],["открывается",{"2":{"155":1,"166":1,"184":1,"506":1}}],["открываться",{"2":{"253":1}}],["открывать",{"2":{"245":1,"350":1}}],["открывающем",{"2":{"196":1}}],["открывающих",{"2":{"174":1}}],["открываются",{"2":{"155":1}}],["открыт",{"2":{"506":1}}],["открытия",{"2":{"263":1,"429":1}}],["открытии",{"2":{"245":1}}],["открытие",{"2":{"230":1}}],["открытых",{"2":{"350":1,"389":1}}],["открытый",{"2":{"276":1}}],["открытыми",{"2":{"460":1}}],["открытым",{"2":{"214":1}}],["открытые",{"2":{"107":1}}],["открытого",{"2":{"431":1}}],["открыто",{"2":{"156":1,"256":1}}],["открытом",{"2":{"136":1,"460":1}}],["открыть",{"2":{"134":1,"143":3,"215":1,"232":1,"245":1,"314":1,"353":1,"388":1,"389":2,"420":1,"435":1}}],["отзывами",{"2":{"461":1}}],["отзывчивой",{"2":{"314":1}}],["отзывчивого",{"2":{"172":1,"253":1}}],["отзывчивых",{"2":{"358":1}}],["отзывчивый",{"2":{"172":1}}],["отзывчивые",{"0":{"172":1},"2":{"253":2}}],["отзывчивыми",{"2":{"116":1,"251":1}}],["отзывы",{"2":{"4":1,"47":1,"78":1}}],["отследить",{"2":{"430":1}}],["отслеживать",{"2":{"435":1,"436":2,"441":1}}],["отслеживаться",{"2":{"435":1}}],["отслеживаются",{"2":{"349":1}}],["отслеживание",{"2":{"415":1,"430":1}}],["отслеживании",{"2":{"320":1}}],["отслеживанию",{"2":{"297":1,"302":1}}],["отслеживания",{"2":{"200":1,"213":1,"245":1,"299":1,"350":1,"429":1,"435":1,"448":2}}],["отслеживает",{"2":{"215":1,"448":3}}],["отсылается",{"2":{"350":1}}],["отсылаю",{"2":{"110":1,"309":1,"328":1,"374":1}}],["отсутствует",{"2":{"428":1}}],["отсутствие",{"2":{"415":1}}],["отсутствий",{"2":{"58":1}}],["отсутствовавшие",{"2":{"324":1}}],["отстоит",{"2":{"389":1}}],["отступов",{"2":{"273":1}}],["отступам",{"2":{"145":1}}],["отстает",{"2":{"460":1}}],["отстают",{"2":{"253":1}}],["отставать",{"2":{"253":1}}],["отсюда",{"2":{"218":1,"332":1}}],["отписки",{"2":{"342":1}}],["отпечаток",{"2":{"106":1,"276":1}}],["отправили",{"2":{"385":1,"386":1}}],["отправитель",{"2":{"332":1}}],["отправить",{"2":{"134":1,"315":1,"329":1,"387":1,"389":1}}],["отправленные",{"2":{"382":1}}],["отправленную",{"2":{"329":1,"366":1}}],["отправляя",{"2":{"319":1}}],["отправлять",{"2":{"253":1,"322":1,"341":1,"388":1,"461":1}}],["отправляемого",{"2":{"330":1}}],["отправляем",{"2":{"323":1,"330":1,"386":1,"439":1}}],["отправляемые",{"2":{"195":1}}],["отправляет",{"2":{"106":1,"316":1,"323":1,"366":1,"431":1}}],["отправляется",{"2":{"3":1,"387":1}}],["отправляли",{"2":{"149":1}}],["отправки",{"2":{"330":2,"332":1,"388":2}}],["отправке",{"2":{"297":1}}],["отправка",{"2":{"105":1,"387":1}}],["отправной",{"2":{"229":1,"251":1}}],["отправная",{"2":{"214":1,"215":1,"244":1,"255":1}}],["отправную",{"2":{"110":1,"228":1}}],["отяжелел",{"2":{"50":1}}],["отмечают",{"2":{"417":1}}],["отмечаем",{"2":{"23":1,"88":1}}],["отмеченных",{"2":{"263":1}}],["отмеченным",{"2":{"177":1}}],["отмечена",{"2":{"263":1}}],["отметить",{"2":{"220":1,"222":1,"238":1,"247":2,"253":1,"282":1,"300":1,"306":1,"328":1,"337":1,"343":1,"366":1,"459":1,"460":1}}],["отметим",{"2":{"33":1}}],["отметьте",{"2":{"177":1}}],["отметка",{"2":{"156":1}}],["отменяет",{"2":{"366":1}}],["отменять",{"2":{"149":1}}],["отменены",{"2":{"299":1}}],["отменен",{"2":{"246":1}}],["отменена",{"2":{"220":1,"388":1}}],["отмене",{"2":{"245":1}}],["отмены",{"2":{"179":1}}],["отменит",{"2":{"179":1}}],["отменить",{"2":{"149":1,"185":1,"232":1,"246":1}}],["отдавать",{"2":{"461":1}}],["отдаваемыми",{"2":{"11":1}}],["отдачи",{"2":{"428":1}}],["отделяет",{"2":{"299":1}}],["отделить",{"2":{"451":1,"460":1}}],["отделит",{"2":{"194":1}}],["отделены",{"2":{"169":1}}],["отделку",{"2":{"26":1}}],["отдельная",{"2":{"72":1,"96":1,"108":1,"253":1}}],["отдельного",{"2":{"371":1,"409":1,"451":1,"496":1}}],["отдельности",{"2":{"277":1}}],["отдельном",{"2":{"261":1,"274":1,"345":1,"449":1}}],["отдельно",{"2":{"66":1,"496":1}}],["отдельной",{"2":{"43":1,"82":1,"161":1,"331":1}}],["отдельное",{"2":{"33":1}}],["отдельным",{"2":{"314":1}}],["отдельными",{"2":{"108":1}}],["отдельных",{"2":{"136":1,"220":1,"244":1,"314":1,"333":1,"426":1,"427":2,"543":1}}],["отдельный",{"2":{"9":1,"41":1,"89":1,"96":1,"99":2,"105":2,"194":1,"274":1,"349":1,"409":1,"440":1,"459":1}}],["отдельные",{"2":{"2":1,"11":1,"78":1}}],["отдельную",{"2":{"3":1,"23":1,"256":1,"269":1,"439":1,"449":1}}],["от",{"0":{"360":1},"2":{"3":1,"20":2,"23":1,"26":1,"39":1,"60":1,"63":1,"73":1,"93":1,"105":1,"106":1,"108":4,"112":1,"118":1,"121":1,"124":1,"125":4,"131":1,"134":1,"135":2,"137":1,"138":1,"141":1,"142":2,"147":1,"148":2,"152":2,"153":1,"155":1,"156":1,"157":2,"162":1,"167":1,"169":2,"170":1,"172":3,"174":2,"177":1,"179":1,"185":2,"186":2,"187":1,"190":2,"191":3,"192":1,"194":1,"195":3,"199":2,"210":1,"212":1,"213":1,"215":2,"216":3,"218":1,"222":4,"224":1,"229":1,"230":1,"236":2,"237":1,"240":1,"241":1,"242":1,"247":3,"249":1,"253":3,"260":3,"266":2,"268":1,"269":1,"274":1,"277":1,"278":2,"282":1,"292":1,"297":1,"299":1,"300":1,"301":3,"303":1,"304":1,"306":1,"307":3,"310":1,"314":2,"315":2,"316":1,"318":1,"320":1,"324":3,"325":1,"331":1,"333":1,"337":1,"340":1,"342":3,"343":1,"344":1,"349":2,"350":3,"360":1,"364":1,"382":4,"383":2,"385":1,"386":1,"387":1,"388":5,"389":1,"390":1,"407":1,"412":1,"415":1,"417":1,"419":1,"425":1,"428":1,"430":4,"435":1,"439":1,"440":3,"442":1,"448":1,"449":3,"450":2,"451":3,"455":1,"459":1,"460":4,"484":1,"492":1,"495":1,"496":1,"524":1}}],["отводится",{"2":{"142":1}}],["отвечающие",{"2":{"449":1,"451":1}}],["отвечающий",{"2":{"314":1,"332":1}}],["отвечающего",{"2":{"430":1}}],["отвечаем",{"2":{"332":1,"382":2}}],["отвечает",{"2":{"106":1,"140":1,"182":1,"215":1,"228":1,"229":1,"230":2,"231":1,"232":1,"261":1,"339":1,"411":1,"428":1,"545":1}}],["отвечал",{"2":{"332":1}}],["отвечать",{"2":{"6":1,"318":1,"360":1}}],["ответы",{"2":{"321":1}}],["ответственная",{"2":{"449":1}}],["ответственностью",{"2":{"271":2}}],["ответственность",{"2":{"266":1,"269":1,"293":1,"297":1,"382":2}}],["ответственности",{"0":{"269":1,"271":1},"2":{"266":1,"269":4}}],["ответственным",{"2":{"2":1}}],["ответьте",{"2":{"250":1,"265":1}}],["ответить",{"2":{"191":1,"211":1,"428":1}}],["ответов",{"2":{"165":1,"485":2}}],["ответе",{"2":{"108":2}}],["ответах",{"2":{"485":1}}],["ответа",{"2":{"4":2,"261":1,"307":1,"321":1,"330":1,"332":3,"382":1,"386":1,"387":2}}],["ответ",{"2":{"4":1,"108":2,"154":1,"231":1,"261":1,"314":1,"323":1,"332":2,"366":1,"374":1,"382":2,"384":1,"423":1,"426":1,"460":1,"483":1}}],["отвлечься",{"2":{"3":1}}],["н",{"2":{"460":1}}],["нынешними",{"2":{"221":1}}],["ный",{"2":{"61":1}}],["ну",{"2":{"246":1,"306":1}}],["нулей",{"2":{"306":1}}],["нулевой",{"2":{"262":1}}],["нулевые",{"2":{"125":1}}],["нуля",{"2":{"191":1,"212":2,"310":1}}],["нули",{"2":{"125":1}}],["нуждающихся",{"2":{"348":1}}],["нуждаются",{"2":{"238":1}}],["нужд",{"2":{"344":1,"381":1}}],["нужды",{"2":{"212":1}}],["нужен",{"0":{"430":1},"2":{"17":1,"262":1,"265":1,"294":1,"374":3,"408":1,"433":1,"443":1,"449":2,"460":2,"461":1,"516":1}}],["нужную",{"2":{"295":1,"432":1,"515":1}}],["нужна",{"2":{"12":1,"109":1,"116":1,"191":1,"270":1,"273":1,"409":1,"414":1,"448":1,"453":1}}],["нужное",{"2":{"408":1}}],["нужно",{"2":{"12":1,"39":1,"41":2,"58":1,"67":1,"86":2,"96":1,"103":1,"106":2,"112":1,"114":1,"125":2,"132":1,"138":1,"160":1,"161":1,"191":1,"192":1,"193":1,"195":2,"199":1,"203":1,"212":1,"215":1,"218":2,"221":1,"222":1,"223":1,"230":1,"235":1,"240":1,"241":1,"246":1,"271":1,"293":1,"298":1,"301":1,"309":1,"325":1,"332":1,"342":1,"347":1,"374":2,"383":1,"387":1,"408":1,"411":1,"412":2,"417":1,"420":1,"423":1,"435":1,"436":1,"438":1,"443":2,"448":1,"449":2,"450":2,"452":1,"459":1,"460":1,"461":2}}],["нужного",{"2":{"9":1,"174":1}}],["нужных",{"2":{"448":1,"524":1}}],["нужный",{"2":{"125":1,"186":1,"218":1,"450":1,"528":1}}],["нужные",{"2":{"107":1,"395":1,"540":1}}],["нужны",{"2":{"7":1,"97":1,"410":1,"424":1,"426":1,"448":1,"452":1,"461":1,"524":1}}],["нужным",{"2":{"3":1}}],["нюансов",{"2":{"108":1,"110":1}}],["нём",{"2":{"41":1,"96":1,"456":1}}],["нежелаемые",{"2":{"495":1}}],["нежелательных",{"2":{"217":1}}],["нежелательные",{"2":{"158":1}}],["нежелательная",{"2":{"216":1}}],["неуклюжим",{"2":{"426":1}}],["неудобно",{"2":{"412":1}}],["неудачей",{"2":{"417":1,"438":1}}],["неудачи",{"2":{"309":2,"417":1}}],["неудачное",{"2":{"449":1}}],["неудачного",{"2":{"309":1}}],["неудачной",{"2":{"235":1,"421":2}}],["неудачный",{"2":{"385":1}}],["неудачные",{"2":{"308":1}}],["неудачным",{"2":{"307":1,"388":1}}],["неудача",{"2":{"307":1}}],["нелогично",{"2":{"449":1}}],["нелегкая",{"2":{"418":1}}],["нельзя",{"2":{"350":1,"451":1}}],["нецелесообразно",{"2":{"380":1}}],["неэффективным",{"2":{"461":1}}],["неэффективной",{"2":{"342":1}}],["неэтичной",{"2":{"176":1}}],["недействительным",{"2":{"426":1}}],["неделимого",{"2":{"269":1}}],["недопущения",{"2":{"504":1}}],["недопонимание",{"2":{"67":1}}],["недочеты",{"2":{"417":1}}],["недорого",{"2":{"407":1}}],["недостающие",{"2":{"424":1,"428":1}}],["недостаток",{"2":{"308":1,"342":1}}],["недостаточно",{"2":{"251":1,"252":1,"388":1}}],["недостатком",{"2":{"314":2,"343":1}}],["недостатков",{"2":{"234":1,"366":1,"382":1,"388":1}}],["недостатка",{"2":{"213":1,"386":1}}],["недостатки",{"2":{"195":1,"253":2,"344":1,"366":1,"382":1,"420":1}}],["недоступна",{"2":{"116":1}}],["недоумении",{"2":{"159":1}}],["независимы",{"2":{"449":1}}],["независимых",{"2":{"420":2}}],["независимость",{"2":{"409":1}}],["независимо",{"2":{"260":1,"277":1,"340":1,"342":2,"409":1,"435":1}}],["независимое",{"2":{"249":1}}],["незавершенных",{"2":{"222":1}}],["незаслужено",{"2":{"106":1}}],["неиспользуемых",{"2":{"273":1}}],["неиспользуемые",{"2":{"216":1}}],["неисчерпывающими",{"2":{"268":1}}],["неизменяемым",{"2":{"389":1}}],["неизменяемое",{"2":{"195":1}}],["неизменным",{"2":{"293":1}}],["неизбежным",{"2":{"169":1}}],["нечто",{"2":{"212":1,"345":1,"369":1,"377":1,"449":1}}],["нередко",{"2":{"388":1}}],["нереактивных",{"2":{"374":1}}],["нереактивные",{"2":{"195":1}}],["нерационального",{"2":{"273":1}}],["неразличенно",{"2":{"140":1}}],["ненужную",{"2":{"275":1}}],["ненужной",{"2":{"449":1}}],["ненужного",{"2":{"275":1}}],["ненужному",{"2":{"271":1}}],["ненужное",{"2":{"109":1}}],["ненужным",{"2":{"270":1}}],["ненависть",{"2":{"184":1}}],["ненаправленность",{"0":{"182":1}}],["неочевидные",{"2":{"485":1}}],["неотзывчивым",{"2":{"314":1,"350":1}}],["неотъемлемой",{"2":{"234":1,"306":1}}],["неоднократно",{"2":{"296":1,"306":1,"380":1}}],["неоптимизированных",{"2":{"461":1}}],["неопределено",{"2":{"309":1}}],["неопределенное",{"2":{"426":1}}],["неопределенном",{"2":{"159":1,"309":1}}],["неопределенных",{"2":{"309":1}}],["неопределенна",{"2":{"307":1}}],["неопытный",{"2":{"276":1}}],["необычными",{"2":{"358":1}}],["необычно",{"2":{"240":1}}],["необязателен",{"2":{"316":1}}],["необязательными",{"2":{"378":1}}],["необязательным",{"2":{"236":1}}],["необязательные",{"2":{"55":1}}],["необходима",{"2":{"342":1}}],["необходимую",{"2":{"325":1,"461":1}}],["необходим",{"2":{"135":1,"298":1,"348":1,"407":1,"442":1}}],["необходимы",{"2":{"380":1,"383":1,"390":1,"410":1,"441":1}}],["необходимыми",{"2":{"218":1,"299":1,"492":1}}],["необходимым",{"2":{"188":1,"255":1,"495":1}}],["необходимые",{"2":{"124":1,"213":1,"240":1,"253":1,"258":1,"261":1,"332":1,"402":1,"444":1}}],["необходимых",{"2":{"110":1,"122":1,"347":1,"420":1,"544":1}}],["необходимый",{"2":{"50":1,"124":1,"178":1,"460":1}}],["необходимому",{"2":{"148":1}}],["необходимое",{"2":{"147":1,"232":1,"421":1}}],["необходимость",{"2":{"96":1,"142":1,"156":1,"231":1,"277":1,"381":1,"430":1,"435":1,"442":1}}],["необходимости",{"2":{"58":1,"110":1,"135":1,"191":2,"195":1,"218":1,"235":2,"258":1,"294":1,"303":2,"314":1,"320":1,"344":1,"366":1,"367":2,"371":1,"374":1,"380":1,"383":3,"408":1,"410":1,"412":1,"428":1,"492":2}}],["необходимой",{"2":{"12":1,"298":1,"299":1}}],["необходимо",{"0":{"256":1},"2":{"9":1,"12":1,"58":1,"106":1,"116":2,"124":1,"125":2,"126":6,"128":1,"131":1,"135":1,"136":1,"137":1,"141":1,"152":1,"174":2,"190":1,"191":3,"195":3,"203":1,"215":1,"216":1,"218":1,"221":1,"228":1,"229":1,"230":2,"234":1,"235":1,"236":1,"238":1,"240":1,"245":1,"246":2,"247":1,"253":2,"260":1,"261":2,"262":2,"270":1,"271":1,"273":2,"284":2,"287":1,"298":1,"300":1,"301":6,"304":1,"306":1,"307":2,"309":1,"315":1,"316":2,"317":1,"318":1,"325":1,"326":2,"327":1,"332":1,"342":1,"345":2,"349":1,"366":1,"368":1,"370":1,"372":1,"374":2,"376":1,"377":1,"380":1,"382":1,"383":2,"384":1,"385":2,"387":1,"388":1,"389":1,"411":1,"418":4,"419":2,"420":1,"421":2,"422":1,"423":1,"424":1,"427":2,"428":1,"433":1,"435":1,"439":1,"442":1,"495":1,"516":1,"517":1,"540":1}}],["негативный",{"2":{"159":1}}],["негативных",{"2":{"159":1,"274":1}}],["него",{"2":{"9":1,"11":1,"81":1,"96":1,"98":1,"108":1,"121":2,"135":1,"168":1,"170":1,"173":1,"187":1,"203":1,"213":1,"216":1,"219":1,"222":1,"276":1,"287":1,"339":1,"352":1,"377":1,"386":1,"387":1,"414":1,"420":1,"424":1,"426":1,"427":1,"431":1,"444":1,"449":2,"503":1}}],["неяркой",{"2":{"153":1}}],["неявно",{"2":{"97":1}}],["невероятно",{"2":{"418":1}}],["невелика",{"2":{"374":1}}],["невелик",{"2":{"222":1}}],["невелики",{"2":{"128":1}}],["невозможен",{"2":{"367":1}}],["невозможна",{"2":{"327":1}}],["невозможным",{"2":{"179":1}}],["невозможной",{"2":{"418":1}}],["невозможность",{"2":{"179":1}}],["невозможности",{"2":{"12":1}}],["невозможно",{"2":{"125":1,"133":1,"186":1,"216":1,"247":1,"269":1,"418":1,"449":1,"460":1}}],["невыполненных",{"2":{"220":1}}],["неё",{"2":{"83":1,"86":1,"106":1,"215":1,"389":1,"499":1}}],["нефункциональные",{"0":{"76":1},"2":{"67":1}}],["некую",{"2":{"299":1}}],["некоего",{"2":{"449":1}}],["некое",{"2":{"156":1}}],["некой",{"2":{"106":1}}],["некоторая",{"2":{"389":1}}],["некоторый",{"2":{"223":1}}],["некоторыми",{"2":{"122":2,"219":1,"222":1,"262":1,"277":1,"324":1,"375":1,"417":1}}],["некоторым",{"2":{"122":2,"152":1,"314":1}}],["некоторые",{"2":{"119":1,"121":1,"125":2,"138":1,"141":2,"148":1,"159":1,"163":1,"164":1,"167":1,"179":1,"186":1,"188":1,"190":1,"191":3,"195":2,"212":1,"213":2,"215":3,"216":4,"219":1,"220":1,"224":1,"240":1,"242":1,"253":3,"255":2,"260":1,"265":1,"267":1,"273":1,"276":1,"297":1,"298":1,"306":1,"321":1,"322":1,"324":1,"335":2,"339":1,"350":2,"366":1,"380":1,"381":1,"386":1,"389":1,"391":2,"415":1,"425":2,"429":1,"438":1,"439":1,"448":1,"461":1}}],["некоторых",{"2":{"47":1,"114":1,"140":1,"154":1,"178":1,"186":1,"203":1,"214":1,"215":1,"216":1,"218":1,"226":1,"242":1,"253":2,"272":1,"282":1,"285":1,"295":1,"314":1,"328":1,"337":1,"383":1,"389":1,"411":1,"417":1,"418":1,"427":1}}],["некоторое",{"2":{"195":1,"282":1,"420":1,"421":1}}],["некоторой",{"2":{"117":1,"248":1,"261":1,"299":1,"300":1,"319":1,"421":1,"426":1}}],["некотором",{"2":{"60":1,"388":1,"449":1}}],["некоторую",{"2":{"107":1}}],["некритичными",{"2":{"40":1}}],["некий",{"2":{"9":1,"301":1,"461":1}}],["небольшая",{"0":{"248":1}}],["небольшом",{"2":{"374":1}}],["небольшого",{"2":{"106":1,"107":1,"192":1,"337":1,"351":1}}],["небольшой",{"0":{"91":1},"2":{"99":1,"128":1,"155":1,"222":1,"241":1,"327":1,"331":1,"332":1,"445":1,"461":1}}],["небольшое",{"2":{"38":1,"114":1,"127":1,"156":1,"166":1,"192":1,"203":1}}],["небольших",{"2":{"172":1,"195":1,"235":1,"335":1,"344":1,"428":1,"459":1,"496":1}}],["небольшим",{"2":{"121":1,"191":1,"223":1}}],["небольшими",{"2":{"83":1,"263":1,"353":1}}],["небольшие",{"2":{"78":1,"139":1,"161":1,"275":1}}],["небольшую",{"2":{"2":1,"178":1,"461":1}}],["ней",{"2":{"34":1,"40":1,"107":2,"139":1,"212":1,"241":1,"298":1,"330":1,"337":1,"350":2,"395":1,"399":1,"400":1,"403":1,"421":1,"448":1,"449":1,"453":1,"461":1,"524":1}}],["нетривиальная",{"2":{"444":1}}],["нетривиальные",{"2":{"418":1}}],["нетривиальных",{"2":{"415":1,"430":1}}],["нетерпеливые",{"2":{"158":1}}],["нет",{"2":{"30":1,"32":1,"61":1,"87":1,"106":2,"110":1,"125":1,"135":1,"149":1,"164":1,"169":1,"178":1,"195":2,"198":1,"211":1,"213":1,"214":1,"222":1,"225":1,"248":2,"287":1,"298":1,"303":1,"314":3,"344":2,"347":1,"360":1,"372":1,"377":1,"380":1,"420":2,"421":1,"423":2,"460":2,"461":1}}],["немножко",{"2":{"461":1}}],["немногие",{"2":{"180":1}}],["немного",{"2":{"89":1,"192":1,"210":1,"217":1,"223":1,"239":1,"253":3,"304":1,"309":1,"326":1,"346":1,"369":1,"377":1,"383":1,"451":1,"453":1,"459":1}}],["немедленным",{"2":{"323":1}}],["немедленное",{"2":{"319":1}}],["немедленно",{"2":{"247":1,"343":1}}],["немодифицированный",{"2":{"301":1}}],["нему",{"2":{"106":1,"108":1,"130":1,"240":1,"374":1,"380":1,"426":1,"439":1,"444":1,"449":1}}],["немаленький",{"2":{"44":1}}],["нем",{"2":{"29":1,"32":1,"86":1,"106":2,"108":1,"173":1,"190":1,"191":1,"303":1,"306":1,"314":1,"326":1,"348":1,"350":1,"407":1,"408":2,"421":1,"425":1,"460":1,"486":1}}],["непустое",{"2":{"198":1}}],["непрямой",{"2":{"449":1}}],["непрактичным",{"2":{"430":1}}],["неправильно",{"2":{"383":1}}],["неправильном",{"2":{"199":1,"388":1}}],["неприятных",{"2":{"241":1}}],["непрерывно",{"2":{"440":1}}],["непрерывной",{"2":{"134":1}}],["непрерывная",{"0":{"440":1},"2":{"405":1,"439":1,"440":3}}],["непредусмотренные",{"2":{"176":1}}],["непроизвольным",{"2":{"346":1}}],["непроизвольных",{"2":{"159":1}}],["непростой",{"2":{"89":1}}],["непростая",{"2":{"25":1}}],["неплохим",{"2":{"107":1}}],["неплохой",{"2":{"452":1}}],["неплохо",{"2":{"99":1,"305":1,"460":1,"527":1}}],["неполным",{"2":{"439":1}}],["неполный",{"0":{"268":1},"1":{"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1},"2":{"110":1,"151":1,"154":1,"266":1,"278":1}}],["непостоянен",{"2":{"223":1}}],["непосредственный",{"2":{"174":1}}],["непосредственное",{"2":{"175":1}}],["непосредственно",{"2":{"40":1,"113":1,"128":1,"134":1,"174":1,"193":1,"214":1,"215":2,"216":2,"222":1,"234":1,"261":1,"262":1,"270":1,"273":2,"287":1,"301":1,"304":1,"316":1,"321":1,"325":1,"326":1,"377":1,"389":2,"426":2,"448":1,"491":1,"495":1}}],["непонятным",{"2":{"215":1}}],["неподкованых",{"2":{"12":1}}],["нее",{"2":{"20":1,"164":1,"195":1,"341":1,"343":1,"436":1,"437":1,"449":1,"451":1}}],["несущественные",{"2":{"470":1}}],["нестандартные",{"2":{"460":1}}],["нестандартных",{"2":{"382":1}}],["нести",{"2":{"382":1}}],["несем",{"2":{"382":1}}],["несмотря",{"2":{"158":2,"277":1,"327":1,"337":1,"420":1,"421":1,"460":1}}],["несовместимости",{"2":{"190":2}}],["несомненно",{"2":{"138":1}}],["несоответствия",{"2":{"438":1}}],["несоответствие",{"2":{"113":2,"438":1}}],["несоответствию",{"2":{"67":1}}],["несложен",{"2":{"135":1}}],["несложных",{"2":{"461":1}}],["несложный",{"2":{"12":1}}],["несложно",{"2":{"23":1,"39":1,"57":1,"106":1}}],["несколькими",{"2":{"219":1,"238":1,"248":1,"334":1,"389":1}}],["нескольким",{"2":{"108":1,"237":1,"275":1}}],["нескольких",{"2":{"43":1,"115":1,"124":1,"125":2,"195":1,"214":1,"221":1,"232":1,"234":1,"241":1,"250":1,"251":1,"264":1,"266":1,"271":1,"277":1,"318":1,"325":1,"332":1,"342":1,"350":1,"369":1,"375":1,"388":1,"409":1,"411":1,"430":2,"438":1,"443":1,"449":1,"450":1,"451":1,"492":1}}],["несколько",{"2":{"11":1,"29":1,"38":1,"90":1,"94":2,"123":1,"125":3,"128":1,"149":1,"153":1,"158":2,"172":1,"174":1,"181":1,"186":2,"189":1,"191":1,"192":1,"193":3,"195":1,"202":2,"203":1,"215":1,"218":2,"222":1,"232":2,"234":1,"235":2,"237":2,"240":3,"247":1,"248":1,"253":1,"260":1,"261":1,"268":1,"271":2,"274":1,"277":1,"297":1,"303":1,"306":1,"308":1,"314":1,"327":1,"331":1,"333":1,"337":1,"340":1,"342":1,"350":2,"364":1,"377":2,"380":1,"381":1,"383":2,"390":1,"408":1,"411":2,"420":3,"421":3,"425":1,"426":1,"449":2,"452":1,"461":1}}],["несвязанные",{"2":{"3":1}}],["не",{"0":{"109":1,"274":1},"2":{"3":1,"10":2,"17":1,"20":1,"23":2,"26":1,"32":1,"33":1,"39":3,"40":1,"41":1,"50":1,"55":1,"58":2,"63":3,"64":1,"70":1,"72":1,"73":1,"75":1,"84":2,"87":1,"98":1,"99":2,"105":1,"106":4,"107":4,"108":3,"109":2,"110":4,"112":2,"113":1,"114":4,"115":2,"116":1,"120":1,"122":1,"124":1,"125":4,"127":1,"128":4,"130":1,"131":1,"132":2,"133":1,"134":2,"135":2,"139":1,"140":1,"141":2,"143":3,"145":3,"147":1,"152":2,"153":1,"156":3,"157":1,"158":1,"159":4,"161":5,"162":1,"164":1,"165":3,"166":2,"167":1,"169":5,"170":1,"173":3,"175":1,"177":4,"178":3,"179":1,"181":2,"183":1,"185":2,"186":1,"187":1,"190":2,"191":3,"192":2,"193":2,"194":2,"195":9,"197":1,"198":1,"199":1,"200":1,"202":2,"203":4,"204":1,"209":2,"212":3,"213":1,"214":6,"215":5,"216":3,"217":1,"218":5,"219":8,"221":2,"223":3,"225":1,"226":2,"229":1,"231":1,"232":3,"234":1,"235":1,"236":1,"237":2,"238":3,"240":5,"241":2,"242":4,"246":2,"247":3,"253":6,"255":3,"256":1,"258":2,"260":1,"261":7,"263":2,"264":1,"266":4,"267":2,"269":1,"270":3,"271":1,"272":3,"273":4,"274":3,"275":2,"276":2,"277":1,"282":1,"283":1,"286":1,"287":2,"290":1,"292":5,"293":4,"294":2,"295":2,"298":5,"300":1,"301":4,"302":1,"303":2,"304":1,"306":3,"307":7,"308":4,"309":5,"313":1,"314":11,"318":2,"319":1,"321":1,"323":1,"324":1,"325":3,"326":5,"327":4,"332":2,"333":1,"334":1,"337":3,"339":4,"342":1,"344":1,"345":2,"346":1,"349":2,"350":11,"351":1,"352":1,"366":6,"368":2,"371":4,"374":6,"376":1,"377":3,"379":1,"380":1,"382":2,"383":3,"385":1,"386":2,"387":4,"388":6,"389":4,"391":1,"405":1,"408":1,"410":1,"411":2,"412":1,"414":1,"415":1,"416":1,"417":3,"418":1,"420":2,"421":4,"422":5,"423":2,"424":1,"425":1,"426":3,"427":3,"429":1,"430":3,"433":1,"435":6,"436":4,"437":1,"438":3,"439":1,"442":1,"444":7,"447":1,"448":7,"449":11,"450":1,"451":6,"452":3,"453":5,"454":1,"456":2,"459":1,"460":5,"461":10,"485":1,"491":1,"492":3,"495":2,"496":1,"503":1,"516":2,"527":1,"543":1}}],["ни",{"2":{"195":1,"240":1,"282":1,"293":1,"345":1,"350":3,"382":1,"419":1,"420":1,"421":1,"436":1}}],["нижняя",{"2":{"530":1}}],["нижней",{"2":{"161":1,"162":1,"164":1,"172":1,"174":1,"260":1}}],["нижнем",{"2":{"141":1,"143":1,"147":2,"174":1,"205":1,"221":1}}],["нижний",{"2":{"144":1,"246":1}}],["ниже",{"2":{"10":1,"108":1,"116":1,"128":1,"151":1,"154":1,"156":1,"174":2,"238":1,"377":1,"378":1,"389":1,"437":1,"483":1}}],["низкоуровневый",{"2":{"495":1}}],["низком",{"2":{"301":1}}],["низкие",{"2":{"128":1}}],["низвело",{"2":{"96":1}}],["никогда",{"2":{"109":1,"125":1,"161":1,"215":1,"219":1,"234":1,"261":1,"388":1,"460":1}}],["никаким",{"2":{"374":1}}],["никакие",{"2":{"221":1}}],["никаких",{"2":{"109":1,"426":1,"449":1}}],["никакого",{"2":{"178":1}}],["никакой",{"2":{"162":1,"247":1,"248":1,"449":1,"461":1}}],["никак",{"2":{"3":1,"374":1}}],["ниша",{"2":{"62":1}}],["нивелирования",{"2":{"41":1}}],["ничем",{"2":{"32":1}}],["ничего",{"2":{"10":1,"149":1,"193":1,"195":1,"323":1,"350":1,"460":1}}],["нибудь",{"2":{"12":1,"149":1,"385":1}}],["ним",{"2":{"9":1,"17":1,"48":1,"50":2,"52":1,"96":1,"125":1,"161":1,"216":1,"306":1,"310":1,"314":1,"324":1,"332":1,"369":1,"388":1,"426":2,"456":1,"460":1,"461":1,"501":1}}],["ними",{"2":{"2":1,"34":1,"43":1,"98":1,"106":1,"125":1,"188":1,"191":2,"194":1,"215":1,"222":1,"229":1,"261":1,"264":1,"303":1,"310":1,"314":1,"337":1,"350":1,"352":1,"364":1,"373":1,"380":1,"381":1,"388":1,"411":1,"431":1}}],["них",{"2":{"6":1,"39":1,"41":1,"73":1,"78":1,"114":2,"125":2,"143":1,"151":1,"153":1,"158":1,"164":1,"172":1,"176":1,"186":2,"190":1,"191":1,"195":2,"196":1,"203":1,"216":2,"218":1,"222":1,"230":1,"237":1,"238":1,"239":1,"240":2,"242":1,"247":1,"260":1,"261":1,"269":1,"270":1,"276":1,"282":1,"287":1,"297":1,"298":1,"299":1,"303":1,"306":1,"309":1,"314":1,"319":2,"322":1,"335":2,"350":1,"352":1,"366":2,"369":1,"374":3,"380":2,"394":1,"418":1,"421":2,"424":1,"425":1,"430":3,"431":1,"436":1,"443":1,"448":1,"450":1,"452":1,"454":1}}],["ночных",{"2":{"440":1}}],["ноут",{"2":{"444":1}}],["ноу",{"2":{"430":1}}],["ное",{"2":{"428":1}}],["нормальный",{"2":{"289":1}}],["нормально",{"2":{"61":1,"461":1}}],["нормальному",{"2":{"38":1}}],["нотация",{"2":{"426":1}}],["нотацией",{"2":{"380":1}}],["нотации",{"2":{"317":1}}],["нотаций",{"2":{"230":1}}],["нотацию",{"2":{"196":1,"221":1,"349":1,"371":3}}],["нотированной",{"2":{"115":1}}],["носят",{"2":{"185":1,"441":1}}],["носит",{"2":{"123":1,"139":1,"188":1}}],["номера",{"2":{"387":1,"388":1}}],["номер",{"2":{"315":1,"461":1}}],["номеров",{"2":{"161":1}}],["номером",{"2":{"161":1}}],["номеру",{"2":{"161":1}}],["новички",{"2":{"360":1}}],["новичка",{"2":{"109":1}}],["новейшим",{"2":{"235":1}}],["нова",{"2":{"218":1}}],["новая",{"2":{"118":1,"161":1,"184":1,"217":1,"247":1,"248":1,"308":1,"366":1,"461":1}}],["новую",{"2":{"217":1,"244":1,"325":1,"326":1,"364":1,"366":1,"428":1,"438":1,"453":1,"533":1}}],["нововведением",{"2":{"449":1}}],["новой",{"2":{"212":1,"214":1,"242":1,"247":1,"301":1,"326":1,"377":1,"408":1,"428":1,"459":1,"527":1,"543":1}}],["новое",{"0":{"369":1,"464":1,"469":1,"472":1,"475":1},"2":{"191":1,"309":1,"389":1,"408":1}}],["новостных",{"2":{"366":1,"449":1}}],["новостные",{"2":{"158":1}}],["новостей",{"2":{"177":1,"449":1}}],["новому",{"2":{"250":1}}],["новом",{"2":{"118":2,"232":1,"246":1,"369":1}}],["нового",{"0":{"247":1,"248":1},"2":{"110":1,"116":1,"195":1,"212":2,"247":1,"315":1,"343":1,"368":1,"376":1,"387":1,"388":1,"417":1,"451":1,"483":1}}],["новыми",{"2":{"390":1}}],["новым",{"2":{"138":1,"195":1,"309":1,"329":1}}],["новые",{"0":{"119":1},"2":{"119":1,"125":1,"161":2,"162":1,"170":1,"190":3,"229":1,"242":1,"243":1,"247":1,"324":1,"327":1,"344":1,"354":1,"358":1,"366":1,"369":2,"372":1,"373":1,"377":1,"381":1,"391":1,"415":1,"429":1,"438":1,"444":1,"451":1,"460":1}}],["новый",{"2":{"99":1,"110":3,"118":1,"121":1,"153":1,"162":1,"178":2,"194":1,"195":1,"203":2,"214":2,"229":2,"237":1,"287":1,"336":1,"359":1,"374":2,"378":1,"387":1,"389":1,"435":1,"439":1,"443":1,"453":1}}],["новых",{"2":{"2":1,"119":1,"156":1,"212":1,"230":1,"247":2,"251":1,"312":1,"322":1,"325":1,"349":1,"350":1,"358":1,"366":2,"408":1,"486":1,"545":1}}],["но",{"2":{"3":1,"9":1,"17":1,"20":1,"23":3,"26":3,"29":1,"39":1,"41":1,"44":1,"58":1,"70":1,"73":1,"84":1,"88":1,"98":1,"99":2,"106":3,"107":3,"109":1,"110":3,"114":1,"116":1,"121":3,"122":1,"125":2,"128":4,"129":1,"131":1,"140":2,"144":1,"145":2,"150":1,"153":1,"154":2,"155":2,"156":2,"158":1,"159":2,"162":2,"164":1,"169":3,"170":1,"172":2,"173":1,"178":1,"181":1,"184":1,"186":1,"187":1,"190":1,"191":6,"192":1,"193":1,"194":3,"195":9,"198":1,"199":1,"201":1,"202":1,"203":2,"204":1,"209":1,"213":2,"214":2,"215":3,"216":2,"218":3,"219":2,"230":1,"237":1,"238":1,"239":2,"240":2,"241":1,"242":1,"246":1,"247":3,"248":2,"249":1,"251":1,"253":6,"255":2,"256":3,"259":1,"260":1,"261":1,"262":1,"266":1,"271":2,"272":1,"274":2,"276":2,"292":1,"293":3,"295":2,"298":1,"301":5,"303":3,"305":1,"306":2,"307":2,"308":3,"309":3,"310":1,"312":1,"314":3,"318":2,"321":1,"322":1,"327":1,"335":1,"336":1,"337":2,"339":2,"342":3,"345":1,"346":1,"347":1,"349":3,"350":3,"360":1,"366":1,"367":1,"368":1,"369":1,"371":1,"374":1,"375":1,"377":2,"381":1,"382":2,"383":2,"388":4,"389":2,"405":1,"408":1,"411":1,"412":1,"417":1,"418":2,"419":1,"420":4,"421":2,"425":3,"426":2,"429":1,"430":1,"431":1,"435":1,"437":1,"438":1,"439":2,"444":1,"448":2,"449":4,"450":1,"451":5,"452":2,"453":2,"460":4,"461":5,"495":1,"500":1,"507":1,"536":1}}],["нахождение",{"2":{"524":1}}],["находят",{"2":{"449":1}}],["находятся",{"2":{"134":1,"145":1,"174":1,"409":1,"460":1,"526":1}}],["находимся",{"2":{"436":1}}],["находим",{"2":{"89":1,"322":1,"426":1}}],["находит",{"2":{"218":1}}],["находить",{"2":{"140":1,"273":1}}],["находиться",{"2":{"17":1,"43":1,"300":1,"318":1,"368":2}}],["находится",{"2":{"48":1,"135":1,"141":1,"153":2,"159":1,"177":1,"203":1,"218":1,"246":1,"261":1,"309":1,"342":2,"382":1,"435":1,"449":1,"460":1,"503":1,"537":1,"544":1}}],["находились",{"2":{"47":1}}],["накладные",{"2":{"343":1}}],["накладывает",{"2":{"276":1,"277":1}}],["наконец",{"2":{"132":1,"190":2,"192":1,"219":1,"222":2,"241":2,"246":1,"255":1,"298":1,"302":1,"321":2,"322":1,"332":1,"352":1,"371":1,"375":1,"383":1,"427":1,"438":1}}],["научимся",{"2":{"418":1,"431":1}}],["научиться",{"2":{"358":1,"430":1}}],["научились",{"2":{"249":1,"264":1,"426":1}}],["научных",{"2":{"190":1}}],["наоборот",{"2":{"195":1,"350":1,"391":1}}],["нажали",{"2":{"426":1}}],["нажав",{"2":{"263":1}}],["нажатию",{"2":{"506":1}}],["нажатии",{"2":{"246":1,"323":1,"534":1,"536":1}}],["нажатием",{"2":{"155":1,"214":1}}],["нажать",{"2":{"143":1,"218":1}}],["нажимая",{"2":{"426":1}}],["нажимать",{"2":{"220":1}}],["нажимает",{"2":{"184":1,"387":1}}],["нажмите",{"2":{"214":3,"263":1,"515":1}}],["нажмет",{"2":{"203":1}}],["нагружает",{"2":{"461":1}}],["нагрузку",{"2":{"322":1,"383":1}}],["нагрузке",{"2":{"320":1,"383":1}}],["нагрузки",{"2":{"131":1,"330":1,"383":1}}],["наглядные",{"2":{"335":1}}],["наглядно",{"2":{"162":1}}],["наглядность",{"2":{"159":1}}],["наглядности",{"2":{"113":1}}],["наглядной",{"2":{"154":1}}],["наглядного",{"2":{"67":1}}],["нанимаемой",{"2":{"125":1}}],["наивная",{"2":{"298":1}}],["наивной",{"2":{"297":1,"298":1,"299":1,"301":1}}],["наивную",{"2":{"293":1}}],["наименьшими",{"2":{"452":1}}],["наименьшей",{"2":{"229":1}}],["наименования",{"2":{"23":1,"496":1}}],["наилучшим",{"2":{"228":1,"232":1}}],["наибольшую",{"2":{"184":1}}],["наиболее",{"2":{"125":2,"128":1,"138":1,"154":1,"172":1,"174":1,"181":1,"188":1,"190":1,"195":1,"196":1,"211":1,"213":2,"215":1,"218":1,"232":1,"251":1,"255":1,"275":1,"277":1,"320":1,"327":2,"349":1,"355":1,"358":1,"366":2,"377":1,"380":3,"382":1,"386":1,"389":2,"393":1,"401":1,"419":1,"430":1,"437":1,"439":1,"443":1,"452":1,"485":1}}],["налету",{"2":{"461":1,"524":1}}],["налево",{"2":{"125":1}}],["наложенный",{"2":{"260":1}}],["налогов",{"2":{"183":1}}],["наличии",{"2":{"380":1}}],["наличия",{"2":{"255":1,"258":1,"273":1,"380":1,"451":1}}],["наличие",{"2":{"12":1,"135":1,"167":1,"219":1,"222":1,"292":1,"309":1,"388":1,"420":1,"422":1,"450":1}}],["навязывающим",{"2":{"495":1}}],["навык",{"2":{"335":1}}],["навыков",{"2":{"212":1}}],["навыки",{"2":{"136":1,"224":1,"354":1,"364":1,"390":1,"415":1,"441":1}}],["навигационная",{"2":{"530":1}}],["навигационное",{"2":{"530":1}}],["навигационного",{"2":{"371":1}}],["навигационной",{"2":{"165":1}}],["навигационных",{"2":{"371":1,"375":1,"382":1,"505":1}}],["навигационные",{"2":{"229":1,"371":1,"377":1}}],["навигационный",{"2":{"174":1}}],["навигацией",{"2":{"163":1,"256":1,"367":1,"390":1}}],["навигацию",{"2":{"161":1,"367":2,"369":1,"373":1,"374":1,"377":1,"380":1,"382":1,"428":1}}],["навигации",{"0":{"163":1},"1":{"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1},"2":{"125":1,"158":1,"164":1,"165":2,"167":1,"169":1,"172":2,"242":1,"260":1,"367":1,"368":2,"375":1,"376":1,"379":1,"380":1,"390":1}}],["навигация",{"0":{"375":1},"1":{"376":1,"377":1},"2":{"118":1,"127":1,"135":1,"161":1,"367":1,"371":1,"377":1,"536":1}}],["наведение",{"2":{"155":1}}],["наведем",{"2":{"83":1}}],["наверное",{"2":{"293":1,"321":1,"451":1,"461":1}}],["наверняка",{"2":{"48":1}}],["наверх",{"2":{"30":1}}],["натянуть",{"2":{"452":1}}],["нативная",{"2":{"301":1}}],["нативного",{"2":{"253":1,"451":1,"461":1}}],["нативное",{"2":{"157":1,"251":1}}],["нативно",{"2":{"153":1}}],["нативный",{"2":{"542":1}}],["нативным",{"2":{"461":1}}],["нативными",{"2":{"190":1,"260":1}}],["нативные",{"2":{"116":1,"301":1}}],["нативных",{"2":{"114":1,"242":1,"306":2,"461":1}}],["нативную",{"2":{"114":1}}],["натуры",{"2":{"9":1}}],["набросать",{"2":{"246":1}}],["набросок",{"2":{"228":1}}],["набрать",{"2":{"389":1}}],["набранный",{"2":{"222":1}}],["набрав",{"2":{"215":1}}],["набирает",{"2":{"222":1,"388":1}}],["набирать",{"2":{"219":1}}],["набирают",{"2":{"209":1}}],["набираются",{"2":{"206":1}}],["наберите",{"2":{"214":1}}],["наблюдает",{"2":{"297":1}}],["наблюдающий",{"2":{"162":1}}],["наблюдателю",{"2":{"298":1}}],["наблюдателей",{"2":{"297":4}}],["наблюдатели",{"2":{"297":3}}],["наблюдатель",{"0":{"297":1},"1":{"298":1},"2":{"297":2,"298":2}}],["наблюдателям",{"2":{"297":1,"298":1}}],["наблюдателя",{"2":{"161":1,"297":1,"301":1}}],["наблюдать",{"2":{"148":1,"297":1}}],["наблюдении",{"2":{"99":1}}],["набором",{"2":{"426":1}}],["наборов",{"2":{"418":1}}],["набору",{"2":{"295":1}}],["наборы",{"2":{"191":1,"193":1}}],["наборе",{"2":{"161":1}}],["наборами",{"2":{"421":1}}],["набора",{"2":{"143":1,"161":1,"212":1,"382":1}}],["набор",{"2":{"68":1,"141":1,"161":2,"190":1,"204":1,"255":1,"270":1,"309":1,"366":1,"407":1,"420":2,"424":1,"439":1}}],["назовите",{"2":{"391":1}}],["назвать",{"2":{"189":1,"225":1,"324":1}}],["названную",{"2":{"344":1}}],["названный",{"2":{"195":1,"315":1,"371":1}}],["названа",{"2":{"180":1}}],["названий",{"2":{"182":1}}],["названиемстор",{"2":{"449":1}}],["названием",{"2":{"149":1,"221":1,"242":1,"260":1,"287":1,"298":1,"418":1,"515":1}}],["название",{"2":{"44":1,"81":1,"93":1,"94":1,"155":1,"159":1,"195":1,"255":1,"328":1,"366":1,"460":1,"516":1}}],["названиями",{"2":{"369":1}}],["названия",{"2":{"23":1,"88":1,"159":1,"253":1,"256":1,"301":1}}],["назад",{"2":{"138":1,"158":1,"223":1,"247":1,"256":1,"380":2,"448":1}}],["назначению",{"2":{"333":1}}],["назначение",{"2":{"127":1,"241":1,"262":1,"306":1,"380":1}}],["назначения",{"2":{"124":1,"297":1,"327":1}}],["называть",{"2":{"215":1,"449":2}}],["называют",{"2":{"156":1,"277":1,"297":1,"366":2,"381":1}}],["называются",{"2":{"125":2,"126":1,"167":1,"240":1,"297":1,"389":2}}],["называет",{"2":{"409":1}}],["называется",{"2":{"96":1,"115":1,"128":1,"161":2,"174":1,"180":1,"192":1,"201":1,"238":1,"290":1,"366":1,"430":1,"431":2,"436":1,"440":1,"448":1,"449":1,"515":1,"524":1}}],["называемому",{"2":{"389":1}}],["называемой",{"2":{"125":1,"194":1}}],["называемая",{"2":{"301":1}}],["называемую",{"2":{"287":1,"339":1}}],["называемых",{"2":{"366":1}}],["называемыми",{"2":{"314":1}}],["называемые",{"2":{"196":1,"240":1,"253":1,"309":1,"389":1,"449":1}}],["называемый",{"2":{"195":1,"240":1,"297":1,"318":1}}],["начнут",{"2":{"435":1}}],["начните",{"2":{"417":1}}],["начнем",{"2":{"204":1,"212":1,"222":1,"240":1,"246":1,"309":1,"310":1,"320":1,"321":1,"322":1,"339":1,"340":1,"344":1,"351":1,"352":1,"369":1,"371":1,"373":1,"374":1,"375":2,"420":2,"421":2,"424":1,"431":1}}],["начнется",{"2":{"193":1}}],["начнете",{"2":{"172":1,"358":1}}],["начаться",{"2":{"314":1}}],["начать",{"2":{"107":1,"138":1,"191":1,"213":1,"250":1,"395":1,"424":1,"435":1,"438":1}}],["началу",{"2":{"421":1}}],["начали",{"2":{"224":1,"306":1,"436":1}}],["начальная",{"2":{"229":1}}],["начальный",{"2":{"229":1,"475":1}}],["начальных",{"2":{"215":1,"251":1}}],["начальным",{"2":{"162":1,"212":1,"226":1,"344":1}}],["начального",{"2":{"439":1,"460":1}}],["начальной",{"2":{"215":1}}],["начальное",{"2":{"199":1}}],["начальном",{"2":{"11":1,"217":1}}],["начало",{"2":{"212":1,"328":1,"431":1}}],["началось",{"2":{"159":1}}],["началом",{"2":{"148":1,"460":1}}],["начале",{"2":{"135":1,"174":1,"185":1,"192":1,"247":1,"289":1,"314":1,"328":1}}],["начала",{"2":{"23":1,"60":1,"141":1,"204":1,"247":1,"261":1,"314":1,"382":1,"417":1,"420":1,"423":1,"461":1,"495":1,"544":1}}],["начинаниях",{"2":{"363":1}}],["начинаете",{"2":{"336":1}}],["начинает",{"2":{"247":1,"332":1}}],["начинается",{"2":{"207":1,"222":2,"269":1,"358":1,"377":1,"426":1}}],["начинаем",{"2":{"222":1,"241":1,"246":2,"303":1,"309":1,"325":1,"342":1,"346":1,"347":1,"426":1}}],["начинаешь",{"2":{"81":1}}],["начинающим",{"2":{"496":1}}],["начинающий",{"2":{"495":1}}],["начинающих",{"2":{"444":1,"485":1}}],["начинающихся",{"2":{"222":1}}],["начинающему",{"2":{"460":1}}],["начинающемся",{"2":{"222":1}}],["начинающуюся",{"2":{"196":1}}],["начинаются",{"2":{"206":2,"376":1}}],["начинаться",{"2":{"206":1}}],["начинать",{"2":{"109":1,"191":1}}],["начиная",{"2":{"75":2,"136":1,"174":1,"194":1,"215":2,"229":1,"267":1,"269":1,"309":1,"342":1,"390":1,"396":1}}],["наряду",{"2":{"264":1,"366":1,"450":1}}],["нарезку",{"2":{"229":1}}],["нарушена",{"2":{"325":1}}],["нарушению",{"2":{"67":1}}],["нарушить",{"2":{"415":1}}],["нарушит",{"2":{"271":1}}],["нарушать",{"2":{"314":1}}],["нарушает",{"2":{"169":2,"234":1,"292":1,"297":1}}],["нарушаются",{"2":{"220":1}}],["нарушают",{"2":{"164":1}}],["наращивать",{"2":{"11":1,"190":1}}],["найдете",{"2":{"218":1}}],["найдем",{"2":{"86":1,"273":1}}],["найдена",{"2":{"294":1}}],["найдены",{"2":{"292":1}}],["найденные",{"2":{"27":1,"135":1}}],["найдено",{"2":{"10":2,"350":1}}],["найти",{"2":{"61":1,"116":1,"118":1,"120":1,"132":1,"133":1,"135":1,"139":1,"141":1,"143":1,"147":1,"148":1,"149":1,"152":1,"153":1,"202":1,"203":1,"213":2,"216":1,"217":1,"218":1,"219":1,"226":1,"227":1,"242":1,"246":1,"260":1,"261":1,"269":1,"325":1,"348":1,"349":1,"350":1,"365":1,"380":3,"383":1,"387":1,"416":1,"419":1,"421":1,"425":1,"426":1,"427":1,"428":1,"433":1,"434":1}}],["наполнения",{"2":{"494":1,"496":1}}],["напомним",{"2":{"307":1,"340":1}}],["напишите",{"2":{"417":1}}],["напишем",{"2":{"202":1,"422":1,"423":1}}],["написали",{"2":{"132":1}}],["написанным",{"2":{"450":1}}],["написанный",{"2":{"10":1,"107":1,"191":1}}],["написание",{"2":{"417":1,"450":1}}],["написанию",{"2":{"218":1,"425":1}}],["написании",{"2":{"209":1,"460":1,"461":1}}],["написания",{"2":{"107":1,"162":1,"190":1,"194":3,"203":1,"253":1,"425":1,"435":1}}],["написаны",{"2":{"193":1,"421":1}}],["написано",{"2":{"191":1}}],["написан",{"2":{"50":1,"81":1,"417":1}}],["написать",{"2":{"12":1,"26":1,"41":1,"81":1,"98":1,"107":2,"222":1,"246":1,"274":1,"316":1,"418":1,"421":1,"460":1,"461":1}}],["напротив",{"2":{"380":1}}],["направленные",{"2":{"188":1}}],["направленную",{"2":{"177":1}}],["направление",{"2":{"426":1}}],["направлением",{"0":{"144":1}}],["направлению",{"2":{"172":1}}],["направлении",{"2":{"147":2,"173":1,"238":1}}],["направлений",{"2":{"147":1}}],["направляя",{"2":{"173":1}}],["направляют",{"2":{"140":1}}],["направляться",{"2":{"130":1}}],["направлять",{"2":{"125":1,"126":1,"128":1}}],["направляется",{"2":{"106":1}}],["направляет",{"2":{"106":1,"299":1,"300":1}}],["направить",{"2":{"142":1,"318":1}}],["напрямую",{"2":{"20":1,"55":1,"187":1,"192":1,"195":1,"222":1,"261":1,"271":1,"287":1,"292":1,"301":1,"314":1,"315":1,"318":1,"344":1,"349":1,"350":1,"374":1,"421":1,"443":1,"448":1,"453":1,"454":1,"461":1}}],["например",{"2":{"3":1,"12":1,"16":1,"18":1,"23":1,"41":2,"47":2,"48":1,"58":1,"83":1,"89":1,"97":1,"106":6,"107":6,"108":1,"115":2,"116":1,"117":1,"119":1,"125":4,"126":1,"127":1,"134":1,"141":2,"143":1,"145":1,"147":1,"148":1,"154":2,"155":2,"158":1,"159":2,"161":2,"164":1,"165":2,"169":3,"170":2,"173":1,"174":1,"175":1,"179":1,"182":1,"191":3,"195":4,"197":1,"198":1,"200":1,"202":1,"203":1,"205":1,"206":4,"207":1,"208":1,"209":1,"215":2,"216":1,"218":2,"219":1,"222":1,"223":1,"230":1,"231":1,"236":3,"238":2,"240":4,"241":1,"253":3,"257":1,"258":1,"259":1,"260":2,"269":2,"273":1,"274":1,"277":1,"284":3,"288":1,"290":2,"296":1,"298":1,"299":1,"300":1,"301":3,"302":1,"303":1,"306":1,"307":1,"309":1,"314":1,"315":1,"316":1,"319":1,"327":2,"328":1,"339":1,"340":1,"348":1,"350":2,"371":1,"377":1,"381":1,"383":2,"385":1,"386":2,"387":1,"388":4,"389":1,"405":2,"409":3,"410":2,"411":1,"412":1,"417":1,"418":1,"421":2,"422":2,"423":1,"427":1,"432":1,"436":1,"439":2,"440":1,"444":2,"449":5,"451":4,"453":1,"454":1,"457":1,"461":2,"492":2,"536":1}}],["намекнули",{"2":{"310":1}}],["намекает",{"2":{"247":1}}],["намеренная",{"0":{"422":1}}],["намеренное",{"2":{"185":1}}],["намеренно",{"2":{"181":1,"220":1}}],["намереваясь",{"2":{"184":1}}],["намечены",{"2":{"36":1}}],["намеченные",{"2":{"10":1}}],["нами",{"2":{"125":1,"169":1,"221":1,"309":1,"371":1,"385":1,"440":1}}],["намного",{"2":{"13":1,"20":1,"47":1,"55":1,"366":1,"444":1,"449":1,"451":2,"454":1,"459":2,"460":1,"461":3}}],["нам",{"2":{"7":1,"39":2,"41":1,"50":1,"112":1,"124":2,"125":1,"126":5,"128":4,"131":1,"132":1,"140":1,"149":1,"160":1,"161":1,"190":1,"191":1,"192":1,"193":2,"195":3,"202":1,"203":2,"214":1,"215":3,"218":1,"219":1,"220":1,"221":2,"222":5,"230":1,"231":1,"232":3,"234":1,"235":1,"238":2,"239":1,"240":1,"241":1,"246":3,"248":1,"249":1,"253":1,"260":1,"261":1,"262":2,"270":1,"293":1,"294":2,"296":1,"301":2,"302":1,"303":1,"304":1,"309":3,"312":1,"314":1,"315":2,"317":1,"318":1,"321":1,"331":2,"332":1,"340":2,"341":1,"342":2,"344":1,"345":5,"347":2,"349":1,"355":1,"367":1,"374":4,"377":3,"380":1,"381":2,"383":2,"384":1,"385":2,"389":1,"418":3,"419":3,"420":3,"421":1,"423":3,"424":4,"425":2,"426":3,"428":3,"429":1,"430":1,"435":1,"436":1}}],["нашли",{"2":{"358":1}}],["наша",{"2":{"214":1,"223":2,"241":1,"247":1,"308":1,"339":1,"369":1,"426":1}}],["нашу",{"2":{"162":1,"177":1,"218":1,"221":1,"222":1,"241":1,"247":1,"261":1,"273":1,"325":1,"338":2,"339":1,"436":1,"439":1}}],["нашей",{"2":{"214":1,"215":1,"218":1,"222":4,"223":1,"247":1,"262":1,"298":1,"302":1,"309":3,"312":1,"320":2,"323":1,"332":1,"339":1,"341":1,"342":1,"382":2,"386":1,"430":2,"431":1,"435":1,"439":1}}],["наше",{"2":{"111":1,"125":1,"126":2,"128":3,"192":2,"212":1,"215":1,"216":1,"219":1,"223":2,"224":1,"226":1,"246":1,"248":1,"249":1,"260":1,"263":1,"264":1,"307":1,"317":1,"318":1,"319":1,"324":1,"327":1,"340":1,"344":1,"364":1,"368":1,"369":1,"371":1,"383":1,"387":1,"388":1,"389":1,"390":1}}],["нашего",{"0":{"223":1,"244":1,"247":1,"248":1},"2":{"14":1,"27":1,"98":1,"111":2,"122":2,"124":2,"125":1,"126":2,"127":1,"128":3,"130":1,"131":1,"136":4,"137":1,"162":1,"192":1,"193":2,"194":5,"195":1,"212":1,"214":3,"215":5,"216":2,"217":2,"218":1,"221":1,"222":4,"234":2,"235":1,"238":1,"242":1,"246":2,"247":4,"249":1,"255":3,"260":4,"261":1,"262":1,"293":1,"316":1,"317":2,"320":1,"325":1,"331":1,"333":3,"335":1,"339":1,"342":1,"343":1,"350":1,"351":1,"352":2,"353":1,"354":1,"368":3,"370":1,"374":3,"377":1,"380":1,"382":3,"383":1,"385":3,"386":2,"387":1,"388":4,"389":1,"415":2,"420":2,"424":1,"425":2,"426":2,"427":1,"428":3,"429":1,"435":1,"436":3,"441":1}}],["нашему",{"2":{"125":1,"128":1,"132":1,"162":1,"215":1,"221":1,"223":1,"224":1,"234":1,"243":1,"258":1,"261":1,"295":1,"313":1,"318":1,"345":1,"349":1,"371":2,"372":1,"383":1,"386":1,"389":1,"431":1}}],["нашем",{"2":{"5":1,"11":1,"47":1,"115":1,"125":1,"127":1,"128":1,"141":1,"162":1,"195":2,"202":1,"214":1,"218":1,"222":1,"223":1,"231":1,"232":3,"235":1,"246":8,"247":4,"255":1,"260":1,"261":1,"293":1,"298":1,"306":1,"309":1,"314":1,"316":1,"317":1,"318":1,"320":1,"325":1,"326":1,"339":1,"340":1,"341":1,"344":1,"345":2,"346":1,"347":1,"351":1,"352":1,"368":2,"369":1,"373":2,"374":1,"381":1,"383":3,"386":1,"389":3,"417":1,"418":2,"420":2,"424":1,"426":1,"428":3,"438":1,"441":1}}],["наш",{"0":{"419":1},"2":{"4":1,"9":1,"12":1,"39":1,"41":2,"91":1,"98":1,"103":1,"127":2,"132":1,"133":1,"134":1,"162":1,"193":1,"194":1,"195":2,"213":1,"214":1,"215":2,"216":1,"218":3,"219":1,"220":2,"221":4,"222":4,"223":3,"224":1,"226":1,"229":1,"232":1,"235":1,"240":1,"245":1,"246":4,"247":3,"260":3,"261":2,"263":1,"309":1,"315":2,"316":2,"323":1,"324":2,"327":1,"328":1,"329":2,"330":1,"339":2,"340":1,"342":1,"344":1,"345":2,"347":1,"349":1,"351":1,"352":3,"367":1,"369":1,"371":2,"373":2,"374":2,"377":2,"382":1,"383":2,"386":1,"387":1,"388":2,"408":1,"419":2,"420":5,"422":1,"425":3,"428":2,"436":1,"439":1}}],["наших",{"2":{"136":1,"141":1,"145":1,"193":1,"214":1,"218":3,"221":1,"222":1,"241":1,"247":1,"255":1,"287":1,"302":1,"306":1,"309":1,"316":1,"317":2,"318":1,"349":1,"350":1,"351":1,"352":1,"354":1,"375":1,"377":2,"381":1,"383":2,"389":2,"390":1,"415":1,"418":1,"420":1,"421":1,"423":1,"425":2,"426":2,"427":3,"428":1,"431":1,"436":1,"442":1}}],["нашими",{"2":{"222":1,"317":1,"347":1,"354":1,"368":1,"369":1,"371":1}}],["нашим",{"2":{"52":1,"116":1,"130":1,"162":1,"192":1,"214":1,"215":1,"222":1,"226":1,"246":2,"248":1,"302":1,"318":1,"323":1,"343":1,"344":1,"377":2,"382":1,"415":1,"426":1}}],["наши",{"0":{"0":1},"2":{"7":1,"128":1,"133":1,"134":2,"193":2,"194":1,"195":2,"212":1,"215":1,"216":1,"223":1,"226":1,"244":1,"247":1,"248":1,"253":1,"270":1,"312":1,"335":1,"340":1,"341":1,"347":1,"368":4,"371":1,"377":1,"382":1,"386":2,"418":1,"420":1,"423":3,"424":1,"426":1}}],["надстройку",{"2":{"495":1}}],["надёжней",{"2":{"444":1}}],["наделите",{"2":{"271":1}}],["наделение",{"2":{"161":1}}],["надеюсь",{"2":{"140":1,"253":1,"301":1}}],["надежного",{"2":{"344":1,"461":1}}],["надежное",{"2":{"232":1,"317":1,"408":1}}],["надежность",{"2":{"17":1}}],["надежные",{"2":{"358":1}}],["надежными",{"2":{"251":1}}],["надежных",{"2":{"226":1,"359":1,"451":1}}],["надежный",{"2":{"106":1,"128":1}}],["надежная",{"2":{"135":1}}],["надобности",{"2":{"527":1}}],["надо",{"2":{"39":1,"41":2,"47":1,"81":2,"86":1,"99":1,"103":1,"407":1,"408":1,"449":2,"451":3,"452":3,"460":2,"527":1}}],["над",{"0":{"270":1,"454":1},"2":{"4":1,"25":1,"83":1,"99":4,"122":1,"150":1,"155":1,"157":1,"195":2,"213":1,"219":1,"235":1,"246":2,"247":1,"249":1,"262":2,"270":1,"299":1,"321":1,"395":1,"421":1,"439":2,"451":1,"461":1,"484":1}}],["насыщенные",{"2":{"366":1}}],["насыщенного",{"2":{"248":1}}],["наследуют",{"2":{"377":1}}],["наследуемая",{"2":{"270":1}}],["наследованием",{"0":{"270":1},"2":{"270":1,"452":2}}],["наследования",{"2":{"266":1,"270":3,"303":1,"448":1}}],["насколько",{"2":{"191":1,"214":1,"272":1}}],["насчет",{"2":{"20":1,"225":1,"248":1}}],["настал",{"2":{"306":1}}],["настало",{"2":{"214":1,"215":1,"246":1,"260":1,"351":1,"419":1}}],["настоятельно",{"2":{"213":1,"272":1}}],["настоящий",{"2":{"260":1}}],["настоящему",{"2":{"253":1,"306":1}}],["настоящее",{"2":{"125":2,"152":1,"165":1,"168":1,"174":1,"387":1,"389":1,"415":1}}],["настоящую",{"2":{"17":1}}],["настольная",{"2":{"260":1}}],["настольном",{"2":{"255":1}}],["настольному",{"2":{"172":1}}],["настольные",{"2":{"253":1}}],["настольными",{"2":{"190":1,"253":2}}],["настольных",{"2":{"164":2,"172":1,"251":1,"253":1,"260":1,"366":1}}],["настолько",{"2":{"128":1,"172":1,"173":2,"191":1,"242":1,"350":1,"461":1}}],["настройте",{"2":{"460":1}}],["настройку",{"2":{"246":1,"444":1,"448":2}}],["настройкой",{"2":{"246":1}}],["настройке",{"2":{"136":1,"439":1}}],["настройках",{"2":{"385":1}}],["настройками",{"2":{"162":1,"253":1}}],["настройка",{"0":{"131":1,"214":1,"244":1,"444":1,"516":1},"1":{"132":1},"2":{"112":1,"122":1,"178":1,"212":1,"253":1,"439":1,"443":2,"444":1,"495":1}}],["настройки",{"2":{"98":1,"371":1,"410":2,"429":1,"443":1,"541":1}}],["настроили",{"2":{"332":1}}],["настроить",{"2":{"11":1,"125":2,"126":1,"134":1,"440":1,"443":2,"444":1}}],["настроен",{"2":{"408":1}}],["настроена",{"2":{"134":2}}],["настроек",{"2":{"153":1,"222":1,"444":2,"448":1}}],["настраивает",{"2":{"135":1}}],["настраивается",{"2":{"108":1,"253":1}}],["настраиваемой",{"2":{"194":1}}],["настраиваемым",{"2":{"246":1}}],["настраиваемыми",{"2":{"135":1}}],["настраиваемые",{"0":{"237":1},"2":{"77":1}}],["настраиваем",{"2":{"103":1,"439":1}}],["настраивать",{"2":{"62":1,"262":1,"359":1}}],["нас",{"0":{"486":1},"2":{"3":1,"12":1,"16":1,"17":1,"29":1,"36":1,"41":1,"43":1,"48":1,"86":1,"88":1,"96":2,"103":1,"106":1,"114":1,"135":1,"149":1,"162":3,"194":1,"195":2,"209":1,"214":1,"215":1,"222":4,"228":1,"235":1,"237":2,"240":1,"248":1,"260":1,"261":1,"270":1,"302":1,"307":1,"309":2,"316":1,"320":1,"337":1,"339":1,"342":1,"347":1,"375":1,"377":3,"382":1,"383":3,"408":1,"420":2,"423":1,"452":1}}],["на",{"0":{"0":1,"4":1,"96":1,"102":1,"134":1,"357":1,"404":1,"514":1},"1":{"515":1,"516":1},"2":{"2":2,"3":6,"4":1,"6":2,"7":1,"10":2,"11":3,"12":3,"13":2,"16":1,"17":1,"20":3,"23":5,"27":1,"33":1,"34":1,"36":2,"39":5,"40":3,"41":4,"43":1,"44":2,"47":3,"48":1,"50":1,"57":1,"58":1,"62":1,"66":1,"67":2,"68":1,"70":1,"71":1,"78":1,"81":3,"83":2,"86":2,"87":1,"88":1,"89":2,"90":1,"93":1,"94":3,"96":2,"102":1,"103":1,"105":4,"106":14,"107":8,"108":5,"109":11,"110":3,"112":1,"114":2,"116":6,"117":2,"121":3,"125":13,"126":4,"127":6,"128":5,"130":1,"131":3,"133":1,"134":9,"135":5,"136":2,"137":1,"138":3,"139":1,"140":4,"141":1,"142":3,"143":2,"144":1,"145":1,"147":4,"148":2,"149":3,"150":2,"153":2,"154":3,"155":1,"156":5,"157":2,"158":4,"159":4,"161":5,"162":8,"164":2,"165":1,"166":1,"167":4,"168":2,"169":3,"172":4,"173":4,"174":5,"175":1,"177":3,"178":2,"181":2,"183":1,"186":9,"188":2,"190":3,"191":10,"192":8,"193":2,"194":3,"195":8,"196":1,"199":1,"200":4,"202":3,"203":6,"206":3,"209":1,"211":1,"212":2,"213":6,"214":7,"215":5,"216":3,"217":4,"218":3,"219":6,"220":3,"221":1,"222":9,"223":1,"227":1,"228":1,"229":2,"230":3,"231":5,"232":2,"235":3,"236":2,"237":3,"238":2,"240":3,"241":3,"242":3,"243":1,"246":7,"247":6,"248":1,"249":1,"250":1,"251":3,"253":7,"254":1,"255":1,"256":1,"258":3,"259":1,"260":14,"261":3,"263":2,"264":1,"265":1,"266":3,"267":2,"269":6,"270":2,"271":5,"272":2,"273":2,"274":1,"275":1,"276":2,"277":6,"278":1,"281":1,"282":1,"284":1,"287":2,"288":1,"290":1,"292":2,"293":4,"296":2,"297":5,"298":1,"299":1,"300":3,"301":3,"302":3,"303":5,"305":1,"306":2,"307":1,"308":2,"309":2,"310":3,"314":17,"315":3,"316":2,"317":2,"318":2,"319":1,"320":1,"321":5,"322":1,"323":3,"324":3,"325":3,"326":2,"327":6,"329":1,"330":1,"331":1,"332":2,"333":1,"334":1,"335":2,"337":4,"340":3,"342":4,"343":3,"345":1,"346":1,"347":2,"349":2,"350":12,"351":1,"352":2,"353":1,"360":3,"361":2,"363":1,"364":3,"365":1,"366":6,"367":1,"369":6,"371":5,"374":10,"375":1,"376":1,"377":3,"381":1,"382":5,"383":6,"384":2,"385":3,"386":5,"387":8,"388":5,"389":6,"394":1,"398":1,"401":1,"402":1,"405":2,"407":4,"408":12,"409":2,"410":3,"412":2,"415":3,"417":7,"418":3,"419":2,"420":4,"421":5,"422":1,"423":3,"424":1,"426":6,"427":1,"428":2,"429":2,"431":2,"432":2,"433":1,"435":4,"437":2,"438":2,"439":5,"440":4,"441":1,"442":1,"443":3,"444":5,"448":7,"449":11,"450":8,"451":11,"452":8,"453":1,"454":2,"456":3,"459":5,"460":23,"461":16,"469":1,"470":1,"484":1,"486":1,"492":2,"496":3,"497":1,"499":2,"504":1,"505":1,"506":1,"507":1,"508":1,"515":2,"517":1,"524":1,"528":1,"530":2,"533":3,"534":1,"536":1,"537":1,"542":2,"543":1,"544":1}}],["пдд",{"2":{"460":1}}],["пк",{"2":{"444":2}}],["пытаются",{"2":{"302":1,"452":1}}],["пытаться",{"2":{"270":1,"271":1,"275":1,"452":1}}],["пытается",{"2":{"261":1,"427":1,"444":1}}],["птицы",{"2":{"140":1}}],["псевдонима",{"2":{"219":1}}],["псевдонимов",{"2":{"219":1}}],["псевдонимы",{"2":{"215":1}}],["псевдоним",{"2":{"125":1,"219":1,"221":1}}],["пятого",{"2":{"66":1}}],["пятью",{"2":{"158":1}}],["пять",{"2":{"36":1,"200":1}}],["песочницы",{"2":{"444":1}}],["песочнице",{"2":{"443":1}}],["пешеходного",{"2":{"253":1}}],["пейджера",{"2":{"161":2}}],["пейджером",{"2":{"161":1}}],["пейджер",{"0":{"161":1},"1":{"162":1},"2":{"161":2}}],["печатает",{"2":{"316":1}}],["печати",{"2":{"256":1}}],["печать",{"2":{"149":2}}],["печатными",{"2":{"138":1}}],["печально",{"2":{"122":1}}],["петлю",{"2":{"125":1}}],["пет",{"2":{"62":1,"408":1}}],["периодическая",{"2":{"219":1}}],["периодически",{"2":{"212":1}}],["периода",{"2":{"179":1}}],["первую",{"2":{"247":1,"309":1,"314":1,"318":1}}],["первые",{"2":{"314":1,"424":1}}],["первых",{"2":{"312":1,"366":1,"460":1,"485":1}}],["первым",{"2":{"173":1,"246":1,"248":1,"328":1}}],["первый",{"2":{"93":1,"96":1,"125":1,"169":1,"173":1,"183":1,"195":1,"213":1,"223":1,"273":1,"286":1,"303":1,"309":1,"332":1,"371":1,"374":2,"376":1,"421":2,"436":1}}],["первичный",{"2":{"142":1}}],["первая",{"2":{"114":1,"174":1,"178":1,"260":1,"314":1,"387":1,"436":2}}],["первоклассные",{"2":{"190":1}}],["первоначальном",{"2":{"197":1}}],["первоначальной",{"2":{"183":1}}],["первоначальный",{"2":{"174":1,"229":1,"382":1}}],["первое",{"2":{"155":1,"222":1,"254":1,"387":1}}],["первой",{"2":{"17":1,"162":1,"174":1,"266":1,"314":3,"371":1,"374":1,"389":1,"421":1,"435":1,"436":1,"460":1,"461":1}}],["первого",{"2":{"11":1,"17":1,"138":1,"141":1,"151":1,"167":1,"172":1,"192":1,"236":1,"292":1,"314":1,"346":1,"349":1,"421":1,"425":1,"426":2,"449":1}}],["первом",{"2":{"6":1,"7":1,"11":1,"17":2,"23":1,"47":1,"71":1,"106":2,"222":2,"287":1,"301":1,"310":1,"424":1,"461":1}}],["персонализация",{"0":{"86":1}}],["перспективе",{"2":{"68":1,"277":1}}],["переопределение",{"2":{"545":1}}],["переутомлению",{"2":{"415":1}}],["переупаковывать",{"2":{"253":1}}],["переиспользуемые",{"2":{"496":1}}],["переиспользовать",{"2":{"409":1}}],["переименовывая",{"2":{"455":1}}],["переименовываются",{"2":{"412":1}}],["переименовываем",{"2":{"87":1}}],["переименуем",{"2":{"91":1}}],["переадресация",{"2":{"385":1}}],["перезаписывание",{"2":{"489":1}}],["перезаписываем",{"2":{"430":1}}],["перезаписью",{"2":{"371":1}}],["перезагрузка",{"2":{"533":1}}],["перезагрузку",{"2":{"408":1}}],["перезагрузкой",{"2":{"215":1,"366":1}}],["перезагружается",{"2":{"374":1}}],["перечисленные",{"2":{"417":1}}],["перечисленных",{"2":{"388":1}}],["перечислены",{"2":{"377":1}}],["перечислим",{"2":{"366":1}}],["перечень",{"2":{"187":1}}],["перебирать",{"2":{"222":1}}],["перевыполняет",{"2":{"421":1}}],["перевычеслены",{"2":{"222":1}}],["перевода",{"2":{"410":1,"524":1}}],["перевод",{"0":{"357":1},"2":{"460":1,"464":1,"524":1}}],["переводчика",{"2":{"213":1}}],["перевешивают",{"2":{"253":1,"309":1}}],["перевести",{"2":{"67":1,"109":1}}],["перерасти",{"2":{"191":1}}],["перепишите",{"2":{"226":1}}],["переписывание",{"2":{"450":1}}],["переписываете",{"2":{"449":1}}],["переписывать",{"2":{"129":1,"303":1,"430":1}}],["переписать",{"2":{"346":1}}],["переписанный",{"2":{"111":1}}],["переполнение",{"2":{"162":1}}],["перекомпоновать",{"2":{"326":1}}],["перекрывают",{"2":{"253":1}}],["перекрестного",{"2":{"108":1}}],["переключитесь",{"2":{"437":1}}],["переключателя",{"2":{"531":1}}],["переключатель",{"2":{"302":1}}],["переключаться",{"2":{"199":1,"431":1}}],["переключать",{"2":{"164":1}}],["переключения",{"2":{"154":1,"172":1}}],["переключение",{"2":{"153":1,"230":1,"531":1,"545":3}}],["перегружена",{"2":{"364":1}}],["перегруженности",{"2":{"158":1}}],["перегруженных",{"2":{"148":1}}],["перегружать",{"2":{"148":1,"169":1}}],["перейдите",{"2":{"515":1}}],["перейдем",{"2":{"134":1,"141":1,"143":1,"220":1,"295":1,"339":1,"425":1,"438":1}}],["перейти",{"2":{"38":1,"158":1,"306":1,"320":1,"353":1,"377":1,"389":1,"499":1}}],["перехвачен",{"2":{"383":1}}],["перехваченные",{"2":{"303":1}}],["перехвачена",{"2":{"302":1}}],["перехватчиков",{"2":{"499":1}}],["перехватчики",{"2":{"352":1}}],["перехвата",{"2":{"352":2}}],["перехватываем",{"2":{"326":1,"426":1}}],["перехватывается",{"2":{"302":1}}],["перехватывает",{"2":{"261":1,"304":1}}],["перехватывать",{"2":{"301":1}}],["перехватываться",{"2":{"130":1}}],["перехватывая",{"2":{"261":1,"301":1,"426":1}}],["перехвате",{"2":{"260":1}}],["перехватить",{"2":{"237":1,"385":1}}],["перехвату",{"2":{"222":1}}],["переходом",{"2":{"380":1}}],["переходов",{"2":{"203":1}}],["переходе",{"2":{"186":1}}],["переходят",{"2":{"172":1}}],["переходит",{"2":{"172":1,"270":1}}],["переходить",{"2":{"110":1,"229":1,"247":1}}],["переходим",{"2":{"125":1,"387":1}}],["переход",{"2":{"109":1,"110":1,"121":3,"247":1,"349":1,"378":1,"437":1,"454":1}}],["перехода",{"2":{"20":1,"164":1,"167":1,"203":1,"367":1,"371":1,"376":1,"378":1,"405":1}}],["пересылает",{"2":{"461":1}}],["пересылаемый",{"2":{"106":1}}],["перестанет",{"2":{"453":1}}],["перестает",{"2":{"297":1,"449":1}}],["пересчитали",{"2":{"451":1}}],["пересчет",{"2":{"222":1}}],["пересчете",{"2":{"125":1}}],["пересмотреть",{"2":{"339":1}}],["пересмотрите",{"2":{"126":1}}],["пересекаться",{"2":{"380":1}}],["пересекаются",{"2":{"176":1}}],["пересечении",{"2":{"161":1}}],["перешло",{"2":{"118":1}}],["перешел",{"2":{"117":1}}],["перемещения",{"2":{"239":1,"256":1,"435":1}}],["перемещая",{"2":{"455":1}}],["перемещать",{"2":{"222":1}}],["перемещаться",{"2":{"161":1}}],["перемещается",{"2":{"172":1,"222":1}}],["перемещает",{"2":{"147":1}}],["переместившись",{"2":{"437":1}}],["переместит",{"2":{"220":1}}],["переместился",{"2":{"117":1,"215":1}}],["переменным",{"2":{"195":2}}],["переменными",{"2":{"195":1}}],["переменные",{"0":{"205":1},"2":{"192":1,"194":1,"195":4,"222":2,"233":1,"238":1,"241":1,"247":1,"273":1,"309":1,"330":1,"344":1,"449":1,"451":2,"545":1}}],["переменных",{"2":{"114":1,"191":1,"195":1,"203":1,"222":1,"260":1,"325":1,"448":1,"545":1}}],["переменную",{"2":{"164":1,"191":1,"195":2,"198":1,"202":1,"222":2,"240":1,"241":1,"242":1,"287":1,"337":2,"338":2,"342":1,"344":1,"449":2,"451":1}}],["переменная",{"2":{"162":1,"191":1,"192":1,"195":1,"197":3,"198":2,"222":1,"230":1,"237":1,"246":1,"247":2,"309":1,"451":2}}],["переменной",{"2":{"96":1,"106":1,"162":2,"191":2,"192":1,"195":3,"197":2,"201":2,"203":2,"222":1,"223":1,"237":2,"246":1,"330":2,"339":1,"342":1,"371":1,"448":2,"449":1,"451":2,"536":1}}],["перелогиниваться",{"2":{"106":1}}],["перелогин",{"2":{"106":1}}],["переделать",{"2":{"364":1}}],["передаст",{"2":{"387":1}}],["передадим",{"2":{"371":1}}],["передаю",{"2":{"449":1}}],["передающих",{"2":{"321":1}}],["передают",{"2":{"299":1,"337":1}}],["передаются",{"2":{"236":2,"326":1,"332":1}}],["переданной",{"2":{"421":1}}],["переданное",{"2":{"352":1,"426":1}}],["переданного",{"2":{"321":1}}],["переданному",{"2":{"308":1}}],["переданную",{"2":{"294":1,"385":1}}],["переданные",{"2":{"315":1,"321":1}}],["переданными",{"2":{"426":1}}],["переданным",{"2":{"199":1,"391":1}}],["переданный",{"2":{"114":1}}],["переданы",{"2":{"246":1}}],["передан",{"2":{"240":1,"371":1,"377":1}}],["передач",{"2":{"460":1}}],["передача",{"2":{"292":1,"293":2,"376":1,"411":1}}],["передаче",{"2":{"215":1}}],["передачи",{"2":{"195":1,"236":1,"238":1,"240":1,"292":1,"337":1,"383":1}}],["передачу",{"2":{"134":1}}],["передаваемых",{"2":{"327":1}}],["передаваемые",{"2":{"305":1,"314":1,"385":1}}],["передаваемой",{"2":{"330":1}}],["передаваемое",{"2":{"321":1}}],["передаваемому",{"2":{"240":1}}],["передавать",{"2":{"219":2,"230":1,"236":1,"238":1,"240":1,"309":1,"314":1,"318":1,"339":2,"340":1,"377":1,"388":1,"410":1,"451":1}}],["передаваться",{"2":{"127":1,"242":1,"325":1,"337":1}}],["передавая",{"2":{"192":1,"219":1,"231":1,"298":1,"301":1,"322":1,"371":1,"410":1,"425":1}}],["передав",{"2":{"126":1,"374":1}}],["передает",{"2":{"240":1,"298":1,"382":1,"419":1}}],["передается",{"2":{"118":1,"187":1,"290":1}}],["передаем",{"2":{"111":1,"127":1,"162":1,"192":1,"262":1,"308":1,"309":1,"322":1,"326":1,"330":1,"332":2,"338":1,"342":1,"347":1,"371":2,"377":2,"387":1,"425":2,"426":3}}],["передаёт",{"2":{"106":1}}],["передать",{"2":{"47":1,"132":1,"162":1,"194":1,"235":2,"237":1,"276":1,"298":1,"325":1,"337":2,"374":2,"383":1,"426":1,"449":2}}],["перед",{"2":{"103":1,"148":1,"149":1,"162":1,"165":1,"166":1,"180":1,"191":2,"195":1,"214":1,"215":1,"235":1,"238":1,"260":1,"273":2,"291":1,"293":1,"303":1,"309":1,"317":1,"318":1,"371":1,"374":1,"380":1,"389":1,"412":1,"438":1,"440":1,"460":1,"495":1}}],["переехать",{"2":{"39":1}}],["перенесенного",{"2":{"314":1}}],["перенесена",{"2":{"293":1}}],["перенести",{"2":{"86":1,"133":1}}],["перенаправить",{"2":{"387":1}}],["перенаправит",{"2":{"385":1}}],["перенаправлен",{"2":{"384":1}}],["перенаправления",{"2":{"384":2,"385":1}}],["перенаправлениях",{"2":{"383":1}}],["перенаправление",{"2":{"186":1,"387":1}}],["перенаправляющие",{"2":{"386":1}}],["перенаправляют",{"2":{"186":1}}],["перенаправляем",{"2":{"384":1}}],["перенаправляться",{"2":{"383":1}}],["перенасыщенности",{"2":{"158":1}}],["переноса",{"2":{"226":1}}],["переносить",{"2":{"203":1,"366":1}}],["переносится",{"2":{"30":1,"285":1,"444":1}}],["переносе",{"2":{"190":1}}],["перенос",{"0":{"134":1},"2":{"389":1}}],["перенять",{"2":{"26":1}}],["плевел",{"2":{"460":1}}],["плечах",{"2":{"145":1}}],["плохая",{"2":{"449":2}}],["плохие",{"2":{"277":1,"459":1}}],["плохую",{"2":{"277":1}}],["плохой",{"2":{"140":1,"274":1,"448":1}}],["плохо",{"2":{"64":1,"448":1,"459":1}}],["плавность",{"2":{"314":1}}],["плавающее",{"2":{"182":1}}],["плавающей",{"2":{"174":1}}],["плавающего",{"2":{"157":1}}],["плавающий",{"2":{"155":1}}],["платежей",{"2":{"452":1}}],["плату",{"2":{"439":1}}],["платформах",{"2":{"442":1}}],["платформа",{"2":{"260":3,"439":1}}],["платформы",{"2":{"253":1,"255":1,"258":1,"260":1,"264":1}}],["платных",{"2":{"386":1}}],["платные",{"2":{"39":1,"460":1}}],["платная",{"2":{"213":2}}],["платить",{"2":{"195":1}}],["плагину",{"2":{"262":1}}],["плагине",{"2":{"242":1,"246":1}}],["плагинами",{"2":{"443":1}}],["плагина",{"2":{"226":1,"238":1,"245":1,"246":3,"247":1,"261":1,"264":1,"371":1,"461":1,"503":1}}],["плагином",{"2":{"219":1,"243":1,"246":1}}],["плагинов",{"0":{"112":1},"2":{"110":1,"112":1,"116":1,"190":1,"194":1,"219":2,"243":1,"262":1,"322":1,"349":1,"443":1,"444":1}}],["плагин",{"0":{"243":1,"262":1},"1":{"244":1,"245":1,"246":1},"2":{"116":2,"213":1,"226":1,"232":1,"243":1,"245":1,"246":4,"247":2,"249":1,"250":1,"261":1,"262":6,"332":3,"367":1,"503":1}}],["плагины",{"2":{"98":1,"110":1,"111":1,"112":1,"121":1,"190":1,"215":1,"243":1,"244":1,"251":1,"389":1,"443":1,"449":1}}],["планшетов",{"2":{"506":1}}],["планшеты",{"2":{"253":1}}],["планирования",{"2":{"319":1,"320":1}}],["планирование",{"2":{"319":1}}],["планироваться",{"2":{"319":1}}],["планируется",{"2":{"63":1,"496":1}}],["планов",{"2":{"181":1}}],["планы",{"2":{"107":2}}],["план",{"0":{"65":1},"1":{"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1},"2":{"415":1,"417":2}}],["планах",{"0":{"533":1}}],["планами",{"2":{"407":1}}],["плана",{"2":{"40":1,"66":1,"320":1,"418":1}}],["плане",{"2":{"9":1,"25":1,"223":1,"448":1,"449":1,"459":1}}],["плюсы",{"2":{"449":1,"459":2}}],["плюсом",{"2":{"222":1}}],["плюс",{"2":{"25":1,"55":1,"106":1,"195":1,"220":1,"326":1,"408":1,"420":1,"449":1}}],["пищеварительной",{"2":{"269":1}}],["пишут",{"2":{"276":1}}],["пишутся",{"2":{"205":1,"208":1}}],["пишет",{"2":{"461":1}}],["пишете",{"2":{"273":1,"274":1}}],["пишем",{"2":{"9":1,"194":1}}],["пиши",{"0":{"276":1},"1":{"279":1,"280":1,"281":1,"282":1},"2":{"266":1,"274":1}}],["пикселей",{"2":{"172":1}}],["пиктограмму",{"2":{"170":1}}],["пиктограмм",{"2":{"167":1}}],["пиктограммами",{"2":{"164":2}}],["пиктограммой",{"2":{"157":1}}],["пиктограммы",{"2":{"144":1,"145":1,"149":1,"155":1,"156":1}}],["письмо",{"2":{"387":2}}],["письмом",{"2":{"179":1}}],["письмами",{"2":{"187":1}}],["писем",{"2":{"156":1,"387":1}}],["писать",{"2":{"81":1,"195":1,"209":1,"219":1,"420":1,"430":1,"449":1,"451":1,"492":1}}],["писаться",{"2":{"20":1}}],["пуша",{"2":{"408":1}}],["пулей",{"2":{"253":1}}],["пули",{"2":{"232":1}}],["пузырьком",{"2":{"156":1}}],["пузырьки",{"0":{"156":1}}],["пузыря",{"2":{"155":1}}],["публичным",{"2":{"389":1}}],["публичный",{"2":{"125":2,"215":1}}],["публикуются",{"2":{"486":1}}],["публикуем",{"2":{"321":1,"342":1}}],["публиковаться",{"2":{"319":1}}],["публикацию",{"2":{"440":1}}],["публикации",{"2":{"122":1,"124":1,"136":1,"137":1,"297":2,"342":1}}],["публикация",{"0":{"124":1},"1":{"125":1},"2":{"122":1,"124":1}}],["пупкина",{"2":{"106":1}}],["пупкин",{"2":{"106":1}}],["путаница",{"2":{"389":1}}],["путаницу",{"2":{"140":1,"158":1}}],["пути",{"2":{"126":2,"165":1,"219":2,"221":1,"342":1,"371":1,"374":1,"376":1,"380":4,"390":1}}],["путешествии",{"2":{"214":1}}],["путешествовать",{"2":{"114":1}}],["путем",{"2":{"108":1,"129":1,"131":1,"143":1,"166":1,"219":1,"246":1,"270":1,"303":1,"322":1,"377":1,"380":1,"382":1,"383":2,"431":1}}],["путей",{"2":{"86":1,"219":1}}],["путях",{"2":{"103":1,"443":1}}],["путями",{"2":{"103":1,"126":1,"376":1}}],["путь",{"0":{"193":2},"2":{"93":1,"118":2,"124":1,"126":3,"127":2,"130":1,"131":1,"132":2,"140":1,"194":1,"210":1,"238":1,"256":1,"261":1,"315":1,"374":1,"377":1,"380":1,"435":1}}],["пункте",{"2":{"515":1}}],["пункту",{"2":{"339":1}}],["пунктирными",{"2":{"229":1}}],["пункт",{"2":{"178":2,"273":1}}],["пункты",{"2":{"124":1,"220":1,"247":2,"258":1,"374":1}}],["пунктов",{"2":{"29":1,"110":1,"167":1,"220":1,"374":1}}],["пунктах",{"2":{"263":1,"320":1}}],["пункта",{"2":{"4":1,"292":1}}],["пуст",{"2":{"222":1}}],["пуста",{"2":{"222":1}}],["пустого",{"2":{"495":1,"544":1}}],["пустом",{"2":{"218":1}}],["пустой",{"2":{"7":1,"294":1,"298":1,"342":1}}],["пустым",{"2":{"125":1,"352":1}}],["пусть",{"2":{"16":1,"376":1,"452":1,"456":1}}],["пабло",{"2":{"363":1}}],["падает",{"2":{"314":1}}],["паттерн",{"2":{"222":1,"374":1,"448":1}}],["паттернов",{"2":{"210":1,"266":1,"359":1,"360":1,"364":1,"390":1,"403":1,"415":1}}],["паттерны",{"2":{"190":2,"216":2,"220":1,"223":2,"364":1,"400":1,"419":1,"459":1}}],["паутина",{"2":{"190":1}}],["пагинации",{"2":{"161":2}}],["пагинация",{"0":{"161":1},"1":{"162":1},"2":{"161":1}}],["памятью",{"2":{"342":2}}],["память",{"2":{"149":1,"273":1}}],["памяти",{"2":{"118":1,"125":1,"149":1,"273":3,"314":1,"430":1,"444":1}}],["папок",{"0":{"215":1},"2":{"128":1,"212":1}}],["папкоподобная",{"2":{"165":1}}],["папке",{"2":{"139":1,"215":1,"218":1,"246":1,"368":2,"387":1,"412":1,"435":3}}],["папка",{"2":{"126":1,"127":1,"131":1,"134":1,"215":4}}],["папки",{"2":{"117":1,"214":1,"218":1,"244":1,"412":2}}],["папку",{"2":{"117":1,"127":1,"134":1,"214":1,"215":1,"216":1,"217":1,"218":1,"244":1,"412":3,"420":2}}],["панацея",{"2":{"84":1}}],["панелей",{"2":{"167":1}}],["панели",{"0":{"159":1},"1":{"160":1},"2":{"31":1,"82":1,"156":1,"164":3,"167":1,"169":1,"174":1,"369":1,"374":1,"428":1,"515":1,"535":1}}],["панелью",{"2":{"169":1}}],["панель",{"2":{"28":1,"78":1,"128":2,"129":1,"145":1,"159":1,"172":3,"174":1,"369":1,"377":1,"409":1,"429":1}}],["палитры",{"2":{"533":1}}],["палитру",{"2":{"142":1}}],["пал",{"2":{"39":1}}],["пару",{"2":{"383":1,"444":1,"448":1,"456":1,"496":1,"524":1}}],["паролей",{"2":{"383":2,"388":1}}],["паролями",{"2":{"382":1,"383":1}}],["пароля",{"2":{"382":2,"388":1,"390":1}}],["паролю",{"0":{"382":1,"387":1},"2":{"382":1}}],["пароль",{"2":{"106":1,"383":1,"388":1,"449":1}}],["парольной",{"2":{"40":1}}],["параграфов",{"2":{"524":1}}],["параграфы",{"2":{"460":1}}],["параграфа",{"2":{"260":1}}],["параллельно",{"2":{"417":1}}],["парами",{"2":{"374":1}}],["параметре",{"2":{"300":1}}],["параметр",{"2":{"293":1,"309":1,"328":1,"332":1,"371":1,"377":3,"421":2,"489":1,"516":1}}],["параметром",{"2":{"235":1,"328":1,"421":1,"524":1}}],["параметров",{"2":{"214":1,"288":1,"307":1,"321":1,"328":1,"332":1,"337":1,"426":1,"489":1}}],["параметрам",{"2":{"391":1}}],["параметрами",{"2":{"375":1,"380":2,"408":1}}],["параметра",{"2":{"118":1,"235":2,"246":1,"290":1,"293":1,"298":1,"308":1,"315":1,"316":1,"322":1,"371":1,"376":1,"378":1,"380":1,"421":1}}],["параметры",{"2":{"98":1,"195":2,"243":1,"272":1,"297":1,"367":1,"371":1,"374":1,"377":2,"379":1,"385":1,"410":1,"496":1,"497":1,"533":1}}],["параметру",{"2":{"48":1,"308":1}}],["парадигм",{"2":{"270":1}}],["парадигму",{"2":{"190":1}}],["парадигмы",{"2":{"190":2,"270":1}}],["пара",{"2":{"11":1,"222":1}}],["паре",{"2":{"3":1}}],["пакет",{"2":{"215":2,"235":1,"299":1,"340":2,"371":1,"409":1,"419":2,"420":1,"444":1,"453":1,"492":1,"527":1}}],["пакетных",{"2":{"213":1}}],["пакетами",{"2":{"443":1}}],["пакета",{"2":{"111":1,"116":1,"118":1,"136":1,"195":1,"214":2,"235":3,"346":1,"367":1,"368":1,"371":3,"415":1,"418":1,"433":1,"445":1,"448":1}}],["пакеты",{"2":{"5":1,"366":1,"496":1}}],["пакетов",{"2":{"5":1,"214":2,"420":1,"433":1,"444":1,"492":1}}],["п",{"2":{"4":1,"38":1,"94":1,"157":1,"436":1,"450":1,"452":1,"484":1,"495":1}}],["поиграйте",{"2":{"460":1}}],["поизучайте",{"2":{"460":1}}],["поисковых",{"2":{"461":1}}],["поисковыми",{"2":{"253":1,"366":1}}],["поисковиков",{"2":{"461":1}}],["поисковик",{"2":{"461":1}}],["поисковиками",{"2":{"461":2}}],["поисковая",{"2":{"89":1}}],["поисковой",{"2":{"89":1}}],["поиск",{"0":{"48":1},"2":{"16":1,"17":2,"48":2,"78":1,"145":1,"169":1,"218":1}}],["поисках",{"2":{"322":1}}],["поискать",{"2":{"89":1,"414":1}}],["поиска",{"2":{"4":1,"29":1,"48":2,"173":2,"382":1}}],["поэкспериментируйте",{"2":{"460":1}}],["поэтапного",{"2":{"264":1}}],["поэтапно",{"2":{"60":1}}],["поэтому",{"2":{"13":1,"20":1,"44":1,"64":2,"86":1,"89":1,"93":1,"115":2,"125":1,"128":1,"134":1,"135":1,"141":2,"149":1,"157":1,"159":2,"166":1,"172":1,"191":1,"192":1,"193":1,"195":2,"203":2,"209":1,"210":1,"214":1,"216":1,"217":1,"218":2,"223":1,"228":1,"236":1,"247":1,"255":1,"260":2,"261":1,"268":1,"270":1,"273":1,"286":1,"293":2,"297":1,"301":1,"313":1,"314":4,"316":2,"317":1,"319":1,"321":1,"324":1,"325":2,"327":1,"332":1,"339":1,"340":1,"350":3,"352":1,"375":1,"380":1,"383":2,"384":1,"388":1,"389":3,"419":1,"420":1,"422":2,"423":1,"426":2,"427":1,"428":1,"433":1,"435":1,"439":1,"444":2,"448":1,"449":1,"451":1,"452":1,"461":1}}],["побуждает",{"2":{"389":1}}],["побочным",{"2":{"337":1,"371":1}}],["побочных",{"2":{"241":1,"274":1}}],["побочные",{"2":{"158":1}}],["пояснить",{"2":{"303":1}}],["появятся",{"2":{"203":1}}],["появляются",{"2":{"215":1,"258":1,"314":1,"444":1}}],["появляется",{"2":{"33":1,"247":1,"253":1,"375":1,"377":1,"410":1,"522":1}}],["появлении",{"2":{"438":1,"504":1}}],["появление",{"2":{"366":2}}],["появлением",{"2":{"190":1,"366":1}}],["появления",{"2":{"215":1,"366":1,"461":1}}],["появлению",{"2":{"195":1,"426":1}}],["появившаяся",{"2":{"430":1}}],["появиться",{"2":{"162":1,"214":1,"229":1,"246":1,"419":1}}],["появится",{"2":{"108":1,"135":1,"162":1,"198":1,"214":1,"218":1,"260":1,"438":1}}],["появились",{"2":{"119":1,"151":1,"190":1,"266":1,"429":1,"449":1}}],["появился",{"2":{"110":1,"229":1,"237":1,"449":1,"461":1}}],["появилась",{"2":{"96":1,"115":1,"301":1,"366":1,"451":1,"495":1}}],["появилось",{"2":{"61":1,"448":1,"449":1}}],["пошагово",{"2":{"246":1}}],["пожалуйста",{"2":{"293":1,"320":1,"382":1}}],["пожалуй",{"2":{"235":1,"253":1,"269":1,"418":1}}],["погрузимся",{"2":{"335":1,"343":1}}],["поговорим",{"2":{"194":1,"381":1,"436":1}}],["погуглим",{"2":{"23":1}}],["поймать",{"2":{"448":1}}],["поймете",{"2":{"143":1,"172":1,"271":1}}],["поймем",{"2":{"138":1,"191":1}}],["пойдем",{"2":{"124":1,"382":1}}],["пойдет",{"2":{"107":1,"430":1}}],["почта",{"2":{"387":1}}],["почтовые",{"2":{"366":1}}],["почти",{"2":{"218":1,"261":1,"274":1,"421":1,"433":1,"460":1}}],["почты",{"2":{"125":1,"156":1,"381":1,"387":2,"388":1,"389":1}}],["почувствовать",{"2":{"185":1}}],["почву",{"2":{"140":1}}],["почему",{"2":{"39":1,"109":1,"137":1,"141":3,"143":1,"189":1,"211":2,"225":2,"242":1,"263":1,"311":3,"314":1,"322":1,"426":1,"442":3,"451":1,"459":1,"460":1}}],["поработайте",{"2":{"460":2}}],["поработать",{"2":{"321":1}}],["поработаем",{"2":{"246":1,"299":1}}],["пора",{"2":{"229":1,"306":1}}],["порекомендовать",{"2":{"209":1}}],["порой",{"2":{"460":1}}],["порог",{"2":{"451":1}}],["породили",{"2":{"366":1}}],["породить",{"2":{"170":1}}],["порождать",{"2":{"314":1}}],["порождающие",{"0":{"279":1}}],["порождают",{"2":{"277":1}}],["порождал",{"2":{"241":1}}],["порождает",{"2":{"193":1}}],["пор",{"2":{"139":1,"166":1,"169":1,"179":1,"191":1,"193":1,"202":1,"203":1,"212":1,"229":1,"232":1,"235":1,"276":1,"290":1,"306":1,"309":1,"314":1,"344":1,"366":1,"374":1,"375":1,"377":2,"387":1,"431":1}}],["порядки",{"2":{"461":1}}],["порядковому",{"2":{"426":1}}],["порядковым",{"2":{"161":1}}],["порядке",{"2":{"161":1,"172":1,"193":1,"214":1,"215":2,"222":1,"246":1,"247":1,"255":1,"322":1}}],["порядка",{"2":{"144":1,"161":1,"167":1,"193":1}}],["порядку",{"2":{"124":1,"433":1}}],["порядок",{"2":{"109":1,"247":1}}],["портфолио",{"2":{"494":1,"495":1,"496":1}}],["порта",{"2":{"350":1}}],["порталов",{"2":{"125":1}}],["портал",{"2":{"106":1}}],["портрет",{"2":{"262":1}}],["портретная",{"2":{"257":1}}],["портретных",{"2":{"172":1}}],["порт",{"2":{"214":1,"332":1}}],["портом",{"2":{"108":1}}],["похудеет",{"2":{"448":1}}],["похвастаться",{"2":{"324":1}}],["похож",{"2":{"350":1}}],["похожем",{"2":{"542":1}}],["похожее",{"2":{"377":1}}],["похожей",{"2":{"273":1,"317":1}}],["похоже",{"2":{"251":1,"292":1,"388":1}}],["похожим",{"2":{"303":1,"347":1}}],["похожий",{"2":{"235":1}}],["похожи",{"2":{"199":1,"325":1,"328":1}}],["похожие",{"2":{"4":1,"23":1,"147":1}}],["похакать",{"2":{"107":1}}],["повысит",{"2":{"458":1}}],["повысить",{"2":{"312":1,"452":1,"544":1}}],["повышению",{"2":{"400":1}}],["повышение",{"2":{"354":1,"485":1}}],["повышения",{"2":{"264":1,"301":1,"312":1,"366":1}}],["повышается",{"2":{"452":1,"461":1}}],["повышает",{"2":{"78":1,"333":1,"409":1,"439":1}}],["повсеместно",{"2":{"306":1}}],["повседневном",{"2":{"148":1}}],["повсюду",{"2":{"172":1}}],["поверх",{"2":{"156":1,"191":2,"213":1,"324":1,"381":1,"382":1,"439":1}}],["поведенческие",{"0":{"280":1}}],["поведенческих",{"2":{"68":1}}],["поведением",{"2":{"190":1}}],["поведение",{"2":{"68":1,"97":1,"143":1,"190":1,"196":1,"215":1,"222":1,"271":1,"284":1,"451":1}}],["поведения",{"2":{"67":1,"161":1,"173":1,"180":1,"314":1}}],["поводу",{"2":{"155":1,"159":1}}],["повлиять",{"2":{"334":1}}],["повлияют",{"2":{"326":1}}],["повлияет",{"2":{"147":1,"236":1,"314":1,"374":1}}],["повлияли",{"2":{"117":1}}],["повторно",{"2":{"195":1,"250":1,"369":1}}],["повторного",{"2":{"195":1,"239":1,"241":1,"260":1,"267":1,"277":1,"290":1,"428":1}}],["повторяйтесь",{"2":{"306":1}}],["повторяйся",{"0":{"274":1}}],["повторяющегося",{"2":{"451":1}}],["повторяющееся",{"2":{"143":1,"234":1}}],["повторяющихся",{"2":{"266":1}}],["повторяемому",{"2":{"228":1}}],["повторяется",{"2":{"162":1,"417":1}}],["повторяет",{"2":{"143":1}}],["повторять",{"2":{"219":1,"339":1}}],["повторяться",{"2":{"216":1,"219":1,"266":1,"339":1}}],["повторения",{"2":{"143":2,"144":1,"241":1,"286":1,"328":1}}],["повторение",{"0":{"143":1},"2":{"143":4}}],["покрывается",{"2":{"428":1}}],["покрытии",{"2":{"428":3}}],["покрытия",{"2":{"428":2}}],["покрытие",{"0":{"428":1},"2":{"427":1,"428":1}}],["покидают",{"2":{"388":1}}],["покидать",{"2":{"231":1}}],["покупку",{"2":{"179":1}}],["покупках",{"2":{"183":1}}],["покупка",{"2":{"179":1}}],["покупке",{"2":{"136":1,"183":1}}],["покупки",{"2":{"125":1,"178":2,"361":1}}],["покупать",{"2":{"125":1}}],["покупателей",{"2":{"78":1,"461":1}}],["покупателя",{"2":{"78":1}}],["покупаем",{"2":{"125":1}}],["покупок",{"2":{"78":1,"178":1}}],["показывали",{"2":{"460":1,"461":1}}],["показывания",{"2":{"408":1}}],["показываем",{"2":{"387":1}}],["показывает",{"2":{"110":1,"155":1,"198":1,"314":1,"323":1,"430":1,"449":1}}],["показывается",{"2":{"30":2,"31":1}}],["показываются",{"2":{"411":1}}],["показывают",{"2":{"167":1,"199":1}}],["показывающее",{"2":{"353":1}}],["показывающие",{"2":{"259":1}}],["показывающих",{"2":{"165":1}}],["показывающим",{"2":{"96":1}}],["показывающая",{"2":{"96":1,"156":1}}],["показываться",{"2":{"199":1,"448":1}}],["показывать",{"2":{"155":1,"271":1,"451":1,"461":1}}],["показывая",{"2":{"144":1,"153":1,"199":1,"220":1}}],["показ",{"2":{"78":1,"452":1}}],["показав",{"2":{"314":1}}],["показателей",{"0":{"263":1}}],["показать",{"0":{"145":1},"2":{"156":1,"159":1,"169":1,"435":1}}],["показаться",{"2":{"26":1,"128":1,"194":3,"215":1,"251":1,"253":1,"273":1,"303":1,"309":1,"314":1,"426":1}}],["показана",{"2":{"426":1}}],["показанном",{"2":{"247":1}}],["показанное",{"2":{"173":1}}],["показаны",{"2":{"161":1,"240":1}}],["показано",{"2":{"125":1,"195":1,"237":1,"299":1,"308":1,"320":1,"336":1,"337":1,"338":1,"342":1,"344":1,"382":1,"401":1}}],["показа",{"2":{"47":1,"199":2,"412":1}}],["показе",{"2":{"30":1,"260":1}}],["пока",{"2":{"25":1,"34":1,"41":1,"72":1,"87":1,"88":2,"98":1,"99":1,"125":1,"161":1,"166":1,"179":1,"190":1,"191":1,"194":1,"203":2,"219":1,"229":1,"232":1,"235":1,"246":2,"269":1,"273":1,"276":1,"288":1,"290":1,"304":1,"307":1,"309":1,"314":1,"322":1,"347":1,"369":1,"371":1,"374":1,"381":1,"387":1,"436":1}}],["поняли",{"2":{"214":1,"260":1}}],["поняв",{"2":{"203":1}}],["понятен",{"2":{"173":1,"332":1}}],["понять",{"2":{"150":1,"172":1,"204":1,"223":1,"230":1,"261":1,"284":1,"310":1,"321":1,"345":1,"346":1,"383":1,"411":1,"420":1,"449":1,"460":1}}],["понятий",{"2":{"193":1,"265":1}}],["понятийном",{"2":{"67":1}}],["понятия",{"2":{"191":1,"193":1,"210":1,"274":1,"297":1,"340":1,"391":1,"393":1,"403":1,"441":1,"452":1}}],["понятиями",{"2":{"147":1,"238":1}}],["понятии",{"2":{"191":1}}],["понятие",{"2":{"106":1,"192":1,"240":1,"274":1,"429":1,"439":1,"451":1}}],["понятное",{"2":{"315":1}}],["понятно",{"2":{"238":1,"321":1,"495":1}}],["понятной",{"2":{"157":1}}],["понятна",{"2":{"172":1,"343":1}}],["понятные",{"2":{"443":1}}],["понятными",{"2":{"161":1}}],["понятным",{"2":{"109":1,"276":1,"312":1}}],["понятный",{"2":{"67":1,"76":1,"168":1,"337":1}}],["понятную",{"2":{"88":1,"459":1}}],["понадобятся",{"2":{"222":1,"252":1,"301":1}}],["понадобится",{"2":{"36":1,"72":1,"98":1,"99":1,"192":1,"222":2,"246":1,"247":1,"293":1,"443":1}}],["понадобиться",{"2":{"34":1}}],["поначалу",{"2":{"194":1}}],["понимаете",{"2":{"377":1,"439":1}}],["понимается",{"2":{"275":1}}],["понимают",{"2":{"159":1,"223":1,"274":1}}],["понимаются",{"2":{"151":1,"412":1}}],["понимании",{"2":{"335":1,"350":1}}],["пониманием",{"2":{"173":1}}],["понимание",{"0":{"194":1},"2":{"140":1,"145":1,"266":1,"337":1,"358":1,"460":1}}],["понимания",{"2":{"64":1,"67":1,"122":1,"136":1,"140":1,"169":1,"266":1,"299":1,"307":1,"309":1,"330":1,"336":1,"344":1,"360":1,"402":1}}],["понимать",{"2":{"106":1,"191":1,"277":1,"383":1,"419":1,"460":1}}],["попробуем",{"2":{"438":1}}],["попробует",{"2":{"414":1}}],["попробуйте",{"2":{"414":1,"444":1,"460":2}}],["попросите",{"2":{"143":1}}],["попап",{"2":{"448":1}}],["попасть",{"2":{"339":1}}],["попадают",{"2":{"428":1}}],["попадает",{"2":{"159":1,"387":1}}],["попадет",{"2":{"147":1,"219":1}}],["попытаемся",{"2":{"438":1}}],["попытается",{"2":{"143":1,"424":1}}],["попытаться",{"2":{"132":1,"261":2,"428":1}}],["попытался",{"2":{"61":1}}],["попытка",{"2":{"109":1,"302":1,"418":1}}],["популярности",{"2":{"444":1}}],["популярность",{"2":{"209":1}}],["популярной",{"2":{"431":1}}],["популярном",{"2":{"217":1}}],["популярного",{"2":{"216":1}}],["популярна",{"2":{"186":1,"448":1,"524":1}}],["популярных",{"2":{"190":1,"213":1,"430":1}}],["популярными",{"2":{"251":1,"389":1,"533":1}}],["популярным",{"2":{"167":2,"417":1,"461":1}}],["популярные",{"2":{"164":1,"443":1,"496":1}}],["популярны",{"2":{"158":1,"167":1}}],["популярный",{"2":{"107":1,"213":2,"408":1}}],["популярен",{"2":{"128":1,"131":1,"153":1,"192":1,"296":1,"431":1,"439":1}}],["популяризация",{"2":{"109":2}}],["попутный",{"2":{"64":1}}],["попутно",{"2":{"62":1,"190":1}}],["познавательные",{"2":{"441":1}}],["познакомившись",{"2":{"138":1}}],["познакомились",{"2":{"136":1,"188":1,"312":1,"333":1}}],["познакомился",{"2":{"61":1}}],["познакомимся",{"2":{"122":1,"138":1,"190":1,"215":1,"226":2,"251":1,"390":1}}],["позитивного",{"2":{"422":1}}],["позиционируют",{"2":{"495":1}}],["позицией",{"2":{"389":1}}],["позиции",{"2":{"164":1}}],["позаботится",{"2":{"195":1,"215":1,"222":1,"346":1}}],["позора",{"0":{"185":1}}],["поздно",{"2":{"147":1,"453":1}}],["позже",{"2":{"99":1,"125":2,"192":1,"203":1,"213":1,"218":1,"230":1,"238":1,"240":1,"241":1,"246":1,"260":2,"270":1,"274":1,"321":1,"322":1,"330":1,"349":1,"369":1,"371":1,"419":1,"436":1,"461":1}}],["позволили",{"2":{"366":1}}],["позволить",{"2":{"58":1,"292":1}}],["позволит",{"2":{"11":1,"47":1,"164":1,"215":1,"238":1,"266":1,"273":1,"310":1,"358":1,"419":1,"420":1}}],["позволял",{"2":{"241":1}}],["позволят",{"2":{"235":1,"312":1,"439":1}}],["позволяя",{"2":{"219":1,"307":1,"405":1}}],["позволяют",{"2":{"153":1,"237":1,"253":1,"327":1,"373":1,"380":1,"407":1,"443":1}}],["позволяющую",{"2":{"371":1}}],["позволяющая",{"2":{"303":1,"333":1,"390":1}}],["позволяющего",{"2":{"430":1}}],["позволяющее",{"2":{"284":1}}],["позволяющему",{"2":{"152":1}}],["позволяющим",{"2":{"387":1}}],["позволяющими",{"2":{"188":1}}],["позволяющих",{"2":{"333":1,"383":1}}],["позволяющие",{"2":{"188":1,"190":1,"273":1,"389":1,"439":1,"495":1}}],["позволяющий",{"2":{"108":1,"119":1,"129":1,"161":1,"243":1,"260":1,"350":1}}],["позволяйте",{"2":{"149":2}}],["позволяет",{"2":{"34":1,"67":1,"68":1,"83":1,"99":1,"116":1,"125":2,"129":1,"159":1,"161":2,"165":1,"166":1,"168":1,"191":1,"194":1,"203":1,"215":3,"235":1,"237":1,"269":1,"277":1,"294":1,"298":2,"309":1,"314":1,"315":1,"320":1,"329":1,"344":1,"367":1,"374":1,"377":3,"380":1,"408":1,"409":2,"420":1,"425":1,"431":2,"436":1,"439":1,"444":1,"449":1,"451":2,"452":1,"461":2,"494":1,"499":1,"501":1,"542":1,"543":1}}],["помечает",{"2":{"438":1}}],["помечаем",{"2":{"162":1}}],["помеченный",{"2":{"247":1}}],["помеченных",{"2":{"222":1}}],["поместили",{"2":{"247":1,"261":1}}],["поместим",{"2":{"215":1,"420":1}}],["поместите",{"2":{"216":1,"217":1,"438":1}}],["поместит",{"2":{"194":1,"214":1}}],["поместить",{"2":{"130":1,"261":1,"409":1}}],["помещен",{"2":{"427":1}}],["помещены",{"2":{"127":1,"436":1}}],["помещаться",{"2":{"412":1}}],["помещаем",{"2":{"374":1}}],["помещается",{"2":{"240":1,"536":1}}],["помещаются",{"2":{"178":1,"215":1,"412":1}}],["поменять",{"2":{"40":1,"41":1,"492":1}}],["помните",{"2":{"293":1,"350":1,"421":1,"438":1}}],["помнить",{"2":{"125":1,"193":1,"194":1,"218":1,"236":1,"273":1,"325":1,"326":1,"382":2,"383":1,"411":1,"423":1,"439":1,"449":1}}],["помним",{"2":{"41":1}}],["помимо",{"2":{"110":1,"159":1,"162":1,"167":1,"183":1,"215":1,"297":1,"306":1,"314":1,"358":1,"383":1,"415":1}}],["помогают",{"2":{"193":1,"459":1,"460":1}}],["помогающая",{"2":{"191":1}}],["помогает",{"2":{"168":1,"203":1,"231":1,"273":1,"321":1,"460":1,"495":1}}],["помогут",{"2":{"145":1,"189":1,"190":1,"204":1,"261":1}}],["поможет",{"2":{"110":1,"140":1,"266":2,"301":1,"358":2,"417":2,"460":1}}],["помочь",{"2":{"108":1,"155":1,"211":1,"310":1,"460":1}}],["помощь",{"2":{"237":1,"240":1,"259":1,"423":1}}],["помощью",{"0":{"135":1,"226":1,"228":1,"238":1,"242":1,"263":1,"324":1,"340":1,"345":1,"396":1,"400":1,"431":1},"1":{"227":1,"228":1,"229":2,"230":2,"231":2,"232":2,"233":1,"234":1,"235":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,"325":1,"326":1,"327":1,"328":1,"329":1,"330":1,"341":1,"342":1,"346":1,"347":1,"348":1,"349":1},"2":{"35":2,"81":2,"93":1,"107":1,"122":1,"128":1,"134":1,"135":2,"136":1,"138":1,"141":1,"153":1,"154":1,"155":1,"157":1,"158":2,"167":1,"172":2,"194":2,"195":1,"202":2,"203":1,"212":1,"214":2,"215":1,"217":2,"218":1,"220":2,"222":7,"223":1,"225":1,"226":3,"228":1,"229":1,"230":2,"234":1,"235":3,"236":2,"237":1,"238":2,"240":2,"243":1,"245":2,"246":2,"247":2,"250":1,"251":1,"253":4,"254":1,"260":1,"261":1,"262":1,"264":2,"270":1,"273":1,"295":1,"298":2,"301":2,"306":3,"308":2,"309":1,"310":1,"312":1,"314":1,"316":2,"322":1,"324":1,"325":1,"327":1,"328":1,"330":2,"332":3,"335":2,"339":1,"340":1,"342":1,"344":1,"345":2,"346":2,"349":1,"350":2,"351":1,"352":2,"354":1,"358":1,"364":1,"366":1,"367":2,"368":1,"369":1,"373":1,"374":2,"377":2,"381":2,"383":1,"385":1,"386":1,"387":1,"388":2,"389":2,"390":1,"400":1,"402":1,"407":1,"415":2,"417":1,"420":1,"421":2,"423":1,"424":1,"425":1,"426":3,"429":3,"435":1,"436":3,"438":2,"440":1,"444":1,"449":1,"496":1,"497":1,"499":1,"501":1,"507":2,"532":1}}],["помощников",{"2":{"140":1}}],["помощник",{"2":{"81":1,"214":2}}],["помощи",{"2":{"73":1,"213":1}}],["посещении",{"2":{"389":1}}],["послано",{"2":{"426":1}}],["послойное",{"2":{"314":1}}],["после",{"2":{"39":1,"57":1,"71":1,"78":1,"109":1,"111":1,"112":1,"116":1,"126":1,"127":1,"136":1,"159":1,"169":1,"176":1,"178":1,"179":1,"187":1,"199":1,"202":1,"214":1,"220":1,"221":1,"222":1,"223":1,"229":1,"231":1,"234":2,"237":1,"238":1,"246":1,"247":2,"248":1,"259":1,"260":2,"261":2,"262":1,"263":1,"282":1,"286":1,"292":1,"294":1,"298":2,"303":1,"304":1,"307":3,"314":3,"315":1,"316":1,"321":1,"322":1,"326":1,"331":2,"332":2,"344":2,"345":1,"367":1,"368":1,"371":3,"381":1,"384":2,"388":1,"389":1,"405":1,"407":1,"408":2,"415":1,"417":1,"419":2,"420":1,"421":2,"424":2,"429":1,"430":1,"432":1,"435":5,"436":2,"439":1,"448":1,"449":1,"461":3,"522":1,"528":1,"544":1}}],["последствия",{"2":{"277":1}}],["последующим",{"2":{"421":1}}],["последующих",{"2":{"183":1,"287":2}}],["последующая",{"2":{"368":1}}],["последующей",{"2":{"388":1}}],["последующего",{"2":{"20":1,"251":1,"321":1,"492":1}}],["последующему",{"2":{"135":1}}],["последующем",{"2":{"17":1,"260":1}}],["последовательную",{"2":{"309":1}}],["последовательный",{"2":{"161":1}}],["последовательным",{"0":{"143":1},"2":{"238":1}}],["последовательной",{"2":{"209":1}}],["последовательном",{"2":{"161":1}}],["последовательного",{"2":{"158":1,"314":3}}],["последовательно",{"2":{"148":1,"307":1,"308":1,"314":1,"350":1}}],["последовательности",{"2":{"144":1,"149":1,"231":1}}],["последнем",{"2":{"375":1}}],["последнего",{"2":{"332":1}}],["последней",{"2":{"194":1,"269":1}}],["последнее",{"2":{"155":1,"326":1}}],["последняя",{"2":{"190":1,"358":1,"433":1,"440":1}}],["последним",{"2":{"247":1,"267":1,"309":1,"321":1}}],["последний",{"2":{"150":1,"260":1,"292":1,"369":1,"426":1,"433":1,"439":1}}],["последних",{"2":{"134":1,"216":1,"408":1}}],["последние",{"2":{"50":1,"75":1,"151":1,"448":1,"524":1}}],["последнюю",{"2":{"25":1,"213":1}}],["посвящены",{"2":{"222":1,"277":1}}],["посвящена",{"2":{"212":1,"282":1,"314":1,"400":1}}],["посвященный",{"2":{"145":1}}],["посадочная",{"2":{"158":1}}],["посадочной",{"2":{"158":1}}],["поскольку",{"2":{"125":1,"126":2,"128":1,"139":1,"140":1,"147":1,"153":1,"158":2,"161":1,"162":2,"169":1,"191":1,"192":2,"195":1,"203":1,"204":1,"212":1,"218":2,"222":3,"223":2,"235":1,"247":2,"261":1,"262":1,"271":1,"273":1,"292":1,"297":1,"301":1,"302":3,"303":1,"304":1,"306":1,"307":1,"309":1,"314":2,"317":1,"318":1,"323":1,"324":1,"326":1,"327":1,"332":2,"337":1,"339":1,"340":1,"342":1,"344":2,"346":1,"347":1,"350":3,"351":1,"352":2,"369":1,"374":1,"377":2,"380":2,"382":1,"386":2,"387":1,"389":2,"417":3,"418":1,"421":1,"424":1,"426":1,"428":1,"429":1,"435":1,"436":1,"438":1,"439":1,"441":1}}],["посылать",{"2":{"109":1}}],["посредником",{"2":{"108":1}}],["посредством",{"2":{"40":1}}],["посмотрели",{"2":{"354":1}}],["посмотреть",{"2":{"16":1,"94":2,"131":1,"191":1,"214":1,"260":1,"363":1,"374":2,"388":1,"443":1,"444":1,"460":1,"461":1,"496":1}}],["посмотрим",{"2":{"133":1,"150":1,"237":1,"254":1,"309":1,"314":1,"322":2,"330":1,"337":2,"338":1,"346":2,"372":1,"373":1,"376":1,"383":1}}],["посмотрите",{"2":{"23":1,"139":1,"213":1,"227":1,"240":1,"252":1,"308":1,"313":1,"336":1,"365":1,"416":1,"444":1,"460":1}}],["поступившие",{"2":{"440":1}}],["поступления",{"2":{"12":1}}],["пострадать",{"2":{"253":1}}],["построим",{"2":{"320":1,"345":1}}],["построить",{"2":{"191":1,"216":1,"223":2,"312":1,"358":1}}],["построчно",{"2":{"298":1,"300":1,"302":1}}],["построено",{"2":{"223":1,"439":1}}],["построен",{"2":{"191":1,"193":1,"220":1}}],["построенные",{"2":{"191":1,"381":1,"439":1,"449":1}}],["построены",{"2":{"126":1,"191":1}}],["построению",{"2":{"226":1,"358":1}}],["построение",{"2":{"75":1}}],["построения",{"2":{"39":1,"191":3,"305":1,"496":1,"530":1}}],["постов",{"2":{"174":1}}],["постоянный",{"2":{"260":1}}],["постоянных",{"2":{"149":1}}],["постоянными",{"2":{"324":1}}],["постоянным",{"2":{"106":1}}],["постоянной",{"2":{"312":1,"333":1}}],["постоянного",{"2":{"260":1,"354":1}}],["постоянно",{"2":{"106":1,"216":1,"234":1,"430":1,"441":1}}],["постсервисное",{"2":{"140":1}}],["постепенной",{"2":{"265":1}}],["постепенно",{"2":{"78":1,"190":1,"191":1,"251":1,"358":1}}],["постепенное",{"2":{"75":1,"253":1}}],["постановка",{"2":{"435":1,"436":1}}],["поставки",{"2":{"434":1}}],["поставлен",{"2":{"435":1}}],["поставлены",{"2":{"299":1}}],["поставленных",{"2":{"69":1}}],["поставляется",{"2":{"263":1}}],["поставляемых",{"2":{"212":1}}],["поставщиков",{"2":{"109":1}}],["поставив",{"2":{"107":1}}],["поставить",{"2":{"103":1,"107":1,"438":1,"444":1,"460":1}}],["постараемся",{"2":{"20":1}}],["потратьте",{"2":{"444":1,"456":1}}],["потратит",{"2":{"420":1}}],["потребуются",{"2":{"418":1}}],["потребует",{"2":{"38":1,"191":1}}],["потребуется",{"2":{"12":1,"213":1,"219":1,"222":1,"307":1,"364":1,"369":1,"383":1,"421":1}}],["потребностей",{"2":{"310":1,"335":1,"428":1}}],["потребностями",{"2":{"215":1,"222":1}}],["потребностях",{"2":{"128":1}}],["потребляют",{"2":{"307":1}}],["потребительском",{"2":{"138":1}}],["потери",{"2":{"414":1}}],["потеряете",{"2":{"388":1}}],["потеряло",{"2":{"150":1}}],["потерять",{"2":{"106":1}}],["потенциал",{"2":{"366":1,"438":2}}],["потенциально",{"2":{"314":1}}],["потоке",{"2":{"261":1,"274":1,"307":1,"314":2,"350":1,"451":1}}],["потоках",{"2":{"314":1}}],["потоками",{"0":{"335":1,"399":1},"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,"349":1,"350":1,"351":1,"352":1,"353":1,"354":1,"355":1},"2":{"230":1,"240":1,"251":1,"260":1,"288":1,"300":1,"319":2,"399":1}}],["потока",{"0":{"230":1},"2":{"300":1,"307":2,"308":1,"309":1,"337":1,"383":1}}],["поток",{"2":{"150":1,"191":1,"276":1,"307":2,"383":1,"448":1}}],["потоком",{"2":{"118":1,"194":1,"195":1,"282":1,"295":1,"335":1,"336":1,"342":1,"349":1,"354":1,"374":1,"451":1}}],["потоков",{"2":{"11":1,"67":1}}],["поточнее",{"2":{"81":1}}],["потомок",{"2":{"449":1}}],["потомком",{"2":{"449":1}}],["потом",{"2":{"23":1,"26":1,"36":1,"39":1,"40":1,"62":1,"64":1,"90":1,"143":1,"261":1,"449":2,"461":2,"492":1}}],["потому",{"2":{"3":1,"17":1,"48":1,"86":1,"87":1,"106":1,"143":1,"219":1,"286":1,"308":1,"332":1,"377":1,"408":1,"449":1,"461":1}}],["по",{"0":{"48":1,"66":1,"382":1,"387":1,"531":1},"2":{"11":1,"12":1,"13":3,"14":1,"16":1,"17":3,"23":2,"26":2,"41":1,"47":2,"48":4,"68":1,"75":2,"78":2,"81":1,"94":1,"97":1,"99":2,"103":1,"106":4,"107":3,"108":3,"114":2,"115":4,"116":1,"120":1,"124":2,"125":2,"126":1,"127":1,"128":2,"131":1,"132":1,"133":1,"134":1,"135":5,"136":2,"139":1,"144":1,"147":1,"149":1,"152":2,"155":2,"157":1,"159":2,"161":4,"162":1,"163":1,"167":1,"169":1,"170":1,"172":2,"173":1,"176":1,"178":1,"190":4,"191":3,"192":1,"193":1,"195":3,"200":1,"202":1,"210":2,"212":3,"213":2,"214":2,"215":2,"217":1,"218":2,"219":1,"221":1,"222":1,"223":1,"224":1,"225":1,"226":1,"229":2,"230":3,"232":1,"235":4,"236":3,"237":1,"238":2,"240":9,"241":1,"242":1,"245":1,"246":4,"247":6,"248":3,"250":1,"252":1,"253":4,"254":1,"256":1,"258":1,"260":1,"262":1,"264":1,"266":2,"269":2,"270":1,"271":2,"272":1,"273":1,"275":1,"277":1,"278":1,"290":2,"292":1,"293":3,"294":4,"295":1,"297":3,"298":2,"302":1,"307":2,"309":2,"310":1,"312":1,"314":4,"318":1,"319":1,"320":1,"325":1,"326":2,"328":1,"332":4,"334":1,"335":1,"337":3,"338":1,"339":3,"344":2,"349":5,"350":3,"360":1,"362":1,"365":1,"366":4,"367":3,"368":1,"371":1,"374":4,"376":1,"377":3,"380":5,"382":2,"383":3,"386":1,"387":1,"388":2,"389":5,"390":1,"404":1,"407":1,"408":2,"409":1,"412":4,"413":1,"415":2,"416":2,"417":1,"420":2,"424":1,"426":1,"430":3,"431":1,"433":1,"436":1,"438":1,"439":2,"443":2,"444":2,"448":2,"449":6,"450":1,"452":1,"458":1,"459":1,"460":8,"461":8,"485":1,"492":1,"499":1,"501":1,"506":1,"515":1,"516":1,"524":1,"526":1,"527":1,"528":1}}],["полиморфизмом",{"2":{"452":1}}],["политика",{"2":{"106":1}}],["политиками",{"2":{"58":1}}],["политики",{"2":{"58":2}}],["политик",{"2":{"58":1,"418":1}}],["полтора",{"2":{"449":1}}],["полагаясь",{"2":{"377":1}}],["полагаться",{"2":{"135":1,"387":1}}],["половину",{"2":{"314":1}}],["полос",{"2":{"388":1}}],["полосой",{"2":{"314":1}}],["полоса",{"2":{"162":1}}],["полосу",{"2":{"159":1}}],["поломке",{"2":{"115":1}}],["положено",{"2":{"431":1}}],["положение",{"2":{"111":1,"165":1,"301":1}}],["положить",{"2":{"412":1}}],["положительное",{"2":{"419":1}}],["положительного",{"2":{"78":1,"188":1}}],["положительный",{"2":{"140":1}}],["положительные",{"2":{"121":1,"138":1,"380":1}}],["пользуется",{"2":{"449":1}}],["пользу",{"0":{"360":1},"2":{"189":1,"360":1}}],["польза",{"2":{"64":1}}],["пользоваться",{"2":{"81":1,"449":1,"451":1,"459":1,"527":1}}],["пользователем",{"2":{"140":1,"168":1,"169":1,"182":1,"183":1,"222":1,"230":1,"235":1,"241":1,"351":1,"375":1,"383":1,"387":1,"415":1,"451":1,"452":1,"545":1}}],["пользователей",{"2":{"47":1,"58":2,"141":1,"143":1,"177":1,"184":1,"190":1,"213":1,"248":1,"253":2,"274":1,"342":1,"381":2,"382":5,"383":2,"386":1,"388":2,"389":1,"391":2,"417":1,"450":1,"452":1,"461":2}}],["пользователи",{"2":{"106":1,"143":1,"158":1,"159":1,"173":2,"180":1,"213":1,"264":1,"382":1}}],["пользователю",{"2":{"67":1,"106":1,"129":1,"141":1,"143":1,"145":1,"147":1,"148":2,"150":1,"152":1,"153":2,"154":1,"155":2,"158":2,"159":2,"161":3,"163":1,"164":1,"165":1,"166":2,"167":1,"168":1,"170":1,"174":1,"180":1,"181":1,"188":1,"231":1,"235":1,"253":1,"260":2,"350":1,"375":1,"382":1,"383":1,"384":1,"386":1,"387":2,"388":2,"408":1,"419":1,"438":1,"451":1}}],["пользователями",{"2":{"151":1,"188":1,"544":1}}],["пользователям",{"2":{"73":1,"106":1,"168":1,"173":1,"213":1,"426":1}}],["пользователя",{"0":{"382":1},"2":{"47":1,"75":1,"98":1,"106":7,"138":1,"140":2,"141":1,"142":2,"143":2,"148":2,"149":3,"150":4,"152":1,"154":1,"156":2,"157":3,"158":1,"159":4,"161":1,"169":1,"170":1,"176":1,"177":2,"179":1,"180":2,"182":1,"185":1,"186":2,"187":1,"188":1,"222":1,"231":1,"232":1,"247":1,"253":3,"260":3,"261":1,"307":1,"314":1,"350":2,"366":2,"382":3,"383":2,"385":2,"387":4,"388":5,"389":9,"390":1,"408":1,"409":1,"410":2,"426":1,"449":2,"461":3,"484":1}}],["пользовательской",{"0":{"231":1},"2":{"173":1}}],["пользовательского",{"0":{"141":1,"146":1,"226":1,"229":1,"396":1},"1":{"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":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},"2":{"115":1,"138":2,"140":2,"141":5,"142":1,"145":3,"147":1,"154":3,"169":1,"174":1,"175":1,"194":2,"201":1,"220":1,"222":1,"228":1,"232":1,"240":1,"241":1,"253":1,"256":1,"270":1,"271":1,"273":1,"295":2,"303":2,"304":1,"307":1,"318":1,"325":1,"339":2,"366":1,"367":1,"369":1,"403":2,"429":1}}],["пользовательские",{"2":{"226":3,"230":1,"366":1}}],["пользовательский",{"2":{"145":1,"175":2,"188":1,"216":1,"222":1,"260":3,"261":1,"308":1,"314":1,"375":1,"461":1,"543":1}}],["пользовательским",{"2":{"140":1,"247":1,"267":1}}],["пользовательских",{"2":{"140":1,"141":2,"191":2,"214":1,"224":1,"237":1,"306":1,"358":1,"377":1,"396":1}}],["пользовательская",{"2":{"67":1}}],["пользователь",{"2":{"11":1,"106":6,"138":1,"147":1,"148":1,"149":2,"150":4,"155":1,"159":1,"161":2,"162":1,"173":1,"178":1,"179":2,"180":2,"181":2,"183":1,"184":2,"185":1,"186":1,"187":1,"201":1,"203":1,"220":2,"222":1,"230":1,"231":1,"232":1,"245":1,"253":2,"258":1,"259":1,"260":4,"261":1,"314":1,"330":1,"377":1,"382":1,"383":2,"384":1,"387":4,"388":1,"389":1,"438":1,"448":1,"449":1,"451":2,"492":1,"496":1,"522":1}}],["пользования",{"2":{"41":1}}],["полутора",{"2":{"525":1}}],["полупрозрачным",{"2":{"246":1}}],["полуготовые",{"2":{"61":1}}],["получены",{"2":{"330":1,"377":1}}],["полученном",{"2":{"332":1}}],["полученное",{"2":{"315":1}}],["полученный",{"2":{"386":1}}],["полученными",{"2":{"332":1}}],["полученные",{"2":{"298":1,"316":1,"321":1,"327":1,"329":1,"332":1,"364":1,"383":1,"391":1}}],["полученных",{"2":{"156":1}}],["полученная",{"2":{"116":1}}],["получению",{"2":{"297":1,"350":1}}],["получения",{"2":{"114":1,"119":1,"152":1,"195":1,"222":1,"232":1,"246":2,"285":1,"293":1,"307":1,"330":1,"339":1,"352":1,"430":1}}],["получении",{"2":{"106":1,"322":1}}],["получение",{"0":{"324":1},"1":{"325":1,"326":1,"327":1,"328":1,"329":1,"330":1},"2":{"73":1,"124":1,"134":1,"380":1}}],["получила",{"2":{"309":1}}],["получилось",{"2":{"214":1}}],["получил",{"2":{"156":1,"195":1}}],["получили",{"2":{"126":1,"242":1,"274":1,"332":1,"366":1,"386":1}}],["получившуюся",{"2":{"340":1}}],["получив",{"2":{"127":2,"218":1,"294":1,"317":1,"383":1,"389":1}}],["получим",{"2":{"83":1,"220":1,"226":1,"261":1,"369":1}}],["получит",{"2":{"197":1,"253":1,"309":1}}],["получите",{"2":{"138":1,"229":1,"421":1,"438":1}}],["получить",{"0":{"360":1},"2":{"67":1,"83":1,"106":1,"121":1,"136":1,"145":1,"169":1,"195":3,"222":1,"240":1,"263":1,"295":1,"301":1,"309":1,"314":1,"327":1,"350":2,"384":1,"385":1,"391":1,"405":1,"407":1,"421":1,"425":1,"428":1,"461":1,"524":1}}],["получится",{"2":{"26":1,"288":1,"435":1,"460":1}}],["получай",{"2":{"389":1}}],["получают",{"2":{"337":2}}],["получат",{"2":{"360":1}}],["получатель",{"2":{"332":1}}],["получателя",{"2":{"300":3,"385":1}}],["получателей",{"2":{"299":1}}],["получателе",{"2":{"238":1}}],["получаться",{"2":{"78":1}}],["получать",{"2":{"11":1,"94":1,"107":1,"177":2,"235":1,"240":1,"253":3,"319":1,"327":1,"330":1,"332":1,"346":1,"366":1,"426":1,"460":1,"461":1}}],["получаем",{"2":{"89":1,"103":1,"115":1,"162":1,"222":1,"238":1,"302":1,"309":1,"321":1,"352":1,"366":1,"383":1,"389":1,"426":1,"439":1}}],["получаете",{"2":{"314":1,"407":1}}],["получается",{"2":{"17":1,"138":1,"195":1,"271":1,"309":1,"408":1,"412":1,"448":1,"452":1,"461":4,"492":1}}],["получает",{"2":{"3":1,"106":1,"108":1,"125":1,"234":1,"235":1,"246":1,"247":1,"302":1,"303":1,"307":1,"309":4,"315":2,"316":1,"332":1,"342":1,"346":2,"350":1,"374":1,"376":1,"377":1,"380":1,"388":1,"419":1,"421":1,"461":1}}],["получая",{"2":{"11":1,"293":1,"427":1}}],["полем",{"2":{"222":1,"300":1}}],["полезную",{"2":{"322":1}}],["полезная",{"2":{"438":1}}],["полезна",{"2":{"255":1,"355":1}}],["полезные",{"0":{"446":1},"1":{"447":1,"448":1},"2":{"444":1,"452":1,"460":1,"467":1,"473":1,"533":1}}],["полезным",{"2":{"223":1,"308":1,"309":1,"371":1}}],["полезных",{"2":{"217":1,"255":1,"444":1}}],["полезный",{"2":{"145":1,"235":1}}],["полезны",{"2":{"140":1,"157":1,"303":1,"305":1,"314":1,"359":1,"405":1,"450":1,"461":1}}],["полезного",{"2":{"326":1,"444":1}}],["полезной",{"2":{"320":1,"330":1,"383":2,"408":1}}],["полезное",{"2":{"212":1,"527":1}}],["полезность",{"2":{"150":1,"450":1}}],["полезно",{"2":{"3":1,"4":1,"23":1,"88":1,"136":1,"301":1,"308":1,"336":1,"387":1,"436":1,"455":1}}],["полезен",{"2":{"125":1,"287":1,"297":1,"299":1,"307":1,"344":1,"366":1,"460":1,"461":1}}],["поле",{"2":{"47":1,"48":2,"195":2,"200":1,"222":1,"262":1,"315":1,"326":1,"332":1,"371":2,"374":1,"383":2,"387":3,"426":1,"449":1,"451":1}}],["полей",{"2":{"44":1,"47":2,"48":1,"142":1,"192":1,"255":1,"258":1,"326":1,"383":1}}],["полям",{"0":{"48":1},"2":{"255":1,"344":1}}],["полями",{"2":{"17":1,"194":1,"195":1,"222":1,"255":1,"322":1,"326":2,"384":1}}],["поля",{"2":{"16":1,"17":1,"18":1,"44":1,"47":2,"48":1,"152":1,"170":1,"192":1,"195":3,"258":4,"294":1,"300":1,"315":1,"326":2,"345":1,"371":1,"377":1,"384":1,"451":1}}],["полна",{"2":{"140":1}}],["полную",{"2":{"128":1,"219":1,"417":1}}],["полные",{"2":{"219":1}}],["полным",{"2":{"128":1,"282":1,"320":1,"336":1,"339":1,"380":1}}],["полный",{"2":{"120":1,"139":1,"152":1,"202":1,"226":1,"246":1,"260":1,"277":1,"371":1,"375":1,"380":3,"421":1,"425":1,"426":1,"433":1,"449":1}}],["полноты",{"2":{"398":1}}],["полноэкранном",{"2":{"256":1}}],["полного",{"2":{"256":1,"325":1,"349":1,"353":1}}],["полно",{"2":{"107":1,"459":1,"500":1}}],["полному",{"2":{"48":1,"222":1}}],["полное",{"2":{"47":1,"83":1,"125":1,"183":1,"188":1,"253":1,"256":1,"332":1}}],["полностью",{"2":{"26":1,"110":1,"118":1,"138":1,"166":1,"172":1,"191":1,"195":1,"199":1,"216":1,"263":1,"314":1,"332":1,"366":1,"415":1,"418":1,"544":1}}],["полноценную",{"2":{"492":1}}],["полноценного",{"2":{"301":1}}],["полноценное",{"2":{"107":1}}],["полноценной",{"2":{"107":1}}],["полноценным",{"2":{"75":1}}],["полноценный",{"2":{"12":1,"228":1}}],["полноценная",{"2":{"12":1,"350":1}}],["полней",{"2":{"4":1}}],["поделился",{"2":{"444":1}}],["поделиться",{"2":{"174":1,"230":2,"253":1,"375":1,"411":1}}],["подтвердили",{"2":{"426":1}}],["подтверждающих",{"2":{"417":1}}],["подтверждать",{"2":{"389":1}}],["подтверждается",{"2":{"23":1,"135":1}}],["подтвержден",{"2":{"387":1}}],["подтверждение",{"0":{"185":1}}],["подтверждения",{"2":{"149":1,"166":1,"178":1,"185":1,"387":1}}],["подтверждении",{"2":{"125":1}}],["подмаршрутов",{"2":{"375":1}}],["подмаршруты",{"2":{"375":1,"377":1}}],["подмена",{"0":{"184":1}}],["поднимают",{"2":{"337":1}}],["подниматься",{"2":{"238":1}}],["поднабор",{"2":{"161":1}}],["подумайте",{"2":{"426":1}}],["подумаем",{"2":{"229":1}}],["подумав",{"2":{"223":1}}],["подумать",{"2":{"4":1,"159":1,"176":1}}],["подводит",{"2":{"396":1}}],["подвохом",{"0":{"177":1},"2":{"177":1}}],["подвижные",{"2":{"303":1}}],["подвесить",{"2":{"308":1}}],["подвергнуть",{"2":{"223":1}}],["подведут",{"2":{"143":1}}],["подведение",{"0":{"136":1,"188":1,"210":1,"224":1,"249":1,"264":1,"310":1,"333":1,"354":1,"390":1,"441":1}}],["подгружается",{"2":{"461":1}}],["подгруппа",{"2":{"169":2}}],["подгруппе",{"2":{"161":1}}],["подготовиться",{"2":{"335":1}}],["подготовились",{"2":{"219":1}}],["подготовим",{"2":{"212":1}}],["подготовлены",{"2":{"203":1,"215":1}}],["подготовки",{"2":{"124":1,"265":1,"384":1,"460":1}}],["подготовка",{"2":{"64":1}}],["подчиняется",{"2":{"374":1}}],["подчинение",{"2":{"2":1}}],["подчеркнуть",{"2":{"273":1}}],["подчеркивания",{"2":{"205":1}}],["подчеркивает",{"2":{"191":1}}],["подчеркивающим",{"2":{"154":1}}],["подразумевает",{"2":{"191":1,"216":1,"269":1,"415":1,"430":1}}],["подразумевается",{"2":{"140":1,"461":1,"495":1}}],["подробней",{"2":{"542":1}}],["подробнее",{"2":{"106":1,"125":1,"201":1,"282":1,"288":1,"381":1,"383":1,"443":1}}],["подробны",{"2":{"441":1}}],["подробные",{"2":{"374":1}}],["подробный",{"2":{"263":1}}],["подробную",{"2":{"118":1,"147":1,"148":1,"217":1}}],["подробности",{"2":{"389":1,"411":1}}],["подробностями",{"2":{"374":1}}],["подробностей",{"2":{"277":1}}],["подробное",{"2":{"262":1}}],["подробному",{"2":{"232":1}}],["подробной",{"2":{"119":1}}],["подробно",{"2":{"110":1,"111":1,"115":1,"194":2,"195":1,"214":1,"226":1,"230":1,"237":1,"240":1,"242":1,"247":1,"249":1,"251":1,"295":1,"303":1,"304":1,"350":1,"354":1,"366":1,"380":1,"412":1,"515":1}}],["подробная",{"2":{"108":1}}],["подпапкой",{"2":{"244":1}}],["подпапка",{"2":{"126":1}}],["подписи",{"2":{"383":3}}],["подпись",{"2":{"383":1}}],["подписанных",{"2":{"342":1}}],["подписанным",{"2":{"179":1}}],["подписчиков",{"2":{"297":1}}],["подписывает",{"2":{"340":1}}],["подписываться",{"2":{"340":1}}],["подписываются",{"2":{"297":1}}],["подписывания",{"2":{"106":1}}],["подписок",{"2":{"179":1}}],["подписки",{"2":{"177":1,"179":1,"342":1}}],["поддиректории",{"2":{"409":1,"412":1}}],["поддиректориями",{"2":{"408":1}}],["подделки",{"2":{"383":1}}],["поддержкой",{"2":{"443":1,"449":1}}],["поддержку",{"2":{"213":1,"271":1}}],["поддержки",{"2":{"179":1,"344":1,"387":1,"448":2,"460":1,"524":1}}],["поддержка",{"0":{"73":1},"2":{"66":1,"73":1,"140":2,"349":3,"449":2}}],["поддерживаются",{"2":{"448":1}}],["поддерживают",{"2":{"253":1,"531":1,"545":1}}],["поддерживающих",{"2":{"121":1,"389":1}}],["поддерживая",{"2":{"201":1}}],["поддерживаемость",{"2":{"459":1}}],["поддерживаемый",{"2":{"345":1}}],["поддерживаемых",{"2":{"152":1,"258":1,"383":1}}],["поддерживает",{"2":{"270":1,"324":1}}],["поддерживается",{"2":{"194":1,"195":2,"241":1,"414":1,"543":1}}],["поддерживайте",{"2":{"149":1}}],["поддерживаться",{"2":{"449":1,"453":1}}],["поддерживать",{"2":{"68":1,"116":1,"245":1,"271":1,"301":1,"314":1,"439":1,"452":1}}],["поддается",{"2":{"275":1,"461":1}}],["поддавайтесь",{"2":{"270":1}}],["поддомена",{"2":{"135":1}}],["поддомен",{"2":{"125":2,"126":1}}],["поддомены",{"2":{"125":3,"132":1,"135":1,"407":1}}],["поддоменов",{"2":{"125":2,"137":1}}],["подарила",{"2":{"461":1}}],["подарочные",{"2":{"4":1}}],["подавляющее",{"2":{"380":1}}],["подавление",{"2":{"158":1}}],["податлив",{"2":{"324":1}}],["подает",{"2":{"236":1}}],["подальше",{"2":{"87":1}}],["подзадачи",{"2":{"78":1}}],["подключить",{"2":{"371":1,"407":1}}],["подключена",{"2":{"491":1}}],["подключены",{"2":{"264":1}}],["подключении",{"2":{"389":1}}],["подключения",{"2":{"243":1,"328":1,"389":1,"409":1,"439":1,"496":1,"530":1}}],["подключение",{"2":{"41":1,"103":1,"389":2,"492":3,"526":1}}],["подключенными",{"2":{"409":1}}],["подключенных",{"2":{"125":1}}],["подключенный",{"2":{"125":1}}],["подключаются",{"2":{"412":1}}],["подключаемые",{"2":{"389":1,"531":1}}],["подключаемый",{"2":{"243":1}}],["подключаем",{"2":{"111":1,"128":1}}],["подключать",{"2":{"12":1,"412":1,"449":1,"453":2,"527":1}}],["подскажите",{"0":{"445":1}}],["подсказку",{"2":{"260":2}}],["подсказкой",{"2":{"155":1}}],["подсказка",{"0":{"260":1},"2":{"155":1}}],["подсказками",{"2":{"89":1}}],["подсказки",{"0":{"155":1},"2":{"155":1,"260":1}}],["подсказок",{"2":{"143":1}}],["подсказать",{"2":{"81":1}}],["подсоединение",{"2":{"444":1}}],["подсоединяться",{"2":{"40":1}}],["подстановочные",{"2":{"436":1}}],["подсчет",{"2":{"230":1}}],["подсегмент",{"2":{"125":1}}],["подсвечивать",{"2":{"97":1}}],["подсистему",{"2":{"3":1,"68":1}}],["подсистем",{"2":{"3":1,"269":1,"306":1,"342":1}}],["подсистемы",{"0":{"4":1},"2":{"2":2,"3":1,"4":1,"7":1,"34":3,"41":2,"269":1}}],["подобранных",{"2":{"444":1}}],["подобную",{"2":{"215":1,"353":1}}],["подобной",{"2":{"374":1}}],["подобно",{"2":{"200":1,"337":1,"436":1,"439":1}}],["подобному",{"2":{"342":1}}],["подобном",{"2":{"195":1}}],["подобное",{"2":{"34":1,"273":1,"288":1,"345":1,"369":1}}],["подобная",{"2":{"186":1}}],["подобные",{"2":{"176":1,"325":1,"440":1,"461":1}}],["подобными",{"2":{"159":1}}],["подобный",{"2":{"107":1,"108":1,"305":1,"459":1}}],["подобных",{"2":{"81":1,"222":1,"277":1}}],["подождать",{"2":{"235":1}}],["подождите",{"2":{"195":1}}],["подойдут",{"2":{"324":1}}],["подойдет",{"2":{"128":1}}],["подойти",{"2":{"228":1,"388":1,"420":1}}],["подошли",{"2":{"224":1}}],["подошел",{"2":{"39":1}}],["подозрительные",{"2":{"106":1}}],["подходу",{"2":{"191":1,"228":1,"387":1}}],["подходов",{"2":{"191":1,"232":1,"243":1,"306":1,"350":1,"354":1,"387":1,"417":1,"423":1}}],["подходом",{"2":{"162":1,"172":1,"248":1,"274":1,"411":1,"495":1}}],["подходе",{"2":{"172":1,"226":1,"235":1,"388":1,"419":1}}],["подходы",{"2":{"138":1,"195":1,"335":1,"354":1,"358":1,"374":1,"415":1,"430":1,"451":1}}],["подходят",{"2":{"125":2,"335":1,"449":1}}],["подходящая",{"2":{"409":1}}],["подходящей",{"2":{"322":1}}],["подходящее",{"2":{"229":1,"232":1}}],["подходящем",{"2":{"107":1}}],["подходящую",{"2":{"86":1,"89":1}}],["подходящим",{"2":{"169":1,"225":1}}],["подходящие",{"2":{"89":1}}],["подходящий",{"2":{"27":1,"181":1}}],["подходящих",{"2":{"12":1}}],["подход",{"2":{"118":2,"159":1,"166":1,"172":1,"218":1,"226":1,"229":2,"241":1,"244":1,"249":1,"271":1,"277":1,"289":1,"292":3,"293":2,"295":1,"302":2,"306":1,"309":1,"317":2,"342":2,"344":3,"347":2,"349":1,"351":2,"352":1,"358":1,"367":1,"382":1,"421":1,"426":1,"430":1,"459":1,"461":1}}],["подходах",{"2":{"420":1}}],["подхода",{"2":{"99":1,"191":1,"195":1,"235":2,"253":1,"279":1,"290":1,"344":1,"351":1,"358":1,"366":1,"388":1,"422":2}}],["подходите",{"2":{"266":1}}],["подходит",{"2":{"62":1,"228":1,"229":1,"309":1,"327":1,"344":2,"389":1,"444":1,"447":1,"451":1,"452":1,"461":2}}],["подхедер",{"2":{"29":1}}],["подберем",{"2":{"27":1}}],["подбора",{"2":{"9":1}}],["под",{"2":{"4":1,"110":1,"140":1,"142":1,"149":1,"155":1,"168":1,"184":1,"186":2,"212":1,"213":1,"242":1,"246":1,"253":1,"260":1,"262":1,"271":1,"298":1,"350":2,"366":1,"412":1,"418":1,"421":1,"428":1,"450":1,"451":1,"487":1,"495":1,"496":1,"515":1}}],["прыгания",{"2":{"504":1}}],["пр",{"2":{"443":1}}],["прямую",{"2":{"381":1}}],["прямая",{"2":{"337":1}}],["прямым",{"2":{"172":1,"449":1}}],["прямых",{"2":{"162":1,"296":1,"337":1}}],["прямого",{"2":{"258":1,"337":1}}],["прямоугольниками",{"2":{"229":1}}],["прямое",{"2":{"128":1,"181":1,"293":1}}],["прямо",{"2":{"40":1,"128":1,"184":1,"444":1,"495":1}}],["прямой",{"2":{"20":1,"126":1,"174":1,"218":1,"237":1}}],["прятать",{"2":{"4":1}}],["прелоадер",{"2":{"532":1}}],["препроцессора",{"2":{"492":1}}],["преподавательской",{"2":{"64":1}}],["презентационный",{"2":{"459":1}}],["презентационного",{"2":{"318":2}}],["прекрасный",{"2":{"460":1}}],["прекрасно",{"2":{"426":1,"439":1}}],["прекратит",{"2":{"161":1}}],["прервет",{"2":{"326":1}}],["прервана",{"2":{"159":1}}],["прерывая",{"2":{"422":1}}],["прерывать",{"2":{"422":1}}],["прерывается",{"2":{"309":1}}],["прерывании",{"2":{"303":1}}],["преследуете",{"2":{"192":1}}],["преследовали",{"2":{"169":1}}],["претенциозной",{"2":{"448":1}}],["претензий",{"2":{"9":1}}],["претерпела",{"2":{"190":1}}],["преобладающим",{"2":{"174":1}}],["преобразуется",{"2":{"242":1,"374":1}}],["преобразует",{"2":{"114":1,"326":1}}],["преобразовать",{"2":{"325":1}}],["преобразованным",{"2":{"302":1}}],["преобразованы",{"2":{"299":1}}],["преобразовано",{"2":{"221":1}}],["преобразованию",{"2":{"249":1}}],["преобразование",{"2":{"125":2,"382":1}}],["преобразования",{"2":{"44":1,"193":1,"302":1}}],["преобразовывать",{"2":{"41":1,"301":1,"302":1}}],["пренебрегали",{"2":{"140":1}}],["превышает",{"2":{"314":1}}],["превзошла",{"2":{"241":1}}],["превзойти",{"2":{"195":1}}],["превосходящие",{"2":{"140":1}}],["превращения",{"2":{"255":1,"261":1}}],["превращает",{"2":{"251":1}}],["превращается",{"2":{"194":1}}],["превращая",{"2":{"212":1}}],["превращать",{"2":{"20":1,"264":1}}],["превратим",{"2":{"307":1}}],["превратилось",{"2":{"303":1}}],["превратился",{"2":{"274":1}}],["превратится",{"2":{"202":1}}],["превратить",{"2":{"29":1,"253":1,"260":1,"308":1,"373":1}}],["превратятся",{"2":{"195":1}}],["прежнему",{"2":{"169":1,"241":1,"248":2,"253":1,"366":1}}],["прежним",{"2":{"109":1,"190":1}}],["прежде",{"2":{"138":1,"140":1,"149":1,"150":2,"191":1,"215":1,"235":1,"309":1,"314":1,"326":1,"330":1,"347":1,"368":1,"372":1,"373":1,"377":1,"389":1,"425":1,"426":1,"436":1}}],["префикса",{"2":{"326":1}}],["префиксом",{"2":{"241":1}}],["префиксируем",{"2":{"240":1}}],["префикс",{"2":{"103":2,"197":1,"237":1}}],["преимуществами",{"2":{"191":2,"449":1}}],["преимущества",{"2":{"114":1,"121":1,"189":1,"253":2,"265":1,"271":1,"295":1,"309":1,"333":1,"334":1,"366":2,"367":1,"391":1,"420":1,"427":2}}],["преимущественно",{"2":{"109":1,"449":1,"451":1}}],["преимуществ",{"2":{"48":1,"191":1,"195":2,"215":1,"218":1,"235":1,"253":2,"264":1,"318":1,"343":1,"344":1,"349":2,"366":1,"418":2}}],["преимуществом",{"2":{"193":1,"194":1}}],["преимущество",{"2":{"17":1,"295":1,"314":1}}],["предназначались",{"2":{"460":1}}],["предназначена",{"2":{"359":1}}],["предназначен",{"2":{"309":1,"366":1}}],["предназначенная",{"2":{"263":1}}],["предназначенных",{"2":{"190":1}}],["предназначенный",{"2":{"159":1}}],["предназначено",{"2":{"150":1}}],["предшествующий",{"2":{"374":1}}],["преданность",{"2":{"363":1}}],["предисловие",{"0":{"358":1,"485":1},"1":{"486":1}}],["пределами",{"2":{"350":2,"449":1,"451":1}}],["пределы",{"2":{"162":1,"203":2,"350":1}}],["предвидеть",{"2":{"223":1}}],["предварительных",{"2":{"440":1}}],["предварительный",{"2":{"215":1,"460":1}}],["предварительное",{"2":{"359":1}}],["предварительного",{"2":{"214":1,"224":1}}],["предварительно",{"2":{"182":1,"460":2,"461":1}}],["предварительной",{"2":{"155":1,"161":1,"371":1}}],["предприятий",{"2":{"366":1}}],["предписаны",{"2":{"209":1}}],["предписано",{"2":{"203":1}}],["предписанный",{"2":{"194":1}}],["предписывает",{"2":{"191":1,"193":1,"195":1,"277":1,"308":1}}],["предписывается",{"2":{"191":1}}],["предписывают",{"2":{"191":1,"215":1}}],["предпочтение",{"2":{"374":1}}],["предпочтительнее",{"2":{"309":1}}],["предпочтительно",{"2":{"87":1,"199":1}}],["предпосылкам",{"2":{"369":1}}],["предположим",{"2":{"288":1,"375":1,"388":1}}],["предполагалось",{"2":{"302":1}}],["предполагают",{"2":{"255":1}}],["предполагающая",{"2":{"185":1}}],["предполагает",{"2":{"360":1,"417":1,"440":1}}],["предполагается",{"2":{"253":2,"387":1,"417":1}}],["предполагаемой",{"2":{"186":1}}],["предполагая",{"2":{"134":1}}],["предотвратить",{"2":{"260":1,"273":1}}],["предотвращает",{"2":{"260":1}}],["предотвращая",{"2":{"194":1}}],["предотвращать",{"2":{"187":1}}],["предотвращение",{"0":{"181":1}}],["предотвращения",{"2":{"159":1,"332":1}}],["предостережений",{"2":{"350":1}}],["предостережение",{"2":{"159":1,"270":1,"275":1}}],["предоставили",{"2":{"238":1}}],["предоставило",{"2":{"219":1}}],["предоставить",{"2":{"238":1,"253":1,"262":1,"292":1,"410":1,"423":1}}],["предоставит",{"2":{"220":1,"232":1,"245":1,"260":1,"331":1,"340":1,"429":1,"432":1}}],["предоставленные",{"2":{"360":1}}],["предоставленного",{"2":{"246":1}}],["предоставленное",{"2":{"240":1}}],["предоставлена",{"2":{"293":1}}],["предоставление",{"2":{"150":1,"318":1}}],["предоставления",{"2":{"108":1,"166":1,"180":1,"187":1,"188":1,"238":1,"243":1,"381":1,"417":1}}],["предоставляйте",{"2":{"410":1}}],["предоставляющая",{"2":{"439":1}}],["предоставляющую",{"2":{"381":1}}],["предоставляющие",{"2":{"386":1}}],["предоставляющий",{"2":{"381":1}}],["предоставляющих",{"2":{"209":1,"306":1}}],["предоставляются",{"2":{"153":1,"196":1,"288":1,"424":1,"439":1}}],["предоставляют",{"2":{"107":1,"125":1,"135":1,"190":1,"191":1,"216":1,"272":1,"281":1,"318":1,"350":3,"381":2,"388":1,"407":1,"439":1,"459":1}}],["предоставляя",{"2":{"128":1,"318":1,"426":1}}],["предоставляемой",{"2":{"333":1,"441":1}}],["предоставляемое",{"2":{"235":1}}],["предоставляемого",{"2":{"161":1,"238":1}}],["предоставляемых",{"2":{"335":1,"345":1,"350":1,"415":1,"417":1}}],["предоставляемыми",{"2":{"354":1,"401":1}}],["предоставляемым",{"2":{"318":1}}],["предоставляемый",{"2":{"217":1,"260":1,"326":1}}],["предоставляемые",{"2":{"216":1,"349":1,"377":1,"418":1,"441":1}}],["предоставляемую",{"2":{"135":1}}],["предоставляем",{"2":{"128":1,"238":1,"246":1,"352":1}}],["предоставляемая",{"2":{"115":1,"135":1}}],["предоставляет",{"2":{"107":4,"108":1,"125":1,"135":1,"190":1,"195":1,"202":2,"203":1,"215":1,"218":1,"238":1,"242":1,"243":1,"262":1,"296":1,"301":3,"309":2,"314":1,"315":2,"324":1,"327":1,"340":1,"345":2,"350":1,"351":1,"372":1,"373":1,"377":3,"380":1,"381":2,"382":1,"420":1,"424":1,"428":1,"439":1}}],["предоставляется",{"2":{"57":1,"108":1,"128":2,"203":1,"325":1,"350":1}}],["предоставляться",{"2":{"245":1}}],["предоставлять",{"2":{"108":1,"113":1,"166":1,"235":1,"238":1,"253":2,"260":1,"272":1,"449":1}}],["предупредить",{"2":{"158":1,"271":1}}],["предусмотреть",{"2":{"382":1}}],["предусмотренный",{"2":{"235":2}}],["предусмотренные",{"2":{"152":1,"403":1}}],["предусмотрены",{"2":{"196":1}}],["предусмотрен",{"2":{"135":1,"153":1,"159":1,"240":1,"350":1}}],["предусмотрена",{"2":{"63":1,"235":1,"369":1}}],["предусматривает",{"2":{"68":1,"223":1}}],["предусматривают",{"2":{"41":1}}],["предстоит",{"2":{"191":1,"248":1}}],["представительное",{"2":{"246":1}}],["представить",{"2":{"169":1,"193":1,"213":1,"228":1,"229":1,"238":1,"245":1,"247":1,"301":1,"306":1,"318":1,"340":1,"375":1,"388":1,"415":1}}],["представим",{"2":{"26":1,"271":1,"303":1,"309":1,"312":2}}],["представьте",{"2":{"125":1,"138":1,"449":1}}],["представлен",{"0":{"357":1},"2":{"371":1,"397":1,"419":1}}],["представлено",{"2":{"271":1,"314":1,"387":1,"404":1}}],["представлены",{"2":{"186":1,"393":1,"398":1,"400":1,"402":1,"403":1}}],["представленная",{"2":{"166":1,"298":1}}],["представленную",{"2":{"150":1}}],["представленные",{"2":{"415":1}}],["представленных",{"2":{"141":1,"383":1,"419":1}}],["представленный",{"2":{"130":1,"162":1,"336":1}}],["представлена",{"2":{"142":1,"307":1,"399":1}}],["представлений",{"2":{"371":1,"375":1,"377":1,"383":1}}],["представлении",{"2":{"167":1,"377":1}}],["представлением",{"2":{"377":1}}],["представление",{"2":{"4":2,"11":2,"67":1,"122":1,"138":1,"140":1,"159":1,"161":1,"188":1,"190":1,"193":2,"215":1,"230":1,"238":1,"242":1,"245":1,"253":1,"269":1,"271":1,"272":1,"297":1,"299":1,"302":1,"304":1,"308":1,"314":3,"318":1,"320":1,"330":1,"377":1,"383":1,"387":1,"428":1}}],["представления",{"0":{"375":1},"1":{"376":1,"377":1},"2":{"3":2,"17":1,"140":1,"165":1,"222":1,"247":1,"255":1,"256":1,"260":1,"314":1,"391":1,"419":1,"451":1}}],["представляем",{"2":{"366":1}}],["представляемых",{"2":{"231":1}}],["представляется",{"2":{"178":1,"331":1}}],["представляет",{"2":{"125":1,"172":1,"177":1,"181":1,"191":1,"194":1,"215":2,"247":1,"256":1,"321":1,"327":1,"331":1,"350":1,"358":1,"366":1,"383":1,"393":1,"426":1,"499":1}}],["представляющая",{"2":{"256":1,"257":2,"371":1}}],["представляющий",{"2":{"215":1,"234":1,"425":1}}],["представляются",{"2":{"148":1,"153":1,"158":1,"161":1}}],["представляют",{"2":{"6":1,"146":1,"152":1,"153":1,"164":1,"188":1,"193":1,"350":1}}],["представлял",{"2":{"190":1}}],["представлять",{"2":{"23":1,"75":1,"222":1,"229":1,"303":1,"449":1}}],["предсказания",{"2":{"146":1}}],["предыдущую",{"2":{"460":1}}],["предыдущая",{"2":{"218":1,"364":1}}],["предыдущее",{"2":{"422":1}}],["предыдущей",{"2":{"247":1,"258":1,"262":1,"305":1,"314":1,"428":1}}],["предыдущего",{"2":{"144":1,"172":1,"251":1,"255":1,"345":1,"377":1}}],["предыдущему",{"2":{"430":1}}],["предыдущем",{"2":{"125":1,"143":1,"161":1,"173":1,"174":1,"240":2,"260":2,"262":1,"292":1,"300":1,"314":1,"343":1,"374":1,"376":1,"377":1,"380":1,"386":1,"387":2}}],["предыдущих",{"2":{"194":1,"212":2,"215":1,"237":1,"320":1,"335":1,"343":1,"349":1,"364":1,"374":1,"387":1,"388":1}}],["предыдущими",{"2":{"215":1,"416":1}}],["предыдущим",{"2":{"125":1}}],["предыдущие",{"2":{"124":1,"202":1,"422":1,"433":1}}],["предыдущий",{"2":{"112":1,"132":1,"202":1,"260":1,"261":1,"289":1,"297":1,"303":1,"309":1,"315":1,"324":1,"426":1}}],["предмет",{"2":{"107":1,"258":1}}],["предмета",{"2":{"64":1,"143":1}}],["предъявляемых",{"2":{"68":1}}],["предложенное",{"2":{"214":1}}],["предложенных",{"2":{"81":1}}],["предложено",{"2":{"214":1,"438":1}}],["предложений",{"2":{"451":1}}],["предложением",{"2":{"187":1,"238":1,"350":1}}],["предложение",{"2":{"178":1}}],["предложения",{"2":{"158":1,"182":1,"199":1}}],["предложит",{"2":{"260":1}}],["предложить",{"2":{"191":1,"253":1,"306":1,"373":1,"483":1}}],["предложите",{"2":{"143":1}}],["предложил",{"2":{"61":1,"460":1,"461":1}}],["предлагайте",{"2":{"149":2}}],["предлагаемого",{"2":{"191":1}}],["предлагаемый",{"2":{"10":1}}],["предлагается",{"2":{"180":1,"217":1,"350":1}}],["предлагает",{"2":{"39":1,"40":1,"170":1,"191":1,"193":1,"214":1,"217":1,"219":1,"238":1,"255":1,"318":1,"350":1,"428":2,"431":1}}],["предлагающий",{"2":{"218":1}}],["предлагающих",{"2":{"107":1,"186":1}}],["предлагают",{"2":{"135":1,"152":1,"163":1,"440":1,"459":1,"460":1}}],["предлагаю",{"2":{"4":1,"109":1,"298":1}}],["прагматичный",{"2":{"274":1}}],["прайм",{"2":{"143":1}}],["практичности",{"2":{"327":1}}],["практическое",{"2":{"460":1}}],["практической",{"2":{"212":1,"266":1}}],["практического",{"2":{"149":1}}],["практическим",{"2":{"364":1}}],["практических",{"2":{"212":1,"213":1,"364":1}}],["практически",{"2":{"32":1,"116":1,"128":1,"138":2,"158":1,"179":1,"222":2,"232":1,"349":1,"418":1}}],["практикующие",{"2":{"417":1}}],["практику",{"2":{"218":1,"277":1}}],["практикой",{"2":{"204":1,"226":1,"238":1,"374":1,"376":1,"448":1,"449":1}}],["практиками",{"2":{"460":1}}],["практиках",{"2":{"411":1}}],["практика",{"2":{"180":1,"194":1,"255":1,"332":1,"438":1,"440":1,"449":1}}],["практике",{"2":{"116":1,"158":1,"159":1,"176":1,"191":1,"194":1,"214":1,"258":1,"263":1,"267":1,"271":1,"274":1,"277":1,"293":1,"306":1,"307":1,"337":2,"349":1,"350":1,"351":1,"364":1,"417":1,"419":1,"439":1}}],["практик",{"2":{"76":1,"212":1,"271":1,"276":1,"293":1,"460":1,"484":1,"495":2,"496":1}}],["практики",{"0":{"356":1,"411":1},"1":{"357":1,"358":1,"359":1,"360":1,"361":1,"362":1,"363":1},"2":{"9":1,"75":1,"106":1,"190":1,"223":2,"273":1,"276":1,"277":1,"368":1,"440":1,"459":1,"460":1,"495":1,"496":1}}],["прав",{"2":{"381":1,"435":1}}],["правительственных",{"2":{"125":1,"169":1}}],["правильных",{"2":{"460":1}}],["правильным",{"2":{"162":1,"221":1,"274":1,"337":1,"426":1}}],["правильное",{"2":{"426":1}}],["правильность",{"2":{"342":1}}],["правильно",{"2":{"180":1,"194":1,"223":1,"255":1,"259":2,"307":1,"315":1,"325":1,"421":1}}],["правильном",{"2":{"169":1,"314":1}}],["правил",{"0":{"149":1},"2":{"141":1,"149":2,"253":1}}],["правилах",{"2":{"149":1,"169":1}}],["правила",{"2":{"67":1,"149":2,"190":1,"191":1,"194":1,"216":1,"267":1,"304":1,"451":1}}],["правило",{"2":{"2":1,"20":1,"67":1,"130":1,"142":1,"158":1,"169":2,"215":1,"274":1,"284":1,"337":1,"360":1,"380":1,"417":1}}],["правая",{"2":{"444":1}}],["права",{"2":{"106":1,"125":1,"387":1}}],["правой",{"2":{"155":1,"258":1}}],["правом",{"2":{"141":1,"143":1,"147":1,"263":2}}],["право",{"2":{"106":3}}],["правками",{"2":{"83":1}}],["правда",{"2":{"23":1,"307":1,"417":1}}],["проехать",{"2":{"460":1}}],["проекты",{"2":{"360":1,"369":3,"431":2,"460":1}}],["проекту",{"2":{"212":1,"418":1,"431":1}}],["проектов",{"2":{"121":2,"213":1,"241":1,"277":1,"349":1,"369":2,"395":1,"428":1,"430":2,"431":1,"439":1,"443":1,"451":1,"459":1}}],["проектом",{"2":{"78":1,"212":1,"213":1,"395":1,"409":1,"439":1}}],["проекте",{"0":{"487":1},"2":{"61":1,"103":1,"214":1,"218":1,"219":1,"267":2,"377":1,"408":1,"409":1,"415":1,"417":1,"418":1,"419":1,"428":1,"431":1,"443":1,"449":1,"459":1,"484":1,"491":1}}],["проектированию",{"2":{"358":1}}],["проектирование",{"2":{"141":1,"145":1,"303":1}}],["проектирования",{"0":{"141":1,"146":1,"150":1,"232":1,"266":1,"267":1,"268":1,"277":1,"356":1,"394":1},"1":{"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"267":1,"268":1,"269":2,"270":2,"271":2,"272":2,"273":2,"274":2,"275":2,"276":2,"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,"306":1,"307":1,"308":1,"309":1,"310":1,"311":1,"357":1,"358":1,"359":1,"360":1,"361":1,"362":1,"363":1},"2":{"41":1,"97":1,"138":1,"141":1,"142":1,"145":1,"149":1,"169":1,"176":1,"190":2,"210":1,"212":1,"216":2,"220":2,"226":3,"228":1,"229":1,"231":1,"232":1,"234":1,"237":1,"240":1,"241":1,"243":1,"249":1,"266":1,"267":1,"268":1,"276":2,"277":2,"282":1,"295":1,"297":1,"310":1,"311":1,"312":2,"317":1,"318":2,"319":2,"320":1,"333":1,"334":1,"337":1,"340":1,"351":1,"358":3,"359":2,"360":1,"394":1,"399":1,"419":1}}],["проектировании",{"2":{"2":1}}],["проект",{"0":{"60":1,"458":1},"2":{"4":1,"39":1,"57":1,"62":2,"68":1,"75":1,"212":1,"213":1,"214":8,"215":2,"216":1,"218":2,"247":1,"297":1,"310":1,"327":1,"336":1,"345":2,"367":1,"374":1,"395":1,"408":2,"409":1,"415":1,"419":1,"428":1,"431":2,"443":2,"452":1,"456":1,"489":2,"515":1}}],["проектами",{"2":{"243":1,"248":1,"369":1,"487":1}}],["проектах",{"2":{"209":1,"212":2,"218":1,"232":1,"242":1,"277":1,"408":1,"409":1,"427":1,"441":1,"450":1}}],["проекта",{"0":{"4":1,"9":1,"20":1,"57":1,"74":1,"75":1,"79":1,"101":1,"212":1,"214":1,"244":1,"395":1},"1":{"75":1,"76":1,"77":1,"78":1,"102":1,"103":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"223":1,"224":1,"225":1},"2":{"10":1,"14":1,"60":1,"63":1,"64":1,"67":3,"75":1,"103":1,"107":1,"110":1,"111":1,"117":1,"139":1,"193":1,"194":1,"195":1,"212":1,"214":8,"215":3,"216":1,"217":1,"218":1,"219":1,"226":1,"227":1,"243":1,"244":1,"249":1,"298":1,"336":1,"344":1,"345":1,"351":1,"368":2,"369":2,"370":1,"374":5,"405":1,"407":1,"408":2,"409":2,"415":1,"417":2,"420":3,"427":1,"428":1,"431":1,"435":1,"436":1,"450":1,"458":1,"460":1,"484":1,"495":1}}],["проапгрейдиться",{"2":{"459":1}}],["проанализировав",{"2":{"377":1}}],["проанализировать",{"2":{"240":1}}],["пройден",{"2":{"421":1}}],["пройти",{"2":{"138":1,"384":1,"460":1}}],["процентов",{"2":{"448":1,"524":1}}],["процентные",{"2":{"430":1}}],["процедур",{"2":{"439":1}}],["процедуры",{"2":{"418":1}}],["процессы",{"2":{"277":1,"314":1,"327":1}}],["процессу",{"2":{"228":1,"266":1,"267":1,"316":1,"322":1}}],["процессом",{"2":{"163":1,"232":1,"235":1,"314":2,"337":1}}],["процессор",{"2":{"143":1,"209":1,"444":1}}],["процессора",{"2":{"128":1}}],["процессов",{"2":{"67":1,"188":1,"282":1,"383":1}}],["процессах",{"2":{"182":1}}],["процессами",{"2":{"122":1,"314":2,"318":1}}],["процесса",{"2":{"78":1,"135":1,"157":1,"159":1,"173":1,"192":1,"195":1,"234":1,"261":1,"266":1,"308":1,"314":2,"315":2,"320":2,"331":1,"335":1,"383":3,"386":1,"387":1,"388":2,"408":1,"418":1,"422":1,"430":1,"440":1}}],["процессе",{"2":{"67":1,"68":1,"117":1,"126":1,"150":1,"191":1,"193":1,"215":1,"223":1,"246":1,"262":1,"274":1,"314":1,"318":1,"327":1,"382":1,"383":1,"387":1,"409":1,"417":1,"418":1}}],["процесс",{"2":{"60":1,"117":1,"134":1,"135":1,"159":1,"162":1,"193":1,"223":1,"225":1,"228":1,"231":1,"238":1,"246":1,"260":2,"261":1,"274":1,"309":1,"314":9,"318":2,"319":2,"320":1,"326":1,"350":1,"382":1,"383":1,"387":1,"388":4,"389":2,"405":1,"417":2,"418":1,"430":1,"440":3,"442":1,"450":1}}],["проходит",{"2":{"263":1}}],["прозрачным",{"2":{"411":1}}],["прозрачны",{"2":{"253":1}}],["прозрачный",{"2":{"106":1,"414":1}}],["прозрачное",{"2":{"408":1}}],["прозрачно",{"2":{"253":1,"303":1,"409":1}}],["прояснить",{"2":{"301":1}}],["проясняться",{"2":{"195":1}}],["проявлять",{"2":{"314":1}}],["проявляться",{"2":{"267":1}}],["проявляются",{"2":{"253":1}}],["проявляется",{"2":{"179":1,"302":1,"450":1}}],["проявившиеся",{"2":{"195":1}}],["проникновение",{"0":{"178":1}}],["прокручивается",{"2":{"371":1}}],["прокручиваются",{"2":{"164":1}}],["прокрутить",{"2":{"161":1,"174":1}}],["прокруткой",{"2":{"162":1}}],["прокрутка",{"2":{"161":1,"371":1}}],["прокрутку",{"2":{"161":1}}],["прокрутки",{"2":{"147":1,"161":1,"162":1,"241":2}}],["проксирования",{"2":{"301":1,"302":2}}],["прокси",{"2":{"108":1,"109":1,"131":1,"216":1,"261":1,"266":1,"277":1,"301":8,"302":6,"303":6,"305":1,"306":2,"318":1,"325":1,"335":1,"352":2,"451":1}}],["профессиональную",{"2":{"441":1}}],["профессиональные",{"2":{"415":1}}],["профессиональный",{"2":{"145":1}}],["профессионального",{"2":{"455":1}}],["профессиональной",{"2":{"363":1}}],["профессиональное",{"2":{"276":1}}],["профессор",{"2":{"149":1}}],["профилем",{"2":{"58":1}}],["профиля",{"2":{"4":1}}],["промежутках",{"2":{"388":1}}],["промежутка",{"2":{"388":1}}],["промежуток",{"2":{"387":1}}],["промежуточным",{"2":{"328":1}}],["промежуточных",{"2":{"303":1}}],["промежуточный",{"2":{"215":1}}],["промежуточное",{"2":{"301":1}}],["промежуточного",{"2":{"247":1,"451":1}}],["промптировании",{"2":{"260":1}}],["промптов",{"2":{"82":1}}],["промисная",{"2":{"499":1}}],["промисы",{"2":{"266":1,"423":1}}],["промисов",{"2":{"243":1,"460":1}}],["промис",{"2":{"235":2,"381":1,"389":1}}],["промиса",{"2":{"232":1,"246":1}}],["промышленном",{"2":{"328":1}}],["промышленной",{"2":{"216":1,"262":1}}],["промышленный",{"2":{"141":1}}],["прочную",{"2":{"441":1}}],["прочная",{"2":{"439":1}}],["прочтение",{"2":{"363":1}}],["прочим",{"2":{"452":1}}],["прочие",{"2":{"409":1,"412":1}}],["прочих",{"2":{"215":1,"461":1}}],["прочитаны",{"2":{"350":1}}],["прочитал",{"2":{"156":1}}],["прочитать",{"2":{"138":1,"349":1}}],["прочесть",{"2":{"461":1}}],["прочее",{"2":{"58":1}}],["прочего",{"2":{"36":1}}],["прошла",{"2":{"385":1,"387":1}}],["прошлый",{"2":{"276":1}}],["прошли",{"2":{"210":1,"263":2,"420":1,"421":1}}],["прошлой",{"2":{"81":1}}],["прошел",{"2":{"110":1}}],["пробовать",{"2":{"430":1}}],["пробегаемся",{"2":{"298":1}}],["пробелы",{"2":{"205":1}}],["пробелами",{"2":{"108":1}}],["пробная",{"2":{"213":2}}],["пробного",{"2":{"179":1}}],["проблемой",{"2":{"314":2,"383":1}}],["проблему",{"2":{"124":1,"125":1,"162":1,"277":1,"314":2,"408":1,"412":1,"449":1}}],["проблемам",{"2":{"269":1}}],["проблема",{"2":{"67":1,"113":1,"195":1,"237":1,"238":1,"273":1,"309":1,"350":1}}],["проблемы",{"2":{"61":1,"108":2,"190":1,"203":1,"238":1,"266":1,"277":2,"278":1,"383":1,"389":1,"415":1,"430":1,"449":1,"460":1,"461":1}}],["проблем",{"2":{"9":1,"107":1,"162":1,"191":1,"241":1,"266":1,"269":1,"274":1,"308":1,"358":1,"382":1,"415":1,"431":2,"533":1}}],["провайдите",{"2":{"411":1}}],["провайдеры",{"2":{"135":1,"407":2}}],["провайдерами",{"2":{"460":1,"533":1}}],["провайдерах",{"2":{"129":1}}],["провайдера",{"2":{"107":1,"128":1,"452":1}}],["провайдер",{"2":{"107":1,"129":1}}],["провайдеров",{"2":{"107":1,"135":1,"386":1}}],["провизия",{"2":{"238":1}}],["провизию",{"2":{"238":1}}],["проводить",{"2":{"451":1}}],["проводиться",{"2":{"417":2}}],["проводилось",{"2":{"417":1}}],["проводил",{"2":{"162":1}}],["проводнике",{"2":{"215":1}}],["проведения",{"2":{"442":1}}],["проведение",{"2":{"415":1}}],["проведет",{"2":{"263":1}}],["провели",{"2":{"249":1}}],["проверено",{"2":{"461":1}}],["проверена",{"2":{"387":1}}],["проверенная",{"2":{"485":1}}],["проверенное",{"2":{"191":1,"277":1}}],["проверенным",{"2":{"495":1}}],["проверенных",{"2":{"484":1}}],["проверенные",{"2":{"75":1}}],["проверенный",{"2":{"9":1}}],["проверенную",{"2":{"17":1}}],["проверке",{"2":{"421":2}}],["проверку",{"2":{"293":1,"302":1,"383":1,"417":1}}],["проверка",{"2":{"246":1,"301":1,"380":1,"382":1,"388":1,"437":1,"449":3,"533":1}}],["проверки",{"0":{"137":1,"189":1,"211":1,"225":1,"250":1,"265":1,"311":1,"334":1,"355":1,"391":1,"442":1},"2":{"152":1,"382":4,"383":3,"386":2,"388":4,"417":1,"421":1,"423":1}}],["проверит",{"2":{"420":1}}],["проверить",{"2":{"125":1,"214":1,"250":1,"251":1,"259":1,"308":1,"383":1,"386":1,"422":1,"423":1,"426":1,"427":1,"435":1,"436":1,"460":1}}],["проверили",{"2":{"333":1}}],["проверив",{"2":{"106":1}}],["проверьте",{"2":{"116":1,"222":1,"342":1,"461":1}}],["проверок",{"2":{"116":1}}],["проверяются",{"2":{"417":2}}],["проверяем",{"2":{"261":1,"287":1,"294":1,"298":1,"302":1,"309":1,"352":2,"425":1}}],["проверяет",{"2":{"106":2,"222":1,"383":1,"388":1,"408":1,"444":1}}],["проверять",{"2":{"106":1,"382":1,"421":1,"450":1}}],["провести",{"2":{"12":1,"181":1,"191":1,"332":1,"460":1}}],["проталкивает",{"2":{"378":1}}],["протестировали",{"2":{"426":1}}],["протестированы",{"2":{"306":1,"418":1}}],["протестировать",{"2":{"107":1,"418":3,"420":1,"421":1,"423":1,"496":1}}],["протяжении",{"2":{"193":1,"214":1}}],["противном",{"2":{"222":1,"236":1,"293":1,"315":1,"323":1}}],["противоположную",{"2":{"184":1,"277":1}}],["противоположное",{"2":{"177":1}}],["противоположные",{"2":{"158":1}}],["против",{"0":{"140":1},"2":{"144":1}}],["прототипа",{"2":{"250":1}}],["прототипов",{"2":{"232":1}}],["прототип",{"2":{"223":1}}],["прототипирования",{"2":{"20":1}}],["протоколе",{"2":{"383":1}}],["протоколирования",{"2":{"303":1}}],["протоколам",{"2":{"190":1}}],["протокола",{"2":{"135":2,"350":1,"383":2}}],["протоколу",{"2":{"134":1,"135":1,"136":1,"312":1,"407":1,"412":1}}],["протокол",{"2":{"125":3,"327":2,"383":3,"500":1}}],["протоколы",{"0":{"109":1},"2":{"109":1,"390":1,"460":1}}],["протоколом",{"2":{"108":1,"383":1,"385":1}}],["прогон",{"2":{"450":1}}],["проговаривание",{"2":{"64":1}}],["програмную",{"2":{"461":1}}],["програмных",{"2":{"358":1}}],["программой",{"2":{"217":1}}],["программ",{"2":{"213":1,"360":1}}],["программистов",{"2":{"451":1,"485":1}}],["программистские",{"2":{"451":1}}],["программистам",{"2":{"451":1}}],["программиста",{"2":{"266":1,"452":1}}],["программист",{"2":{"191":2,"274":1,"448":1,"451":1}}],["программировали",{"2":{"306":1}}],["программированию",{"2":{"460":2}}],["программирование",{"2":{"266":1,"311":1,"363":1,"451":1}}],["программировании",{"2":{"191":3,"271":1}}],["программирования",{"2":{"3":1,"17":1,"107":2,"190":2,"191":1,"238":1,"261":1,"270":1,"272":1,"451":2}}],["программировать",{"2":{"84":1,"452":1}}],["программы",{"2":{"126":1,"191":1,"194":1,"240":1,"339":1,"368":1,"407":1,"432":1,"444":1,"448":1,"451":2}}],["программа",{"2":{"108":1,"191":1}}],["программу",{"2":{"67":1,"191":1,"275":1,"432":1}}],["программный",{"2":{"378":1}}],["программные",{"2":{"140":1}}],["программными",{"2":{"451":1}}],["программным",{"2":{"140":1,"428":1}}],["программно",{"2":{"191":1,"371":2,"388":1,"426":2,"448":1}}],["программном",{"2":{"148":1,"269":1}}],["программному",{"2":{"128":1,"333":1,"417":1}}],["программное",{"2":{"124":1,"128":2,"138":1,"140":2,"186":1,"358":1,"360":1,"415":1,"417":2,"430":1}}],["программной",{"2":{"68":1,"190":1,"191":1,"269":1,"277":1}}],["программного",{"0":{"266":1,"267":1,"277":1,"394":1},"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,"306":1,"307":1,"308":1,"309":1,"310":1,"311":1},"2":{"60":1,"66":1,"68":1,"75":1,"109":1,"138":1,"140":1,"146":1,"148":1,"186":1,"190":1,"216":1,"220":1,"225":1,"226":1,"230":1,"234":1,"241":1,"266":1,"267":2,"275":1,"276":1,"277":1,"310":1,"319":1,"340":1,"351":1,"394":2,"415":3,"417":2,"419":1,"430":2,"440":1,"450":1}}],["программная",{"0":{"375":1},"1":{"376":1,"377":1},"2":{"2":1,"75":1,"377":1}}],["прогрессивному",{"2":{"387":1}}],["прогрессивное",{"2":{"260":1}}],["прогрессивность",{"2":{"191":1}}],["прогрессивного",{"2":{"122":1,"190":1,"258":1,"262":1,"358":1}}],["прогрессивные",{"0":{"251":1,"398":1},"1":{"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1},"2":{"251":1,"366":1}}],["прогрессивными",{"2":{"390":1}}],["прогрессивным",{"2":{"211":1}}],["прогрессивный",{"0":{"191":1},"2":{"190":1,"191":2,"253":1,"306":1,"393":1}}],["прогрессивных",{"2":{"190":1}}],["прогресса",{"0":{"159":1},"1":{"160":1},"2":{"159":1,"249":1}}],["прогресс",{"2":{"138":1,"159":3}}],["проп",{"2":{"449":1}}],["пропорционально",{"2":{"308":1}}],["проприетарных",{"2":{"253":1}}],["пропустили",{"2":{"302":1}}],["пропустить",{"2":{"218":1}}],["пропускать",{"2":{"58":1}}],["прописать",{"2":{"408":1,"516":1}}],["прописан",{"2":{"527":1}}],["прописано",{"2":{"200":1}}],["прописаны",{"2":{"191":1}}],["прописывать",{"2":{"41":1}}],["пропсом",{"2":{"246":1}}],["пропсов",{"2":{"236":2,"237":2,"240":1,"339":1,"373":1,"410":1,"449":1}}],["пропсу",{"2":{"240":1}}],["пропсами",{"2":{"374":1,"380":1}}],["пропсам",{"2":{"367":1}}],["пропса",{"2":{"237":1,"246":1,"371":1,"377":1}}],["пропс",{"2":{"160":1,"240":1,"246":2,"339":1,"371":1,"374":1,"377":1}}],["пропсы",{"0":{"205":1,"236":1},"2":{"99":1,"236":1,"237":2,"240":2,"247":1,"410":1,"411":1,"449":1}}],["проиграет",{"2":{"461":1}}],["проигнорируем",{"2":{"215":1}}],["проиндексировать",{"2":{"461":1}}],["происхождения",{"2":{"350":1}}],["происхождением",{"2":{"350":1}}],["происходят",{"2":{"253":1}}],["происходящего",{"2":{"159":1}}],["происходящим",{"2":{"150":1}}],["происходить",{"2":{"17":1,"408":1,"415":1,"449":1}}],["происходит",{"2":{"3":1,"121":1,"150":1,"162":1,"222":1,"238":1,"242":1,"245":1,"248":1,"302":2,"308":1,"314":4,"322":1,"326":1,"344":1,"350":1,"377":1,"380":1,"382":1,"387":2,"415":1,"426":1,"440":1,"442":2,"461":1}}],["проиллюстрирован",{"2":{"231":1}}],["проиллюстрировать",{"2":{"172":1}}],["произошла",{"2":{"315":1,"367":1,"424":1}}],["произошло",{"2":{"156":1,"449":1}}],["произойти",{"2":{"253":1,"422":1}}],["произойдет",{"2":{"162":1,"214":1,"222":1,"235":1,"307":1,"339":1,"388":1}}],["произвольные",{"2":{"329":1}}],["произвольный",{"2":{"161":1}}],["произвольное",{"2":{"255":1}}],["производственной",{"2":{"427":1}}],["производственных",{"2":{"218":1}}],["производственные",{"2":{"215":1}}],["производстве",{"2":{"215":1,"298":1}}],["производства",{"2":{"215":2,"219":1}}],["производству",{"2":{"136":1,"215":1}}],["производится",{"2":{"388":1,"433":1}}],["производителен",{"2":{"214":1}}],["производительней",{"2":{"444":1}}],["производительнее",{"2":{"116":1}}],["производительных",{"2":{"359":1}}],["производительными",{"2":{"251":1}}],["производительным",{"2":{"114":1}}],["производительная",{"2":{"358":1}}],["производительное",{"2":{"451":1}}],["производительной",{"2":{"314":1}}],["производительности",{"2":{"67":1,"121":1,"131":1,"191":2,"218":1,"264":1,"301":1,"314":3,"318":1,"323":1,"327":1,"354":1,"366":1,"398":1,"400":1,"448":1,"449":1,"461":1}}],["производительностью",{"2":{"314":1}}],["производительность",{"2":{"17":1,"68":2,"76":1,"199":1,"253":2,"312":1,"314":2,"333":2,"334":1,"366":1,"453":1}}],["производилась",{"2":{"214":1}}],["продвигает",{"2":{"272":1}}],["продвинулись",{"2":{"214":1}}],["продвинутые",{"2":{"233":1}}],["продвинутыми",{"2":{"312":1}}],["продвинутым",{"2":{"223":1}}],["продвинутых",{"2":{"212":1,"374":1}}],["продвинуться",{"2":{"213":1}}],["продвижение",{"2":{"140":1}}],["продвижения",{"2":{"124":1,"190":1,"202":1,"210":1,"223":1,"260":1,"310":1}}],["продуманный",{"2":{"390":1}}],["продуманных",{"2":{"388":1}}],["продуманные",{"2":{"176":1}}],["продуманного",{"2":{"172":1}}],["продуктом",{"2":{"140":1,"150":1}}],["продуктовый",{"2":{"460":1}}],["продуктовое",{"2":{"78":1}}],["продуктов",{"2":{"11":4,"38":1,"39":1}}],["продукте",{"2":{"11":1}}],["продуктами",{"2":{"88":1}}],["продуктах",{"2":{"11":1}}],["продукта",{"2":{"11":1,"13":1,"60":1,"68":1,"73":1,"75":1,"141":1,"174":1,"440":2}}],["продукты",{"2":{"11":1,"140":1}}],["продукт",{"2":{"10":1,"43":1,"64":1,"75":1,"122":1,"140":1,"220":1,"405":1}}],["продолжать",{"2":{"492":1}}],["продолжаться",{"2":{"179":1}}],["продолжаем",{"2":{"364":1}}],["продолжает",{"2":{"308":1,"421":1,"430":1}}],["продолжения",{"2":{"247":1}}],["продолжение",{"2":{"147":2}}],["продолжим",{"2":{"142":1}}],["продолжительность",{"2":{"307":1}}],["продолжить",{"2":{"175":1,"307":1,"436":1}}],["продолжит",{"2":{"116":1}}],["продлевать",{"2":{"135":1}}],["продлить",{"2":{"125":1}}],["продакшен",{"2":{"215":1}}],["продакшне",{"2":{"103":1,"450":1}}],["продает",{"2":{"125":1}}],["продаются",{"2":{"125":1,"180":1}}],["продавалось",{"2":{"138":1}}],["продавать",{"2":{"125":1}}],["продавцам",{"2":{"13":1}}],["продавцов",{"2":{"12":1}}],["проскроллит",{"2":{"522":1}}],["прослойка",{"2":{"461":1}}],["прослушивание",{"2":{"374":1}}],["прослушивания",{"2":{"273":1}}],["прослушивать",{"2":{"332":2}}],["проследим",{"2":{"218":1}}],["просмотр",{"2":{"215":1,"389":1}}],["просмотреть",{"2":{"166":1,"211":1,"218":1,"435":1}}],["просмотра",{"2":{"161":1,"162":2,"164":1,"195":1,"214":1,"224":1,"246":1,"260":1,"324":2,"353":1,"428":1,"435":1}}],["просматривать",{"2":{"11":2,"273":1,"324":1}}],["просишь",{"2":{"106":1}}],["простейший",{"2":{"303":1}}],["проставить",{"2":{"540":1}}],["проста",{"2":{"172":1,"240":1,"321":1,"329":1,"339":1,"343":1,"367":1,"368":1,"382":1,"386":1,"428":1}}],["простая",{"0":{"382":1},"2":{"110":1,"184":1,"222":1,"260":2,"320":1,"342":1,"382":1,"431":1}}],["пространства",{"2":{"142":1}}],["пространстве",{"2":{"136":1,"158":1,"350":1}}],["пространство",{"2":{"125":1,"350":1,"443":1}}],["простую",{"2":{"124":1,"131":1,"149":1,"177":1,"191":1,"241":1,"308":1,"326":1,"327":1,"369":1}}],["прост",{"2":{"110":1,"128":1,"145":1,"238":1,"260":1,"299":1,"307":2,"316":1,"328":1,"388":1}}],["просты",{"2":{"140":1,"461":1}}],["простых",{"2":{"81":1,"114":1,"135":1,"161":1,"189":1,"190":2,"215":1,"226":1,"247":1,"333":1,"344":1,"381":1,"390":1,"423":1,"436":1,"461":1}}],["простым",{"0":{"275":1},"2":{"75":1,"105":1,"150":1,"249":1,"258":1,"266":1,"275":1,"303":1,"306":1,"315":1,"318":1,"344":1,"369":1,"387":1,"411":1,"424":1,"432":1}}],["простыми",{"2":{"11":1,"135":1,"218":1,"322":1}}],["простые",{"2":{"2":1,"23":1,"41":1,"215":1,"216":1,"275":1,"304":1,"305":1,"308":1,"323":1,"337":1,"448":1,"524":1,"541":1}}],["простор",{"2":{"277":1}}],["простого",{"2":{"190":1,"222":1,"240":1,"301":1,"350":1,"388":1,"496":1}}],["простому",{"2":{"224":1,"405":1}}],["простом",{"2":{"160":1,"203":1,"301":1,"304":1,"451":1}}],["простое",{"2":{"114":1,"193":1,"214":1,"219":1,"223":1,"224":1,"237":1,"288":1,"315":1,"337":1,"461":1}}],["простота",{"2":{"39":1,"275":1,"344":1}}],["простоты",{"2":{"7":1,"169":1,"230":1,"255":1,"327":1,"377":1}}],["простой",{"0":{"331":1},"1":{"332":1},"2":{"32":1,"106":1,"144":1,"162":1,"172":1,"192":1,"220":1,"222":2,"229":1,"242":2,"243":1,"260":1,"261":1,"264":1,"269":1,"286":1,"294":1,"297":1,"298":1,"302":1,"303":1,"306":1,"309":1,"312":2,"314":1,"315":1,"325":1,"329":1,"330":2,"337":1,"344":1,"350":1,"352":1,"353":1,"358":1,"371":1,"373":1,"382":1,"400":1,"421":1,"428":2,"440":1,"460":1,"519":1,"520":1,"524":1}}],["просто",{"0":{"218":1},"2":{"2":1,"12":1,"97":1,"106":1,"112":1,"122":1,"125":2,"128":1,"129":1,"132":1,"149":1,"162":1,"168":1,"184":1,"195":1,"202":1,"214":1,"219":1,"226":1,"240":1,"246":2,"276":1,"288":1,"293":2,"294":1,"298":1,"302":1,"303":1,"308":1,"314":1,"315":2,"316":1,"325":1,"326":1,"329":1,"330":1,"332":1,"336":1,"337":1,"338":2,"340":1,"344":1,"347":1,"350":2,"352":1,"368":1,"372":1,"374":1,"381":1,"386":1,"407":1,"419":1,"433":1,"448":1,"449":3,"452":1,"459":1,"460":1,"492":1,"495":1}}],["проще",{"2":{"2":1,"38":1,"55":1,"107":1,"148":1,"169":1,"253":1,"271":1,"345":1,"349":1,"352":1,"366":1,"448":1,"459":1,"461":1}}],["приглашаем",{"2":{"487":1}}],["приглашение",{"2":{"261":1}}],["приглашения",{"2":{"260":2}}],["пригодится",{"2":{"435":1,"460":1}}],["пригодиться",{"2":{"428":1,"444":1}}],["приписываются",{"2":{"389":1}}],["природа",{"2":{"415":1}}],["природе",{"2":{"204":1,"309":1}}],["прирост",{"2":{"314":1,"323":1}}],["пришли",{"2":{"366":1}}],["пришла",{"2":{"241":1}}],["пришлось",{"2":{"143":1}}],["пришло",{"2":{"134":1,"222":1,"246":1,"247":1,"260":1,"320":1,"321":1,"323":1,"326":1,"371":1,"374":1,"380":1,"429":1}}],["признательность",{"2":{"363":1}}],["признаку",{"2":{"247":1}}],["признания",{"2":{"235":1}}],["призывом",{"2":{"174":2}}],["призыв",{"0":{"174":1},"2":{"174":1,"186":1}}],["призывы",{"2":{"157":1}}],["призыва",{"2":{"142":1}}],["придумали",{"2":{"461":1}}],["придумать",{"2":{"311":1}}],["придать",{"2":{"221":1}}],["придерживаться",{"2":{"188":1,"191":1,"307":1,"420":1,"460":1}}],["придерживаются",{"2":{"174":1,"459":1}}],["придется",{"2":{"38":1,"58":1,"191":1,"238":1,"276":1,"287":1,"314":1}}],["приобрела",{"2":{"366":1}}],["приобрести",{"2":{"213":1}}],["приобретают",{"2":{"417":1}}],["приобретаются",{"2":{"125":1}}],["приобретен",{"2":{"125":1,"135":1}}],["приятный",{"2":{"507":1}}],["приятные",{"2":{"215":1}}],["приятней",{"2":{"459":1}}],["приятно",{"2":{"195":1}}],["приятен",{"2":{"141":1}}],["приемник",{"2":{"300":1}}],["приемники",{"2":{"299":1}}],["приемнику",{"2":{"299":1}}],["приемы",{"2":{"188":1}}],["приемов",{"2":{"161":1,"175":1,"218":1}}],["причудливо",{"2":{"191":1}}],["причем",{"2":{"168":1,"301":1,"307":1,"318":1,"350":1,"423":1,"426":1,"460":2}}],["причина",{"2":{"427":1}}],["причинам",{"2":{"424":1}}],["причине",{"2":{"235":1}}],["причин",{"2":{"63":1,"116":1,"164":1,"301":1,"314":1}}],["причины",{"0":{"61":1},"2":{"301":1,"459":1}}],["приборная",{"2":{"429":1}}],["приборной",{"2":{"428":1}}],["прибегая",{"2":{"165":1}}],["приблизить",{"2":{"461":1}}],["приблизительно",{"0":{"78":1}}],["приближении",{"2":{"17":1}}],["приспособленным",{"2":{"358":1}}],["приспособить",{"2":{"136":1}}],["присутствует",{"2":{"449":1}}],["присутствию",{"2":{"125":1}}],["присущей",{"2":{"345":1}}],["присоединить",{"2":{"237":1}}],["присоединяет",{"2":{"299":1}}],["присоединяем",{"2":{"222":1}}],["присоединять",{"2":{"243":1}}],["присоединяться",{"2":{"62":1}}],["присоединении",{"2":{"201":1}}],["присваивать",{"2":{"371":1}}],["присваивание",{"2":{"302":1}}],["присваивая",{"2":{"293":1,"302":1,"377":1}}],["присваиваем",{"2":{"240":1,"292":1,"293":1,"294":1,"302":1,"377":1}}],["присваивает",{"2":{"201":1,"237":1}}],["присваивается",{"2":{"191":1,"201":1,"374":1}}],["присвоено",{"2":{"374":1}}],["присвоение",{"2":{"293":2}}],["присвоения",{"2":{"229":1}}],["присвоении",{"2":{"222":1}}],["присвоить",{"2":{"290":1,"291":1,"302":1}}],["присвоили",{"2":{"240":1}}],["присвоил",{"2":{"162":1}}],["приступать",{"2":{"435":1}}],["приступаем",{"2":{"425":1}}],["приступить",{"2":{"215":1,"218":1,"232":1,"318":1,"326":1,"368":1,"372":1}}],["приступили",{"2":{"212":1}}],["пристыдить",{"2":{"185":1}}],["пристальное",{"2":{"174":1,"360":1}}],["прим",{"2":{"213":1}}],["примитивах",{"2":{"448":1}}],["примитивам",{"2":{"114":2}}],["примитивов",{"2":{"448":1}}],["примитивные",{"2":{"201":1,"236":1,"449":1}}],["примите",{"2":{"195":1,"385":1}}],["приманка",{"0":{"179":1,"184":1}}],["примет",{"2":{"191":1,"232":1}}],["примечание",{"2":{"125":1,"226":1,"236":1}}],["примечателен",{"2":{"32":1}}],["применив",{"2":{"431":1}}],["применительно",{"2":{"253":1}}],["применить",{"2":{"223":1,"228":1,"232":1,"239":1,"304":1,"318":1,"320":1,"351":1,"353":1,"364":1,"417":1}}],["применили",{"2":{"174":1,"221":1,"223":1,"240":1,"249":1,"250":1}}],["применимы",{"2":{"276":1}}],["применим",{"2":{"216":1,"226":1,"242":1,"246":1,"270":1,"293":1,"325":1,"336":1,"389":1}}],["применима",{"2":{"144":1}}],["применимо",{"2":{"138":1}}],["применяют",{"2":{"325":1}}],["применяются",{"2":{"253":1}}],["применять",{"2":{"191":1,"217":1,"223":1,"266":1,"275":1,"284":1,"310":1,"335":1,"418":1,"441":1}}],["применяться",{"2":{"155":1,"215":1,"266":1,"267":1,"536":1}}],["применяя",{"2":{"172":1,"222":1,"317":1,"419":1}}],["применяет",{"2":{"173":1,"307":1}}],["применяется",{"2":{"106":1,"114":2,"172":1,"195":1,"257":1,"276":1,"302":1,"307":1,"382":1}}],["применяемая",{"2":{"240":1}}],["применяемых",{"2":{"216":1,"332":1}}],["применяем",{"2":{"41":1,"347":1,"423":1}}],["применены",{"2":{"425":1}}],["применен",{"2":{"318":1,"504":1}}],["примененными",{"2":{"220":1}}],["применена",{"2":{"170":1,"217":1}}],["применено",{"2":{"142":1}}],["применений",{"2":{"237":1,"327":1}}],["применению",{"2":{"191":1}}],["применения",{"2":{"136":1,"147":1,"149":1,"172":1,"232":1,"235":1,"257":1,"273":1,"285":1,"333":1,"408":1,"415":1}}],["применении",{"2":{"114":1,"216":1,"419":1}}],["применением",{"2":{"226":1,"364":1}}],["применение",{"2":{"109":1,"148":1,"216":1,"218":1,"220":1,"253":2,"269":1,"276":1,"277":1,"282":1,"310":1,"335":1,"492":1}}],["примеру",{"2":{"191":1,"222":1,"288":1,"425":1}}],["примеры",{"2":{"128":1,"133":1,"139":1,"156":1,"159":1,"176":1,"204":1,"216":1,"226":1,"252":1,"308":1,"310":1,"311":1,"335":2,"374":1,"378":1,"394":1,"401":1,"419":1,"441":1,"460":1}}],["примеров",{"0":{"362":1},"2":{"114":1,"123":1,"140":1,"158":1,"186":1,"191":1,"193":1,"195":1,"213":1,"252":1,"266":1,"272":1,"343":1,"348":1,"358":1,"362":1,"380":1,"389":1,"416":1,"419":1,"420":1}}],["примером",{"2":{"75":1,"173":1,"229":1,"350":1,"381":1,"435":1}}],["примере",{"2":{"17":1,"94":1,"112":1,"132":1,"142":1,"143":1,"174":1,"178":1,"185":1,"191":1,"192":1,"195":1,"203":1,"214":1,"216":1,"237":1,"238":2,"240":1,"247":1,"260":1,"261":1,"262":1,"273":1,"293":1,"297":1,"298":1,"301":2,"302":1,"303":1,"312":1,"316":1,"324":2,"328":1,"333":1,"337":1,"340":1,"341":1,"342":2,"345":2,"346":1,"353":1,"368":1,"380":1,"386":2,"389":1,"418":1,"428":1,"438":1}}],["примерное",{"2":{"314":1}}],["примерно",{"2":{"14":1,"17":1,"26":2,"48":1,"88":1,"105":1,"214":2,"240":2,"247":1,"263":1,"296":1,"314":1,"324":1,"343":1,"382":1,"387":1,"428":1,"435":1,"436":1,"449":1,"461":1}}],["примерный",{"2":{"5":1}}],["примерами",{"2":{"203":1,"216":1,"253":1,"366":1,"371":1,"429":1}}],["примерам",{"2":{"125":1,"285":1,"313":1,"360":1,"364":1}}],["примерах",{"2":{"113":1,"147":1,"201":1,"226":1,"237":1,"255":1,"282":1,"287":1,"306":1,"317":1,"350":1,"364":1,"366":1,"371":1,"380":1,"387":1,"496":1}}],["примера",{"2":{"4":1,"126":1,"142":1,"172":1,"177":1,"195":1,"215":1,"220":1,"252":1,"259":1,"261":1,"263":1,"269":1,"271":1,"302":1,"308":1,"309":1,"315":1,"323":1,"324":1,"334":1,"343":1,"345":1,"353":3,"371":1,"375":1,"376":1,"389":1,"421":1,"428":1,"436":1}}],["пример",{"0":{"243":1,"419":1},"1":{"244":1,"245":1,"246":1},"2":{"3":1,"14":1,"17":1,"97":1,"105":2,"108":1,"111":1,"112":2,"113":1,"115":1,"129":1,"131":1,"143":2,"144":2,"153":1,"155":1,"157":1,"158":1,"159":2,"161":1,"165":1,"166":1,"168":1,"172":1,"177":1,"178":1,"184":1,"185":1,"192":1,"195":1,"200":1,"201":1,"202":1,"203":1,"220":1,"226":1,"235":3,"236":2,"240":2,"241":1,"242":1,"246":1,"258":3,"260":1,"261":1,"262":2,"263":1,"272":1,"273":1,"290":1,"291":1,"292":1,"294":1,"300":1,"301":1,"302":1,"303":3,"307":2,"309":2,"311":1,"316":1,"323":1,"324":3,"339":1,"342":1,"345":1,"353":1,"374":1,"377":2,"380":1,"383":1,"408":2,"411":1,"419":1,"422":1,"425":1,"426":1,"427":1,"428":1,"437":1,"449":1,"526":1}}],["прикосновений",{"2":{"507":1}}],["прикосновением",{"2":{"170":1}}],["прикладном",{"2":{"500":1}}],["прикладного",{"2":{"17":1,"238":1,"272":1}}],["прикладную",{"2":{"247":1}}],["прикрыть",{"2":{"246":1}}],["прикрепить",{"2":{"345":1}}],["прикрепив",{"2":{"234":1}}],["прикрепляем",{"2":{"273":1}}],["прикрепляя",{"2":{"112":1}}],["приходила",{"2":{"461":1}}],["приходится",{"2":{"135":1,"195":2,"199":1,"214":1,"238":1,"426":1,"444":1}}],["приходит",{"2":{"128":1,"237":1,"240":1,"259":1}}],["приходите",{"2":{"26":1}}],["приходу",{"2":{"319":1}}],["приходя",{"2":{"452":1}}],["приходятся",{"2":{"449":1,"451":1}}],["приходят",{"2":{"161":1,"423":1}}],["приходящих",{"2":{"109":1}}],["привыкли",{"2":{"347":1}}],["привычный",{"2":{"317":1}}],["привычным",{"2":{"287":1,"439":1}}],["привычными",{"2":{"276":1}}],["привычнее",{"2":{"93":1}}],["привлечь",{"2":{"337":1}}],["привлекает",{"2":{"142":1}}],["приватные",{"2":{"344":1}}],["приватный",{"2":{"128":1}}],["приватному",{"2":{"293":2}}],["привяжем",{"2":{"222":1}}],["привязывайтесь",{"2":{"456":1}}],["привязывание",{"2":{"241":1}}],["привязывается",{"2":{"125":1,"350":1}}],["привязки",{"2":{"373":1}}],["привязку",{"2":{"237":1}}],["привязке",{"2":{"162":1}}],["привязанной",{"2":{"380":1}}],["привязанный",{"2":{"240":1}}],["привязанные",{"2":{"216":1}}],["привязана",{"2":{"223":1,"449":1}}],["приводящую",{"2":{"421":1}}],["приводятся",{"2":{"394":1}}],["приводят",{"2":{"150":1,"228":1,"307":1}}],["приводит",{"2":{"388":1,"421":1,"426":1}}],["приводится",{"2":{"151":1,"277":1}}],["приветствуется",{"2":{"483":1}}],["привет",{"2":{"315":1,"316":1}}],["привел",{"2":{"203":1}}],["привели",{"2":{"195":2,"310":1}}],["привело",{"2":{"190":1,"241":1}}],["приведет",{"2":{"135":1,"147":1,"307":1,"342":1,"350":1,"426":1}}],["приведем",{"2":{"113":1,"115":1,"143":1,"189":1,"235":2,"258":1,"269":1,"292":1}}],["приведена",{"2":{"247":1}}],["приведенной",{"2":{"340":1}}],["приведенном",{"2":{"261":1}}],["приведенного",{"2":{"177":1}}],["приведенным",{"2":{"244":1}}],["приведенные",{"2":{"204":1,"441":1}}],["приведенный",{"2":{"110":1,"290":1,"298":1,"339":1,"389":1,"425":1}}],["приведены",{"2":{"128":1,"156":1,"216":1,"378":1,"437":1}}],["приведен",{"2":{"108":1,"110":1,"128":1,"129":1,"154":1,"273":1,"295":1,"371":1,"380":1,"389":1}}],["привести",{"2":{"67":1,"115":1,"158":1,"195":1,"235":1,"253":1,"270":1,"271":1,"311":1,"337":1,"346":1,"415":2,"422":1}}],["прилагает",{"2":{"314":1}}],["приложить",{"2":{"253":1}}],["приложений",{"0":{"452":1},"1":{"453":1,"454":1,"455":1,"456":1,"457":1,"458":1},"2":{"106":1,"125":1,"135":1,"136":1,"141":1,"180":1,"190":2,"191":5,"193":2,"212":1,"226":2,"251":1,"253":7,"255":1,"264":1,"266":2,"272":1,"274":1,"310":1,"312":1,"335":2,"344":1,"349":1,"354":1,"359":2,"360":1,"366":2,"381":1,"382":2,"383":1,"386":1,"388":2,"390":1,"397":1,"415":1,"428":1,"436":1,"440":1,"461":1}}],["приложению",{"2":{"97":1,"125":1,"132":1,"163":1,"194":1,"215":2,"221":1,"224":1,"234":1,"243":1,"250":1,"261":1,"313":1,"318":1,"320":1,"323":1,"344":1,"345":1,"349":1,"367":1,"371":1,"372":1,"383":1,"389":1,"409":1,"449":1,"530":1}}],["приложениями",{"2":{"128":2,"167":1,"190":1,"253":3,"260":1,"263":1,"264":2,"277":1,"364":1,"366":1,"389":2,"390":1}}],["приложениям",{"2":{"116":1,"333":1,"364":1}}],["приложениях",{"2":{"113":1,"138":2,"145":1,"157":1,"159":1,"164":1,"167":1,"178":1,"217":2,"218":1,"226":1,"278":1,"282":2,"309":1,"312":1,"381":1,"383":1,"390":1,"418":1}}],["приложения",{"0":{"78":1,"111":1,"122":1,"124":1,"126":1,"135":1,"172":1,"223":1,"247":1,"248":1,"251":1,"364":1,"397":1,"398":1,"402":1,"412":1,"419":1,"443":1,"490":1,"529":1},"1":{"123":1,"124":1,"125":2,"126":1,"127":2,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"365":1,"366":1,"367":1,"368":1,"369":1,"370":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,"413":1,"414":1,"530":1,"531":1,"532":1,"533":1},"2":{"11":1,"58":1,"98":1,"105":1,"109":1,"110":4,"111":5,"112":3,"118":1,"122":6,"124":3,"125":1,"126":4,"127":2,"128":3,"129":1,"130":1,"134":2,"135":1,"136":3,"137":1,"154":1,"157":1,"159":1,"164":2,"166":2,"169":1,"171":1,"172":1,"174":3,"188":1,"190":2,"191":6,"192":5,"193":4,"194":1,"202":1,"203":1,"212":2,"214":1,"215":7,"216":2,"217":1,"219":1,"220":3,"221":1,"222":1,"224":3,"225":2,"228":2,"229":2,"231":1,"232":1,"234":2,"235":2,"238":2,"242":2,"243":2,"246":4,"247":3,"248":1,"249":1,"251":2,"253":8,"254":2,"255":3,"256":3,"257":4,"258":4,"259":1,"260":5,"261":3,"262":1,"263":2,"265":1,"269":2,"271":1,"273":2,"274":2,"275":1,"280":1,"281":1,"284":1,"293":1,"301":2,"306":1,"310":1,"312":2,"313":1,"314":3,"316":1,"318":1,"320":3,"323":1,"324":1,"328":1,"331":1,"332":1,"333":3,"334":2,"335":3,"336":1,"337":1,"342":5,"343":1,"344":2,"345":1,"348":1,"350":5,"354":1,"358":1,"364":1,"366":8,"368":3,"371":2,"374":2,"381":2,"382":1,"383":1,"384":1,"385":2,"386":2,"387":2,"388":2,"389":6,"390":1,"391":1,"396":1,"400":1,"408":1,"409":2,"410":1,"411":1,"412":2,"415":2,"417":2,"418":3,"419":5,"429":1,"440":1,"443":3,"448":1,"450":1,"451":1,"452":2,"453":1,"461":5,"484":1,"492":1,"494":1,"495":3,"496":4,"499":1,"530":5,"532":1,"533":3,"542":1,"543":1,"544":3}}],["приложением",{"2":{"6":1,"122":1,"134":1,"138":1,"140":1,"150":1,"166":1,"192":1,"226":1,"261":1,"358":1,"461":1,"484":2}}],["приложение",{"0":{"110":1,"220":1,"369":1,"404":1},"1":{"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"221":1,"222":1,"223":1},"2":{"6":1,"11":1,"50":1,"78":1,"86":1,"107":2,"111":1,"112":1,"116":1,"125":2,"126":4,"127":1,"128":3,"132":1,"134":3,"135":1,"150":2,"156":1,"159":2,"174":1,"187":1,"190":1,"191":4,"192":2,"193":2,"194":2,"212":2,"214":1,"215":4,"216":1,"219":1,"220":4,"222":1,"223":4,"224":2,"225":2,"226":1,"232":1,"247":1,"248":1,"249":1,"251":3,"253":9,"255":1,"256":2,"257":1,"259":1,"260":6,"263":1,"264":1,"265":1,"269":1,"303":1,"307":1,"314":2,"317":1,"318":1,"320":1,"323":1,"324":2,"327":1,"331":1,"335":1,"340":1,"345":1,"347":1,"350":1,"364":2,"366":1,"368":1,"369":1,"371":1,"373":1,"377":1,"381":1,"383":1,"387":3,"388":1,"389":1,"390":2,"402":1,"409":1,"412":1,"419":4,"429":1,"459":1,"460":1,"461":3,"492":2,"496":1,"541":1,"542":1}}],["приложении",{"0":{"192":1},"1":{"193":1},"2":{"5":1,"11":1,"96":1,"112":1,"156":1,"191":1,"192":1,"195":1,"216":1,"218":1,"220":1,"221":1,"222":1,"231":1,"232":2,"235":1,"246":3,"247":2,"253":1,"274":2,"277":1,"283":1,"293":1,"294":1,"300":1,"314":1,"316":1,"317":1,"320":1,"328":1,"337":1,"342":1,"343":1,"345":1,"347":1,"351":1,"368":1,"369":1,"373":1,"380":1,"383":2,"386":1,"387":1,"399":1,"404":1,"412":2,"424":1,"449":3,"461":1,"501":1,"504":1,"545":1}}],["приличных",{"2":{"64":1}}],["приняли",{"2":{"214":2,"321":1,"322":1}}],["принят",{"2":{"231":1,"246":1}}],["приняты",{"2":{"190":1}}],["принято",{"2":{"161":1,"165":2,"193":1,"215":1,"255":1,"297":1,"430":1}}],["принять",{"2":{"149":1,"180":1,"181":1,"232":2,"246":1,"260":1,"303":1}}],["принятие",{"2":{"148":1}}],["принятия",{"2":{"63":1,"148":1,"166":1,"417":1}}],["принести",{"2":{"189":1,"449":1}}],["принадлежность",{"2":{"387":1}}],["принадлежит",{"2":{"274":1,"386":1}}],["принадлежат",{"2":{"144":1,"449":1}}],["принадлежать",{"2":{"16":1}}],["принадлежт",{"2":{"99":1}}],["принимают",{"2":{"237":1,"240":1,"272":1}}],["принимающей",{"2":{"325":1}}],["принимающую",{"2":{"236":1,"243":1,"340":1}}],["принимающий",{"2":{"108":1,"332":1,"341":1,"374":1}}],["принимаемого",{"2":{"378":1}}],["принимает",{"2":{"235":1,"236":1,"240":1,"242":1,"245":1,"246":1,"247":1,"294":1,"352":2,"378":1,"379":1,"382":1}}],["принимается",{"2":{"115":1,"255":1}}],["принимаешь",{"2":{"81":1}}],["принимать",{"2":{"23":1,"161":1,"242":1,"266":1,"489":1}}],["принципу",{"2":{"272":1,"389":1}}],["принципа",{"2":{"144":1,"216":1,"269":1,"271":1,"273":2,"276":1,"297":1}}],["принципами",{"2":{"142":1,"146":1,"269":1}}],["принципах",{"2":{"138":1,"169":1,"174":1,"359":1}}],["принципом",{"2":{"142":1,"274":1,"311":1}}],["принципов",{"0":{"268":1},"1":{"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1},"2":{"140":1,"210":1,"266":2,"267":1,"276":1,"358":1}}],["принципы",{"0":{"141":1,"150":1,"266":1,"267":1,"394":1,"492":1},"1":{"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":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,"306":1,"307":1,"308":1,"309":1,"310":1,"311":1},"2":{"141":2,"145":2,"149":1,"150":1,"216":1,"220":2,"223":1,"226":1,"234":1,"241":1,"266":2,"267":2,"268":2,"276":1,"310":1,"318":1,"319":1,"340":1,"351":1,"394":1,"418":1,"419":1}}],["принципе",{"2":{"99":1,"223":1,"276":1,"451":1}}],["принцип",{"0":{"271":1},"2":{"2":1,"108":1,"142":1,"143":1,"145":1,"149":1,"150":1,"219":1,"234":1,"241":2,"269":3,"270":3,"271":2,"272":2,"273":1,"274":1,"275":3,"276":2,"292":1,"298":1,"337":1}}],["при",{"0":{"438":1,"529":1},"1":{"530":1,"531":1,"532":1,"533":1},"2":{"2":1,"23":1,"30":1,"39":2,"40":1,"41":5,"47":1,"58":2,"61":1,"68":1,"75":1,"88":1,"96":2,"99":2,"103":1,"106":4,"107":1,"108":2,"109":1,"113":2,"114":3,"121":1,"125":1,"127":2,"132":1,"134":1,"136":2,"137":1,"140":1,"143":1,"144":2,"145":1,"147":1,"149":1,"154":1,"155":3,"156":1,"158":1,"159":2,"161":2,"162":1,"167":1,"168":1,"169":1,"170":1,"173":1,"174":3,"178":1,"180":1,"183":3,"185":1,"186":2,"190":1,"191":6,"192":1,"193":2,"195":1,"197":1,"199":2,"201":1,"203":3,"209":1,"211":1,"214":2,"215":4,"217":1,"218":4,"219":1,"220":1,"221":1,"222":3,"226":1,"234":1,"235":4,"236":1,"237":1,"238":1,"240":1,"242":1,"245":2,"247":1,"251":1,"253":2,"255":2,"257":1,"260":3,"261":1,"262":1,"266":1,"267":1,"272":1,"277":2,"287":2,"297":1,"301":1,"303":3,"306":1,"307":1,"308":2,"309":1,"310":1,"314":2,"315":1,"316":2,"317":1,"322":1,"323":1,"324":1,"337":2,"342":1,"345":1,"350":3,"351":1,"353":2,"354":1,"359":1,"367":3,"368":1,"369":2,"371":1,"374":4,"375":3,"380":1,"382":2,"383":3,"385":1,"388":1,"389":4,"391":1,"408":4,"411":1,"412":2,"417":2,"418":1,"419":2,"420":1,"421":3,"422":1,"424":1,"425":1,"427":2,"428":2,"435":1,"438":2,"439":1,"440":1,"444":2,"448":1,"450":2,"451":3,"459":1,"460":1,"461":8,"484":2,"489":1,"491":1,"492":1,"495":1,"496":3,"499":1,"501":1,"504":1,"533":1,"534":1,"536":1,"543":1,"544":1}}],["чрезвычайно",{"2":{"287":1,"306":1}}],["чрезмерного",{"2":{"275":1,"411":1}}],["чужих",{"2":{"459":1}}],["чужим",{"2":{"439":1}}],["чужие",{"2":{"306":1}}],["чувствительный",{"2":{"387":1}}],["чувствительна",{"2":{"148":1}}],["чувствует",{"2":{"150":1}}],["чувствовать",{"2":{"149":1,"150":1}}],["чувство",{"2":{"149":1,"159":1}}],["чуть",{"2":{"12":1,"461":1}}],["члену",{"2":{"302":1}}],["членов",{"2":{"195":1}}],["член",{"2":{"195":1,"346":1}}],["члены",{"2":{"113":1,"344":1,"346":1}}],["членами",{"2":{"337":1,"346":2,"390":1}}],["членам",{"2":{"195":1,"344":1,"439":1}}],["члена",{"2":{"96":1,"330":1}}],["чаще",{"2":{"151":1,"178":1,"197":1,"202":1,"266":1,"274":1,"276":1,"278":1,"380":1,"421":1,"440":1}}],["чате",{"2":{"485":1}}],["чата",{"2":{"156":1}}],["чат",{"0":{"82":1},"2":{"82":1}}],["частях",{"2":{"161":1,"266":1,"310":2,"320":1,"325":1}}],["частями",{"2":{"166":1,"232":1,"299":1}}],["частям",{"2":{"26":1}}],["частным",{"2":{"351":1}}],["частных",{"2":{"131":1}}],["частной",{"2":{"128":1}}],["частности",{"2":{"14":1,"146":1,"226":1,"253":1,"327":1,"335":1,"343":1,"430":1,"524":1}}],["части",{"2":{"106":1,"125":1,"143":1,"152":1,"161":1,"162":1,"164":2,"165":1,"172":1,"173":1,"174":1,"214":1,"219":1,"230":1,"240":1,"260":2,"266":1,"269":4,"275":1,"288":1,"303":2,"313":1,"342":1,"383":1,"436":1,"460":1,"499":1}}],["частичной",{"2":{"301":1}}],["частичном",{"2":{"301":1}}],["частичного",{"2":{"226":1}}],["частично",{"2":{"39":1,"172":1,"217":1,"251":1,"449":3,"451":2}}],["часто",{"2":{"50":1,"125":5,"140":1,"150":1,"153":3,"157":1,"164":2,"165":1,"168":1,"169":1,"176":2,"178":2,"179":2,"182":2,"185":1,"186":1,"191":2,"195":1,"196":1,"199":2,"203":1,"211":1,"212":1,"214":1,"216":1,"222":1,"255":1,"256":1,"266":1,"272":1,"277":5,"285":1,"287":2,"297":1,"299":1,"301":1,"339":1,"359":1,"377":1,"380":3,"381":1,"388":1,"412":1,"415":1,"417":1,"448":1,"460":1,"485":2,"524":1}}],["частей",{"2":{"28":1,"275":1,"306":1,"314":1,"332":1,"333":1,"346":1,"533":1}}],["частью",{"2":{"87":1,"118":1,"128":1,"143":1,"157":1,"174":1,"192":1,"198":1,"234":1,"246":1,"255":1,"273":1,"276":1,"277":1,"306":1,"308":1,"321":1,"352":1,"389":1,"436":1,"449":1,"460":1}}],["часть",{"2":{"2":1,"6":1,"109":2,"116":1,"142":1,"174":1,"191":1,"194":1,"221":1,"222":2,"266":1,"273":1,"330":1,"338":1,"366":1,"383":1,"386":1,"417":1,"428":1,"440":1,"444":1,"448":1,"530":2}}],["чёткого",{"2":{"67":1}}],["чтения",{"2":{"195":2,"273":1,"324":1,"350":1,"352":1}}],["чтению",{"2":{"152":1}}],["чтение",{"2":{"58":1}}],["что",{"0":{"63":1,"124":1,"277":1,"366":1,"392":1,"417":1,"418":1,"430":1},"1":{"125":1,"393":1,"394":1,"395":1,"396":1,"397":1,"398":1,"399":1,"400":1,"401":1,"402":1,"403":1,"404":1},"2":{"3":3,"6":1,"11":2,"12":1,"17":1,"23":3,"25":1,"26":2,"32":1,"33":2,"35":1,"41":2,"43":1,"44":1,"48":1,"61":2,"62":1,"67":1,"81":1,"84":1,"86":2,"87":1,"88":1,"96":2,"99":1,"103":1,"106":9,"107":2,"108":1,"109":2,"113":1,"115":1,"116":3,"122":1,"125":4,"126":2,"127":2,"128":3,"134":1,"135":1,"137":5,"138":3,"140":3,"141":3,"142":4,"143":4,"144":2,"145":1,"147":2,"148":1,"149":1,"150":4,"155":2,"156":3,"157":1,"158":2,"159":4,"161":1,"162":2,"167":2,"168":1,"169":1,"172":2,"173":3,"174":1,"176":1,"177":1,"178":1,"179":2,"180":2,"181":1,"185":1,"186":1,"188":1,"189":3,"191":14,"192":3,"193":5,"194":6,"195":12,"198":2,"199":2,"200":1,"201":1,"202":2,"203":1,"211":2,"213":3,"214":6,"215":7,"216":2,"217":1,"218":6,"219":4,"221":3,"222":9,"223":5,"228":1,"230":3,"231":1,"235":2,"236":2,"237":3,"238":1,"240":4,"241":1,"242":1,"246":2,"247":3,"250":2,"251":2,"253":5,"255":3,"259":2,"260":5,"261":1,"263":1,"265":2,"266":1,"269":2,"270":1,"271":3,"272":1,"273":4,"274":2,"276":3,"277":2,"282":1,"283":1,"284":1,"286":2,"287":2,"288":3,"290":2,"292":1,"293":4,"295":3,"296":1,"297":1,"298":1,"300":1,"301":8,"302":4,"303":10,"305":2,"306":2,"307":2,"308":3,"309":10,"310":1,"311":1,"314":10,"315":2,"316":1,"319":3,"320":2,"321":1,"322":1,"323":1,"325":4,"326":2,"327":2,"328":2,"332":4,"334":2,"337":4,"339":3,"340":1,"342":1,"343":1,"344":1,"345":2,"346":2,"350":6,"351":1,"352":1,"353":1,"355":3,"360":1,"364":1,"366":6,"367":2,"368":1,"371":7,"374":4,"376":1,"377":5,"379":1,"380":1,"381":1,"382":5,"383":4,"385":1,"386":2,"387":3,"388":4,"389":2,"393":1,"405":1,"408":3,"409":2,"412":1,"415":2,"417":6,"418":2,"419":2,"420":3,"421":8,"422":2,"423":1,"424":2,"425":1,"426":7,"427":2,"428":1,"430":3,"431":2,"435":2,"436":4,"438":4,"439":4,"442":4,"443":2,"448":1,"449":16,"450":3,"451":3,"452":2,"453":1,"459":3,"460":4,"461":4,"495":3,"515":1,"527":1,"545":1}}],["чтобы",{"0":{"145":1,"360":1},"2":{"2":1,"7":1,"16":1,"22":1,"55":1,"67":1,"81":1,"97":2,"98":1,"106":1,"117":1,"125":1,"127":1,"129":1,"139":1,"142":2,"143":1,"148":2,"149":1,"153":1,"155":2,"156":2,"160":1,"162":1,"166":1,"169":2,"172":1,"174":3,"177":1,"179":2,"185":1,"192":1,"194":2,"195":4,"198":1,"202":1,"203":1,"209":2,"211":2,"213":1,"214":5,"215":1,"216":1,"217":1,"218":2,"219":3,"220":2,"221":1,"222":4,"223":3,"224":1,"226":1,"227":1,"228":2,"229":1,"232":3,"234":1,"235":1,"237":1,"238":1,"240":1,"242":1,"244":1,"246":6,"248":1,"249":1,"250":1,"251":2,"252":1,"253":3,"259":1,"260":2,"261":2,"263":1,"265":1,"270":1,"276":1,"286":1,"287":3,"289":1,"294":2,"298":3,"299":1,"301":1,"302":1,"303":1,"304":1,"306":2,"308":3,"310":1,"313":2,"314":4,"318":2,"319":1,"320":1,"321":1,"322":1,"325":1,"326":1,"328":2,"332":3,"334":1,"336":1,"337":2,"338":1,"339":2,"343":1,"345":2,"349":1,"350":2,"351":2,"352":1,"364":2,"365":1,"366":1,"368":1,"369":1,"370":1,"371":1,"373":1,"374":3,"375":3,"377":1,"380":1,"382":1,"383":1,"385":1,"387":1,"389":3,"391":1,"403":1,"407":2,"408":1,"411":1,"412":1,"416":1,"420":2,"421":1,"422":3,"423":2,"424":2,"426":1,"427":2,"429":2,"431":1,"435":3,"438":1,"441":1,"443":2,"449":1,"451":2,"460":2,"461":5,"492":1,"495":2,"503":1,"516":1}}],["чипом",{"2":{"388":1}}],["чипы",{"0":{"154":1}}],["читать",{"2":{"460":1}}],["читателя",{"2":{"387":2}}],["читателю",{"2":{"4":1,"262":1}}],["читаемая",{"2":{"460":1}}],["читаемом",{"2":{"448":1}}],["читаем",{"2":{"421":1}}],["читаемым",{"2":{"209":1,"276":1}}],["читается",{"2":{"219":1}}],["читает",{"2":{"177":1}}],["читают",{"2":{"180":1}}],["читабельней",{"2":{"99":1}}],["чисел",{"2":{"125":2,"152":1,"162":1,"309":2,"422":1,"448":1,"524":1}}],["чистого",{"2":{"492":1}}],["чисто",{"2":{"366":1}}],["чистоте",{"2":{"276":1}}],["чистоту",{"2":{"168":1,"216":1}}],["чистом",{"2":{"247":1,"314":1,"315":1,"389":1,"459":1,"492":1}}],["чистая",{"2":{"201":1,"337":1,"525":1}}],["чистым",{"2":{"266":1,"276":1,"337":1}}],["чистые",{"2":{"151":1}}],["чистый",{"2":{"76":1,"270":1,"292":1,"456":1}}],["чистую",{"2":{"124":1}}],["чистим",{"2":{"87":1}}],["числовом",{"2":{"421":1}}],["число",{"2":{"93":1,"96":1,"350":1,"380":1,"419":1,"452":1}}],["числом",{"2":{"47":1,"99":1,"308":1}}],["числа",{"2":{"88":1,"159":1,"162":1,"192":1,"201":1,"307":1,"380":1,"419":1,"533":1}}],["числе",{"2":{"7":1,"13":1,"23":1,"25":1,"116":1,"308":1,"377":1,"496":1}}],["честь",{"2":{"180":1}}],["чекбокс",{"2":{"153":1,"154":1}}],["чекбоксы",{"0":{"153":1},"2":{"153":1}}],["человеческий",{"2":{"269":1}}],["человеческой",{"2":{"125":1}}],["человеку",{"2":{"125":1}}],["человекоемкая",{"2":{"430":1}}],["человекоемкой",{"2":{"266":1}}],["человеком",{"2":{"140":1,"417":1}}],["человеко",{"2":{"88":1,"138":1}}],["человека",{"2":{"75":1}}],["человек",{"2":{"26":1,"268":1,"276":1,"444":1,"460":2}}],["черной",{"2":{"314":1}}],["черные",{"2":{"272":1}}],["черед",{"2":{"306":1}}],["через",{"0":{"489":1},"1":{"490":1},"2":{"2":1,"23":1,"34":2,"35":1,"36":1,"40":1,"41":1,"52":1,"55":1,"58":2,"98":1,"99":1,"105":1,"106":5,"107":1,"109":1,"110":1,"125":1,"126":1,"127":1,"128":2,"129":1,"134":1,"135":1,"143":2,"170":1,"213":1,"231":1,"237":1,"238":1,"246":1,"247":2,"253":1,"260":3,"261":1,"262":1,"263":1,"274":1,"276":1,"283":1,"284":1,"286":1,"288":1,"296":2,"298":1,"316":1,"318":1,"323":2,"324":1,"327":1,"341":1,"344":1,"345":1,"346":2,"376":1,"380":1,"387":2,"389":1,"408":1,"410":1,"411":1,"412":1,"419":1,"432":1,"433":1,"443":1,"444":1,"448":2,"449":1,"459":1,"492":1,"497":1,"503":1,"535":1,"545":2}}],["черты",{"2":{"270":1,"376":1}}],["чертой",{"2":{"126":1}}],["чертежа",{"2":{"68":1}}],["чего",{"0":{"64":1},"2":{"40":1,"106":1,"150":1,"162":1,"181":1,"185":1,"368":1,"383":1,"448":1,"449":1,"451":1,"524":1}}],["четкая",{"2":{"411":1}}],["четких",{"2":{"166":1}}],["четкий",{"2":{"152":1}}],["четкую",{"2":{"121":1}}],["четкого",{"2":{"314":1}}],["четкое",{"2":{"190":1,"215":1}}],["четкость",{"2":{"109":1}}],["четко",{"2":{"9":1,"141":1,"142":2,"194":1,"228":1,"261":1,"272":1,"345":1,"383":1}}],["четырех",{"2":{"28":1,"125":1}}],["четыре",{"2":{"20":1,"99":1,"106":1,"125":1,"497":1}}],["чему",{"2":{"169":1,"237":1,"249":1,"342":1}}],["чем",{"2":{"2":1,"47":1,"99":1,"105":1,"137":1,"138":1,"141":1,"147":1,"149":3,"170":1,"183":1,"191":1,"195":1,"202":1,"211":1,"214":1,"215":1,"223":1,"230":1,"235":1,"238":1,"249":1,"253":3,"260":1,"265":1,"275":2,"277":1,"293":1,"308":2,"309":1,"311":1,"314":4,"326":1,"328":1,"330":1,"347":1,"355":1,"364":1,"366":2,"372":1,"373":1,"374":1,"375":1,"377":1,"383":1,"388":1,"389":1,"407":1,"417":2,"418":1,"430":1,"436":1,"438":1,"442":1,"443":2,"448":1,"449":1,"451":1,"456":1,"459":1}}],["кб",{"2":{"528":1}}],["киты",{"2":{"495":1}}],["кстати",{"2":{"291":1}}],["квадрат",{"2":{"269":1}}],["квадратов",{"2":{"167":1}}],["кэша",{"2":{"543":1}}],["кэширующий",{"2":{"449":1}}],["кэшированный",{"2":{"261":1}}],["кэширования",{"2":{"253":1,"260":1,"261":1,"408":1,"543":1}}],["кэшированием",{"2":{"260":1}}],["кэширование",{"2":{"103":1,"366":1,"461":1,"543":1}}],["кэшировать",{"2":{"253":1,"260":1,"261":2}}],["кэшу",{"2":{"261":1}}],["кэш",{"2":{"261":8,"301":1,"543":1}}],["кэшем",{"2":{"533":1}}],["кэше",{"2":{"203":1,"261":1}}],["кем",{"2":{"191":1}}],["кебаба",{"2":{"167":1}}],["книжка",{"2":{"460":1}}],["книга",{"0":{"359":1,"392":1},"1":{"393":1,"394":1,"395":1,"396":1,"397":1,"398":1,"399":1,"400":1,"401":1,"402":1,"403":1,"404":1},"2":{"358":2,"359":1,"360":1,"361":1,"389":1,"460":2,"485":1}}],["книгами",{"2":{"143":1}}],["книгу",{"0":{"361":1},"2":{"149":1}}],["книг",{"2":{"143":1}}],["книги",{"0":{"357":1,"360":1},"2":{"123":1,"134":1,"139":1,"140":1,"143":1,"169":1,"172":1,"193":1,"196":1,"214":1,"216":1,"218":1,"226":1,"228":1,"246":1,"247":1,"262":1,"266":2,"273":1,"277":2,"310":2,"313":1,"360":1,"362":1,"363":2,"380":1,"382":1,"386":1,"389":2,"416":1,"439":1,"460":2,"464":1}}],["книге",{"0":{"204":1},"1":{"205":1,"206":1,"207":1,"208":1,"209":1},"2":{"115":1,"136":1,"139":1,"190":3,"191":1,"195":2,"202":1,"204":2,"210":1,"213":2,"218":1,"238":1,"240":2,"241":1,"272":1,"274":1,"278":1,"296":1,"298":1,"303":2,"336":1,"360":3,"374":1}}],["кнопок",{"2":{"142":1,"185":1,"186":2,"246":1}}],["кнопкой",{"2":{"194":1,"258":1,"342":1}}],["кнопку",{"2":{"170":1,"203":1,"214":1,"222":1,"260":2,"261":1,"323":1,"337":1,"426":3,"452":1}}],["кнопке",{"2":{"165":1,"202":1,"338":1}}],["кнопки",{"2":{"142":2,"147":1,"153":1,"155":1,"186":2,"246":1,"387":1}}],["кнопкам",{"2":{"452":1}}],["кнопками",{"2":{"246":1}}],["кнопка",{"2":{"141":1,"147":2,"184":1,"202":1,"223":1,"260":4}}],["кучу",{"2":{"451":1}}],["куча",{"2":{"449":1}}],["кучи",{"2":{"448":1,"524":1}}],["кулер",{"2":{"444":1}}],["кулисами",{"2":{"302":1}}],["куда",{"2":{"143":1,"247":1,"383":1,"384":1,"444":1,"451":1}}],["купить",{"0":{"361":1},"2":{"135":2,"407":1}}],["куку",{"2":{"106":1}}],["курсы",{"2":{"138":1,"460":1}}],["курсор",{"2":{"83":1,"147":1}}],["курсов",{"2":{"63":1,"460":1}}],["курс",{"2":{"2":1,"452":1,"460":1}}],["кто",{"2":{"39":1,"67":1,"140":1,"270":1,"301":1,"430":1,"450":1,"451":1,"461":1}}],["креативности",{"2":{"170":1,"430":1}}],["креативность",{"2":{"150":1}}],["крутятся",{"2":{"444":1}}],["крутится",{"2":{"159":1}}],["кругозор",{"2":{"460":1}}],["круговой",{"2":{"247":2}}],["круга",{"2":{"187":1,"495":1}}],["круглой",{"2":{"154":1}}],["кружок",{"2":{"156":1,"159":1}}],["крупнейший",{"2":{"389":1}}],["крупные",{"2":{"176":1}}],["крупных",{"2":{"107":1,"212":1,"417":1}}],["крупномасштабного",{"2":{"400":1}}],["крупного",{"2":{"156":1,"192":1}}],["крупной",{"2":{"128":1}}],["криптовалюты",{"2":{"389":3}}],["криптографическими",{"2":{"389":1}}],["криптографические",{"2":{"389":1}}],["криптографическую",{"2":{"383":1}}],["криптографии",{"2":{"388":1}}],["криптография",{"2":{"106":1}}],["критериям",{"2":{"260":1,"263":1}}],["критериями",{"2":{"39":1}}],["критике",{"2":{"223":1}}],["критика",{"0":{"223":1,"248":1},"2":{"223":1}}],["критически",{"2":{"224":1,"247":1}}],["критической",{"2":{"157":1}}],["критичных",{"2":{"106":1}}],["кроулером",{"2":{"461":1}}],["кровеносной",{"2":{"269":1}}],["кровлю",{"2":{"26":1}}],["кроссплатформенными",{"2":{"213":1}}],["крошкам",{"2":{"165":1}}],["крошки",{"0":{"165":1},"2":{"165":2}}],["кроче",{"2":{"143":1}}],["кроме",{"2":{"68":1,"96":1,"109":1,"161":1,"169":1,"178":1,"195":3,"202":1,"214":1,"219":1,"249":1,"253":3,"258":1,"260":1,"275":1,"276":1,"292":1,"303":1,"312":1,"317":1,"323":1,"332":1,"376":1,"381":1,"408":3,"409":1,"432":1,"443":1,"449":2,"451":1,"453":1,"460":1,"461":2}}],["кроется",{"2":{"67":1}}],["крайний",{"2":{"242":1}}],["крайние",{"2":{"240":1,"328":1}}],["крайних",{"2":{"226":1,"298":2,"418":1}}],["крайними",{"2":{"219":1,"380":1}}],["крайней",{"2":{"212":1,"290":1,"302":1,"307":1,"360":1}}],["красное",{"2":{"420":1}}],["красным",{"2":{"263":1,"421":1}}],["красе",{"2":{"383":1}}],["красивую",{"2":{"459":1}}],["красиво",{"2":{"332":1,"461":1}}],["красивые",{"2":{"61":1}}],["красивый",{"2":{"26":1}}],["красочный",{"2":{"174":1}}],["края",{"2":{"147":1}}],["кражей",{"2":{"106":1}}],["краткий",{"0":{"278":1},"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,"306":1,"307":1,"308":1,"309":1},"2":{"154":1,"303":1,"349":1}}],["кратким",{"2":{"110":1,"151":1,"258":1}}],["краткосрочной",{"2":{"277":1}}],["краткости",{"2":{"230":1,"237":1,"246":2,"386":1}}],["кратко",{"2":{"192":1,"211":1,"340":1}}],["кратковременной",{"2":{"149":1}}],["кратковременную",{"2":{"149":1}}],["краткого",{"2":{"125":1}}],["краткое",{"0":{"494":1},"2":{"94":1,"220":1,"284":1}}],["краткая",{"0":{"223":1},"2":{"47":1}}],["клонирования",{"2":{"431":1}}],["клонируемого",{"2":{"325":1}}],["клонируем",{"2":{"102":1,"325":1}}],["клон",{"2":{"325":1}}],["клетки",{"2":{"269":1}}],["класть",{"2":{"412":1,"449":1}}],["классе",{"2":{"292":1}}],["классом",{"2":{"221":1,"317":1,"544":1}}],["классов",{"0":{"207":1},"2":{"23":1,"191":2,"203":1,"216":1,"217":1,"241":1,"247":1,"270":1,"272":1,"279":1,"424":1,"449":1,"452":1,"459":1,"496":1}}],["классы",{"2":{"216":1,"217":1,"218":1,"222":1,"240":2,"246":1,"303":1,"449":1}}],["классу",{"2":{"195":1,"293":1}}],["класс",{"2":{"160":1,"222":1,"271":1,"274":1,"287":2,"288":2,"290":1,"293":2,"412":1}}],["классифицируются",{"2":{"278":1}}],["классификаций",{"2":{"282":1}}],["классификация",{"2":{"255":1,"256":1,"257":1,"258":1}}],["классификаторов",{"2":{"154":1}}],["классической",{"2":{"149":1}}],["классический",{"2":{"184":1,"195":1,"241":1,"460":1}}],["классически",{"2":{"66":1}}],["классических",{"2":{"47":1}}],["классическим",{"2":{"6":1}}],["классами",{"2":{"343":1,"452":1}}],["классах",{"2":{"274":1}}],["класса",{"2":{"20":1,"247":1,"287":3,"288":1,"296":1,"299":1,"325":1,"449":1,"497":1}}],["кладем",{"2":{"298":1}}],["кладет",{"2":{"106":1}}],["кладется",{"2":{"96":1}}],["клавиатуры",{"2":{"444":1}}],["клавиатуру",{"2":{"444":1}}],["клавиатурой",{"2":{"161":1}}],["клавиатура",{"2":{"149":1}}],["клавишу",{"2":{"220":1,"222":1}}],["клавиши",{"2":{"153":1,"214":1}}],["клавиш",{"2":{"81":1,"149":1,"214":1}}],["клавишей",{"2":{"81":1}}],["ключу",{"2":{"238":1,"448":1,"524":1}}],["ключ",{"2":{"58":2,"302":1,"324":1,"374":1,"383":4,"408":1}}],["ключом",{"2":{"58":1,"238":1,"302":1,"350":1}}],["ключей",{"2":{"236":1,"389":2}}],["ключевая",{"2":{"388":1,"397":1}}],["ключевую",{"2":{"366":1}}],["ключевое",{"2":{"195":2,"309":1,"346":1}}],["ключевой",{"2":{"191":1}}],["ключевые",{"2":{"320":1,"364":1,"393":1,"418":1}}],["ключевыми",{"2":{"399":1}}],["ключевым",{"2":{"128":1,"301":1,"309":1,"319":1,"337":1}}],["ключевых",{"2":{"63":1,"124":1,"350":1,"366":1,"417":1,"418":1}}],["ключе",{"2":{"57":1}}],["ключа",{"2":{"57":1,"58":1,"238":1,"383":1}}],["климов",{"2":{"460":1}}],["клише",{"2":{"274":1}}],["клиентской",{"2":{"321":1}}],["клиентское",{"2":{"320":1}}],["клиентского",{"2":{"303":1}}],["клиентском",{"2":{"300":1}}],["клиенту",{"2":{"299":1,"322":1,"329":1,"332":1,"382":1}}],["клиенты",{"2":{"299":1,"366":1}}],["клиентов",{"2":{"140":1,"299":2}}],["клиентом",{"2":{"135":1,"302":1,"306":1,"332":1,"461":1}}],["клиентами",{"2":{"321":1}}],["клиентам",{"2":{"108":1,"440":1}}],["клиента",{"2":{"108":3,"301":3,"306":1,"318":2,"321":1,"384":1,"461":1,"499":1,"543":2}}],["клиент",{"0":{"6":1},"2":{"9":1,"67":1,"109":2,"301":2,"303":1,"322":1,"383":1,"444":2}}],["клику",{"2":{"506":1}}],["клике",{"2":{"96":1}}],["клик",{"2":{"3":1,"222":1}}],["казаться",{"2":{"461":1}}],["казалось",{"2":{"159":1}}],["капот",{"2":{"460":1}}],["капотом",{"2":{"110":1,"262":1,"421":1,"451":1}}],["калькулятором",{"2":{"419":1}}],["калькулятор",{"2":{"419":1}}],["кадров",{"2":{"314":2}}],["кадрами",{"2":{"314":1}}],["камне",{"2":{"191":1}}],["каркас",{"2":{"492":1,"494":1,"495":1,"496":1,"533":1}}],["каркаса",{"2":{"212":1,"214":2,"224":1,"496":2}}],["карьере",{"2":{"363":1}}],["кардинально",{"2":{"333":1}}],["кардинальность",{"2":{"297":1}}],["каруселей",{"2":{"158":1}}],["карусели",{"2":{"158":2}}],["каруселью",{"2":{"174":1}}],["карусель",{"0":{"158":1,"447":1},"2":{"158":3}}],["карты",{"2":{"388":1}}],["карточкой",{"2":{"394":1}}],["карточка",{"2":{"143":1}}],["карточками",{"2":{"96":1}}],["карточках",{"2":{"94":1}}],["карточке",{"0":{"96":1},"2":{"96":1}}],["карточки",{"2":{"93":3,"143":2,"144":1,"247":1}}],["картинками",{"2":{"461":1}}],["картинка",{"2":{"414":1}}],["картинки",{"2":{"412":6,"461":2}}],["картинке",{"2":{"197":1,"461":1}}],["картинок",{"2":{"94":1,"414":1}}],["картины",{"2":{"26":1,"269":1}}],["картину",{"2":{"26":1}}],["канал",{"0":{"486":1}}],["канала",{"0":{"104":1},"1":{"105":1},"2":{"374":1}}],["кандидатов",{"2":{"451":1}}],["кануть",{"2":{"140":1}}],["каскадно",{"2":{"388":1}}],["каскадные",{"2":{"190":1}}],["касались",{"2":{"335":1}}],["касается",{"2":{"326":1,"374":1,"449":1}}],["касающиеся",{"2":{"441":1}}],["касающимися",{"2":{"238":1}}],["касаются",{"2":{"67":1,"279":1,"280":1}}],["кастомные",{"2":{"459":1}}],["кастомных",{"2":{"452":1}}],["кастомными",{"2":{"443":1}}],["кастомный",{"2":{"407":1,"516":2}}],["кастомную",{"2":{"107":1}}],["кастомизированный",{"2":{"91":1}}],["кастомизировать",{"2":{"62":1}}],["кастомизацию",{"2":{"90":1,"99":1}}],["кастомизация",{"0":{"85":1},"1":{"86":1,"87":1,"88":1,"89":1,"90":1,"91":1},"2":{"492":1,"496":1,"545":1}}],["кастомизации",{"2":{"75":1,"492":1,"494":1,"533":1}}],["качество",{"2":{"68":1,"333":1,"459":1,"484":2}}],["качества",{"2":{"64":1,"68":1,"414":1,"415":1,"417":1,"460":1}}],["качественные",{"2":{"460":2}}],["качественный",{"2":{"444":1}}],["качественно",{"2":{"460":1}}],["качественного",{"2":{"415":1}}],["качественное",{"2":{"140":1}}],["качестве",{"2":{"17":1,"39":1,"113":1,"114":1,"118":1,"123":1,"125":1,"142":1,"162":1,"172":1,"192":1,"195":1,"213":1,"214":3,"220":1,"221":1,"222":1,"223":1,"235":2,"236":3,"240":1,"241":1,"243":1,"253":1,"265":1,"269":1,"271":1,"273":2,"283":1,"288":1,"290":1,"294":3,"295":1,"298":2,"302":2,"307":1,"308":1,"315":1,"316":1,"318":3,"320":1,"321":1,"322":1,"323":1,"325":1,"326":2,"327":1,"330":2,"332":1,"338":1,"346":2,"350":1,"368":1,"371":3,"374":2,"375":1,"376":1,"380":1,"385":1,"386":1,"388":1,"389":2,"390":1,"395":1,"410":1,"419":2,"420":1,"421":2,"425":2,"441":1,"449":1,"461":1,"485":1,"492":2,"499":1,"516":1}}],["кабинетом",{"2":{"58":1}}],["кабинета",{"2":{"36":1,"409":1}}],["кабинет",{"2":{"29":1,"33":1,"78":1}}],["катастрофы",{"2":{"150":1}}],["каталоги",{"2":{"368":1,"436":1}}],["каталогов",{"0":{"117":1},"2":{"110":1,"117":1,"126":3,"214":1,"215":3,"368":1,"435":1}}],["каталогом",{"2":{"11":1,"29":1,"89":1}}],["каталогу",{"2":{"86":1}}],["каталогах",{"2":{"244":1}}],["каталога",{"2":{"16":1,"78":1,"409":1}}],["каталоге",{"2":{"11":1,"93":1,"128":1,"129":1,"131":1,"214":2,"217":1,"221":1,"244":1,"321":1,"345":1,"368":1,"370":1,"424":1,"425":1,"435":1}}],["каталог",{"2":{"11":3,"33":2,"86":2,"131":1,"132":1,"214":3,"215":2,"261":1,"368":1,"420":1,"435":1}}],["категорией",{"2":{"449":1}}],["категорически",{"2":{"241":1}}],["категоризации",{"2":{"169":1}}],["категорию",{"2":{"23":1,"43":1,"88":1,"159":1}}],["категорий",{"2":{"3":2,"4":1,"11":3,"23":1,"38":1,"78":1,"90":1,"154":1}}],["категории",{"2":{"3":2,"4":1,"7":1,"11":2,"16":2,"23":1,"30":1,"31":1,"47":1,"88":1,"93":3,"128":1,"176":1,"263":1,"366":1,"381":1}}],["категориям",{"2":{"86":1,"128":1,"163":1,"273":1}}],["категориями",{"2":{"43":1,"89":1,"452":1}}],["категориях",{"2":{"43":1,"264":1}}],["категория",{"0":{"16":1,"92":1},"1":{"93":1,"94":1},"2":{"3":1,"16":1,"96":1,"263":1}}],["каждым",{"2":{"214":1,"223":1,"322":1,"383":1,"389":1,"461":1}}],["каждый",{"2":{"9":2,"41":1,"106":2,"110":1,"114":2,"124":1,"125":2,"130":1,"135":1,"141":2,"151":1,"161":1,"162":1,"191":1,"195":2,"203":1,"215":1,"222":1,"247":1,"256":2,"258":1,"263":1,"269":1,"271":1,"274":1,"287":1,"298":2,"301":1,"303":2,"314":4,"322":1,"327":1,"328":1,"337":1,"338":1,"340":2,"341":1,"342":2,"345":3,"346":1,"349":1,"350":3,"366":1,"371":1,"374":1,"381":1,"383":1,"388":1,"389":1,"409":1,"420":1,"430":1,"443":1,"449":3,"451":1,"499":1}}],["каждая",{"2":{"134":1,"142":1,"143":1,"165":1,"200":1,"221":1,"241":1,"246":1,"260":1,"261":1,"303":1,"309":2,"332":1,"383":2,"421":1,"430":1,"449":1}}],["каждую",{"2":{"66":1,"194":1,"293":1,"294":1,"298":1,"335":1,"374":1,"421":1}}],["каждой",{"2":{"83":1,"96":1,"128":1,"131":1,"135":1,"140":1,"143":1,"161":1,"165":1,"212":1,"220":1,"221":1,"222":1,"253":1,"262":1,"263":1,"303":1,"309":1,"321":1,"325":1,"326":1,"383":1,"389":1,"415":1,"421":2,"436":1}}],["каждому",{"2":{"48":1,"106":1,"212":1,"240":2,"338":1,"371":1,"374":1,"376":1,"381":1,"408":1}}],["каждом",{"2":{"41":1,"106":1,"153":1,"191":1,"216":1,"247":1,"266":2,"267":1,"274":1,"314":1,"328":1,"344":1,"350":2,"369":1,"377":1,"383":1,"409":2,"451":1}}],["каждого",{"2":{"13":1,"23":1,"77":1,"78":1,"110":1,"131":1,"135":3,"138":1,"143":1,"161":1,"162":1,"169":1,"174":1,"191":1,"194":1,"203":1,"219":1,"222":3,"230":3,"234":2,"247":1,"258":1,"261":1,"262":1,"287":1,"327":1,"338":1,"342":1,"350":3,"354":1,"358":1,"374":2,"377":1,"378":1,"408":2,"420":1,"427":1,"431":1,"443":1,"497":1,"543":1}}],["каждое",{"2":{"3":1,"68":1,"195":1,"197":1,"207":1,"247":1,"297":1,"301":1,"320":1,"327":1,"350":1,"426":3}}],["кажется",{"2":{"3":1,"178":1,"195":1,"314":1,"344":1}}],["какая",{"2":{"355":1,"428":2,"444":1}}],["какими",{"2":{"250":1}}],["каким",{"2":{"159":1,"187":1,"265":1,"300":2,"424":1}}],["каких",{"2":{"138":1,"188":1,"191":1,"308":1,"334":1,"346":1,"368":1,"461":1,"492":1,"525":1}}],["какие",{"2":{"4":1,"16":2,"23":1,"67":2,"137":3,"138":1,"190":1,"193":1,"211":1,"228":3,"230":1,"231":2,"232":2,"242":1,"250":1,"251":2,"261":1,"265":1,"297":1,"299":1,"311":1,"334":2,"355":1,"372":1,"383":1,"411":1,"446":1,"448":1,"451":1,"460":2,"489":1}}],["какую",{"2":{"20":1,"189":1,"192":1,"230":1,"314":1,"442":1,"495":1}}],["каковы",{"0":{"267":1},"2":{"138":1,"225":2,"265":2,"334":1,"391":3}}],["каком",{"2":{"107":1,"126":1,"159":1}}],["какого",{"2":{"60":1,"155":1,"167":1,"213":1,"314":1}}],["какое",{"2":{"12":1,"190":1,"344":1}}],["какой",{"2":{"3":1,"20":1,"114":1,"159":1,"191":1,"192":1,"219":1,"229":1,"235":1,"247":1,"269":1,"292":1,"293":1,"302":1,"388":1,"414":1,"435":2,"444":1,"453":1,"454":1}}],["как",{"2":{"2":1,"3":1,"9":2,"10":1,"12":1,"22":1,"23":2,"25":1,"26":1,"39":1,"43":1,"44":1,"50":2,"62":1,"67":5,"68":1,"77":1,"93":1,"94":1,"96":1,"97":1,"99":1,"106":5,"107":3,"108":1,"109":4,"110":1,"112":2,"113":1,"115":3,"118":1,"119":1,"125":4,"126":1,"128":1,"131":1,"132":1,"133":1,"134":2,"136":1,"138":3,"140":7,"141":4,"143":1,"144":2,"145":1,"146":2,"147":2,"148":1,"149":2,"152":1,"154":1,"155":1,"158":4,"159":1,"162":4,"163":1,"167":1,"169":4,"170":1,"172":3,"173":4,"174":2,"175":1,"176":1,"177":1,"178":3,"180":1,"185":1,"187":1,"190":1,"191":8,"192":2,"193":6,"194":4,"195":13,"198":1,"199":2,"201":2,"203":1,"209":1,"212":2,"213":1,"214":5,"215":4,"216":6,"217":1,"218":5,"219":1,"220":1,"221":1,"222":9,"223":5,"224":2,"225":1,"226":3,"227":1,"228":3,"229":3,"230":2,"231":2,"233":1,"234":1,"235":4,"236":4,"237":3,"238":5,"239":1,"240":5,"241":1,"242":1,"245":1,"246":4,"247":9,"248":1,"249":1,"250":3,"251":4,"253":5,"254":2,"255":2,"256":2,"257":1,"258":2,"259":2,"260":6,"261":5,"262":1,"263":1,"264":2,"266":2,"267":1,"269":3,"270":2,"271":3,"272":2,"273":4,"274":3,"276":2,"277":2,"287":1,"290":1,"291":1,"292":1,"293":2,"294":2,"295":2,"297":1,"298":3,"299":1,"301":5,"302":6,"303":3,"304":1,"306":1,"307":2,"308":6,"309":6,"310":2,"311":1,"312":4,"314":9,"316":4,"318":6,"320":2,"321":5,"322":2,"323":4,"325":2,"326":2,"327":5,"328":2,"330":3,"332":3,"333":1,"334":2,"335":2,"336":1,"337":4,"338":2,"339":1,"342":1,"343":3,"344":9,"345":7,"346":3,"347":2,"349":5,"350":3,"351":1,"352":3,"353":3,"355":2,"358":1,"359":1,"360":4,"364":4,"366":8,"367":1,"368":3,"369":3,"371":9,"373":1,"374":8,"375":1,"376":2,"377":2,"380":4,"381":2,"382":2,"383":10,"386":2,"387":2,"388":5,"389":8,"390":3,"391":2,"395":1,"399":1,"401":1,"402":2,"408":2,"409":3,"411":2,"412":3,"414":1,"415":2,"417":6,"418":1,"419":2,"420":1,"421":4,"422":1,"423":3,"425":1,"426":8,"430":3,"431":1,"435":1,"436":4,"438":2,"439":4,"440":1,"441":2,"443":3,"444":3,"448":5,"449":8,"450":1,"451":1,"458":2,"459":4,"460":6,"461":10,"465":1,"467":1,"485":2,"495":2,"496":2,"497":1,"501":1,"522":1,"533":1}}],["коврике",{"2":{"461":1}}],["кошелек",{"2":{"389":3}}],["кошельки",{"2":{"389":2}}],["кошелька",{"2":{"389":6}}],["кошельками",{"2":{"389":1}}],["кошельках",{"2":{"389":1}}],["кошельков",{"2":{"389":2}}],["кошельком",{"2":{"389":2}}],["кошмар",{"2":{"20":1}}],["коем",{"2":{"282":1,"350":1,"382":1}}],["кого",{"0":{"359":1},"2":{"276":3,"301":1}}],["когда",{"0":{"284":1},"2":{"3":1,"30":1,"41":1,"61":1,"96":1,"106":4,"107":1,"108":1,"114":4,"117":1,"125":1,"128":1,"134":1,"136":1,"143":1,"149":1,"150":1,"151":1,"152":1,"153":4,"155":1,"161":2,"162":3,"169":1,"170":1,"173":1,"174":1,"184":1,"190":1,"191":7,"192":1,"195":3,"198":1,"199":1,"201":2,"202":1,"203":4,"215":2,"219":1,"222":2,"225":2,"226":1,"229":1,"231":2,"232":1,"237":4,"238":1,"239":1,"242":2,"245":1,"246":1,"248":1,"253":1,"256":1,"258":1,"259":1,"260":6,"266":1,"270":2,"271":3,"273":4,"276":2,"284":4,"289":1,"292":1,"297":1,"298":1,"302":4,"303":1,"307":1,"308":2,"309":1,"310":2,"314":5,"315":1,"320":1,"322":1,"323":1,"325":2,"328":1,"330":1,"335":1,"337":1,"342":1,"344":2,"347":2,"349":1,"350":1,"352":1,"355":1,"366":3,"371":1,"373":1,"374":2,"380":1,"381":1,"386":1,"387":2,"391":1,"409":1,"411":1,"412":1,"417":1,"418":1,"422":1,"426":1,"427":1,"430":2,"435":1,"439":1,"442":1,"448":2,"449":3,"459":1,"460":1,"461":3}}],["координирует",{"2":{"230":1}}],["координировать",{"2":{"191":1}}],["координация",{"2":{"191":1}}],["координации",{"2":{"191":1}}],["ко",{"2":{"128":2,"148":1,"215":1,"267":1,"276":1,"345":1,"423":1,"449":1,"452":1}}],["косой",{"2":{"126":1,"376":1}}],["коридоре",{"2":{"461":1}}],["коричневый",{"2":{"142":1}}],["корпоративном",{"2":{"431":1}}],["корпоративных",{"2":{"125":1,"138":1}}],["корня",{"2":{"376":1}}],["корневую",{"2":{"117":1}}],["корневом",{"2":{"129":1,"238":2,"316":1,"345":1,"410":2}}],["корневому",{"2":{"112":1}}],["корневого",{"2":{"113":1,"119":1,"229":1}}],["корневой",{"2":{"113":1,"126":1,"215":1,"238":1,"420":1,"435":2}}],["корне",{"2":{"111":1,"126":1,"130":1,"132":1,"215":1,"217":1,"255":1,"261":1,"428":1}}],["корень",{"2":{"215":1,"247":1,"261":1,"408":1}}],["коренится",{"2":{"141":1}}],["коробкой",{"2":{"460":1}}],["коробки",{"2":{"216":1,"262":1,"420":1,"424":1}}],["короче",{"2":{"158":1,"322":1}}],["коротким",{"0":{"275":1}}],["короткий",{"2":{"154":1,"157":1,"219":1,"322":1,"425":1,"460":1}}],["короткое",{"2":{"157":1,"256":1}}],["короткоживущий",{"2":{"106":1}}],["корректировку",{"2":{"483":1}}],["корректировки",{"2":{"66":1}}],["корректно",{"2":{"421":1}}],["корректном",{"2":{"215":1}}],["корректный",{"2":{"132":1,"292":1}}],["корзину",{"0":{"178":1},"2":{"178":3}}],["корзины",{"2":{"12":1,"89":1,"175":1,"182":1,"185":1}}],["корзина",{"2":{"4":1,"29":1,"33":1,"78":1}}],["коллеги",{"2":{"460":1}}],["коллекцию",{"2":{"326":2}}],["коллекций",{"2":{"200":1,"218":1,"326":1}}],["коллекция",{"2":{"191":1,"216":1,"241":1}}],["коллекции",{"2":{"16":1,"288":1,"326":1}}],["коллизий",{"2":{"238":1}}],["коллизия",{"2":{"234":1}}],["коллизии",{"2":{"162":1}}],["коллоцированный",{"2":{"128":1}}],["количеством",{"2":{"121":1,"128":1,"366":1,"389":1,"448":1,"450":1}}],["количество",{"2":{"114":1,"137":1,"141":1,"142":1,"148":2,"149":1,"162":1,"169":2,"180":1,"190":1,"216":1,"219":1,"222":2,"229":1,"235":1,"275":1,"298":1,"314":1,"350":2,"377":1,"382":1,"383":1,"386":2,"390":1,"421":2,"426":1}}],["количества",{"2":{"106":1,"148":1,"274":1,"386":1}}],["колоночным",{"2":{"456":1}}],["колоночной",{"2":{"172":1,"459":1}}],["колонок",{"2":{"47":1,"93":1,"172":1}}],["колонки",{"2":{"172":2,"229":1}}],["колонка",{"2":{"93":1}}],["колонками",{"2":{"93":1}}],["колонтитуле",{"2":{"174":1}}],["колонтитул",{"2":{"144":1,"246":1}}],["комфорту",{"2":{"461":1}}],["комфортней",{"2":{"444":1}}],["комфортное",{"2":{"229":1}}],["комфортно",{"2":{"50":1,"68":1,"409":1,"449":1}}],["комиксах",{"2":{"155":1}}],["комбинацию",{"2":{"496":1}}],["комбинация",{"2":{"128":1,"350":1}}],["комбинаций",{"2":{"81":1}}],["коммита",{"2":{"436":1}}],["коммит",{"2":{"435":1,"438":1,"439":1,"440":1}}],["коммиты",{"2":{"134":1}}],["коммуникациях",{"2":{"381":1}}],["коммуникация",{"2":{"314":1}}],["коммуникациями",{"2":{"253":1}}],["коммуникации",{"2":{"309":1,"312":1,"366":1,"382":1,"388":1}}],["коммуникационного",{"2":{"274":1,"320":1}}],["коммуникаций",{"2":{"109":1,"312":1,"383":1}}],["комментирование",{"2":{"484":1}}],["комментарию",{"2":{"294":1}}],["комментарии",{"2":{"261":1,"276":2}}],["комментарием",{"2":{"247":1}}],["комментариев",{"2":{"165":1,"273":1}}],["комментариями",{"2":{"106":1,"492":1}}],["комментариях",{"2":{"63":1}}],["комментарий",{"2":{"81":1,"426":1}}],["коммерческий",{"2":{"460":1}}],["коммерческих",{"2":{"125":1,"408":1}}],["коммерческого",{"2":{"135":1}}],["компетентные",{"2":{"460":1}}],["компилирует",{"2":{"440":1}}],["компиляции",{"2":{"439":1,"440":1}}],["компиляция",{"2":{"192":1}}],["комплект",{"2":{"434":1}}],["комплексное",{"2":{"106":1}}],["компромиссов",{"0":{"232":1},"2":{"232":1}}],["компромиссы",{"2":{"191":1,"228":1,"358":1,"366":2,"427":1,"430":1}}],["компромисс",{"2":{"191":2,"218":1}}],["компромиссами",{"2":{"191":1}}],["компаниях",{"2":{"417":1,"460":1}}],["компания",{"2":{"180":1}}],["компаниям",{"2":{"180":1}}],["компанией",{"2":{"145":1}}],["компании",{"2":{"106":1,"140":2,"173":1,"176":1,"177":1,"179":1,"180":1,"182":1}}],["компьютере",{"2":{"360":1,"443":1,"461":1}}],["компьютера",{"2":{"444":1}}],["компьютерам",{"2":{"275":1}}],["компьютерах",{"2":{"253":1,"260":1}}],["компьютером",{"2":{"140":1,"274":1}}],["компьютеров",{"2":{"125":3,"164":1,"172":1,"360":1,"389":1}}],["компьютеры",{"2":{"138":1}}],["компьютерного",{"2":{"138":1}}],["компьютерное",{"2":{"138":1}}],["компьютеру",{"2":{"125":1}}],["компьютер",{"2":{"125":1,"159":1,"213":1}}],["композитных",{"2":{"335":1,"344":1}}],["композитные",{"2":{"270":1}}],["композиции",{"2":{"270":1}}],["композицию",{"2":{"226":1}}],["композиция",{"0":{"226":1,"270":1,"396":1},"1":{"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":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},"2":{"115":1,"145":1,"193":1,"194":2,"201":1,"220":1,"266":1,"270":1,"271":1,"273":1,"295":1,"303":1,"304":1,"339":1,"367":1}}],["композаблом",{"2":{"449":1}}],["композабле",{"2":{"97":1,"449":1}}],["композабл",{"0":{"97":1,"241":1},"1":{"242":1},"2":{"241":9,"409":1,"448":1,"449":4,"452":1}}],["композаблы",{"2":{"86":1,"452":1}}],["компонуемый",{"2":{"273":1}}],["компоновкой",{"2":{"171":1}}],["компоновки",{"2":{"117":1,"391":1}}],["компоновка",{"2":{"26":1}}],["компонентно",{"2":{"451":1}}],["компонентного",{"2":{"324":1}}],["компонентом",{"2":{"230":1,"231":1,"240":1,"245":1,"246":1,"247":1,"337":1,"350":1,"367":1,"371":1,"425":1,"426":2,"449":2}}],["компонентов",{"0":{"112":1,"194":1,"207":1,"226":1,"228":1,"337":1,"396":1},"1":{"227":1,"228":1,"229":2,"230":2,"231":2,"232":2,"233":1,"234":1,"235":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,"338":1,"339":1},"2":{"110":1,"112":2,"113":1,"119":1,"136":1,"145":1,"190":1,"192":1,"193":2,"194":2,"195":2,"202":2,"203":5,"210":1,"216":1,"219":2,"220":2,"223":2,"224":1,"226":4,"228":1,"229":5,"230":1,"232":2,"234":2,"235":1,"238":2,"239":1,"242":1,"243":1,"247":1,"250":1,"262":1,"270":2,"271":4,"272":1,"273":1,"321":1,"333":1,"335":1,"337":1,"339":2,"340":1,"342":2,"343":2,"344":1,"351":1,"367":1,"377":1,"396":1,"401":1,"415":1,"418":1,"419":1,"424":2,"426":1,"442":1,"445":1,"449":1,"533":1}}],["компоненту",{"2":{"111":1,"195":1,"223":1,"230":1,"237":1,"240":1,"242":1,"246":1,"305":1,"338":1,"371":1,"378":1,"425":1}}],["компоненте",{"2":{"41":1,"105":1,"115":1,"160":1,"220":1,"222":1,"223":1,"234":1,"236":2,"237":1,"238":5,"240":3,"241":1,"246":1,"247":2,"274":1,"304":1,"323":1,"326":1,"330":1,"338":1,"344":1,"353":1,"374":2,"376":3,"377":1,"381":1,"387":1,"426":1,"449":3,"526":1}}],["компонентам",{"2":{"118":1,"219":1,"229":1,"230":1,"237":1,"247":1,"271":1,"337":1,"367":1,"377":1,"410":1}}],["компонентами",{"0":{"454":1},"2":{"115":1,"145":1,"194":1,"195":2,"201":1,"221":1,"226":1,"230":1,"233":1,"234":2,"237":1,"238":1,"241":2,"242":1,"280":1,"281":1,"295":2,"303":1,"304":1,"321":1,"336":1,"340":1,"343":1,"345":2,"347":2,"349":1,"354":1,"355":1,"367":2,"368":1,"369":1,"374":1,"411":1,"420":1,"429":1,"489":1}}],["компонента",{"2":{"23":1,"113":1,"159":1,"161":1,"193":1,"194":4,"195":7,"203":4,"215":1,"216":2,"217":1,"221":2,"222":3,"225":1,"226":1,"229":1,"230":1,"232":1,"234":4,"235":1,"236":3,"237":7,"239":1,"240":3,"241":1,"242":4,"246":7,"247":1,"260":4,"269":1,"271":1,"273":4,"295":1,"301":1,"304":3,"305":1,"337":1,"338":1,"342":2,"346":1,"373":1,"374":2,"377":3,"380":1,"382":1,"410":1,"419":1,"420":2,"424":1,"425":3,"426":3,"449":4,"452":1,"459":2,"501":1,"507":1}}],["компонентах",{"2":{"20":1,"41":1,"105":1,"113":1,"119":1,"145":1,"189":1,"194":1,"195":1,"231":2,"234":1,"241":1,"242":1,"249":1,"250":1,"274":1,"303":1,"316":1,"348":1,"351":1,"352":1,"374":2,"418":1,"427":1,"441":1}}],["компоненты",{"0":{"28":1,"119":1,"203":1,"233":1,"234":1,"239":1,"242":1,"373":1},"1":{"29":1,"30":1,"31":1,"32":1,"234":1,"235":1,"236":1,"237":1,"238":1,"240":1},"2":{"20":2,"26":1,"41":1,"68":1,"86":1,"111":1,"112":1,"113":2,"119":2,"190":1,"193":2,"194":3,"195":2,"201":1,"203":2,"211":1,"215":3,"218":1,"226":2,"228":2,"229":4,"230":3,"233":1,"234":2,"235":2,"237":1,"240":1,"243":1,"245":2,"247":1,"249":2,"250":1,"270":1,"271":2,"272":3,"303":2,"305":1,"317":1,"335":1,"337":4,"339":1,"340":1,"341":1,"344":1,"367":1,"368":4,"369":1,"372":2,"373":2,"377":4,"409":1,"410":2,"411":2,"417":1,"418":3,"419":1,"423":3,"424":1,"449":2,"451":2,"452":1,"454":2,"455":1,"459":3,"496":1,"531":1,"545":1}}],["компонент",{"2":{"20":1,"36":1,"81":1,"89":1,"91":1,"93":1,"99":4,"112":1,"113":1,"119":1,"153":1,"162":2,"192":2,"193":1,"194":3,"195":4,"203":7,"215":3,"220":2,"221":5,"223":1,"229":2,"230":2,"231":4,"234":5,"235":7,"236":2,"238":2,"240":10,"241":1,"242":5,"245":1,"246":6,"247":4,"271":9,"273":2,"274":1,"303":1,"304":1,"329":3,"337":7,"339":2,"340":3,"341":1,"342":2,"344":2,"353":1,"369":1,"371":4,"373":2,"374":6,"377":4,"379":1,"385":1,"387":1,"410":2,"412":1,"414":1,"417":1,"419":2,"425":3,"448":1,"449":7,"451":3,"454":1,"459":2,"491":1,"496":1,"531":2,"533":1,"545":1}}],["кому",{"2":{"106":1}}],["командную",{"2":{"433":1}}],["командного",{"2":{"299":1}}],["командной",{"2":{"212":1,"214":1,"215":1,"224":1,"331":1,"420":1,"429":1,"431":1,"432":1,"443":1}}],["команд",{"2":{"215":2,"299":1,"300":1,"408":1,"433":1,"451":1}}],["командами",{"2":{"420":1}}],["командах",{"2":{"417":1}}],["команда",{"0":{"299":1},"1":{"300":1},"2":{"209":1,"238":1,"266":1,"299":1,"349":1,"368":1,"431":1,"489":1}}],["командой",{"2":{"145":1,"287":1,"401":1,"415":1,"417":1,"418":1,"424":1,"438":1,"439":1,"461":1}}],["команде",{"2":{"140":1,"145":1,"191":1,"209":1,"238":1,"299":1,"320":1}}],["команды",{"2":{"96":1,"191":1,"215":1,"217":1,"234":1,"236":1,"262":1,"268":1,"299":2,"300":1,"322":1,"330":1,"340":1,"345":1,"381":1,"390":1,"420":2,"424":1,"428":2,"433":2,"435":2,"436":2,"437":2,"438":1,"439":1,"442":1}}],["команду",{"2":{"34":1,"83":1,"127":1,"214":3,"222":1,"300":1,"323":1,"327":1,"331":2,"349":1,"368":1,"419":1,"424":1,"428":2,"434":2,"435":2,"438":1}}],["коп",{"2":{"451":1}}],["копейкой",{"2":{"178":1}}],["копейку",{"2":{"178":1}}],["копии",{"2":{"337":1,"431":1}}],["копируются",{"2":{"314":1}}],["копирование",{"2":{"342":1}}],["копирования",{"2":{"136":1,"443":1}}],["копировать",{"2":{"23":1}}],["копий",{"2":{"200":1,"343":1}}],["копия",{"2":{"154":1,"247":1}}],["копию",{"2":{"154":1,"222":1,"231":2,"325":1,"342":2,"431":1,"436":1}}],["копонент",{"2":{"32":1}}],["кот",{"2":{"18":1}}],["которой",{"2":{"131":1,"140":1,"143":1,"149":1,"162":1,"172":1,"188":1,"192":1,"215":1,"262":1,"268":1,"301":1,"306":1,"315":1,"318":1,"369":2,"371":1,"386":1,"397":1,"421":2,"440":1,"496":1}}],["которого",{"2":{"113":1,"195":4,"236":2,"242":1,"246":1,"256":1,"273":1,"314":1,"346":2,"420":1}}],["которое",{"2":{"113":1,"114":1,"115":1,"134":1,"135":1,"141":1,"142":2,"148":1,"162":1,"166":1,"202":1,"213":1,"221":1,"222":1,"223":1,"230":1,"235":1,"238":1,"240":1,"246":1,"302":1,"309":1,"314":1,"315":2,"342":1,"344":1,"349":1,"350":2,"368":2,"374":1,"383":1,"387":1,"418":2,"419":1,"425":1,"426":2,"428":1,"438":1,"439":1,"450":1}}],["котором",{"2":{"58":1,"125":1,"190":2,"194":1,"214":1,"215":1,"222":1,"235":2,"242":1,"247":1,"254":1,"261":1,"262":1,"271":1,"300":1,"302":1,"314":1,"327":1,"329":1,"374":2,"382":1,"383":1,"389":1,"407":1,"415":1,"423":1,"424":1,"448":1,"449":1}}],["которому",{"2":{"48":1,"200":1,"332":1,"347":1,"351":1,"380":1,"410":1,"422":1,"425":1}}],["которая",{"2":{"43":1,"61":1,"68":1,"96":1,"109":1,"116":2,"125":1,"128":1,"134":1,"159":1,"174":1,"191":1,"192":1,"195":1,"198":1,"215":1,"222":4,"230":1,"235":1,"241":3,"242":1,"247":2,"269":1,"293":1,"296":1,"301":1,"307":2,"309":1,"318":1,"322":1,"327":1,"331":1,"342":1,"347":1,"350":5,"352":1,"371":1,"374":1,"381":2,"389":1,"417":1,"420":2,"421":1,"425":1,"426":2,"428":1,"436":1,"449":2,"451":1,"459":1,"460":1,"461":1}}],["которым",{"2":{"16":1,"17":1,"108":1,"141":1,"195":1,"209":1,"215":1,"235":1,"241":1,"245":1,"324":1,"350":1,"371":1,"374":1,"410":3,"459":1}}],["которыми",{"2":{"3":1,"4":1,"123":1,"148":1,"209":1,"215":1,"247":1,"301":1,"312":1,"449":1}}],["которые",{"2":{"16":1,"23":1,"36":1,"47":1,"106":1,"108":1,"110":1,"114":1,"121":1,"132":1,"133":2,"136":1,"137":1,"140":2,"141":1,"145":2,"146":1,"150":3,"153":1,"159":1,"161":1,"162":1,"167":3,"169":1,"175":1,"178":1,"182":1,"188":2,"189":1,"190":5,"192":2,"193":3,"194":1,"195":4,"196":1,"199":1,"202":3,"203":3,"204":1,"212":1,"215":4,"216":3,"217":1,"218":3,"220":1,"223":1,"229":1,"230":1,"231":1,"234":2,"235":3,"236":1,"237":3,"238":1,"240":2,"241":1,"251":2,"253":2,"255":2,"258":1,"260":1,"261":1,"263":1,"266":2,"267":2,"269":2,"272":1,"273":3,"274":2,"275":1,"277":3,"278":2,"281":1,"298":2,"303":1,"306":1,"310":1,"312":3,"314":2,"318":1,"320":1,"326":1,"330":1,"331":1,"337":1,"340":1,"342":1,"344":1,"346":1,"349":2,"350":2,"351":1,"358":2,"359":1,"366":1,"369":1,"372":1,"376":1,"377":2,"380":1,"382":1,"383":1,"384":1,"385":1,"386":1,"389":2,"390":1,"407":1,"409":2,"411":1,"412":1,"417":1,"418":2,"421":2,"425":1,"426":3,"436":1,"438":1,"459":1,"460":1,"461":2,"495":1,"496":1,"545":1}}],["которых",{"2":{"12":1,"40":1,"68":1,"110":1,"121":1,"190":1,"191":1,"193":1,"195":1,"200":1,"218":1,"241":1,"246":1,"256":1,"277":1,"297":1,"303":2,"352":1,"368":1,"372":1,"375":1,"377":1,"381":1,"382":1,"386":1,"388":1,"415":1,"439":1,"449":1,"451":1,"461":1}}],["который",{"2":{"3":1,"10":1,"13":1,"35":1,"41":1,"48":1,"62":1,"83":1,"107":2,"108":2,"110":1,"125":4,"128":1,"135":3,"141":1,"144":1,"159":2,"161":1,"162":1,"164":1,"168":1,"172":2,"173":1,"177":2,"180":1,"182":1,"190":1,"191":2,"192":2,"193":1,"194":4,"195":4,"203":2,"204":1,"212":1,"213":1,"214":1,"215":3,"220":2,"221":1,"222":2,"223":1,"228":1,"230":1,"232":1,"235":5,"239":1,"240":1,"241":1,"242":2,"245":1,"246":3,"247":2,"249":1,"253":1,"255":1,"259":1,"261":3,"262":1,"271":2,"276":1,"286":1,"288":1,"296":1,"299":1,"301":2,"302":3,"303":3,"304":1,"305":2,"308":1,"309":1,"315":2,"317":1,"318":1,"319":1,"320":1,"321":2,"326":1,"327":1,"331":1,"332":1,"335":1,"340":3,"345":3,"347":1,"348":1,"352":2,"366":1,"367":2,"371":5,"374":2,"376":1,"377":3,"382":1,"383":1,"384":1,"385":1,"387":1,"388":1,"389":3,"395":1,"410":1,"412":1,"417":1,"421":2,"423":1,"425":1,"426":1,"427":2,"431":1,"436":1,"443":1,"449":3,"450":1,"451":1,"461":2}}],["которую",{"2":{"2":1,"23":1,"81":1,"145":1,"155":1,"161":1,"183":1,"184":1,"192":1,"215":1,"219":1,"247":1,"257":1,"259":1,"278":1,"314":1,"323":1,"325":2,"342":1,"371":1,"377":1,"381":1,"383":1,"385":1,"386":1,"387":1,"408":1,"421":1,"449":1,"460":1}}],["конвейера",{"0":{"320":1},"1":{"321":1,"322":1,"323":1}}],["конвейеров",{"2":{"306":1}}],["конгруэнтным",{"2":{"249":1}}],["конфликтуют",{"2":{"444":1}}],["конфликта",{"2":{"438":1}}],["конфликт",{"2":{"438":1}}],["конфликты",{"0":{"438":1},"2":{"439":1}}],["конфликтов",{"2":{"221":1,"439":1}}],["конфигом",{"2":{"444":1}}],["конфиге",{"0":{"516":1},"2":{"443":1}}],["конфигурирование",{"2":{"212":1,"530":1}}],["конфигурацией",{"2":{"262":1}}],["конфигурационного",{"2":{"408":1,"489":1}}],["конфигурационному",{"2":{"219":1}}],["конфигурационные",{"2":{"497":1}}],["конфигурационный",{"2":{"215":1,"219":1,"424":2,"503":1}}],["конфигурационных",{"2":{"123":1}}],["конфигураций",{"2":{"133":1}}],["конфигурации",{"0":{"128":1,"219":1},"1":{"129":1,"130":1,"131":1,"132":1,"133":1},"2":{"118":1,"126":1,"128":2,"131":1,"214":1,"215":1,"219":2,"262":1,"271":1,"371":1,"410":2,"427":2}}],["конфигурацию",{"2":{"118":1,"127":1,"128":2,"129":1,"132":1,"136":1,"218":1,"219":2,"420":1}}],["конфигурациях",{"2":{"461":1}}],["конфигурация",{"0":{"129":1},"1":{"130":1},"2":{"20":1,"134":1,"444":1}}],["конфиденциальности",{"2":{"188":1,"381":1}}],["конец",{"2":{"214":1,"427":2}}],["конечную",{"2":{"382":1,"384":1,"385":1,"388":1}}],["конечная",{"2":{"328":1,"332":1}}],["конечным",{"2":{"383":1}}],["конечными",{"2":{"327":1}}],["конечных",{"2":{"331":1,"350":1,"383":1}}],["конечные",{"2":{"215":1,"247":1,"332":1}}],["конечный",{"2":{"122":1,"195":1,"215":1,"220":1,"240":2,"247":2,"373":1}}],["конечном",{"2":{"209":1,"235":1,"440":1}}],["конечному",{"2":{"141":1,"260":1,"388":1}}],["конечной",{"2":{"178":1,"327":1}}],["конечного",{"2":{"68":1,"75":1,"125":1,"366":1,"440":2}}],["конечно",{"2":{"17":1,"109":1,"127":1,"220":1,"251":1,"263":1,"303":1,"309":1,"337":1,"342":1,"386":1,"389":1,"417":1,"452":1,"461":1}}],["консистентности",{"2":{"449":1}}],["консоли",{"2":{"448":1}}],["консоль",{"2":{"213":1,"302":2,"308":1,"316":1}}],["константные",{"2":{"206":1}}],["константе",{"2":{"195":1}}],["константа",{"2":{"195":2}}],["константы",{"0":{"206":1},"2":{"195":2,"222":1}}],["константу",{"2":{"195":2,"241":2,"247":1,"344":2}}],["конструкция",{"0":{"245":1},"2":{"247":1}}],["конструкциями",{"2":{"39":1}}],["конструкции",{"2":{"229":1,"449":1}}],["конструктором",{"2":{"371":1}}],["конструкторов",{"2":{"222":1,"347":1,"371":1}}],["конструктору",{"2":{"315":1,"371":1}}],["конструкторе",{"2":{"287":1,"292":1,"293":1,"298":1}}],["конструктора",{"2":{"195":1,"241":1,"246":1,"309":1,"321":1,"346":1,"352":2,"377":1,"496":2}}],["конструкторы",{"2":{"118":1,"206":1,"377":1,"380":1}}],["конструктор",{"2":{"111":2,"118":1,"127":1,"192":1,"195":3,"247":1,"301":1,"302":1,"309":1,"315":2,"317":1,"326":1,"332":1,"343":1,"344":1,"346":2,"347":1,"349":1,"371":1}}],["кончается",{"2":{"106":2}}],["кончился",{"2":{"106":1}}],["контакты",{"2":{"483":1}}],["контактов",{"2":{"187":1}}],["контактам",{"2":{"187":1}}],["контейнер",{"2":{"373":1}}],["контейнера",{"2":{"162":1}}],["контенту",{"2":{"174":1}}],["контент",{"2":{"172":2,"186":1,"253":1,"461":1}}],["контентом",{"2":{"158":1,"169":1,"174":1,"248":1,"461":2,"494":1,"496":1}}],["контента",{"0":{"171":1},"1":{"172":1,"173":1,"174":1,"175":1},"2":{"142":1,"158":1,"165":1,"190":1,"192":1,"203":1,"229":1,"461":1}}],["контекстов",{"2":{"262":1}}],["контексту",{"2":{"229":1,"381":1}}],["контекст",{"2":{"219":1,"238":1,"424":1}}],["контексте",{"2":{"219":1,"266":1,"366":1}}],["контекстном",{"2":{"258":1}}],["контекстного",{"2":{"155":1,"336":1}}],["контекстные",{"2":{"155":1}}],["контекстным",{"2":{"155":1}}],["контекстных",{"2":{"155":1}}],["контекстах",{"2":{"256":1,"366":1}}],["контекста",{"2":{"81":1,"195":1,"234":1,"251":1,"258":1,"268":1,"278":1,"282":1,"300":1,"335":1,"382":1,"495":1}}],["контрагентами",{"2":{"451":1}}],["контрастно",{"2":{"174":1}}],["контрастах",{"2":{"174":1}}],["контраста",{"2":{"144":1}}],["контраст",{"0":{"142":1},"2":{"142":3}}],["контролируется",{"2":{"544":1}}],["контролирует",{"2":{"448":1,"451":1}}],["контролировать",{"2":{"2":1,"215":1,"295":1,"373":1}}],["контроллеров",{"2":{"237":1}}],["контроллеры",{"0":{"237":1}}],["контроля",{"0":{"415":1},"1":{"416":1,"417":1,"418":1,"419":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,"442":1},"2":{"149":2,"150":1,"159":1,"213":2,"215":1,"223":1,"271":1,"371":1,"401":1,"431":1}}],["контроль",{"0":{"401":1},"2":{"134":1,"150":1,"195":2,"213":1,"215":1,"219":1,"235":1,"262":1,"308":1,"366":1,"429":1}}],["концом",{"2":{"303":1}}],["концов",{"2":{"261":1,"306":1}}],["концу",{"2":{"138":1,"190":1,"251":2,"312":1,"314":1,"335":1,"364":1}}],["концептуального",{"2":{"396":1}}],["концептуально",{"2":{"317":1}}],["концептуальной",{"2":{"232":1}}],["концептуальный",{"2":{"389":1}}],["концептуальных",{"2":{"312":1}}],["концептуальные",{"2":{"267":1}}],["концепций",{"2":{"190":1,"306":1,"333":1,"358":1}}],["концепцией",{"2":{"161":1,"191":1,"345":1,"396":1}}],["концепция",{"2":{"138":1,"144":1,"155":1,"156":1,"161":1,"169":1,"170":2,"172":1,"179":1,"190":1,"191":1,"195":1,"213":1,"218":1,"240":1,"271":1,"272":1,"283":1,"299":1,"302":1,"388":1,"390":1,"415":1,"428":1}}],["концепциями",{"2":{"136":1,"226":1,"319":1,"399":1}}],["концепции",{"2":{"126":1,"141":1,"143":1,"193":1,"212":1,"266":1,"312":1,"320":1,"333":1,"335":1,"336":1,"350":1,"358":1,"402":1,"415":1,"440":1,"441":1,"452":1}}],["концепцию",{"2":{"125":1,"145":1,"170":1,"174":1,"195":1,"232":1,"251":1,"340":1,"366":1,"383":1}}],["конце",{"2":{"174":1,"177":1,"192":1,"215":1,"247":1,"261":1,"306":1,"314":1,"417":1}}],["концентрируемся",{"2":{"41":1}}],["конца",{"2":{"60":1,"161":1,"162":1,"332":1,"382":1}}],["конкатенируются",{"2":{"383":1}}],["конкатенированы",{"2":{"376":1}}],["конкатенировать",{"2":{"112":1}}],["конкатенации",{"2":{"383":1}}],["конкретика",{"2":{"271":1}}],["конкретную",{"2":{"271":1,"496":1}}],["конкретным",{"2":{"277":1}}],["конкретных",{"2":{"247":1,"253":1,"262":1,"352":1,"496":1}}],["конкретные",{"2":{"191":1}}],["конкретный",{"2":{"43":1,"328":1,"492":1}}],["конкретная",{"2":{"170":1}}],["конкретного",{"2":{"110":1,"148":1,"232":1,"388":1,"411":1,"421":1}}],["конкретное",{"2":{"108":1,"195":1}}],["конкретно",{"2":{"41":1}}],["конкретном",{"2":{"11":1,"191":1,"318":1,"377":1}}],["конкурировать",{"2":{"190":1}}],["конкурировали",{"2":{"190":1}}],["конкурируют",{"2":{"154":1}}],["конкурентов",{"0":{"22":1},"2":{"23":1,"140":1}}],["кодироваться",{"2":{"412":1}}],["кодирования",{"2":{"260":1,"309":1,"358":1,"383":2,"417":1}}],["кодирование",{"2":{"249":1,"290":1}}],["кодированию",{"2":{"172":1}}],["кодировке",{"2":{"383":1}}],["кодирует",{"2":{"383":1}}],["кодов",{"2":{"388":1}}],["кодовой",{"2":{"293":1,"436":1,"439":1}}],["кодовая",{"2":{"247":1,"253":1}}],["кодовых",{"2":{"204":1,"210":1,"273":1}}],["кодовые",{"0":{"204":1},"1":{"205":1,"206":1,"207":1,"208":1,"209":1},"2":{"209":1}}],["кодом",{"2":{"75":1,"107":1,"210":1,"213":1,"222":2,"241":1,"246":1,"306":1,"320":1,"331":1,"336":1,"372":1,"387":1,"388":1,"389":1,"415":1,"420":1,"424":1,"427":1,"430":1,"431":1,"436":1,"438":1}}],["кодера",{"2":{"444":1}}],["коде",{"2":{"195":3,"209":1,"211":1,"219":1,"222":2,"232":1,"238":1,"241":1,"260":3,"261":1,"273":2,"289":1,"300":1,"303":1,"305":1,"309":2,"325":1,"334":1,"367":1,"374":1,"377":1,"387":1,"417":1,"420":1,"421":1,"426":1,"427":1,"430":1,"441":2,"451":1,"452":1,"459":1,"492":1,"497":1,"499":1,"500":1,"527":1}}],["коду",{"2":{"41":1,"220":1,"246":1,"276":1,"320":1,"326":1,"340":1,"374":1,"383":1,"430":1}}],["кода",{"0":{"362":1,"503":1},"2":{"40":1,"63":1,"105":2,"107":1,"115":1,"116":1,"134":2,"191":2,"192":1,"193":1,"194":2,"195":6,"209":1,"213":3,"218":1,"219":1,"222":2,"223":1,"226":3,"227":1,"239":1,"241":1,"242":1,"245":1,"246":1,"247":2,"252":3,"255":2,"260":2,"263":2,"267":1,"271":1,"273":2,"274":2,"275":1,"276":1,"277":1,"292":1,"303":1,"307":2,"313":2,"314":5,"318":1,"320":1,"322":1,"323":1,"324":1,"325":1,"330":1,"332":1,"333":1,"335":1,"345":1,"346":1,"350":1,"353":1,"360":2,"362":1,"364":1,"366":1,"367":1,"376":1,"377":2,"380":1,"381":1,"382":1,"383":2,"385":1,"386":1,"387":3,"388":2,"401":1,"405":2,"408":1,"415":3,"416":1,"417":1,"421":2,"428":2,"429":2,"430":2,"431":2,"432":1,"436":3,"438":2,"441":1,"444":1,"449":1,"451":3,"453":1,"455":2,"459":2,"460":1,"461":2,"484":1,"495":1,"496":2,"499":1,"503":2}}],["код",{"0":{"276":1,"363":1,"423":1},"1":{"279":1,"280":1,"281":1,"282":1},"2":{"9":1,"23":1,"76":1,"81":1,"97":1,"99":1,"105":2,"108":1,"109":1,"127":1,"128":1,"132":1,"137":1,"139":2,"153":1,"161":1,"166":1,"172":1,"191":1,"192":2,"193":2,"195":5,"204":1,"209":1,"213":1,"214":1,"215":5,"216":1,"218":1,"222":4,"223":1,"224":1,"226":1,"227":1,"235":2,"237":1,"241":1,"246":3,"250":1,"252":1,"260":1,"261":2,"266":1,"273":3,"274":2,"276":6,"277":2,"286":1,"287":2,"289":2,"292":2,"302":1,"303":1,"308":1,"309":2,"313":1,"314":1,"315":1,"320":1,"322":1,"323":1,"336":2,"342":1,"343":1,"344":1,"354":1,"365":2,"373":1,"374":3,"377":1,"382":1,"384":1,"385":1,"386":2,"387":5,"388":3,"389":3,"408":1,"416":2,"417":5,"419":1,"420":2,"423":1,"425":1,"427":3,"430":2,"436":1,"438":1,"439":2,"440":1,"444":1,"448":1,"455":1,"460":2,"517":1,"530":1,"544":1}}],["к",{"0":{"174":1,"260":1,"324":1},"1":{"325":1,"326":1,"327":1,"328":1,"329":1,"330":1},"2":{"2":1,"11":1,"16":1,"20":1,"26":1,"38":1,"40":2,"41":4,"52":2,"57":1,"58":2,"62":1,"67":1,"68":1,"86":1,"93":1,"103":1,"105":1,"106":4,"107":7,"108":6,"110":1,"111":1,"112":1,"114":6,"115":1,"118":3,"119":1,"122":2,"125":7,"126":1,"127":1,"128":4,"130":1,"132":1,"134":1,"135":4,"136":1,"138":1,"140":2,"141":1,"142":1,"143":2,"144":3,"145":1,"147":1,"148":1,"149":1,"150":2,"152":1,"153":1,"157":1,"158":2,"161":1,"162":2,"163":1,"164":1,"165":2,"172":6,"173":1,"174":5,"176":3,"178":1,"186":1,"187":1,"190":3,"191":1,"195":19,"197":1,"201":1,"203":3,"211":1,"212":1,"213":1,"215":4,"216":2,"217":1,"218":1,"219":1,"220":1,"222":3,"223":1,"224":1,"225":1,"226":1,"227":1,"228":4,"229":2,"230":1,"232":2,"234":2,"235":2,"236":1,"237":1,"240":4,"241":2,"243":3,"246":2,"247":1,"249":1,"250":1,"251":3,"253":5,"255":2,"256":1,"258":1,"260":5,"261":6,"262":1,"263":1,"264":1,"265":1,"266":1,"270":1,"271":2,"273":3,"274":1,"276":1,"277":1,"279":1,"283":1,"284":3,"288":1,"295":2,"299":1,"301":1,"302":1,"303":2,"306":5,"307":2,"309":5,"310":1,"312":3,"313":2,"314":7,"315":2,"316":1,"317":1,"318":5,"320":2,"321":2,"322":2,"323":2,"324":1,"325":1,"326":1,"327":1,"328":1,"332":3,"333":3,"335":2,"336":1,"337":4,"339":2,"340":1,"342":2,"344":2,"345":1,"346":3,"347":1,"349":3,"350":7,"351":1,"352":2,"353":1,"358":4,"360":2,"364":2,"366":3,"367":3,"368":1,"369":1,"371":2,"372":1,"373":1,"374":4,"375":1,"376":1,"377":1,"378":1,"380":3,"381":1,"382":1,"383":1,"387":3,"388":1,"389":8,"391":1,"396":1,"407":2,"410":1,"412":1,"415":3,"417":1,"418":1,"419":1,"420":1,"421":3,"422":1,"423":2,"425":6,"426":5,"430":3,"431":1,"435":1,"437":1,"439":1,"444":5,"448":1,"449":2,"452":1,"456":1,"460":3,"461":3,"486":1,"487":1,"495":1,"499":2,"500":1,"501":1,"530":1}}],["вкратце",{"2":{"335":1}}],["вкладок",{"2":{"350":1}}],["вкладка",{"2":{"184":1}}],["вкладки",{"2":{"144":1,"145":1,"350":2}}],["вклад",{"2":{"138":1,"276":1}}],["включенные",{"2":{"268":1}}],["включенное",{"2":{"153":1}}],["включением",{"2":{"329":1,"371":1}}],["включение",{"2":{"218":1,"389":1,"420":1}}],["включения",{"2":{"216":1,"317":1,"322":1,"348":1,"368":1,"376":1,"415":1,"435":1,"436":1,"448":1}}],["включен",{"2":{"215":1,"234":1,"371":1,"435":1}}],["включено",{"2":{"153":2}}],["включены",{"2":{"141":1,"377":1}}],["включена",{"2":{"135":1,"172":1}}],["включив",{"2":{"424":1,"427":1}}],["включите",{"2":{"216":1,"347":1}}],["включить",{"2":{"128":1,"129":1,"215":1,"218":3,"271":1,"328":1,"332":1,"345":1,"368":1,"428":1}}],["включили",{"2":{"218":1,"326":1,"332":1,"371":1,"377":1}}],["включил",{"2":{"129":1,"492":1}}],["включим",{"2":{"103":1,"216":1,"322":1,"324":1}}],["включать",{"2":{"190":1,"216":1,"218":1,"237":1,"260":1,"319":1,"320":1,"377":1,"427":1,"439":1,"440":1,"444":1}}],["включающий",{"2":{"116":1}}],["включают",{"2":{"68":1,"235":1,"366":1,"439":1,"533":1}}],["включаем",{"2":{"373":1,"374":1}}],["включаемые",{"2":{"115":1}}],["включается",{"2":{"106":1,"307":1,"444":1}}],["включает",{"0":{"124":1,"392":1},"1":{"125":1,"393":1,"394":1,"395":1,"396":1,"397":1,"398":1,"399":1,"400":1,"401":1,"402":1,"403":1,"404":1},"2":{"68":1,"69":1,"73":1,"116":1,"122":1,"128":1,"140":3,"154":1,"157":1,"167":1,"273":1,"274":1,"297":1,"318":1,"327":1,"417":2,"435":1,"439":1}}],["включая",{"2":{"47":1,"190":1,"270":1,"343":1,"443":1,"444":1,"448":1,"459":1,"533":1}}],["вмешательства",{"2":{"261":1}}],["вместе",{"2":{"109":1,"114":1,"138":1,"164":1,"185":1,"203":1,"212":1,"263":1,"266":1,"275":1,"312":1,"332":1,"366":1,"373":1,"377":1,"388":1,"417":1,"438":1,"453":1}}],["вместо",{"2":{"20":1,"108":1,"112":1,"115":1,"127":2,"174":1,"193":1,"194":1,"195":1,"218":1,"234":1,"240":1,"241":1,"253":1,"261":1,"266":1,"270":1,"298":1,"299":1,"303":1,"308":1,"317":1,"319":1,"339":1,"343":1,"347":1,"349":1,"350":2,"374":1,"377":1,"391":1,"418":1,"420":1,"423":1,"434":1,"443":1,"448":1,"461":1,"500":2,"544":1}}],["втянуть",{"2":{"176":1}}],["вторых",{"2":{"460":1}}],["вторым",{"2":{"421":1}}],["вторично",{"2":{"444":1}}],["вторичным",{"2":{"155":1}}],["вторичный",{"2":{"142":1,"388":1}}],["вторую",{"2":{"332":1}}],["вторая",{"2":{"114":1,"273":1,"314":1}}],["второго",{"2":{"390":1,"425":1}}],["второе",{"2":{"222":1,"387":1,"388":1}}],["втором",{"2":{"106":2,"301":1,"371":1}}],["второстепенных",{"2":{"17":1}}],["второй",{"2":{"17":1,"55":1,"57":1,"66":1,"236":1,"260":1,"287":1,"328":1,"371":1,"388":1,"415":1,"421":2,"444":3,"522":1}}],["впрочем",{"2":{"527":1}}],["впредь",{"2":{"264":1}}],["впервые",{"2":{"439":1}}],["вперёд",{"2":{"366":1}}],["вперед",{"2":{"202":1,"223":1,"256":1,"261":1,"310":1,"344":1,"380":1,"386":1,"437":1}}],["впечатляющее",{"2":{"377":1}}],["впечатляющей",{"2":{"324":1}}],["впечатление",{"2":{"159":1,"161":1,"484":1,"495":1}}],["вплоть",{"2":{"191":1,"240":1,"269":1,"424":1,"429":1}}],["вполне",{"2":{"4":1,"58":1,"106":1,"121":1,"214":1,"327":1,"342":1,"381":1,"382":1,"383":1,"439":1,"449":1,"451":1,"460":1,"495":1}}],["входе",{"2":{"461":1}}],["входы",{"2":{"304":1,"418":1}}],["вход",{"2":{"303":1,"385":2}}],["входящего",{"2":{"318":1,"419":1}}],["входящих",{"2":{"321":1,"322":1,"421":1}}],["входящий",{"2":{"130":1}}],["входящие",{"2":{"129":1,"272":1}}],["входят",{"2":{"258":1}}],["входной",{"2":{"304":1}}],["входного",{"2":{"235":1,"419":1}}],["входных",{"2":{"288":1,"296":1,"417":1}}],["входные",{"2":{"230":1,"301":1}}],["входными",{"2":{"223":1}}],["входным",{"2":{"115":1}}],["входов",{"0":{"231":1},"2":{"417":1}}],["входить",{"2":{"228":1,"303":1}}],["входит",{"2":{"108":1,"134":1,"145":1,"386":1,"434":1,"484":1}}],["входа",{"2":{"29":1,"128":1,"194":1,"271":4,"299":1,"318":1,"320":1,"386":1,"451":1,"461":1}}],["вузах",{"2":{"64":1}}],["владельцем",{"2":{"337":1}}],["властвуй",{"2":{"2":1}}],["вложенных",{"0":{"376":1},"2":{"377":1,"411":1}}],["вложенные",{"0":{"375":1},"1":{"376":1,"377":1},"2":{"380":1}}],["вложенном",{"2":{"238":1}}],["вложенному",{"2":{"237":1}}],["вложенного",{"2":{"165":1}}],["вложены",{"2":{"176":1}}],["вложений",{"2":{"61":1}}],["влиять",{"2":{"267":1}}],["влияющий",{"2":{"308":1}}],["влияющее",{"2":{"156":1}}],["влияют",{"2":{"140":1,"273":1,"281":1}}],["влияет",{"2":{"153":1,"196":1,"314":1,"453":1}}],["влияние",{"2":{"68":1,"175":1}}],["вязала",{"2":{"61":1}}],["вновь",{"2":{"315":1,"459":1}}],["вносит",{"2":{"459":1}}],["вносится",{"2":{"415":1}}],["вносите",{"2":{"276":1}}],["вносить",{"2":{"219":1}}],["вносят",{"2":{"190":1}}],["внуку",{"2":{"339":1}}],["внушительная",{"2":{"241":1}}],["внушительное",{"2":{"169":1}}],["внучатому",{"2":{"237":1}}],["внутрь",{"2":{"377":1,"444":1}}],["внутренняя",{"2":{"303":1}}],["внутреннюю",{"2":{"241":1,"342":1}}],["внутренне",{"2":{"303":1}}],["внутреннего",{"2":{"293":1,"298":1,"352":1,"460":1}}],["внутреннее",{"2":{"245":1,"246":2,"349":1}}],["внутренней",{"2":{"203":1,"214":1,"264":1,"301":1,"342":1}}],["внутреннему",{"2":{"290":1,"293":1,"383":1}}],["внутреннем",{"2":{"195":1,"352":1}}],["внутренний",{"2":{"273":1,"352":1,"387":1,"411":1}}],["внутренним",{"2":{"272":1,"303":1,"351":1,"389":1}}],["внутренними",{"2":{"114":1}}],["внутренних",{"2":{"138":1,"203":1,"236":1,"325":1,"418":1}}],["внутренние",{"2":{"116":1,"344":1,"451":1}}],["внутри",{"2":{"48":1,"119":1,"126":1,"153":1,"154":1,"167":1,"172":2,"191":3,"192":2,"200":1,"215":2,"219":2,"221":1,"222":4,"225":1,"235":1,"237":1,"240":2,"244":1,"253":1,"260":1,"269":1,"295":1,"304":1,"308":1,"309":2,"312":1,"316":1,"346":1,"347":1,"352":1,"382":1,"385":1,"386":1,"410":1,"412":1,"421":3,"448":3,"449":1,"530":1,"537":1}}],["вниз",{"2":{"161":1,"174":1,"307":1,"339":1,"485":1,"522":1}}],["внизу",{"2":{"33":1,"157":1,"162":1}}],["внимательно",{"0":{"144":1}}],["вниманию",{"2":{"157":1}}],["внимания",{"2":{"122":2,"156":1,"157":1,"186":1,"293":1}}],["внимание",{"2":{"99":1,"113":1,"114":1,"127":1,"130":1,"142":2,"144":1,"145":1,"156":1,"169":1,"172":1,"174":2,"177":1,"190":1,"191":1,"192":3,"194":1,"195":1,"215":1,"221":2,"222":3,"237":1,"246":1,"247":3,"253":1,"264":1,"287":1,"297":1,"302":2,"307":1,"309":1,"314":2,"316":1,"325":1,"328":1,"337":1,"339":1,"342":1,"346":1,"349":1,"360":1,"371":2,"374":1,"377":1,"383":1,"387":1,"421":1,"423":1,"426":3,"436":1}}],["внешней",{"2":{"449":1}}],["внешнего",{"2":{"190":1,"216":1,"303":1}}],["внешних",{"2":{"418":1}}],["внешние",{"2":{"271":1}}],["внешний",{"2":{"190":1,"217":1,"253":1,"373":1,"387":1,"411":1}}],["внедрить",{"2":{"261":1,"371":1,"410":1}}],["внедрена",{"2":{"238":1}}],["внедрения",{"2":{"212":1,"251":1,"262":1,"315":1}}],["внедрении",{"2":{"186":1}}],["внедряйте",{"2":{"410":1}}],["внедряют",{"2":{"215":1,"389":1}}],["внедрять",{"2":{"55":1,"162":1,"216":1}}],["внесите",{"0":{"483":1}}],["внесения",{"2":{"483":1}}],["внесение",{"2":{"430":1}}],["внесенных",{"2":{"191":1}}],["внесем",{"2":{"214":1}}],["внесли",{"2":{"138":1,"344":1}}],["внести",{"2":{"40":1,"137":1,"275":1,"415":1}}],["вне",{"2":{"119":1,"213":1,"239":1,"253":1,"307":1}}],["вредными",{"2":{"460":1}}],["вредоносные",{"2":{"176":1}}],["времена",{"2":{"459":1}}],["временами",{"2":{"190":1}}],["временем",{"2":{"195":1,"297":1,"408":1}}],["временных",{"2":{"418":1}}],["временным",{"2":{"173":1}}],["временная",{"2":{"383":1}}],["временно",{"2":{"448":1,"449":1}}],["временной",{"2":{"314":1}}],["временное",{"2":{"108":1}}],["времени",{"2":{"61":1,"84":1,"116":1,"125":1,"148":2,"152":1,"159":2,"195":1,"220":1,"241":1,"302":1,"306":1,"307":1,"308":1,"314":4,"350":1,"366":3,"387":6,"388":1,"429":1,"450":1,"455":1,"459":1,"460":1}}],["время",{"0":{"448":1},"2":{"99":1,"103":1,"113":1,"118":1,"125":3,"128":1,"134":1,"147":1,"148":3,"149":1,"152":1,"157":1,"165":1,"168":1,"174":1,"180":1,"191":2,"192":2,"193":1,"195":1,"203":1,"214":1,"215":3,"218":1,"222":1,"223":1,"229":1,"232":1,"235":3,"240":1,"246":2,"247":1,"249":1,"260":3,"276":1,"290":1,"301":1,"303":1,"304":1,"308":1,"309":2,"320":1,"321":1,"323":1,"326":1,"340":1,"351":1,"354":2,"358":1,"371":1,"374":2,"380":1,"387":1,"389":1,"390":1,"415":2,"417":1,"419":1,"420":1,"421":1,"429":1,"430":1,"439":1,"444":1,"448":1,"449":1,"450":5,"452":1,"453":1,"455":1,"460":1,"495":1,"524":1,"530":1}}],["вращение",{"2":{"160":1}}],["вращающихся",{"2":{"160":1,"444":1}}],["вроде",{"2":{"61":1,"94":1,"449":1,"461":1}}],["вручную",{"2":{"38":1,"135":1,"251":1,"261":1,"264":1,"273":2,"417":1,"424":1}}],["вряд",{"2":{"26":1,"415":1,"460":1}}],["взяли",{"2":{"452":1}}],["взяв",{"2":{"451":1}}],["взята",{"2":{"218":1}}],["взять",{"2":{"4":1,"134":1,"191":1,"229":1,"366":1,"414":1,"419":1,"495":1}}],["взлетевших",{"2":{"451":1}}],["взлететь",{"2":{"444":1}}],["взломают",{"2":{"388":1}}],["взвесить",{"2":{"191":1}}],["взглянув",{"2":{"249":1}}],["взглянуть",{"2":{"27":1,"109":1,"247":1}}],["взгляд",{"2":{"140":1,"169":1,"173":1,"195":1,"277":1,"303":1,"309":1,"376":1}}],["взгляда",{"2":{"138":1,"141":1,"151":1,"167":1}}],["взаимоотношения",{"2":{"281":1}}],["взаимозаменяемые",{"2":{"191":1,"308":1}}],["взаимопониманием",{"2":{"188":1}}],["взаимодействуем",{"2":{"366":1}}],["взаимодействует",{"2":{"34":1,"140":1,"150":1}}],["взаимодействуют",{"2":{"312":1,"335":1,"411":1}}],["взаимодействовать",{"2":{"166":1,"228":1,"230":2,"232":1,"246":1,"249":1,"250":1,"264":1,"334":1,"389":1,"426":1}}],["взаимодействии",{"2":{"337":1,"417":1}}],["взаимодействию",{"2":{"306":1}}],["взаимодействий",{"0":{"230":1},"2":{"150":1,"190":1,"306":1,"331":1,"366":1,"381":2,"418":2}}],["взаимодействие",{"0":{"337":1},"1":{"338":1,"339":1},"2":{"140":1,"222":2,"230":1,"231":2,"235":1,"245":1,"246":1,"284":1,"306":3,"312":1,"319":1,"327":1,"389":1,"417":2,"426":1}}],["взаимодействием",{"2":{"68":1,"163":1,"223":1,"230":1,"231":1,"261":1}}],["взаимодействия",{"0":{"163":1,"320":1},"1":{"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"321":1,"322":1,"323":1},"2":{"68":1,"138":2,"140":2,"150":1,"167":1,"173":1,"176":1,"226":1,"230":1,"241":1,"274":1,"277":1,"280":1,"315":1,"319":1,"320":1,"329":1,"337":2,"364":1,"381":1,"388":1,"389":1,"415":1,"426":1,"428":1,"429":1,"452":1}}],["взаимосвязаны",{"2":{"311":1}}],["взаимосвязь",{"2":{"301":1}}],["взаимосвязи",{"2":{"68":1,"415":1}}],["взаимосвязей",{"2":{"67":1,"429":1}}],["вентиляторов",{"2":{"444":1}}],["вело",{"2":{"251":1}}],["велосипед",{"2":{"216":1,"266":1,"298":1,"306":1}}],["великолепным",{"2":{"194":1}}],["ведение",{"2":{"382":1}}],["ведет",{"2":{"202":1,"301":1,"358":1,"371":1}}],["ведется",{"2":{"180":1,"389":1}}],["ведь",{"2":{"374":1,"420":1}}],["ведома",{"2":{"180":1}}],["ведут",{"2":{"154":1,"199":1,"200":1,"240":1,"380":1}}],["ведущие",{"2":{"125":1,"193":1}}],["веток",{"2":{"438":1}}],["ветвью",{"2":{"461":1}}],["ветвей",{"2":{"437":1}}],["ветвями",{"0":{"437":1},"2":{"437":1,"438":1}}],["ветвление",{"2":{"436":1}}],["ветви",{"2":{"121":1}}],["веткой",{"2":{"436":1,"438":1}}],["ветке",{"2":{"436":2,"437":1,"438":1,"442":1,"515":1}}],["ветки",{"2":{"408":2,"436":1,"437":4,"438":1,"515":1}}],["ветку",{"2":{"134":1,"408":2,"437":3,"438":2,"439":2,"515":2}}],["ветках",{"2":{"442":1,"449":1}}],["ветка",{"2":{"103":1,"436":2}}],["вещах",{"2":{"192":1,"314":1}}],["вещи",{"2":{"107":1,"141":1,"425":1,"448":1,"524":1}}],["вещь",{"2":{"25":1,"216":1,"218":1}}],["везде",{"2":{"86":1}}],["веса",{"2":{"459":1}}],["вести",{"2":{"351":1,"461":1}}],["вестись",{"2":{"60":1,"78":1}}],["веских",{"2":{"301":1}}],["весомых",{"2":{"164":1}}],["вес",{"2":{"94":1,"144":1}}],["весьма",{"2":{"89":1,"185":1,"191":1,"333":1,"342":1,"389":1,"527":1}}],["весь",{"2":{"50":1,"114":1,"161":1,"187":1,"193":1,"195":1,"241":1,"261":1,"274":1,"306":1,"320":1,"366":2,"438":1,"543":1}}],["верен",{"2":{"461":1}}],["вероятно",{"2":{"438":1}}],["вероятность",{"2":{"78":1,"191":1,"253":1,"409":1,"450":1}}],["верстку",{"2":{"459":1}}],["верстки",{"2":{"247":1,"492":1}}],["верстать",{"2":{"456":1,"459":1}}],["версией",{"2":{"435":1}}],["версионность",{"2":{"409":1,"543":1}}],["версионности",{"2":{"70":1}}],["версию",{"2":{"213":1,"215":1,"326":1,"364":1,"408":1,"432":1,"435":1,"460":1,"461":1,"533":1}}],["версий",{"0":{"415":1},"1":{"416":1,"417":1,"418":1,"419":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,"442":1},"2":{"35":1,"125":1,"213":2,"401":1,"440":2}}],["версиях",{"2":{"215":1}}],["версиями",{"2":{"110":1}}],["версия",{"0":{"33":1},"2":{"79":1,"118":1,"190":1,"213":3,"248":1,"358":1,"433":1,"499":1}}],["версии",{"2":{"29":1,"30":1,"33":2,"47":1,"215":1,"242":1,"301":1,"349":1,"408":2,"423":1,"543":1}}],["вертикали",{"2":{"230":1}}],["вертикальный",{"2":{"241":1}}],["вертикальные",{"2":{"143":1,"167":1}}],["вертикального",{"2":{"172":1}}],["вертикальной",{"2":{"172":1,"241":1}}],["верхняя",{"2":{"530":1}}],["верхний",{"2":{"497":1}}],["верхнее",{"2":{"172":1}}],["верхней",{"2":{"143":1,"161":1,"164":1,"165":1,"172":1,"173":1}}],["верхнем",{"2":{"141":2,"169":1,"173":1,"263":2}}],["верхнего",{"2":{"111":1,"125":3,"137":1,"207":1,"229":1,"240":1,"368":1,"369":1}}],["верха",{"2":{"174":1,"215":1,"371":1}}],["вернулся",{"2":{"459":1}}],["вернуть",{"2":{"195":1,"308":1,"309":1,"326":1,"389":1}}],["вернуться",{"2":{"66":1,"165":1,"261":2,"369":1,"430":2}}],["верно",{"2":{"222":1}}],["верное",{"2":{"191":1}}],["вернемся",{"2":{"246":2,"303":1}}],["вернетесь",{"2":{"276":1}}],["вернет",{"2":{"108":1,"247":1,"347":1,"425":1}}],["вернее",{"2":{"25":1}}],["вебприложения",{"2":{"495":1,"496":1}}],["вебприложение",{"2":{"492":1}}],["веба",{"2":{"459":1}}],["вебсайта",{"2":{"408":1,"484":1,"495":1,"496":1}}],["вебсайт",{"2":{"408":1,"494":1}}],["вебсайты",{"2":{"22":1}}],["вебсервер",{"2":{"407":1,"444":1,"461":1}}],["вебсервере",{"2":{"407":1}}],["вебсервера",{"2":{"108":1,"444":1}}],["веб",{"0":{"124":1,"128":1,"135":1,"192":1,"251":1,"320":1,"398":1,"490":1},"1":{"125":1,"129":1,"130":1,"131":1,"132":1,"133":1,"193":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"321":1,"322":1,"323":1},"2":{"3":1,"11":2,"108":2,"122":5,"124":2,"125":3,"126":3,"127":2,"128":10,"129":1,"130":1,"134":1,"135":5,"136":1,"137":4,"138":2,"140":1,"141":1,"157":1,"159":1,"161":1,"162":1,"165":1,"169":1,"188":1,"190":4,"191":2,"192":2,"193":2,"194":1,"197":1,"200":1,"212":2,"213":2,"214":1,"215":5,"216":1,"218":3,"223":2,"226":3,"228":1,"247":1,"251":3,"253":13,"258":1,"259":1,"260":1,"262":3,"263":1,"264":1,"265":2,"269":2,"271":1,"273":1,"274":2,"275":2,"282":1,"300":1,"306":3,"312":3,"314":5,"319":1,"323":1,"327":2,"331":1,"333":2,"334":1,"335":1,"349":1,"350":2,"359":1,"360":3,"366":8,"371":1,"378":1,"381":2,"387":1,"389":2,"390":2,"396":1,"397":1,"409":1,"428":1,"429":1,"439":1,"440":1,"444":1,"450":1,"452":1,"461":3,"492":1,"494":1,"495":1,"496":2}}],["вдохновения",{"2":{"23":1}}],["вводе",{"2":{"451":1}}],["вводя",{"2":{"426":1}}],["вводом",{"2":{"237":1}}],["вводились",{"2":{"451":1}}],["вводился",{"2":{"339":1}}],["вводим",{"2":{"366":1}}],["вводимых",{"2":{"222":1}}],["вводит",{"2":{"201":1,"387":1}}],["вводить",{"2":{"2":1,"152":1,"218":1,"220":1,"453":1}}],["ввод",{"2":{"222":1,"230":2,"426":1}}],["вводы",{"2":{"154":1}}],["ввода",{"0":{"152":1,"237":1},"1":{"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1},"2":{"152":1,"154":1,"201":1,"220":2,"222":7,"223":1,"232":1,"237":3,"242":1,"247":1,"353":1,"369":1,"387":6,"489":1}}],["вверх",{"2":{"238":1,"290":1,"337":1,"339":1}}],["вверху",{"2":{"157":1}}],["ввели",{"2":{"214":2,"232":1,"391":1,"426":1}}],["введи",{"2":{"452":1}}],["введите",{"2":{"214":5,"420":1,"483":1}}],["введём",{"2":{"438":1}}],["введет",{"2":{"387":1}}],["введем",{"2":{"192":1,"331":1}}],["введенный",{"2":{"448":1}}],["введенных",{"2":{"351":1}}],["введенная",{"2":{"145":1}}],["введен",{"2":{"275":1}}],["введении",{"2":{"417":1}}],["введением",{"2":{"415":1}}],["введение",{"0":{"314":1},"1":{"315":1,"316":1,"317":1},"2":{"272":1,"439":1}}],["введения",{"2":{"125":1,"149":1}}],["ввести",{"2":{"16":1,"152":1,"214":1,"220":1,"387":1,"420":1}}],["ввиду",{"2":{"4":1}}],["валидаций",{"2":{"421":1}}],["валидацией",{"2":{"389":1}}],["валидация",{"2":{"301":1,"387":2,"449":1}}],["валиден",{"2":{"106":1}}],["ванильному",{"2":{"195":1}}],["важен",{"2":{"150":1,"215":1,"272":1,"275":1,"276":1,"295":1,"311":1}}],["важнейших",{"2":{"418":1}}],["важнее",{"2":{"170":1,"366":1}}],["важна",{"2":{"140":1}}],["важная",{"2":{"40":1,"121":1,"326":1,"390":1}}],["важный",{"2":{"246":1,"269":1,"283":1,"309":1,"335":1,"378":1}}],["важны",{"2":{"159":1,"211":1,"450":1}}],["важные",{"2":{"136":1,"188":1,"191":1,"310":1,"312":1,"380":1,"393":1,"415":1,"441":1,"458":1}}],["важными",{"2":{"136":1,"147":1,"188":1,"382":1}}],["важных",{"2":{"68":1,"192":1,"215":1,"283":1,"307":1,"333":1,"377":1}}],["важной",{"2":{"161":1,"174":1,"214":1,"430":1,"436":1}}],["важного",{"2":{"157":1}}],["важное",{"2":{"153":1,"246":1}}],["важность",{"2":{"144":1}}],["важно",{"2":{"135":1,"143":2,"162":1,"164":1,"168":1,"174":1,"193":1,"194":1,"195":1,"198":1,"209":2,"222":1,"241":1,"253":1,"260":1,"273":1,"276":1,"297":1,"300":1,"307":1,"311":1,"326":1,"332":1,"366":1,"382":1,"383":1,"430":1,"439":1,"442":1}}],["варьироваться",{"2":{"185":1}}],["варьируются",{"2":{"125":1}}],["вариаций",{"2":{"297":1}}],["вариациями",{"2":{"277":1}}],["вариации",{"2":{"154":1}}],["вариантом",{"2":{"134":1,"165":1,"169":1,"225":1,"381":1}}],["вариантов",{"2":{"106":1,"128":2,"134":2,"148":2,"152":1,"153":1,"165":1,"166":1,"167":1,"169":1,"191":1,"192":1,"213":1,"219":1,"443":1,"496":2,"532":1,"533":2}}],["варианту",{"2":{"99":1}}],["варианте",{"2":{"93":1,"221":1,"361":1}}],["вариантам",{"2":{"404":1}}],["вариантами",{"2":{"214":1,"218":1,"351":1}}],["вариантах",{"2":{"136":1,"153":1,"164":1,"386":1}}],["варианта",{"2":{"58":1,"99":1,"114":1,"135":2,"226":1,"460":1,"496":2}}],["варианты",{"0":{"107":1,"195":1},"2":{"16":1,"106":1,"110":1,"128":1,"137":1,"163":1,"182":1,"190":1,"260":1,"301":1,"324":1,"344":1,"350":1,"407":1,"426":1,"533":1}}],["вариант",{"2":{"4":2,"17":1,"109":1,"153":2,"181":2,"182":1,"191":2,"213":2,"214":1,"215":1,"234":1,"260":1,"287":1,"318":1,"371":1,"448":1,"460":1}}],["вами",{"2":{"214":2,"222":1}}],["вам",{"2":{"110":2,"114":1,"116":3,"122":1,"126":1,"136":1,"141":1,"145":1,"175":1,"188":1,"189":1,"191":4,"192":1,"194":1,"195":2,"204":1,"211":2,"213":1,"214":1,"240":1,"247":2,"252":1,"266":3,"273":2,"276":2,"301":4,"310":2,"324":1,"336":1,"339":1,"350":1,"358":3,"363":2,"364":1,"407":1,"411":1,"412":1,"432":1,"433":1,"435":1,"443":1,"453":1,"459":1,"460":1,"461":1}}],["вас",{"2":{"110":1,"149":1,"173":1,"194":1,"211":1,"242":1,"244":1,"273":1,"276":1,"309":1,"328":1,"420":1,"421":1,"434":2,"439":1,"448":1,"449":1,"516":2}}],["васи",{"2":{"106":1}}],["вася",{"2":{"106":1}}],["ваши",{"2":{"368":1,"449":1}}],["ваших",{"2":{"145":1,"324":1}}],["ваша",{"2":{"209":1}}],["ваше",{"2":{"191":1,"276":1,"314":1,"358":1,"412":1,"453":1,"483":1,"517":1}}],["вашей",{"2":{"125":1,"191":1,"214":1,"287":1,"293":1,"342":1,"436":1}}],["вашего",{"2":{"108":1,"110":2,"115":1,"125":2,"191":1,"203":1,"214":2,"215":1,"216":1,"261":1,"277":1,"281":1,"310":1,"314":1,"335":2,"350":1,"407":1,"408":2,"410":1,"411":1,"453":2,"455":1,"461":1,"515":1,"516":1,"542":1,"544":2}}],["вашему",{"2":{"105":1,"214":1,"334":1,"389":1,"407":2,"449":1}}],["вашем",{"2":{"105":1,"277":1,"360":1,"412":1,"439":1,"461":1}}],["вашу",{"2":{"105":1,"191":1,"432":1,"433":1}}],["ваш",{"2":{"4":1,"107":1,"125":1,"191":1,"192":1,"209":1,"215":1,"216":1,"408":2,"412":1,"435":1,"448":1,"458":1,"460":1,"461":2,"515":1}}],["всплывающем",{"2":{"167":1,"184":1}}],["всплывающего",{"2":{"167":2}}],["всплывающей",{"2":{"155":2}}],["всплывающее",{"2":{"155":1}}],["всплывающая",{"2":{"155":1}}],["вспомним",{"2":{"307":1}}],["вспомнить",{"2":{"216":1}}],["вспомните",{"2":{"140":1,"388":1}}],["вспоминать",{"2":{"287":1}}],["вспомогательный",{"2":{"343":1}}],["вспомогательные",{"2":{"4":1,"302":1}}],["вспомогательная",{"2":{"222":1,"230":1,"247":2}}],["вскоре",{"2":{"145":1,"190":1,"214":1,"314":1,"367":1}}],["всю",{"2":{"134":1,"164":1,"185":1,"218":1,"222":1,"226":1,"246":1,"277":1,"314":1,"382":1,"389":1,"418":1,"420":1}}],["встающих",{"2":{"495":1}}],["вставке",{"2":{"203":1}}],["вставать",{"2":{"4":1}}],["вступает",{"2":{"193":1}}],["встроенную",{"2":{"324":1}}],["встроенная",{"2":{"312":1}}],["встроенным",{"2":{"234":1}}],["встроенный",{"2":{"213":1,"301":1}}],["встроенные",{"0":{"203":1}}],["встроенных",{"0":{"196":1},"1":{"197":1,"198":1,"199":1,"200":1,"201":1,"202":1},"2":{"202":1,"203":1,"383":1}}],["встроенного",{"2":{"190":1}}],["встретит",{"2":{"420":1}}],["встретить",{"2":{"167":1,"186":1,"204":1,"209":1,"271":1,"345":1}}],["встречал",{"2":{"460":1}}],["встречали",{"2":{"375":1}}],["встречающихся",{"2":{"359":1}}],["встречающиеся",{"2":{"125":1,"277":1}}],["встречаются",{"2":{"266":1,"277":1,"278":1}}],["встречается",{"2":{"165":1,"178":1,"179":1,"212":1,"271":1,"306":1}}],["встречавшейся",{"2":{"139":1}}],["всячески",{"2":{"483":1}}],["всяких",{"2":{"461":1}}],["вся",{"2":{"105":1,"127":1,"135":1,"371":1,"388":1,"420":1,"459":1,"491":1,"536":1}}],["всевозможных",{"2":{"460":1}}],["всей",{"2":{"128":1,"185":1,"193":1,"214":1,"238":2,"293":1,"366":1,"383":1,"389":1,"423":1,"544":1}}],["всеми",{"2":{"215":1,"218":1,"222":1,"345":1,"349":1,"369":1,"383":1,"439":1,"461":3}}],["всемирная",{"2":{"190":1}}],["всем",{"2":{"68":1,"108":2,"128":1,"238":1,"261":1,"274":1,"283":1,"294":1,"343":1,"360":1,"448":1,"452":1}}],["всему",{"2":{"41":1,"97":1,"194":1,"215":1,"247":1,"267":1,"273":1,"344":1,"345":1,"349":1,"371":1,"409":1,"430":1,"449":2}}],["всех",{"2":{"38":1,"108":1,"110":2,"113":1,"143":1,"209":1,"222":2,"234":1,"236":1,"253":1,"261":1,"293":1,"306":1,"308":1,"314":2,"328":1,"332":1,"343":1,"350":1,"360":1,"383":1,"386":1,"388":1,"414":1,"420":1,"421":2,"431":1,"433":1,"442":2,"451":2,"461":1,"487":1,"491":1}}],["все",{"2":{"36":1,"47":1,"58":1,"86":1,"91":1,"96":1,"103":1,"106":1,"113":2,"116":1,"122":1,"124":1,"125":2,"126":1,"128":3,"135":2,"141":2,"143":1,"145":1,"147":1,"149":1,"158":1,"162":1,"169":1,"174":1,"176":1,"188":1,"190":3,"191":1,"192":1,"193":1,"194":2,"195":5,"198":1,"202":1,"203":1,"204":1,"209":2,"210":1,"213":3,"218":4,"220":1,"222":6,"223":3,"235":3,"237":1,"247":1,"248":1,"253":3,"255":2,"256":1,"260":2,"261":1,"263":1,"271":1,"275":1,"283":1,"293":1,"295":2,"303":1,"309":1,"314":3,"318":1,"323":1,"324":1,"326":1,"337":2,"338":1,"342":1,"345":1,"349":1,"350":4,"352":1,"354":1,"358":1,"366":2,"371":1,"377":1,"382":4,"389":4,"390":1,"409":1,"417":1,"418":1,"420":1,"421":2,"422":1,"423":1,"424":1,"426":1,"435":4,"437":1,"438":1,"439":1,"441":2,"448":1,"449":2,"451":1,"459":1,"460":1,"461":1,"501":1,"518":1,"531":1,"545":1}}],["всего",{"2":{"29":1,"34":1,"78":1,"106":1,"107":1,"112":1,"125":1,"127":1,"128":1,"140":1,"150":2,"151":1,"158":1,"178":1,"197":1,"222":1,"229":1,"246":1,"247":1,"253":1,"266":1,"273":2,"274":2,"276":2,"278":1,"313":1,"314":2,"321":1,"328":1,"348":1,"380":1,"382":1,"419":1,"421":1,"448":2,"449":1,"460":1,"524":2}}],["всегда",{"0":{"113":1},"2":{"25":1,"113":1,"135":1,"172":2,"191":2,"194":1,"205":1,"209":1,"218":1,"221":1,"253":1,"286":1,"321":1,"326":1,"328":1,"353":1,"387":1,"410":2,"412":1,"449":1,"453":1,"506":1}}],["всём",{"2":{"449":1}}],["всё",{"2":{"2":1,"35":1,"40":1,"50":1,"58":1,"86":1,"108":1,"136":1,"350":1,"444":1,"451":2,"452":1,"460":1,"461":1,"484":1,"491":1}}],["выезжает",{"2":{"534":1,"536":1}}],["выезжающий",{"2":{"33":1}}],["выучить",{"2":{"460":1}}],["выложить",{"2":{"439":1}}],["вылиться",{"2":{"44":1}}],["выясним",{"2":{"322":1}}],["выявлении",{"2":{"461":1}}],["выявления",{"2":{"415":1,"417":1}}],["выявление",{"0":{"232":1}}],["выявить",{"2":{"229":1,"231":1,"269":1}}],["выигрывает",{"2":{"269":1}}],["выигрыш",{"2":{"191":1,"327":1,"333":1}}],["вычисление",{"2":{"421":1,"422":1}}],["вычислений",{"2":{"366":1}}],["вычисления",{"2":{"307":1,"308":1,"419":1,"451":1,"452":1}}],["вычислять",{"2":{"307":1}}],["вычисляем",{"2":{"302":1}}],["вычисляемыми",{"2":{"344":1,"346":1}}],["вычисляемых",{"2":{"222":2,"247":1,"346":1}}],["вычисляемые",{"2":{"195":1,"222":1,"223":1,"345":2,"347":2}}],["вычисляемое",{"2":{"222":1}}],["вычислительных",{"2":{"314":1}}],["вычислительные",{"2":{"251":1}}],["вычислительноемкие",{"2":{"318":1}}],["вычислительной",{"2":{"307":1,"312":1,"323":1,"366":1}}],["вычислительном",{"2":{"199":1}}],["вычислительная",{"2":{"128":1,"389":1}}],["вытекает",{"2":{"301":1}}],["вытеснены",{"2":{"190":1}}],["выталкивая",{"2":{"162":1}}],["вытащить",{"2":{"58":1}}],["выгоде",{"2":{"461":1}}],["выгодно",{"2":{"427":1}}],["выгодные",{"2":{"182":1}}],["выгоды",{"2":{"253":1}}],["выглядело",{"2":{"328":1}}],["выглядел",{"2":{"246":1,"290":1,"424":1}}],["выглядела",{"2":{"219":1,"420":1}}],["выглядеть",{"2":{"14":1,"105":1,"161":2,"217":1,"220":1,"221":1,"229":2,"240":1,"263":1,"291":1,"293":1,"294":1,"303":1,"315":1,"324":1,"329":1,"340":1,"341":1,"345":1,"369":1,"371":1,"375":1,"377":1,"382":1,"387":1,"428":1,"436":1}}],["выглядящий",{"2":{"214":1}}],["выглядят",{"2":{"22":1,"125":2,"148":1,"445":1,"449":1,"499":1}}],["выглядит",{"2":{"88":1,"93":1,"99":1,"112":1,"195":1,"200":1,"246":1,"260":1,"308":1,"353":1,"389":1,"428":1,"429":1,"438":1,"449":1,"461":2}}],["выключен",{"2":{"153":1}}],["выключено",{"2":{"153":2}}],["выключенное",{"2":{"153":1}}],["выходе",{"2":{"492":1}}],["выходов",{"2":{"417":1}}],["выходом",{"2":{"153":1,"421":1}}],["выходных",{"2":{"417":1}}],["выходные",{"2":{"301":1,"431":1}}],["выходным",{"2":{"115":1}}],["выходят",{"2":{"273":1,"276":1}}],["выходящие",{"2":{"190":1}}],["выход",{"2":{"230":1}}],["выходы",{"2":{"195":1,"304":1,"418":1}}],["выходить",{"2":{"228":1,"231":1,"271":1}}],["выходит",{"2":{"172":1,"216":1,"228":1,"262":1,"271":1,"274":1,"382":1,"386":1,"389":2,"439":2}}],["выхода",{"2":{"169":1}}],["выровнены",{"2":{"144":1}}],["выраженных",{"2":{"383":1}}],["выражения",{"2":{"242":2}}],["выражение",{"2":{"202":1}}],["выражением",{"2":{"199":1}}],["выражаю",{"2":{"363":1}}],["вырастает",{"2":{"350":1}}],["выработайте",{"2":{"195":1}}],["выработаете",{"2":{"138":1}}],["выработки",{"2":{"191":1}}],["выравнивания",{"2":{"144":2}}],["выравниванию",{"2":{"144":1,"145":1}}],["выравнивание",{"2":{"144":2,"145":1}}],["выравниванием",{"0":{"144":1},"2":{"144":1}}],["выведет",{"2":{"308":1}}],["выведена",{"2":{"308":1}}],["выведено",{"2":{"308":3,"309":1}}],["выведены",{"2":{"146":1}}],["выведенных",{"2":{"108":1}}],["вывести",{"2":{"203":1,"251":1,"415":1}}],["выводимый",{"2":{"425":1}}],["выводим",{"2":{"247":1,"302":1}}],["выводится",{"2":{"240":1,"302":1}}],["выводит",{"2":{"173":1,"308":1,"309":1}}],["выводе",{"2":{"242":1,"374":1}}],["вывода",{"2":{"203":1,"308":1}}],["вывод",{"0":{"36":1,"84":1},"2":{"230":1,"418":1,"426":2,"444":1,"461":1}}],["выдать",{"2":{"426":1}}],["выдан",{"2":{"428":1}}],["выдана",{"2":{"389":1}}],["выданный",{"2":{"384":1}}],["выдаст",{"2":{"325":1}}],["выдавать",{"2":{"292":1,"421":1,"422":1}}],["выдает",{"2":{"237":1,"297":2,"421":1}}],["выдачи",{"2":{"4":1}}],["выделяет",{"2":{"451":1}}],["выделять",{"2":{"324":1}}],["выделяют",{"2":{"303":1}}],["выделяются",{"2":{"146":1}}],["выделена",{"2":{"421":1}}],["выделенная",{"2":{"389":1}}],["выделенные",{"2":{"222":1,"347":1}}],["выделенный",{"2":{"177":1,"314":1}}],["выделениями",{"2":{"377":1}}],["выделение",{"2":{"155":1}}],["выделении",{"2":{"154":1,"155":1}}],["выделить",{"2":{"105":1,"409":1}}],["выделим",{"2":{"89":1}}],["выдвигающемся",{"2":{"90":1}}],["вышедшая",{"2":{"460":1}}],["вышеперечисленных",{"2":{"386":1}}],["вышеперечисленные",{"2":{"350":2}}],["вышеизложенными",{"2":{"222":1}}],["вышеуказанного",{"2":{"525":1}}],["вышеуказанной",{"2":{"516":1}}],["вышеуказанных",{"2":{"97":1}}],["вышеупомянутой",{"2":{"255":1}}],["вышеупомянутого",{"2":{"236":1}}],["вышеупомянутые",{"2":{"232":1}}],["вышеупомянутымипротоколами",{"2":{"134":1}}],["выше",{"2":{"78":1,"183":1,"263":1,"325":1,"349":1,"384":1,"461":1}}],["выйти",{"2":{"62":1}}],["выпуске",{"2":{"543":1}}],["выпуска",{"2":{"440":1}}],["выпущенного",{"2":{"440":1}}],["выписан",{"2":{"106":2}}],["выпадающих",{"2":{"170":1}}],["выпадающие",{"0":{"170":1},"2":{"170":1}}],["выпадающим",{"2":{"89":1}}],["выпадающее",{"2":{"161":1}}],["выпало",{"2":{"23":1}}],["выполним",{"2":{"217":1,"308":1}}],["выполнить",{"2":{"235":1,"246":1,"254":1,"293":1,"302":1,"307":1,"309":1,"323":1,"327":1,"336":1,"349":1,"368":1,"383":1,"419":2,"428":1,"452":1}}],["выполните",{"2":{"214":1,"263":1,"331":1,"368":1,"424":1,"433":1,"434":2,"435":3,"438":3}}],["выполнит",{"2":{"193":2}}],["выполнив",{"2":{"127":1,"222":1,"305":1,"428":1}}],["выполнено",{"2":{"223":1}}],["выполненные",{"2":{"220":1}}],["выполненных",{"2":{"220":1,"222":3,"421":1}}],["выполнена",{"2":{"154":1,"202":1,"220":1,"222":2,"307":1}}],["выполнение",{"2":{"299":1,"300":1,"307":1,"308":2,"309":2,"314":1,"318":1,"319":1,"326":1,"386":1,"417":1,"421":2,"422":3}}],["выполнением",{"2":{"149":1,"159":1,"193":1}}],["выполнении",{"2":{"253":1,"309":1,"324":1,"389":1,"425":1,"428":1}}],["выполнению",{"2":{"227":1}}],["выполнения",{"2":{"68":1,"135":1,"149":1,"157":1,"159":6,"192":1,"193":3,"202":1,"203":1,"213":1,"226":1,"232":1,"235":1,"240":1,"242":1,"247":1,"253":1,"260":1,"277":1,"299":2,"300":1,"303":2,"304":1,"308":1,"309":1,"314":4,"319":1,"324":1,"330":1,"333":1,"374":1,"384":1,"389":1,"408":1,"415":1,"418":2,"420":2,"421":1,"425":1,"428":1,"432":1,"435":2,"439":2,"441":1,"448":1}}],["выполняют",{"2":{"389":1,"418":1,"449":1,"451":1,"460":1}}],["выполняются",{"2":{"192":1,"307":2,"350":1,"417":1,"423":1,"425":1}}],["выполняющих",{"2":{"418":1}}],["выполняющимся",{"2":{"350":1}}],["выполняющиеся",{"2":{"314":1}}],["выполняющий",{"2":{"271":2,"274":1}}],["выполняемых",{"2":{"417":1}}],["выполняемой",{"2":{"314":1}}],["выполняемая",{"2":{"143":1}}],["выполняем",{"2":{"128":1,"298":1,"302":1,"322":1,"349":1,"421":1}}],["выполняется",{"2":{"107":1,"113":1,"159":1,"195":2,"200":1,"219":1,"235":1,"261":1,"309":1,"374":1,"382":1}}],["выполняет",{"2":{"68":1,"241":1,"297":1,"300":1,"303":2,"314":1,"322":1,"327":1,"337":1,"382":1,"421":1,"461":1}}],["выполняться",{"2":{"314":2,"324":1,"327":1,"423":1,"427":1}}],["выполнять",{"2":{"58":1,"67":1,"131":1,"149":1,"199":1,"213":1,"243":1,"246":2,"271":1,"299":2,"308":2,"314":2,"318":1,"327":2,"337":1,"437":1,"496":1}}],["выносить",{"2":{"297":1}}],["выносятся",{"2":{"41":1}}],["вынужден",{"2":{"181":1}}],["вынести",{"2":{"3":1,"99":1,"271":1}}],["высмеять",{"2":{"185":1}}],["высоту",{"2":{"164":1}}],["высоким",{"2":{"492":1}}],["высокий",{"2":{"76":1,"142":2}}],["высокая",{"2":{"366":1,"492":1}}],["высокой",{"2":{"190":1,"312":1}}],["высокого",{"2":{"64":1,"267":1,"418":1}}],["высокоуровневыми",{"2":{"39":1}}],["выступать",{"2":{"283":1,"352":1}}],["выступает",{"2":{"240":1,"318":1}}],["выстроить",{"2":{"294":1,"309":1}}],["выстроив",{"2":{"150":1}}],["выстраиваем",{"2":{"309":1}}],["выстраиваемой",{"2":{"40":1}}],["выстраивать",{"2":{"308":1}}],["выстраивания",{"2":{"142":1}}],["выставочную",{"2":{"61":1}}],["вызван",{"2":{"303":1}}],["вызвало",{"2":{"195":1}}],["вызвать",{"2":{"34":1,"107":1,"158":1,"186":2,"260":1,"302":1}}],["вызывая",{"2":{"247":1}}],["вызываем",{"2":{"192":1,"300":3,"374":1,"426":1}}],["вызывается",{"2":{"342":1}}],["вызывает",{"2":{"3":1,"149":1,"184":1,"202":1,"231":1}}],["вызывающих",{"2":{"247":1}}],["вызывающим",{"2":{"164":1}}],["вызывающего",{"2":{"161":1}}],["вызываются",{"2":{"273":1}}],["вызывают",{"2":{"138":1,"436":1}}],["вызывать",{"2":{"143":1,"159":1,"219":1,"228":1,"230":1,"231":1,"287":1,"320":1,"371":1,"439":1}}],["вызываться",{"2":{"107":1}}],["вызову",{"2":{"309":2}}],["вызове",{"2":{"308":1,"328":1}}],["вызовет",{"2":{"109":1,"162":1,"222":2,"377":1,"385":1}}],["вызовом",{"2":{"291":1,"309":1}}],["вызовов",{"2":{"105":1,"261":1,"294":1,"308":1,"309":1,"327":1,"328":1,"418":1}}],["вызовами",{"2":{"309":1,"327":1}}],["вызовах",{"2":{"287":1}}],["вызова",{"2":{"236":1,"303":2,"307":5,"308":2,"309":4,"316":1,"332":1}}],["вызов",{"0":{"307":1},"1":{"308":1},"2":{"41":1,"192":1,"301":1,"303":1,"307":3,"309":3,"327":2,"352":1,"382":1,"499":1}}],["вызовы",{"2":{"41":1,"261":1,"266":1,"283":1,"303":1,"304":1,"309":1,"318":1,"327":1,"332":2,"366":1,"423":1,"499":1,"500":1}}],["вы",{"2":{"26":2,"67":1,"114":2,"116":2,"125":2,"134":2,"138":2,"143":3,"145":3,"149":2,"153":1,"166":1,"172":4,"175":1,"177":1,"189":2,"190":1,"191":7,"192":1,"193":2,"194":4,"195":3,"204":1,"209":3,"211":3,"213":1,"214":9,"215":5,"216":2,"218":1,"222":1,"225":1,"238":1,"250":1,"251":1,"253":3,"259":2,"266":1,"269":1,"271":2,"272":1,"273":5,"274":2,"276":5,"277":1,"286":1,"292":1,"293":3,"301":3,"303":1,"306":3,"308":1,"311":2,"312":1,"314":7,"317":1,"323":1,"325":1,"335":2,"336":2,"350":1,"353":1,"355":1,"358":1,"359":1,"360":1,"364":1,"368":2,"369":1,"374":1,"375":1,"377":2,"381":1,"388":1,"395":1,"407":2,"410":3,"411":1,"412":1,"414":1,"421":5,"431":1,"432":1,"434":1,"435":4,"436":2,"437":1,"438":2,"439":2,"440":1,"442":1,"443":1,"449":4,"454":1,"456":1,"460":1,"483":1}}],["выброшенной",{"2":{"422":1}}],["выбрасывать",{"2":{"421":1}}],["выбрасывает",{"2":{"309":1}}],["выбрасываем",{"2":{"293":1}}],["выбрав",{"2":{"420":1}}],["выбрано",{"2":{"253":1}}],["выбранная",{"2":{"545":1}}],["выбранными",{"2":{"489":1}}],["выбранных",{"2":{"214":1}}],["выбранные",{"2":{"182":1}}],["выбранного",{"2":{"134":1,"330":1,"371":1,"389":1}}],["выбранному",{"2":{"125":1}}],["выбранной",{"2":{"11":1,"31":1}}],["выбрали",{"2":{"368":1}}],["выбрал",{"2":{"178":1}}],["выбрать",{"2":{"125":1,"153":2,"181":1,"182":1,"214":1,"329":1,"330":1,"349":1,"375":1,"420":1,"444":1,"489":1,"505":1,"537":1}}],["выбирает",{"2":{"192":1}}],["выбираешь",{"2":{"81":1}}],["выбирая",{"2":{"191":2}}],["выбирать",{"2":{"181":1}}],["выберите",{"2":{"135":2,"214":3,"263":2,"432":1,"515":2}}],["выбором",{"2":{"261":1}}],["выбору",{"2":{"114":1,"214":1,"408":1}}],["выбор",{"0":{"37":1,"39":1},"1":{"38":1,"39":1,"40":1,"41":1},"2":{"39":1,"68":1,"128":1,"148":1,"152":1,"295":1,"330":1,"499":1}}],["выборе",{"2":{"23":1,"39":1,"155":2,"168":1,"183":1,"213":1,"369":1,"375":3,"460":1}}],["выборка",{"2":{"13":1,"375":1}}],["выбора",{"2":{"4":1,"154":1,"167":1,"169":1,"170":2,"494":1,"496":1}}],["визитку",{"2":{"495":1}}],["визитной",{"2":{"394":1}}],["визуализацию",{"2":{"449":1,"451":1}}],["визуализация",{"2":{"388":1}}],["визуализации",{"2":{"154":1,"459":1}}],["визуальные",{"2":{"439":1}}],["визуальный",{"2":{"140":1,"304":1}}],["визуальным",{"2":{"140":1}}],["визуальных",{"2":{"140":1,"141":1,"142":1,"143":2,"451":1}}],["визуальной",{"2":{"484":1}}],["визуальное",{"2":{"304":1,"387":1}}],["визуально",{"2":{"11":1,"169":1,"238":1,"340":1}}],["визуального",{"2":{"3":1,"25":1,"140":1,"143":1,"250":1,"396":1}}],["википедии",{"2":{"147":1,"148":1,"149":1,"275":1}}],["виртуальных",{"2":{"129":1}}],["виртуальный",{"2":{"107":1,"407":1,"460":1}}],["виртуального",{"2":{"131":1}}],["виртуальном",{"2":{"128":1,"137":1}}],["виртуальное",{"2":{"48":1}}],["виртуальная",{"2":{"128":1}}],["витрины",{"2":{"39":1,"75":1,"496":1}}],["витрину",{"2":{"23":1,"61":1,"62":1}}],["витрина",{"0":{"11":1},"2":{"9":1,"12":1,"58":1,"60":1,"78":1,"533":1}}],["видов",{"2":{"505":1,"537":1}}],["виды",{"2":{"417":1,"418":1}}],["видны",{"2":{"388":1}}],["видно",{"2":{"106":1,"159":1,"172":1,"177":1,"295":1,"297":1,"305":1,"308":1,"314":1,"340":1,"343":1,"369":1,"375":1,"388":1}}],["видимые",{"2":{"314":1}}],["видимое",{"2":{"314":1}}],["видимости",{"2":{"261":2,"373":1,"389":1}}],["видимостью",{"2":{"246":1}}],["видимость",{"2":{"230":1}}],["видимой",{"2":{"174":1,"414":1}}],["видим",{"2":{"174":1,"219":1,"237":1,"259":1,"261":1,"277":1,"302":1,"327":1,"376":1,"430":1}}],["видит",{"2":{"106":1}}],["видите",{"2":{"26":1,"169":1,"235":1,"236":1,"238":1,"240":1,"246":1,"258":1,"260":1,"274":1,"290":1,"295":1,"301":1,"306":1,"308":1,"309":1,"366":1,"374":1,"382":1,"383":1,"386":1}}],["виджеты",{"2":{"152":1}}],["виджетов",{"2":{"26":1,"449":1}}],["виду",{"2":{"142":1,"145":1,"169":1,"172":1,"198":1,"277":1,"381":1,"382":1}}],["видели",{"2":{"145":1,"202":1,"239":1,"306":2,"319":1,"337":1,"339":1}}],["виден",{"2":{"144":1,"222":1,"534":1}}],["видение",{"2":{"67":1}}],["видеть",{"2":{"141":1,"172":1,"292":1}}],["видеоролики",{"2":{"363":1}}],["видеоигры",{"2":{"164":1}}],["видео",{"2":{"139":1,"169":1,"213":1,"227":1,"252":1,"313":1,"336":1,"365":1,"412":1,"416":1,"460":4,"461":1}}],["виде",{"2":{"17":1,"60":1,"96":1,"107":2,"155":1,"168":1,"173":1,"174":1,"190":1,"191":2,"194":1,"214":1,"232":1,"236":2,"238":1,"243":1,"247":1,"272":1,"277":1,"288":1,"302":1,"318":1,"325":1,"326":2,"330":1,"332":2,"337":1,"346":1,"366":1,"369":1,"381":1,"382":1,"424":1,"428":2,"448":1}}],["вид",{"2":{"5":1,"18":1,"190":1,"217":1,"253":1,"269":1,"304":1,"314":1,"340":1,"373":1,"388":1}}],["вида",{"2":{"3":1,"4":1,"190":1,"216":1,"303":1,"418":1,"419":1,"423":1}}],["воды",{"2":{"460":1}}],["водителем",{"2":{"460":2}}],["вождению",{"2":{"460":1}}],["вождения",{"2":{"460":3}}],["вовлеченности",{"2":{"430":1}}],["вовсе",{"2":{"269":1}}],["военно",{"2":{"275":1}}],["военного",{"2":{"125":1}}],["воркер",{"2":{"484":1}}],["воркером",{"2":{"323":1}}],["воркеры",{"2":{"261":1}}],["воровство",{"2":{"26":1}}],["воровством",{"2":{"26":1}}],["воплотить",{"2":{"228":1}}],["вопросом",{"2":{"450":1}}],["вопросов",{"2":{"189":1,"215":1,"331":1,"383":1,"460":1,"485":1}}],["вопросительный",{"2":{"436":1}}],["вопроса",{"2":{"232":1,"418":1}}],["вопросах",{"2":{"216":1,"364":1,"485":1}}],["вопросами",{"2":{"211":1}}],["вопросе",{"2":{"165":1,"460":1}}],["вопросу",{"2":{"125":1,"282":1}}],["вопрос",{"2":{"4":2,"177":1,"185":1,"191":2,"229":1,"230":1,"231":1,"232":1,"242":1,"417":1,"428":2,"460":1,"483":1}}],["вопросы",{"0":{"137":1,"177":1,"189":1,"211":1,"225":1,"250":1,"265":1,"311":1,"334":1,"355":1,"391":1,"442":1},"2":{"4":1,"63":1,"122":1,"141":1,"168":1,"211":1,"228":2,"250":1,"265":1,"355":1,"391":1,"485":1}}],["войдите",{"2":{"214":1}}],["волнуйтесь",{"2":{"193":1}}],["волшебству",{"2":{"306":1}}],["волшебства",{"2":{"191":1}}],["волшебство",{"2":{"162":1,"246":1}}],["восстановления",{"2":{"388":1,"389":1}}],["восстановлено",{"2":{"203":1}}],["воссоздающих",{"2":{"324":1}}],["восклицательных",{"2":{"305":1}}],["восемь",{"0":{"149":1},"2":{"149":1}}],["восьми",{"2":{"125":1}}],["воспользуйтесь",{"2":{"515":1}}],["воспользуемся",{"2":{"319":1}}],["воспользоваться",{"2":{"16":1,"211":1,"270":1,"383":1,"429":1,"444":1,"461":1}}],["воспринимается",{"2":{"340":1}}],["воспринимаются",{"2":{"253":1}}],["воспринимайте",{"2":{"191":1}}],["восприятия",{"2":{"309":1,"310":1,"314":1}}],["восприятие",{"2":{"140":1,"150":1,"544":1}}],["восприятии",{"2":{"67":1}}],["воспроизведенные",{"2":{"176":1}}],["вокруг",{"2":{"105":1,"426":1,"449":1}}],["вот",{"2":{"14":1,"16":1,"61":1,"108":1,"109":1,"111":1,"112":2,"114":2,"131":1,"145":1,"149":1,"153":1,"155":1,"157":1,"158":1,"159":2,"161":2,"165":1,"166":1,"167":2,"168":1,"172":1,"177":1,"178":1,"179":1,"185":1,"186":1,"194":1,"195":2,"200":1,"201":1,"213":1,"218":1,"222":1,"223":1,"235":1,"236":2,"240":1,"242":1,"246":1,"255":1,"278":1,"284":1,"287":1,"291":1,"294":1,"297":1,"299":1,"302":1,"303":1,"306":1,"309":2,"314":1,"320":1,"322":1,"349":1,"353":1,"374":1,"375":1,"380":1,"388":1,"389":1,"421":1,"444":1,"445":1,"449":2,"452":1,"460":1,"525":1,"527":1}}],["возлагает",{"2":{"417":1}}],["вознаграждения",{"2":{"389":1}}],["возникшая",{"2":{"426":1}}],["возникла",{"2":{"421":1}}],["возникли",{"2":{"61":1}}],["возникновения",{"2":{"421":1}}],["возникновении",{"2":{"149":1,"315":1,"422":1}}],["возникнет",{"2":{"421":1}}],["возникнуть",{"2":{"108":1,"155":1,"177":1,"242":1,"314":1,"495":1}}],["возникающими",{"2":{"380":1}}],["возникают",{"2":{"67":1}}],["возникает",{"2":{"143":1,"191":1,"237":1,"381":1,"417":1,"430":1}}],["воздействия",{"2":{"306":1}}],["возврата",{"2":{"299":1,"307":1,"309":2}}],["возврат",{"2":{"261":1}}],["возвращайтесь",{"2":{"460":1}}],["возвращают",{"2":{"418":1}}],["возвращающая",{"2":{"346":1,"448":1}}],["возвращающие",{"2":{"309":1}}],["возвращающей",{"2":{"113":1,"195":1,"236":1}}],["возвращающую",{"2":{"113":1,"235":2,"499":1}}],["возвращаемый",{"2":{"426":1}}],["возвращаемся",{"2":{"261":1}}],["возвращаем",{"2":{"241":1,"287":1,"294":2,"302":1,"309":1,"344":1,"352":2}}],["возвращаемое",{"2":{"201":1,"302":1}}],["возвращается",{"2":{"173":1,"380":1,"382":1,"412":1}}],["возвращает",{"2":{"106":2,"107":1,"114":2,"192":2,"195":1,"235":1,"236":1,"241":1,"246":1,"296":1,"299":1,"309":2,"321":1,"323":1,"326":1,"352":1,"374":1,"380":4,"381":1,"422":1}}],["возвращать",{"2":{"173":1,"245":1,"322":1,"366":1,"422":1}}],["возвращаться",{"2":{"161":1,"310":1}}],["возвращения",{"2":{"41":1}}],["возрасти",{"2":{"191":1}}],["возрастающей",{"2":{"172":1}}],["возьмет",{"2":{"134":1,"192":1}}],["возьмем",{"2":{"12":1,"191":1,"220":1,"229":1,"273":1,"288":1,"367":1,"419":1}}],["возможную",{"2":{"388":1}}],["возможна",{"2":{"234":1,"545":1}}],["возможны",{"2":{"236":1}}],["возможными",{"2":{"351":1}}],["возможным",{"2":{"172":1,"366":2,"449":1}}],["возможные",{"2":{"135":1}}],["возможных",{"2":{"133":1,"232":1,"238":1,"247":1,"314":1,"371":1,"417":1,"421":1}}],["возможное",{"2":{"387":1}}],["возможной",{"2":{"311":1}}],["возможного",{"2":{"135":1}}],["возможностях",{"2":{"418":1,"461":1}}],["возможностям",{"2":{"152":1,"350":1}}],["возможностями",{"2":{"122":2,"349":1,"439":1}}],["возможности",{"0":{"457":1},"2":{"153":1,"178":1,"190":3,"215":1,"223":2,"233":1,"236":1,"239":1,"240":1,"243":1,"248":1,"249":1,"260":1,"271":1,"314":1,"324":1,"350":1,"381":1,"389":1,"408":1,"418":1,"429":2,"431":1,"443":1,"448":1,"451":1,"496":2}}],["возможностей",{"0":{"114":1},"2":{"145":1,"190":1,"216":1,"288":1,"309":1,"377":1,"381":1,"418":1,"444":1,"445":1,"448":2,"461":1,"524":1}}],["возможностью",{"2":{"12":1,"107":1,"407":1,"414":1,"429":1,"494":1,"496":3,"531":1}}],["возможность",{"2":{"2":1,"11":2,"12":1,"17":1,"39":1,"64":1,"97":1,"99":1,"106":2,"107":3,"115":1,"125":2,"150":1,"158":1,"164":1,"167":1,"178":1,"191":1,"195":1,"216":2,"219":1,"232":1,"253":1,"260":1,"261":1,"267":1,"274":1,"332":1,"340":1,"351":1,"366":1,"368":1,"369":1,"383":1,"388":1,"411":1,"450":1,"451":1,"453":1,"496":2,"533":1}}],["возможно",{"2":{"40":1,"48":1,"58":1,"93":1,"98":1,"107":1,"172":1,"195":1,"211":1,"225":1,"238":1,"283":1,"306":1,"342":1,"375":1,"408":1,"409":1,"421":1,"428":1,"438":1,"449":1,"451":3,"489":1}}],["возможен",{"2":{"16":1}}],["во",{"0":{"449":1},"2":{"3":1,"17":1,"103":1,"106":2,"113":1,"138":1,"148":2,"157":1,"167":1,"170":1,"176":1,"178":1,"184":1,"192":3,"193":1,"195":1,"203":1,"209":1,"215":1,"217":1,"218":1,"221":1,"230":1,"235":2,"238":1,"240":2,"241":1,"266":1,"271":1,"274":1,"283":1,"293":1,"294":1,"301":1,"303":1,"304":1,"308":1,"309":1,"312":1,"314":1,"318":1,"371":2,"374":1,"377":1,"383":1,"387":1,"415":1,"417":2,"421":2,"435":1,"439":1,"442":1,"444":2,"448":5,"449":7,"450":1,"451":3,"459":1,"460":2,"461":1,"530":1}}],["вообще",{"2":{"3":1,"35":1,"99":1,"180":1,"261":1,"412":1,"414":1,"444":2,"461":1}}],["в",{"0":{"42":1,"115":1,"117":1,"118":1,"124":1,"178":1,"192":1,"196":1,"204":1,"233":1,"314":1,"324":1,"363":1,"392":1,"432":1,"433":1,"434":1,"483":1,"487":1,"503":1,"516":1,"528":1,"532":1,"533":1},"1":{"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"125":1,"193":1,"197":1,"198":1,"199":1,"200":1,"201":1,"202":1,"205":1,"206":1,"207":1,"208":1,"209":1,"234":1,"235":1,"236":1,"237":1,"238":1,"315":1,"316":1,"317":1,"325":1,"326":1,"327":1,"328":1,"329":1,"330":1,"393":1,"394":1,"395":1,"396":1,"397":1,"398":1,"399":1,"400":1,"401":1,"402":1,"403":1,"404":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,"20":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":3,"50":1,"57":1,"58":5,"60":1,"61":1,"63":3,"64":1,"67":4,"68":5,"69":2,"73":1,"75":2,"81":1,"82":1,"83":1,"86":11,"87":1,"88":3,"89":2,"90":2,"91":2,"93":2,"94":2,"96":7,"97":3,"98":5,"99":6,"100":1,"103":7,"105":5,"106":20,"107":9,"108":8,"109":1,"110":8,"111":5,"112":5,"113":7,"114":5,"115":7,"116":4,"117":5,"118":9,"119":3,"120":1,"122":4,"123":3,"124":2,"125":20,"126":11,"127":8,"128":9,"129":3,"130":2,"131":6,"132":8,"133":1,"134":5,"135":8,"136":5,"137":4,"138":5,"139":6,"140":7,"141":7,"142":5,"143":3,"144":1,"145":7,"146":3,"147":9,"148":5,"149":7,"150":3,"151":2,"152":4,"153":7,"154":8,"155":8,"156":6,"157":6,"158":4,"159":10,"160":1,"161":6,"162":14,"164":8,"165":7,"166":2,"167":5,"168":4,"169":6,"172":9,"173":5,"174":9,"176":2,"177":1,"178":7,"179":3,"180":5,"181":2,"182":2,"183":2,"184":1,"185":2,"186":1,"187":2,"188":3,"189":2,"190":13,"191":34,"192":13,"193":12,"194":13,"195":37,"196":4,"197":1,"198":1,"199":6,"200":4,"201":5,"202":6,"203":12,"204":3,"205":1,"206":1,"207":1,"208":1,"209":5,"210":2,"211":3,"212":8,"213":13,"214":27,"215":32,"216":26,"217":7,"218":17,"219":10,"220":13,"221":10,"222":40,"223":12,"224":3,"225":1,"226":9,"227":2,"228":1,"229":5,"230":5,"231":6,"232":6,"233":2,"234":7,"235":13,"236":14,"237":9,"238":16,"240":16,"241":14,"242":6,"243":4,"244":3,"245":1,"246":31,"247":23,"249":4,"250":2,"251":5,"252":3,"253":15,"254":1,"255":8,"256":5,"257":3,"258":2,"259":4,"260":20,"261":18,"262":11,"263":8,"264":6,"265":3,"266":4,"267":2,"268":4,"269":8,"270":3,"271":9,"272":6,"273":13,"274":17,"275":5,"276":6,"277":12,"278":4,"282":5,"283":2,"284":1,"285":4,"286":3,"287":6,"288":3,"289":2,"290":3,"291":1,"292":4,"293":10,"294":5,"295":9,"296":2,"297":4,"298":13,"299":5,"300":14,"301":6,"302":14,"303":21,"304":5,"305":5,"306":13,"307":7,"308":6,"309":20,"310":5,"311":1,"312":7,"313":2,"314":24,"315":5,"316":6,"317":4,"318":13,"319":2,"320":6,"321":14,"322":8,"323":4,"324":7,"325":11,"326":14,"327":17,"328":7,"329":1,"330":10,"331":1,"332":12,"333":3,"334":2,"335":5,"336":6,"337":4,"338":4,"339":7,"340":5,"341":1,"342":11,"343":6,"344":4,"345":7,"346":8,"347":7,"348":3,"349":12,"350":24,"351":8,"352":10,"353":6,"354":2,"355":3,"358":1,"360":4,"361":1,"363":2,"364":4,"365":1,"366":19,"367":2,"368":13,"369":5,"370":2,"371":22,"373":5,"374":28,"375":6,"376":7,"377":17,"378":1,"380":16,"381":11,"382":16,"383":22,"384":1,"385":6,"386":11,"387":18,"388":13,"389":19,"390":5,"391":4,"393":1,"394":1,"395":3,"397":1,"398":1,"399":2,"400":3,"401":2,"402":1,"403":1,"404":1,"405":2,"407":3,"408":15,"409":7,"410":3,"411":3,"412":15,"414":2,"415":10,"416":2,"417":13,"418":6,"419":10,"420":15,"421":18,"422":5,"423":5,"424":5,"425":13,"426":28,"427":13,"428":13,"429":4,"430":9,"431":8,"432":1,"433":6,"434":5,"435":11,"436":9,"437":2,"438":12,"439":9,"440":6,"441":5,"442":3,"443":14,"444":13,"445":2,"448":17,"449":39,"450":5,"451":16,"452":5,"453":2,"459":11,"460":11,"461":22,"470":1,"485":3,"486":1,"489":1,"490":1,"491":1,"492":7,"495":5,"496":1,"497":4,"499":4,"500":1,"501":1,"503":2,"504":1,"515":6,"516":2,"520":1,"521":1,"524":4,"525":1,"526":3,"527":3,"530":2,"533":1,"534":4,"536":4,"541":1,"542":2,"543":2,"544":2,"545":4}}],["рисованиями",{"2":{"314":1}}],["рисуйте",{"2":{"458":1}}],["рисует",{"2":{"296":1,"314":1}}],["рисунки",{"2":{"173":1}}],["рисунка",{"2":{"144":1,"172":2,"297":1}}],["рисунке",{"2":{"125":1,"147":1,"161":1,"162":1,"173":1,"247":1,"337":1,"369":1,"382":1}}],["рисунок",{"2":{"125":1,"135":1,"142":1,"143":1,"144":1,"145":1,"153":2,"154":1,"155":2,"157":1,"158":2,"159":2,"161":3,"166":1,"167":1,"168":1,"169":2,"172":1,"173":2,"174":1,"177":1,"178":1,"185":1,"186":1,"193":1,"214":2,"215":1,"217":1,"218":1,"220":1,"229":2,"230":1,"231":1,"238":1,"240":1,"245":1,"247":2,"259":1,"260":4,"261":1,"263":2,"269":1,"271":1,"297":2,"299":1,"301":1,"303":1,"306":1,"314":3,"318":1,"320":1,"323":1,"324":1,"329":1,"337":1,"340":1,"343":1,"345":1,"353":2,"369":2,"375":1,"377":1,"382":1,"383":1,"387":1,"388":1,"419":2,"428":3,"429":1,"432":1,"435":1,"436":2,"438":1}}],["риски",{"2":{"273":1}}],["рывка",{"2":{"191":1}}],["рынке",{"2":{"138":1}}],["рынка",{"0":{"21":1},"1":{"22":1,"23":1},"2":{"39":1,"116":1}}],["ряду",{"2":{"417":1,"421":1}}],["ряда",{"2":{"193":1,"303":1,"307":1}}],["рядами",{"2":{"93":1}}],["ряде",{"2":{"146":1}}],["ряд",{"2":{"135":1,"161":1,"167":1,"195":2,"235":1,"241":1,"253":1,"263":1,"349":1,"382":1,"422":1}}],["рядом",{"2":{"130":1,"145":1,"147":1,"167":1,"222":1,"253":2,"260":1,"273":1,"309":1,"335":1,"420":2,"427":1}}],["рядового",{"2":{"96":1}}],["родился",{"2":{"461":1}}],["родителей",{"2":{"376":2}}],["родителем",{"2":{"246":1}}],["родители",{"2":{"337":1}}],["родителю",{"2":{"236":1,"240":1,"339":1,"377":1}}],["родительским",{"2":{"240":1,"245":1,"314":1,"337":1}}],["родительскими",{"2":{"237":1}}],["родительские",{"2":{"238":1}}],["родительский",{"2":{"231":2,"238":1,"240":5,"247":1,"271":1,"294":1,"314":2,"318":1,"319":1,"326":1,"337":5,"353":1}}],["родительской",{"2":{"237":1,"338":1}}],["родительском",{"2":{"236":2,"238":3,"240":3,"318":1,"327":1,"376":1}}],["родительскому",{"2":{"195":1,"236":1,"240":1,"316":1,"322":1}}],["родительского",{"2":{"194":1,"195":1,"237":5,"246":1,"314":1,"315":2,"377":2}}],["родитель",{"2":{"230":1,"231":1,"237":2,"320":2,"339":1}}],["родителями",{"2":{"335":1}}],["родителя",{"2":{"230":1,"337":3,"339":1,"374":1}}],["родственными",{"2":{"355":1}}],["родного",{"2":{"317":1}}],["родное",{"2":{"157":1,"253":1}}],["родными",{"2":{"253":1,"264":1}}],["рода",{"2":{"167":1,"177":1,"302":1,"337":1}}],["робот",{"2":{"135":1}}],["ростом",{"2":{"431":1}}],["роста",{"2":{"195":1,"415":1,"455":1}}],["рост",{"2":{"121":1}}],["росте",{"2":{"88":1}}],["роли",{"2":{"352":1,"451":1}}],["ролям",{"2":{"106":1}}],["ролью",{"2":{"106":1}}],["роль",{"2":{"68":1,"140":1,"322":1,"449":1,"451":1,"460":1,"496":1}}],["роутами",{"2":{"411":1}}],["роутера",{"2":{"126":1,"367":1,"373":1}}],["роутере",{"0":{"118":1},"2":{"127":1}}],["роутер",{"0":{"367":1},"1":{"368":1,"369":1,"370":1,"371":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1},"2":{"110":1,"126":1,"368":1,"373":1}}],["роуты",{"2":{"88":1}}],["роутинг",{"2":{"7":1}}],["русском",{"2":{"460":2}}],["русский",{"0":{"357":1},"2":{"460":1}}],["рутинного",{"2":{"451":1}}],["рутовский",{"2":{"57":1}}],["рука",{"2":{"444":1}}],["руководящие",{"2":{"266":1}}],["руководствуясь",{"2":{"213":1}}],["руководству",{"2":{"191":1}}],["руководствами",{"2":{"138":1}}],["руководство",{"2":{"68":1,"72":1,"114":1,"138":1,"349":1,"404":1}}],["рублей",{"2":{"407":1}}],["ручная",{"2":{"261":1}}],["ручную",{"2":{"253":1}}],["ручном",{"2":{"408":1,"444":1}}],["ручной",{"2":{"261":1}}],["ручного",{"2":{"135":1,"442":1,"489":1}}],["ручное",{"2":{"71":1,"417":1}}],["рефы",{"2":{"449":2}}],["рефакторите",{"2":{"276":1}}],["рефакторить",{"2":{"23":1}}],["рефакторинга",{"2":{"417":1,"421":1,"430":1}}],["рефакторингуйте",{"2":{"417":1}}],["рефакторинг",{"0":{"91":1,"455":1},"2":{"249":1,"455":1}}],["ребенка",{"2":{"388":1}}],["ребенку",{"2":{"337":1}}],["ребенок",{"2":{"337":1,"338":1}}],["репликацию",{"2":{"324":1}}],["репозиторием",{"2":{"431":1,"439":6}}],["репозиториев",{"2":{"415":1,"431":1}}],["репозиториями",{"0":{"439":1},"2":{"441":1}}],["репозиториях",{"2":{"216":1}}],["репозитория",{"0":{"491":1},"2":{"134":1,"247":1,"252":1,"320":1,"374":1,"408":4,"431":1,"435":1,"439":1,"515":2,"516":1}}],["репозитории",{"2":{"63":1,"134":1,"139":1,"153":1,"222":1,"226":1,"246":1,"252":1,"260":1,"313":1,"336":1,"353":1,"374":1,"380":1,"405":1,"416":1,"419":1,"439":2,"440":1,"515":1}}],["репозиторий",{"0":{"79":1,"102":1},"2":{"60":1,"79":1,"91":1,"100":1,"102":1,"123":1,"348":1,"409":1,"431":1,"433":1,"435":2,"438":1,"439":5,"440":1,"444":1,"515":1}}],["рендер",{"2":{"240":1}}],["рендерится",{"2":{"239":1}}],["рендеринга",{"2":{"307":1,"314":4,"350":1,"371":1,"373":1}}],["рендеринг",{"2":{"240":1,"314":3,"380":1}}],["рендерингу",{"2":{"203":1}}],["рендеринге",{"2":{"197":1,"314":1}}],["реорганизация",{"2":{"219":1}}],["редакция",{"2":{"438":1}}],["редактировать",{"2":{"437":1,"438":1}}],["редактирование",{"2":{"230":2,"231":1}}],["редактирования",{"2":{"223":1,"247":1}}],["редактируемых",{"2":{"247":1}}],["редактируем",{"2":{"218":1}}],["редакторы",{"2":{"366":1}}],["редактор",{"2":{"213":2,"432":1,"444":1}}],["редакторе",{"2":{"155":1,"444":1}}],["редких",{"2":{"272":1}}],["редкая",{"2":{"242":1}}],["редко",{"2":{"106":1,"235":2,"271":1,"287":1,"350":1}}],["речевого",{"2":{"155":1}}],["речь",{"2":{"10":1,"149":1,"253":1,"418":1,"430":1}}],["резюме",{"2":{"460":1}}],["резервировать",{"2":{"273":1}}],["резервировании",{"2":{"136":1}}],["резервируем",{"2":{"246":1}}],["результирующее",{"2":{"191":1}}],["результатом",{"2":{"247":1,"389":1,"421":1}}],["результатов",{"2":{"222":1,"248":1}}],["результаты",{"2":{"121":1,"173":1,"176":1,"214":1,"232":1,"314":1,"345":1,"436":2}}],["результат",{"2":{"107":1,"147":1,"150":1,"173":1,"195":1,"214":1,"220":1,"309":1,"322":1,"323":1,"325":1,"326":1,"381":1,"382":2,"426":1,"490":1}}],["результате",{"2":{"106":1,"135":1,"147":1,"157":1,"162":1,"181":1,"229":1,"253":1,"303":1,"332":1,"369":1,"383":2,"426":1,"427":1,"428":1,"495":1}}],["результата",{"2":{"67":1,"242":1,"308":2,"321":1,"326":1,"369":1,"385":1}}],["реагировать",{"2":{"319":1,"340":1,"342":1,"374":1}}],["реагирования",{"2":{"261":1}}],["реакции",{"2":{"114":1}}],["реактивную",{"2":{"190":1,"195":2,"222":2,"241":3,"324":1,"337":2,"338":2,"342":1,"344":3,"449":1,"451":1}}],["реактивная",{"2":{"114":1,"195":1,"197":2,"246":1,"247":2,"344":1,"448":1,"451":1}}],["реактивные",{"2":{"119":1,"192":1,"195":2,"206":1,"222":2,"233":1,"238":1,"241":1,"247":1,"330":1,"344":1,"345":1,"347":3,"374":1,"448":1,"449":3,"451":2}}],["реактивный",{"2":{"114":1,"222":1,"337":1,"343":2,"345":1,"346":1,"349":1,"351":1,"353":1,"449":2,"451":2}}],["реактивных",{"0":{"114":1},"2":{"114":2,"195":1,"222":1,"260":1,"325":1,"345":1,"349":1,"358":1,"448":1,"451":1}}],["реактивным",{"2":{"113":1,"114":1,"195":2,"343":1,"351":1}}],["реактивными",{"2":{"97":1,"113":1,"114":2,"195":1,"220":1,"301":1,"325":1,"347":1,"350":1}}],["реактивно",{"2":{"345":1,"375":1}}],["реактивного",{"0":{"343":1,"345":1},"1":{"344":1,"346":1,"347":1,"348":1,"349":1},"2":{"241":1,"297":1,"335":1,"342":1,"352":1,"353":1,"354":1,"496":1}}],["реактивное",{"2":{"230":1,"245":1,"246":1,"325":1,"345":1,"352":1}}],["реактивному",{"2":{"240":1}}],["реактивном",{"2":{"191":2,"246":1,"345":1,"451":1}}],["реактивностью",{"2":{"325":1,"335":1,"451":2}}],["реактивность",{"2":{"191":1,"214":1,"231":1,"243":1,"247":1,"302":2,"303":1,"311":1,"337":2,"342":1,"451":2}}],["реактивности",{"2":{"110":1,"114":1,"116":1,"190":1,"301":2,"302":1,"343":1,"451":2,"524":1}}],["реактивной",{"2":{"96":1,"114":1,"162":2,"195":1,"197":1,"346":1,"371":1}}],["реально",{"2":{"347":1,"453":1}}],["реальности",{"2":{"277":1,"388":1}}],["реальном",{"2":{"220":1,"302":1,"303":1,"366":1,"377":1,"419":1,"429":1}}],["реальному",{"2":{"212":1}}],["реальное",{"2":{"128":1,"164":1,"177":1}}],["реальные",{"2":{"224":1,"450":1}}],["реальным",{"2":{"210":1}}],["реальными",{"2":{"107":1}}],["реальных",{"2":{"191":1,"417":2,"418":1,"431":1}}],["реальный",{"0":{"243":1},"1":{"244":1,"245":1,"246":1},"2":{"186":1,"417":1,"460":2}}],["реализовывать",{"2":{"245":1,"249":1,"310":1,"318":1,"389":1}}],["реализовывали",{"2":{"166":1}}],["реализовали",{"2":{"247":1,"300":1,"353":2}}],["реализована",{"2":{"382":1,"497":1,"499":1,"507":1}}],["реализовано",{"2":{"302":1,"328":1,"337":1,"545":1}}],["реализованного",{"2":{"251":1}}],["реализованный",{"2":{"166":1}}],["реализованные",{"2":{"139":1}}],["реализованы",{"2":{"190":1,"191":1,"251":1,"275":1,"344":1,"389":1,"390":1}}],["реализован",{"2":{"118":1,"290":1,"295":1,"300":1,"301":1,"330":1,"352":1}}],["реализовать",{"2":{"12":1,"35":1,"36":1,"40":1,"99":1,"157":1,"168":1,"232":1,"235":1,"251":2,"293":2,"297":1,"298":1,"300":1,"301":1,"309":1,"312":2,"314":1,"315":1,"317":1,"331":1,"347":1,"355":1,"364":1,"366":1,"375":1,"383":2,"386":1}}],["реализуя",{"2":{"335":1}}],["реализует",{"2":{"237":1,"299":1,"303":1,"338":1,"345":1,"500":1}}],["реализуемая",{"2":{"440":1}}],["реализуемого",{"2":{"322":1}}],["реализуемые",{"2":{"303":1}}],["реализуем",{"2":{"161":1,"241":1,"312":2,"327":1,"329":1,"339":1}}],["реализующая",{"2":{"324":2}}],["реализующих",{"2":{"216":1,"320":1,"325":1}}],["реализующий",{"2":{"153":1,"243":1,"302":1,"492":1}}],["реализуют",{"2":{"296":1,"349":1,"389":1}}],["реализуются",{"2":{"158":1}}],["реализацией",{"2":{"149":1,"247":1,"299":1,"302":1,"353":1,"382":1,"386":1,"387":1,"388":2,"527":1}}],["реализациями",{"2":{"416":1}}],["реализациях",{"2":{"374":1}}],["реализация",{"0":{"246":1,"247":1,"285":1,"315":1,"340":1,"343":1,"345":1},"1":{"286":1,"287":1,"316":1,"317":1,"321":1,"322":1,"323":1,"325":1,"326":1,"327":1,"328":1,"329":1,"330":1,"332":1,"341":1,"342":1,"344":1,"346":1,"347":1,"348":1,"349":1},"2":{"116":1,"134":1,"154":1,"159":1,"161":1,"170":1,"247":1,"260":1,"275":1,"277":1,"285":1,"286":1,"297":1,"298":3,"299":1,"300":1,"301":1,"309":1,"319":1,"320":1,"321":1,"324":2,"325":1,"327":1,"329":1,"335":3,"339":1,"340":1,"342":1,"343":1,"350":1,"367":1,"377":1,"382":1,"388":1,"448":1,"525":1}}],["реализаций",{"2":{"114":1,"161":1,"262":1,"287":1,"288":1,"306":2}}],["реализации",{"0":{"502":1},"1":{"503":1,"504":1},"2":{"39":1,"75":1,"109":1,"111":1,"116":1,"145":1,"158":1,"162":1,"170":1,"188":1,"203":1,"210":1,"212":1,"226":1,"228":1,"229":1,"231":1,"232":1,"238":1,"247":3,"250":1,"255":1,"261":2,"266":2,"277":1,"282":1,"285":1,"286":1,"290":1,"292":2,"293":1,"294":1,"295":1,"296":1,"297":2,"299":1,"301":1,"314":1,"318":2,"320":1,"327":2,"331":1,"333":1,"335":2,"337":1,"340":1,"342":1,"344":1,"345":1,"350":2,"354":1,"375":1,"380":1,"382":1,"383":2,"386":1,"389":1,"394":1,"396":1,"400":1,"418":1,"430":1,"440":2,"448":2,"458":1,"543":1}}],["реализацию",{"2":{"16":1,"41":1,"69":1,"114":1,"158":1,"218":1,"238":1,"246":1,"250":1,"274":1,"277":1,"287":1,"293":2,"298":1,"300":1,"310":1,"317":1,"333":1,"338":1,"350":1,"352":1,"382":1,"386":1,"453":1}}],["рейтинг",{"2":{"94":1,"263":2}}],["рейтинги",{"2":{"78":1}}],["релевантные",{"2":{"107":1}}],["релиз",{"2":{"86":1,"433":1}}],["реляционных",{"2":{"43":1,"44":1,"47":1,"48":1}}],["реляционные",{"2":{"17":2}}],["реляционную",{"2":{"39":1}}],["ресурсе",{"2":{"486":1}}],["ресурсом",{"2":{"301":1,"314":1}}],["ресурсов",{"2":{"108":2,"188":1,"218":1,"243":1,"317":1,"409":1,"412":1,"461":1,"543":1,"544":1}}],["ресурсу",{"2":{"106":1,"108":2,"284":1}}],["ресурса",{"0":{"483":1},"2":{"412":1}}],["ресурсами",{"2":{"107":1,"314":1,"383":1,"412":1,"461":2}}],["ресурсам",{"2":{"106":1,"128":2,"283":1,"412":1}}],["ресурсах",{"0":{"0":1}}],["ресурс",{"2":{"106":2,"108":2,"238":1,"243":1,"246":3,"460":1}}],["ресурсы",{"0":{"412":1},"1":{"413":1,"414":1},"2":{"86":1,"128":2,"215":2,"273":1,"307":1,"314":1,"409":4,"412":4,"418":1,"424":1,"443":1,"460":1,"527":1}}],["режимы",{"2":{"253":1}}],["режим",{"2":{"118":2,"127":3,"128":1,"132":1,"371":1}}],["режимов",{"2":{"118":1}}],["режима",{"2":{"108":1,"126":1,"127":1,"136":1,"219":1,"497":1}}],["режимах",{"2":{"86":1,"534":3,"536":2}}],["режиме",{"2":{"12":1,"86":1,"118":1,"126":1,"127":2,"130":1,"137":1,"155":1,"159":1,"215":1,"256":1,"262":1,"309":1,"408":1,"444":2,"449":2,"450":1,"542":1}}],["регулярный",{"0":{"455":1}}],["регулярных",{"2":{"380":1}}],["регулировать",{"2":{"411":1}}],["регулирования",{"2":{"389":1}}],["регулируется",{"2":{"58":1,"125":1}}],["регистрируя",{"2":{"297":1}}],["регистрирует",{"2":{"451":1}}],["регистрируется",{"2":{"298":1}}],["регистрируете",{"2":{"273":1}}],["регистрируем",{"2":{"112":1,"246":1,"260":2,"261":2,"273":1,"342":1,"374":1}}],["регистрировать",{"2":{"234":1,"243":2,"303":1}}],["регистре",{"2":{"205":1,"206":1,"221":1}}],["регистра",{"2":{"207":1}}],["регистраторе",{"2":{"125":1}}],["регистратора",{"2":{"125":3}}],["регистраторы",{"2":{"125":2}}],["регистратором",{"2":{"125":1}}],["регистрацию",{"2":{"273":1}}],["регистрация",{"0":{"112":1},"2":{"234":1}}],["регистрации",{"2":{"57":1,"110":1,"122":1,"175":2,"234":1,"246":1,"247":1,"261":1,"271":4,"273":1,"293":2,"295":1,"297":1,"298":1,"374":1,"533":1}}],["регистр",{"2":{"44":1,"221":3}}],["решетку",{"2":{"374":1}}],["решетки",{"2":{"371":1}}],["решен",{"2":{"314":1}}],["решена",{"2":{"12":1,"113":1,"166":1}}],["решении",{"2":{"495":1}}],["решению",{"2":{"344":1,"358":1}}],["решением",{"2":{"75":1,"78":1,"107":1,"349":1,"387":1,"411":1,"415":1,"423":1,"430":1,"444":1}}],["решение",{"2":{"12":2,"13":1,"58":1,"61":1,"68":1,"81":1,"107":1,"108":2,"109":1,"118":1,"141":1,"170":1,"181":1,"191":1,"232":5,"241":1,"277":1,"303":1,"319":1,"337":1,"358":1,"374":1,"387":1,"389":1,"418":1,"451":1,"460":1,"495":1}}],["решений",{"2":{"10":1,"12":1,"23":1,"39":1,"41":1,"63":1,"68":3,"232":1,"408":1,"461":1}}],["решениями",{"2":{"161":1}}],["решениях",{"2":{"16":1}}],["решения",{"0":{"10":1,"409":1},"1":{"410":1,"411":1},"2":{"9":1,"10":1,"14":1,"39":1,"61":2,"68":1,"148":2,"150":1,"162":1,"166":1,"167":1,"203":1,"230":1,"238":1,"239":1,"266":4,"271":1,"277":1,"298":1,"308":1,"321":1,"322":1,"383":1,"389":2,"417":1,"430":1,"431":1,"461":1,"495":2}}],["решил",{"2":{"431":1}}],["решили",{"2":{"235":1,"321":1,"452":3}}],["решит",{"2":{"314":1}}],["решить",{"2":{"126":1,"155":1,"314":1,"335":1,"366":1,"380":1,"389":1,"408":1,"412":1}}],["решётки",{"2":{"192":1}}],["решат",{"2":{"314":1}}],["решать",{"2":{"292":1,"328":1}}],["решают",{"2":{"278":1,"449":1}}],["решали",{"2":{"190":1}}],["решает",{"2":{"106":1,"162":1,"191":1,"257":1,"271":1,"449":1}}],["решаем",{"2":{"12":1,"230":1}}],["реквизите",{"2":{"377":1}}],["реквизиты",{"2":{"115":1}}],["рекламных",{"2":{"453":1}}],["рекламные",{"2":{"4":1,"186":1}}],["рекламодателям",{"2":{"187":1}}],["рекламодателями",{"2":{"184":1}}],["рекламы",{"2":{"186":2}}],["реклама",{"0":{"186":1}}],["рекламируемым",{"2":{"184":1}}],["рекомендовал",{"2":{"258":1}}],["рекомендует",{"2":{"444":1}}],["рекомендуется",{"0":{"257":1},"2":{"114":1,"134":1,"135":1,"158":1,"159":1,"213":1,"215":1,"221":1,"234":1,"241":1,"260":1,"272":1,"292":3,"314":3,"324":1,"327":1,"350":1,"360":1,"383":1,"407":1,"435":1,"443":1,"500":1,"545":1}}],["рекомендуемые",{"2":{"258":1}}],["рекомендуемым",{"2":{"255":1,"432":1}}],["рекомендуемой",{"2":{"213":1}}],["рекомендуются",{"2":{"448":1}}],["рекомендую",{"2":{"175":1,"213":2,"240":1,"339":1,"349":1,"352":1,"380":1,"527":1}}],["рекомендацией",{"2":{"418":1}}],["рекомендациям",{"2":{"217":1,"246":1}}],["рекомендациях",{"2":{"136":1}}],["рекомендации",{"2":{"133":1,"216":1,"224":1,"266":1,"267":1}}],["рекомендаций",{"2":{"4":1,"204":1}}],["реконнект",{"2":{"109":1}}],["равенства",{"2":{"421":1}}],["равным",{"2":{"377":1}}],["равных",{"2":{"188":1}}],["равна",{"2":{"198":1}}],["равно",{"2":{"147":1,"195":1,"198":1,"256":1,"293":1,"307":1,"460":1}}],["рамок",{"2":{"253":1}}],["рамками",{"2":{"194":1,"229":1}}],["рамках",{"2":{"191":1,"196":1,"220":1,"238":1,"243":1,"249":1,"261":1,"327":1,"418":1}}],["рамки",{"2":{"134":1,"154":1,"172":1,"190":1,"191":1,"216":1,"228":1,"262":1,"271":1,"273":1,"274":1,"276":1,"382":1,"386":1,"389":2,"439":2}}],["радужно",{"2":{"218":1,"366":1}}],["радует",{"2":{"169":1}}],["ради",{"2":{"213":1}}],["радиус",{"2":{"160":1}}],["радиокнопки",{"0":{"153":1},"2":{"153":2}}],["ранней",{"2":{"430":1}}],["ранних",{"2":{"417":1}}],["рано",{"2":{"147":1,"453":1}}],["ранее",{"2":{"132":1,"194":1,"217":1,"222":1,"247":1,"249":1,"253":1,"298":1,"303":1,"312":1,"319":1,"320":2,"324":1,"328":1,"335":2,"337":1,"374":1,"386":1,"388":2,"408":1,"425":1,"440":1}}],["раньше",{"2":{"12":1,"214":1,"308":3,"309":1,"314":1,"343":1,"369":1,"417":1,"444":1}}],["рабочая",{"2":{"337":1}}],["рабочим",{"0":{"320":1},"1":{"321":1,"322":1,"323":1},"2":{"327":1,"337":1}}],["рабочие",{"2":{"269":1}}],["рабочих",{"2":{"182":1,"188":1,"261":1,"383":1}}],["рабочий",{"2":{"117":1,"127":1,"136":1,"193":1,"246":1,"260":1,"261":2,"319":1,"320":1,"388":1,"389":2,"395":1,"405":2,"440":1,"442":1}}],["рабочей",{"2":{"212":1}}],["рабочему",{"2":{"274":1,"323":1,"330":1}}],["рабочем",{"2":{"157":1,"159":1,"256":1,"382":1,"383":1,"402":1,"417":1,"418":1}}],["рабочего",{"0":{"212":1,"395":1},"1":{"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"223":1,"224":1,"225":1},"2":{"110":1,"111":1,"117":1,"157":1,"159":1,"192":1,"193":1,"194":1,"195":1,"226":1,"227":1,"234":1,"244":1,"261":1,"262":3,"298":1,"308":1,"335":1,"336":1,"383":2,"386":1,"387":1,"388":1,"418":1,"440":2}}],["рабочее",{"2":{"78":1}}],["работоспособного",{"2":{"495":1}}],["работоспособный",{"2":{"383":1}}],["работоспособен",{"2":{"214":1}}],["работник",{"2":{"320":2}}],["работнику",{"2":{"261":1}}],["работника",{"2":{"261":3}}],["работе",{"2":{"41":2,"96":1,"99":1,"114":1,"144":1,"203":1,"211":1,"213":1,"218":1,"247":1,"261":1,"265":1,"277":1,"342":1,"372":1,"383":1,"444":2,"451":2,"495":1}}],["работала",{"2":{"298":1}}],["работало",{"2":{"223":1,"287":1}}],["работали",{"2":{"195":1,"271":1,"273":1}}],["работающую",{"2":{"492":1}}],["работающее",{"2":{"419":1}}],["работающего",{"2":{"252":1,"496":1}}],["работающей",{"2":{"180":1,"225":1}}],["работающими",{"2":{"264":1}}],["работающий",{"2":{"213":1,"216":1,"288":1}}],["работающих",{"2":{"187":1,"275":1,"366":1,"374":1}}],["работают",{"2":{"107":1,"141":1,"194":1,"213":1,"273":1,"275":1,"282":1,"303":1,"307":1,"312":1,"314":1,"321":1,"373":1,"389":1,"390":1,"426":1,"449":1,"541":1}}],["работаем",{"2":{"97":1,"439":1}}],["работаете",{"2":{"145":2,"435":1}}],["работает",{"2":{"50":1,"67":1,"103":1,"106":2,"121":1,"134":1,"159":1,"214":2,"222":2,"223":1,"242":1,"247":1,"268":1,"286":1,"296":1,"300":1,"301":1,"302":2,"322":1,"323":2,"337":2,"340":1,"342":1,"371":1,"383":1,"389":1,"420":1,"421":2,"439":1,"444":1,"448":3,"451":1,"453":1,"460":1,"461":2,"527":1}}],["работа",{"0":{"50":1,"439":1},"2":{"38":1,"122":1,"295":1,"327":1,"435":1,"438":1,"439":2}}],["работать",{"2":{"2":1,"25":1,"50":1,"58":1,"96":1,"107":1,"109":1,"191":1,"193":1,"203":1,"215":2,"218":1,"220":1,"233":1,"242":1,"249":1,"253":3,"260":1,"261":1,"296":1,"301":1,"310":1,"314":1,"324":2,"332":1,"344":1,"350":1,"360":1,"369":1,"380":1,"409":1,"439":2,"444":2,"449":1,"461":1}}],["работу",{"2":{"20":1,"47":1,"68":1,"213":1,"246":1,"247":1,"312":1,"313":1,"314":1,"317":2,"342":2,"344":1,"350":1,"389":2,"390":1,"395":1,"411":1,"430":1,"436":1,"450":1}}],["работы",{"0":{"65":1,"151":1},"1":{"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1},"2":{"12":1,"17":1,"20":1,"50":1,"62":1,"67":1,"96":1,"106":1,"107":1,"108":1,"134":1,"162":1,"188":1,"191":1,"194":1,"202":1,"210":1,"211":1,"213":2,"214":2,"217":1,"220":2,"222":1,"246":1,"247":1,"248":1,"252":1,"253":1,"261":4,"274":1,"276":1,"306":1,"309":2,"312":1,"314":3,"315":1,"319":1,"325":3,"334":1,"338":1,"350":1,"364":1,"382":1,"387":1,"388":1,"412":1,"420":1,"421":1,"435":1,"439":1,"445":1,"446":1,"461":2,"484":3,"544":1}}],["расшаривать",{"2":{"449":1}}],["расшифровывается",{"2":{"231":1,"381":1}}],["расширим",{"2":{"318":1,"324":1}}],["расширили",{"2":{"249":1}}],["расширить",{"2":{"23":1,"248":1,"460":1}}],["расширено",{"2":{"350":1}}],["расширенные",{"2":{"240":1}}],["расширенными",{"2":{"226":1}}],["расширений",{"2":{"444":1}}],["расширении",{"2":{"360":1,"451":1}}],["расширениями",{"2":{"501":1}}],["расширения",{"0":{"527":1},"2":{"108":1,"187":1,"270":1,"303":1,"349":1,"444":2,"448":1,"527":1}}],["расширением",{"2":{"194":1,"215":1}}],["расширение",{"2":{"81":1,"99":1,"255":1,"350":2,"420":1,"527":2,"533":1}}],["расширяет",{"2":{"303":1,"403":1}}],["расширяемость",{"2":{"76":1,"459":1}}],["расширять",{"2":{"18":1,"191":1,"243":1,"441":1,"443":1}}],["расхождения",{"2":{"438":1}}],["расходов",{"2":{"183":1}}],["расходы",{"0":{"183":1},"2":{"343":1}}],["расчеты",{"2":{"350":1}}],["расчетом",{"2":{"12":1}}],["растут",{"2":{"430":1}}],["растущая",{"2":{"216":1}}],["растущим",{"2":{"125":1}}],["растет",{"2":{"247":1}}],["раскрывающимся",{"2":{"515":1}}],["раскрывая",{"2":{"425":1}}],["раскрывает",{"2":{"192":1,"301":1,"327":1}}],["раскрывается",{"2":{"183":1,"300":1,"383":1}}],["раскадровки",{"2":{"145":1}}],["рассказывается",{"2":{"394":1}}],["рассказывали",{"2":{"328":1}}],["рассказано",{"2":{"201":1}}],["рассказать",{"2":{"191":1,"216":1}}],["рассуждений",{"2":{"277":1}}],["рассчитывал",{"2":{"183":1}}],["рассчитать",{"2":{"159":1}}],["рассылку",{"2":{"177":3}}],["расстояния",{"2":{"147":1}}],["расстояние",{"0":{"145":1},"2":{"147":2}}],["рассматривали",{"2":{"174":1,"220":1,"319":1,"340":1,"351":1}}],["рассматриваемое",{"2":{"360":1}}],["рассматриваем",{"2":{"293":1,"386":1}}],["рассматриваемый",{"2":{"162":1}}],["рассматривается",{"2":{"330":1,"358":1}}],["рассматривает",{"2":{"269":1,"461":1}}],["рассматриваете",{"2":{"26":1}}],["рассматриваются",{"2":{"113":1,"115":1,"133":1,"139":1,"190":1,"324":1}}],["рассматриваться",{"2":{"192":1}}],["рассматривать",{"2":{"43":1,"131":1,"141":1,"169":1,"170":1,"193":1,"195":1,"229":1,"240":1,"241":1,"247":1,"269":1,"270":1,"272":1,"303":1,"314":1,"318":2,"319":1,"344":1,"366":1,"380":1}}],["рассмотрите",{"2":{"216":1,"411":1}}],["рассмотрим",{"2":{"10":1,"66":1,"110":1,"124":1,"125":1,"126":1,"132":1,"138":1,"141":1,"142":1,"144":1,"150":1,"169":1,"172":1,"176":1,"190":1,"191":1,"192":1,"194":2,"195":1,"196":1,"201":1,"203":2,"214":1,"215":2,"219":1,"223":1,"224":1,"226":2,"230":1,"233":1,"235":1,"237":3,"240":4,"242":1,"247":1,"254":1,"259":1,"260":3,"261":1,"266":1,"269":1,"273":1,"274":1,"277":2,"282":1,"285":1,"294":1,"295":1,"296":1,"297":1,"298":2,"301":2,"302":1,"303":2,"304":1,"307":1,"308":2,"312":2,"327":1,"330":1,"333":1,"335":1,"336":1,"343":1,"349":1,"350":1,"354":1,"364":1,"366":2,"368":1,"371":1,"374":2,"377":2,"382":1,"383":4,"387":1,"388":1,"389":2,"415":1,"417":1,"418":2,"425":1,"426":1,"427":1,"428":1,"439":1}}],["рассмотренные",{"2":{"320":1,"344":1}}],["рассмотренными",{"2":{"309":1}}],["рассмотренных",{"2":{"169":1,"216":1,"318":1,"440":1}}],["рассмотрении",{"2":{"261":1,"297":1}}],["рассмотрению",{"2":{"213":1,"389":1}}],["рассмотрение",{"2":{"141":1,"262":1,"264":1}}],["рассмотрены",{"2":{"39":1,"303":1}}],["рассмотрели",{"2":{"136":2,"188":2,"233":1,"236":1,"243":1,"247":1,"249":2,"261":1,"264":2,"298":1,"301":1,"310":1,"320":1,"333":1,"349":1,"354":1,"391":1,"423":1,"441":1}}],["рассмотреть",{"2":{"133":1,"215":1,"247":1,"259":1,"260":1,"318":1,"380":1,"381":1,"389":1,"429":1}}],["распознаваемых",{"2":{"376":1}}],["расползлись",{"2":{"449":1}}],["располнела",{"2":{"448":1,"524":1}}],["распологаются",{"2":{"215":1}}],["расположены",{"2":{"503":1}}],["расположенные",{"2":{"252":1}}],["расположенных",{"2":{"238":1}}],["расположенное",{"2":{"174":1}}],["расположена",{"2":{"141":1}}],["расположению",{"2":{"164":1}}],["расположении",{"2":{"149":1}}],["расположения",{"2":{"131":1,"132":1,"143":1,"172":1}}],["расположение",{"2":{"36":1,"131":1,"173":1,"217":1}}],["расположить",{"2":{"36":1}}],["располагались",{"2":{"459":1}}],["располагать",{"2":{"427":1}}],["располагаться",{"2":{"126":1,"128":1,"147":1,"255":1}}],["располагает",{"2":{"218":1}}],["располагается",{"2":{"111":1,"131":1,"147":1,"306":1}}],["располагаются",{"2":{"172":1,"247":1}}],["распределение",{"2":{"461":1}}],["распределения",{"2":{"215":1,"294":1}}],["распределенная",{"2":{"431":1,"438":1}}],["распределенности",{"2":{"431":1}}],["распределенными",{"2":{"389":1}}],["распределенные",{"2":{"389":1}}],["распределенных",{"2":{"275":1,"366":1,"389":2}}],["распределяются",{"2":{"106":1}}],["распространяемы",{"2":{"496":1}}],["распространяется",{"2":{"272":1,"344":1}}],["распространяться",{"2":{"345":1}}],["распространять",{"2":{"253":1}}],["распространяющихся",{"2":{"194":1}}],["распространяются",{"2":{"150":1}}],["распространены",{"2":{"460":1}}],["распространенного",{"2":{"459":1}}],["распространенность",{"2":{"451":1}}],["распространенной",{"2":{"387":1,"401":1}}],["распространенными",{"2":{"138":1,"190":1,"253":1,"261":1,"382":1,"386":1}}],["распространенных",{"2":{"128":1,"188":1,"215":1,"255":1,"327":2,"419":1,"496":1}}],["распространенные",{"2":{"125":1,"128":1,"137":1,"138":1,"154":1,"349":1,"437":1,"451":1}}],["распространенный",{"2":{"9":1,"106":1,"283":1,"439":1}}],["распространение",{"2":{"253":1,"342":1,"366":1}}],["распространения",{"2":{"192":1,"337":1}}],["распространен",{"2":{"173":2,"192":1,"305":1}}],["раза",{"2":{"449":1}}],["разочаровавшись",{"2":{"431":1}}],["разочарованию",{"2":{"388":1}}],["разобщенности",{"2":{"312":1}}],["разобрались",{"2":{"321":1}}],["разобраться",{"2":{"364":1}}],["разобрать",{"2":{"235":1,"326":1}}],["разобран",{"2":{"215":1}}],["разобьем",{"2":{"88":1,"222":1}}],["разумеется",{"2":{"319":1}}],["разумными",{"2":{"262":1}}],["разумным",{"2":{"172":1}}],["разграничению",{"2":{"354":1}}],["разгрузки",{"2":{"300":1}}],["разговаривать",{"2":{"188":1}}],["разблокировав",{"2":{"382":1}}],["разбора",{"2":{"322":1}}],["разбрасывать",{"2":{"273":1}}],["разбросаны",{"2":{"247":1}}],["разберет",{"2":{"214":1}}],["разбиения",{"2":{"451":2}}],["разбиение",{"0":{"4":1},"2":{"2":1,"41":1,"78":1,"235":1}}],["разбираться",{"2":{"373":1,"374":1,"461":1}}],["разбили",{"2":{"247":1}}],["разбивается",{"2":{"409":1}}],["разбивает",{"2":{"269":1}}],["разбивайте",{"2":{"148":1}}],["разбивать",{"2":{"2":1,"3":1}}],["разбивка",{"2":{"14":1,"229":1}}],["разбитым",{"2":{"460":1}}],["разбить",{"2":{"4":1}}],["разбита",{"2":{"2":1}}],["размонтированием",{"2":{"273":1,"374":1}}],["размонтировании",{"2":{"203":1}}],["размышления",{"0":{"126":1},"1":{"127":1},"2":{"276":1}}],["разметки",{"2":{"190":1}}],["разместим",{"2":{"194":1,"221":1,"222":1,"420":2}}],["разместили",{"2":{"143":1}}],["разместить",{"2":{"93":1,"273":1,"374":1,"407":3,"427":1}}],["размер",{"2":{"147":1,"195":1,"218":1,"235":1,"350":1,"367":1,"371":1,"412":2,"453":1}}],["размеров",{"2":{"140":1,"241":1}}],["размеру",{"2":{"125":1,"172":1}}],["размерам",{"2":{"253":1}}],["размерами",{"2":{"172":1,"256":1,"258":1}}],["размера",{"2":{"116":1,"121":1,"142":1,"147":1,"161":1,"167":1,"172":1,"191":3,"235":1,"273":2,"349":1,"412":1}}],["размещали",{"2":{"215":1}}],["размещает",{"2":{"186":1}}],["размещается",{"2":{"172":1,"173":1,"174":2,"255":1,"260":1}}],["размещаем",{"2":{"132":2,"222":1,"247":1}}],["размещаемый",{"2":{"128":1}}],["размещаются",{"2":{"164":1,"215":1}}],["размещайте",{"2":{"145":1}}],["размещать",{"2":{"58":1,"119":1,"125":1,"161":1,"165":1,"215":2,"222":1,"244":1,"420":1}}],["размещена",{"2":{"420":1}}],["размещенный",{"2":{"261":1,"428":1}}],["размещенное",{"2":{"164":1}}],["размещены",{"2":{"216":1,"230":1,"368":1}}],["размещению",{"2":{"420":1}}],["размещение",{"0":{"164":1},"2":{"143":1,"164":1,"173":1,"174":1,"186":1,"426":1}}],["размещении",{"2":{"132":1,"174":1}}],["размещения",{"2":{"107":1,"122":1,"129":1,"174":1,"192":1,"214":1,"407":1,"439":1,"440":1,"461":1,"515":1}}],["размещен",{"2":{"127":1,"214":1,"215":1,"260":2,"352":1,"438":1}}],["размещено",{"2":{"125":2,"126":2,"130":1,"192":1}}],["разная",{"2":{"332":1}}],["разнообразные",{"2":{"366":1}}],["разному",{"2":{"235":1,"461":1}}],["разного",{"2":{"167":1,"451":1}}],["разным",{"2":{"431":1,"438":1}}],["разными",{"2":{"300":1,"430":1}}],["разных",{"2":{"108":1,"161":1,"213":1,"253":1,"274":1,"282":1,"410":1,"427":1,"449":1,"452":1,"470":1,"522":1,"543":1}}],["разный",{"2":{"106":1}}],["разные",{"0":{"195":1},"2":{"106":1,"143":1,"173":1,"232":1,"262":1,"342":1,"377":1,"430":2,"431":1,"443":1,"452":1,"461":1,"533":1}}],["разницей",{"2":{"199":1,"303":1}}],["разницу",{"2":{"114":1,"308":1}}],["разницы",{"2":{"106":1}}],["разница",{"2":{"23":1,"191":1,"211":1,"265":1,"311":1,"332":1,"355":1,"425":1,"460":1}}],["раздувать",{"2":{"503":1}}],["раздутому",{"2":{"67":1}}],["раздаются",{"2":{"461":1}}],["раздражения",{"2":{"185":1}}],["разделу",{"2":{"377":1}}],["разделить",{"2":{"235":1,"269":2,"271":1}}],["разделив",{"2":{"191":1}}],["разделяемые",{"2":{"345":1}}],["разделяется",{"2":{"345":1,"383":1}}],["разделяет",{"2":{"231":1,"303":1,"337":1}}],["разделять",{"2":{"249":1,"449":1}}],["разделяй",{"2":{"2":1}}],["разделом",{"2":{"172":1,"247":1}}],["разделов",{"2":{"158":1,"169":1}}],["разделах",{"2":{"176":1,"194":1,"371":1,"470":1}}],["разделами",{"2":{"349":1}}],["разделам",{"2":{"164":1}}],["раздела",{"2":{"142":1,"174":2,"194":1,"246":1,"345":1}}],["раздел",{"2":{"127":1,"172":1,"174":4,"216":1,"218":1,"222":1,"246":1,"255":1,"353":1,"515":1}}],["разделенной",{"2":{"326":1}}],["разделенные",{"2":{"125":1,"221":1,"383":1}}],["разделенных",{"2":{"108":1,"125":2,"126":1}}],["разделена",{"2":{"269":1}}],["разделению",{"2":{"367":1}}],["разделения",{"2":{"165":1,"194":1,"269":2,"275":1}}],["разделение",{"0":{"269":1},"2":{"34":1,"161":1,"266":1,"269":2,"271":1,"297":1,"318":1,"459":1}}],["разделе",{"2":{"108":1,"192":1,"202":1,"214":1,"221":1,"233":1,"237":1,"243":1,"252":1,"261":1,"273":1,"374":1,"380":1,"418":1,"428":1,"448":1,"515":3}}],["разделы",{"2":{"106":1,"158":1,"172":1,"229":1}}],["различающихся",{"2":{"449":1}}],["различаются",{"2":{"268":1}}],["различают",{"2":{"44":1}}],["различать",{"2":{"307":1}}],["различается",{"2":{"240":1}}],["различие",{"0":{"142":1},"2":{"153":1,"190":1,"191":1}}],["различия",{"2":{"138":1,"380":1,"438":1}}],["различный",{"2":{"194":1}}],["различные",{"2":{"161":1,"190":2,"219":1,"253":3,"308":1,"328":1,"354":1,"364":1,"380":1,"389":1,"415":1,"434":1,"533":2}}],["различных",{"2":{"136":1,"158":1,"190":1,"219":1,"232":1,"236":1,"253":3,"256":1,"262":1,"287":1,"301":1,"314":1,"350":1,"364":1,"369":1,"382":1,"383":1,"391":1,"417":2,"421":1,"430":1,"460":1,"532":1,"533":1}}],["различным",{"2":{"35":1,"41":1,"164":1,"253":1,"276":1}}],["различными",{"2":{"30":1,"107":1,"167":1,"172":1,"218":1,"226":1,"247":1,"269":1,"300":1,"364":1,"383":1,"421":1,"451":1}}],["различного",{"2":{"78":1}}],["развертываемого",{"2":{"496":1}}],["развертывании",{"2":{"217":1}}],["развертыванию",{"2":{"127":1}}],["развертывания",{"0":{"126":1,"514":1},"1":{"127":1,"515":1,"516":1},"2":{"75":1,"118":1,"122":1,"136":1,"219":1,"251":1,"405":1,"408":1}}],["развертыванием",{"2":{"215":1,"408":1}}],["развертывание",{"0":{"70":1,"122":1,"402":1},"1":{"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1},"2":{"66":1,"70":1,"219":1,"254":1,"371":1,"440":1}}],["разветвление",{"2":{"431":1}}],["разветвлять",{"2":{"431":1}}],["разве",{"2":{"314":1}}],["разворачивать",{"2":{"273":1}}],["разворачивание",{"2":{"40":1}}],["развитый",{"2":{"366":1}}],["развитии",{"2":{"366":1}}],["развитием",{"2":{"366":1}}],["развитие",{"0":{"483":1},"2":{"276":1,"318":1}}],["развития",{"0":{"78":1},"2":{"10":1,"62":1,"190":1,"253":1,"495":1}}],["развивается",{"2":{"451":1}}],["развиваться",{"2":{"229":1,"271":1}}],["развиваются",{"2":{"212":1}}],["раз",{"0":{"240":1},"2":{"27":1,"106":3,"136":1,"162":1,"183":1,"191":1,"195":1,"197":1,"218":1,"234":1,"260":1,"275":1,"283":1,"286":1,"287":1,"292":1,"335":1,"347":1,"374":1,"421":2,"426":1,"443":2,"449":1,"461":1}}],["разряда",{"2":{"456":1}}],["разрядной",{"2":{"213":1}}],["разрывные",{"2":{"415":1}}],["разрушить",{"2":{"335":1}}],["разрешив",{"2":{"322":1}}],["разрешили",{"2":{"461":1}}],["разрешил",{"2":{"129":1}}],["разрешить",{"2":{"58":1,"321":1,"332":1,"382":1}}],["разрешающийся",{"2":{"381":1}}],["разрешается",{"2":{"235":1,"245":1,"330":1}}],["разрешает",{"2":{"108":1,"376":1}}],["разрешаться",{"2":{"326":1}}],["разрешать",{"2":{"106":1,"439":1}}],["разрешено",{"2":{"309":1,"438":1}}],["разрешен",{"2":{"108":3}}],["разрешений",{"2":{"452":1,"506":1}}],["разрешение",{"2":{"106":2,"157":1,"246":1,"307":1,"323":1,"389":1,"438":1}}],["разрешениях",{"2":{"504":1}}],["разрешениям",{"2":{"172":1}}],["разрешения",{"2":{"20":1,"106":1,"246":2,"321":1,"326":1,"389":1,"423":1,"439":1}}],["разрабатываешь",{"2":{"452":1}}],["разрабатывается",{"2":{"172":1}}],["разрабатываемые",{"2":{"409":1}}],["разрабатываемого",{"2":{"405":1}}],["разрабатываем",{"2":{"6":1}}],["разрабатывать",{"2":{"68":1,"140":1,"409":1,"451":1,"461":1}}],["разработаем",{"2":{"220":1}}],["разработать",{"2":{"220":1}}],["разработанный",{"2":{"420":1}}],["разработанной",{"2":{"415":1}}],["разработан",{"2":{"191":1}}],["разработана",{"2":{"118":1}}],["разработчику",{"2":{"430":1,"459":1,"460":1,"492":1,"495":1}}],["разработчики",{"2":{"276":1,"306":1,"360":1,"440":1,"459":2}}],["разработчиком",{"2":{"256":1,"403":1,"460":3}}],["разработчиков",{"2":{"2":1,"204":1,"213":1,"218":1,"219":1,"238":1,"287":1,"359":1,"389":1,"390":1,"404":1,"430":3,"431":1,"450":1,"460":1,"485":1}}],["разработчик",{"2":{"67":1,"107":1,"175":1,"188":1,"191":1,"266":1,"449":1,"495":1}}],["разработчиками",{"2":{"138":1}}],["разработчикам",{"2":{"67":1,"411":1,"417":3,"496":2}}],["разработчика",{"2":{"20":1,"192":1,"214":1,"215":1,"259":2,"262":1,"263":3,"306":1,"314":2,"344":1,"349":2,"353":1,"360":1,"389":1,"415":2,"421":2,"430":1,"441":1,"449":2,"458":1,"460":1,"484":1,"499":1}}],["разработкой",{"2":{"68":1,"417":1,"437":1,"450":1}}],["разработка",{"0":{"69":1},"2":{"60":1,"66":2,"69":1,"78":1,"219":1,"225":1,"253":1,"266":1,"382":1,"430":1,"450":1,"467":1,"470":1,"472":1,"473":1}}],["разработки",{"0":{"66":1},"2":{"17":1,"60":1,"68":2,"103":1,"117":1,"191":2,"195":1,"212":1,"213":1,"214":4,"215":3,"217":1,"218":1,"219":3,"222":1,"234":1,"261":1,"266":1,"272":1,"273":1,"275":1,"276":1,"277":1,"306":1,"310":1,"396":1,"407":1,"409":1,"415":2,"417":1,"418":1,"420":1,"429":2,"431":1,"444":3,"448":1,"449":1,"450":1,"451":1,"452":1,"460":1,"495":1}}],["разработку",{"2":{"3":1,"68":1,"140":1,"191":1,"266":1,"390":1,"451":1,"459":2}}],["разработке",{"0":{"532":1},"2":{"3":1,"62":1,"75":3,"108":1,"145":1,"211":1,"213":1,"214":1,"218":1,"225":1,"266":1,"267":1,"275":1,"277":1,"327":1,"354":1,"359":1,"366":1,"418":1,"444":1,"461":1}}],["гибче",{"2":{"449":1}}],["гибридные",{"2":{"366":1}}],["гибридных",{"2":{"350":1,"371":1,"383":1}}],["гибки",{"2":{"451":1}}],["гибкая",{"2":{"344":1,"350":1}}],["гибкой",{"2":{"340":1}}],["гибкости",{"2":{"131":1,"239":1}}],["гибкость",{"2":{"40":1,"109":1,"191":1,"219":1,"308":1,"449":1}}],["гигантский",{"2":{"344":1}}],["гипертекста",{"2":{"190":1}}],["геттеров",{"2":{"449":1}}],["геттерами",{"2":{"347":1,"449":1}}],["геймификации",{"2":{"175":1}}],["героической",{"2":{"174":1}}],["героический",{"2":{"174":1}}],["герой",{"2":{"174":1}}],["генерация",{"2":{"443":1,"461":1}}],["генерации",{"2":{"162":1,"262":1,"366":1,"461":1}}],["генерируемые",{"2":{"366":1}}],["генерируемыми",{"2":{"366":1}}],["генерируется",{"2":{"326":1,"387":1,"461":1}}],["генерируют",{"2":{"215":1}}],["генерировать",{"2":{"161":1,"262":1,"408":1}}],["генерить",{"2":{"461":1}}],["генерит",{"2":{"52":1,"81":2,"106":2}}],["гениальное",{"2":{"2":1}}],["гуглить",{"2":{"107":2,"460":1}}],["греется",{"2":{"444":1}}],["грязно",{"2":{"339":1}}],["громоздка",{"2":{"327":1}}],["громоздким",{"2":{"203":1,"261":1,"350":1}}],["грубый",{"2":{"228":1}}],["грубое",{"2":{"269":1}}],["грубого",{"2":{"249":1}}],["грубо",{"2":{"106":1,"108":1,"452":1}}],["групповой",{"2":{"276":1}}],["группу",{"2":{"220":1,"421":1}}],["группах",{"2":{"276":1}}],["группами",{"2":{"222":1}}],["группа",{"2":{"168":1,"169":1,"222":1}}],["группировки",{"2":{"168":1,"229":2,"273":1}}],["группе",{"2":{"144":2,"220":1,"251":1,"421":1}}],["группы",{"0":{"145":1},"2":{"125":1,"148":1,"153":1,"222":1,"381":1,"417":1,"421":1,"425":1}}],["групп",{"2":{"125":1,"144":1,"421":1}}],["грузить",{"2":{"107":1,"461":1}}],["грамотная",{"2":{"484":1}}],["грамотно",{"2":{"460":1}}],["грамотному",{"2":{"151":1}}],["грамотной",{"2":{"75":1}}],["градусов",{"2":{"302":1}}],["градусах",{"2":{"302":1}}],["градусы",{"2":{"301":2,"303":1}}],["графическая",{"2":{"299":1}}],["графические",{"2":{"439":1}}],["графически",{"2":{"301":1,"303":1,"382":1}}],["графический",{"2":{"228":1,"432":1}}],["графических",{"2":{"216":1}}],["графическим",{"2":{"144":1}}],["графического",{"2":{"216":1,"366":1,"429":1}}],["графическое",{"2":{"161":1,"269":1,"271":1,"297":1,"299":1}}],["графики",{"2":{"144":1,"253":1}}],["грань",{"2":{"253":1}}],["гранулировано",{"2":{"106":1}}],["границах",{"2":{"191":1,"314":1}}],["границу",{"2":{"161":1,"162":1}}],["границы",{"0":{"9":1},"2":{"67":1,"303":1,"350":1}}],["границ",{"2":{"3":1,"160":1}}],["гарагусо",{"2":{"363":1}}],["гарантирует",{"2":{"173":1,"352":1}}],["гамбургера",{"2":{"167":1,"506":1}}],["гамбургер",{"2":{"164":1,"534":1,"536":1}}],["гамме",{"2":{"153":1}}],["гаммы",{"2":{"26":1}}],["галочка",{"2":{"156":1}}],["гаснет",{"2":{"96":1}}],["где",{"2":{"86":1,"106":1,"107":1,"125":1,"127":1,"128":1,"143":1,"148":1,"150":1,"158":1,"164":1,"172":1,"174":2,"186":1,"191":1,"192":1,"194":1,"195":1,"214":1,"222":1,"246":1,"247":3,"275":1,"300":1,"312":1,"314":1,"326":1,"329":1,"345":1,"369":1,"373":1,"381":1,"383":2,"389":1,"407":1,"414":1,"423":1,"426":2,"430":1,"431":1,"440":1,"449":1,"450":1,"451":2,"455":1}}],["готового",{"2":{"495":1,"496":1}}],["готовое",{"2":{"492":1}}],["готовом",{"2":{"369":1}}],["готово",{"2":{"323":1}}],["готовой",{"2":{"215":1}}],["готова",{"2":{"292":1}}],["готовности",{"2":{"263":1}}],["готовность",{"2":{"251":1}}],["готов",{"2":{"222":1,"260":1,"261":1,"329":1,"352":1,"419":1}}],["готовую",{"2":{"215":1}}],["готовый",{"2":{"495":1}}],["готовым",{"2":{"444":1}}],["готовых",{"2":{"136":1,"202":1,"212":1,"496":1}}],["готовы",{"2":{"127":1,"152":1,"203":1,"210":1,"211":1,"213":2,"217":1,"218":1,"232":1,"368":1,"381":1,"382":1,"424":1,"427":1}}],["готовые",{"2":{"61":1,"127":1,"298":1}}],["год",{"2":{"276":1,"407":1}}],["года",{"2":{"460":1,"485":1}}],["годах",{"2":{"275":1}}],["годами",{"2":{"266":1}}],["году",{"2":{"149":1}}],["годы",{"2":{"50":1,"125":1,"151":1,"448":1,"524":1}}],["городов",{"2":{"375":1}}],["город",{"2":{"375":1}}],["города",{"2":{"169":2,"375":1}}],["горизонтальную",{"2":{"172":1}}],["горизонтальному",{"2":{"172":1}}],["горизонтальные",{"2":{"164":2,"167":2,"172":1}}],["гораздо",{"2":{"128":1,"158":1,"212":1,"253":2,"269":1,"282":1,"308":1,"350":1,"439":1,"448":1}}],["гордо",{"2":{"96":1}}],["гостинице",{"2":{"461":1}}],["гостиниц",{"2":{"182":1}}],["гостей",{"2":{"106":1}}],["государство",{"2":{"2":1,"377":1}}],["говорю",{"2":{"302":1,"308":1}}],["говорит",{"2":{"452":1}}],["говорить",{"2":{"57":1,"350":1}}],["говорилось",{"2":{"209":1,"231":1,"254":1,"380":1,"386":1,"417":1,"436":1}}],["говорил",{"2":{"195":1,"298":1}}],["говорили",{"2":{"174":1,"262":1,"374":2}}],["говоря",{"2":{"106":1,"108":1,"143":1,"148":1,"176":1,"271":1,"369":1,"451":1,"452":1,"461":1}}],["глоссарий",{"0":{"484":1}}],["глобален",{"2":{"449":1}}],["глобального",{"2":{"496":1}}],["глобальное",{"2":{"449":1}}],["глобальному",{"2":{"284":1}}],["глобально",{"2":{"232":1,"234":1,"245":1}}],["глобальную",{"2":{"215":1,"322":1,"373":1}}],["глобальная",{"2":{"192":1,"234":1}}],["глобальные",{"0":{"234":1},"2":{"215":1,"216":1,"243":1,"410":1}}],["глобальный",{"2":{"112":1,"234":1,"246":1,"449":1,"532":1}}],["глобальными",{"2":{"449":1}}],["глобальным",{"2":{"34":1,"350":1,"449":2,"452":1}}],["глобальных",{"0":{"112":1},"2":{"20":1,"110":1,"234":1,"243":1}}],["глючит",{"2":{"444":1}}],["глубоких",{"2":{"375":1}}],["глубокий",{"2":{"349":1}}],["глубоким",{"2":{"176":1}}],["глубокой",{"2":{"533":1}}],["глубокое",{"2":{"242":1}}],["глубоко",{"2":{"77":1,"237":1,"238":1,"335":1}}],["глубокого",{"2":{"64":1,"309":1}}],["глубины",{"2":{"169":1}}],["глазах",{"2":{"302":1}}],["глаза",{"2":{"173":1}}],["глаз",{"2":{"169":1}}],["гласит",{"2":{"142":1,"148":1,"270":1,"271":1,"276":1,"431":1}}],["главой",{"2":{"252":1,"266":1}}],["глав",{"2":{"212":1,"251":1}}],["главу",{"2":{"126":1,"211":1,"234":1,"268":1,"330":1}}],["главах",{"2":{"191":1,"212":1,"306":1,"335":1,"364":1}}],["глава",{"0":{"138":1,"393":1,"394":1,"395":1,"396":1,"397":1,"398":1,"399":1,"400":1,"401":1,"402":1,"403":1},"1":{"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":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},"2":{"123":1,"139":1,"188":1,"212":1,"258":1,"262":1,"266":1,"277":1,"310":1,"313":1,"364":1,"380":1,"387":1,"396":1,"397":1,"399":1,"400":1,"403":1,"416":1}}],["главы",{"2":{"122":1,"138":1,"139":1,"166":1,"190":1,"211":1,"213":1,"214":1,"226":1,"227":2,"241":1,"247":1,"251":1,"263":1,"312":1,"313":1,"318":1,"335":1,"336":1,"350":2,"364":1,"365":1,"367":1,"428":1,"431":1,"439":1}}],["главе",{"2":{"81":1,"111":1,"115":1,"117":1,"118":2,"122":1,"124":1,"126":1,"134":1,"136":1,"138":1,"145":1,"150":1,"153":1,"164":1,"173":1,"174":1,"188":1,"189":1,"190":1,"193":1,"194":3,"195":2,"201":1,"210":2,"213":2,"215":3,"216":1,"219":1,"220":2,"223":1,"224":2,"226":4,"227":1,"230":3,"233":1,"235":1,"238":1,"240":1,"242":1,"244":1,"249":2,"250":1,"251":3,"254":1,"260":1,"262":1,"264":2,"265":1,"266":1,"269":1,"270":1,"273":1,"274":1,"288":1,"295":2,"298":2,"300":1,"301":1,"303":1,"304":1,"306":1,"310":2,"312":3,"318":1,"319":1,"328":1,"333":2,"335":1,"336":2,"339":1,"340":1,"350":1,"351":2,"354":2,"355":1,"364":1,"366":2,"371":1,"374":1,"381":1,"390":2,"391":1,"393":1,"394":1,"395":1,"398":1,"401":2,"402":1,"415":3,"419":2,"425":1,"441":1}}],["главным",{"2":{"273":1,"409":1,"460":1}}],["главных",{"2":{"194":1,"343":1,"418":1}}],["главный",{"2":{"26":1,"173":2,"215":1,"220":1,"234":1}}],["главной",{"2":{"169":1,"174":3}}],["главного",{"2":{"167":1,"174":1,"193":1,"215":1,"260":1,"300":1,"504":1}}],["главном",{"2":{"88":1,"96":1,"169":1,"260":2,"318":1}}],["главное",{"2":{"2":1,"165":1,"174":1,"238":1,"383":1}}],["главную",{"2":{"7":1,"87":1,"173":1}}],["главная",{"0":{"174":1},"2":{"7":1,"33":1,"142":1,"173":2,"174":1,"241":1}}],["бюджетных",{"2":{"418":1}}],["бюджету",{"2":{"67":1}}],["бухгалтерская",{"2":{"389":1}}],["бумажном",{"2":{"361":1}}],["булевские",{"2":{"260":1}}],["булево",{"2":{"198":2,"222":1,"246":1}}],["буквы",{"2":{"207":1}}],["буквами",{"2":{"206":1,"209":1}}],["буква",{"2":{"135":1}}],["будто",{"2":{"276":2,"459":1}}],["будь",{"2":{"149":1,"228":1,"253":1}}],["будем",{"2":{"18":1,"23":1,"25":1,"41":1,"55":1,"57":1,"64":1,"86":1,"94":1,"131":1,"135":1,"141":1,"162":1,"190":1,"191":1,"192":1,"193":2,"194":2,"195":3,"202":1,"204":1,"209":1,"210":1,"212":3,"213":2,"214":1,"215":1,"217":1,"218":3,"222":1,"223":1,"228":1,"240":1,"241":2,"242":1,"243":1,"245":1,"246":1,"255":4,"261":2,"264":1,"269":1,"277":1,"278":1,"287":1,"298":1,"303":1,"306":3,"307":1,"309":2,"310":3,"317":2,"318":3,"319":1,"320":1,"321":1,"324":1,"325":1,"335":1,"339":3,"341":1,"346":1,"350":2,"352":2,"368":1,"369":1,"380":2,"381":1,"389":1,"408":2,"420":1,"421":2,"426":2}}],["будете",{"2":{"190":1,"216":1,"251":1,"306":1,"312":1,"364":1,"443":1,"460":1}}],["будет",{"0":{"63":1},"2":{"2":1,"3":2,"6":3,"11":2,"12":3,"16":1,"17":2,"23":1,"25":1,"29":5,"34":1,"36":1,"39":1,"40":2,"41":5,"47":1,"58":1,"60":2,"62":1,"63":1,"64":1,"67":1,"72":1,"78":1,"86":1,"88":1,"98":1,"99":1,"103":1,"105":1,"107":2,"108":1,"109":1,"114":1,"125":5,"126":4,"127":2,"128":4,"130":1,"134":2,"136":1,"141":2,"161":3,"162":3,"166":1,"169":1,"173":1,"179":1,"191":2,"192":3,"193":2,"195":2,"197":2,"198":3,"199":1,"200":1,"201":1,"202":1,"203":1,"212":1,"213":1,"214":5,"215":6,"217":1,"218":2,"219":1,"220":2,"221":3,"222":8,"229":1,"230":5,"234":2,"235":3,"236":1,"237":2,"238":1,"240":3,"242":1,"245":4,"246":3,"253":4,"260":5,"261":2,"262":1,"263":2,"271":1,"286":1,"287":1,"291":1,"296":2,"297":1,"299":1,"302":2,"303":2,"307":2,"308":4,"309":3,"310":1,"312":1,"314":6,"315":1,"317":1,"318":2,"320":2,"321":3,"322":1,"324":1,"325":2,"326":1,"327":2,"328":1,"329":3,"330":1,"332":3,"336":1,"337":2,"340":1,"341":1,"342":1,"344":1,"345":5,"349":1,"350":1,"351":1,"352":3,"353":1,"368":1,"369":4,"371":9,"374":4,"375":1,"376":1,"377":1,"381":1,"382":2,"383":5,"384":1,"387":3,"388":2,"389":4,"395":1,"408":1,"412":1,"418":1,"419":1,"420":1,"421":2,"425":1,"427":1,"428":2,"435":7,"436":1,"438":1,"439":2,"444":1,"449":2,"450":3,"459":1,"460":2,"491":2,"527":1}}],["будучи",{"2":{"301":1,"307":1,"308":1}}],["будущим",{"2":{"358":1}}],["будущими",{"2":{"221":1}}],["будущих",{"2":{"5":1,"395":1}}],["будущего",{"2":{"494":1}}],["будущее",{"2":{"203":1}}],["будущем",{"2":{"23":1,"156":1,"191":1}}],["буду",{"2":{"4":1,"213":1}}],["будут",{"2":{"2":1,"4":1,"11":1,"16":2,"44":1,"47":1,"63":1,"86":1,"94":1,"113":1,"127":1,"132":1,"143":1,"148":1,"167":1,"192":1,"195":1,"199":1,"203":1,"206":1,"209":1,"212":1,"215":2,"216":1,"218":2,"222":2,"228":3,"230":2,"231":2,"235":1,"240":1,"242":1,"245":1,"246":1,"253":2,"256":1,"260":1,"261":2,"262":1,"267":1,"274":1,"300":1,"303":1,"324":2,"326":2,"341":1,"342":1,"350":1,"359":1,"368":2,"369":2,"371":1,"373":1,"375":1,"376":2,"377":3,"382":1,"385":1,"408":1,"415":1,"418":2,"423":1,"424":1,"425":1,"432":1,"436":1,"438":2,"448":1,"489":1}}],["бэджем",{"2":{"99":1}}],["бэдж",{"2":{"99":1}}],["бэджик",{"0":{"99":1},"2":{"99":1}}],["бэджиком",{"2":{"96":1}}],["бэкэнд",{"2":{"389":2}}],["бэке",{"2":{"109":1,"451":2}}],["бэкендов",{"2":{"41":1}}],["бэкендом",{"0":{"104":1},"1":{"105":1},"2":{"41":1,"75":1,"105":2,"108":1,"387":1,"467":1,"500":1}}],["бэкенду",{"2":{"11":1,"38":1,"105":1,"499":2}}],["бэкенде",{"2":{"10":1,"44":1,"94":1,"109":1,"387":1,"388":1,"460":2}}],["бэкенд",{"0":{"107":1},"2":{"6":2,"11":1,"12":2,"17":1,"41":2,"47":1,"58":1,"78":1,"106":5,"107":5,"108":2,"312":1,"382":1,"386":1,"387":1,"388":1,"407":1,"450":1,"451":1,"495":1,"500":1,"530":1}}],["бэкенда",{"2":{"3":1,"13":1,"40":1,"41":1,"58":1,"107":1,"108":2,"383":1,"388":1,"461":1}}],["бэком",{"2":{"109":1}}],["бэкапов",{"2":{"408":1}}],["бэкапить",{"2":{"408":1}}],["бэкапа",{"2":{"70":1}}],["бэка",{"2":{"106":1,"107":1,"451":1}}],["бэк",{"2":{"105":1,"106":2,"107":1,"444":1}}],["боялся",{"2":{"460":1}}],["бояться",{"2":{"116":1}}],["бо́льшая",{"2":{"451":1}}],["бойскаута",{"2":{"276":1}}],["бойлерплейтов",{"2":{"495":1}}],["бойлерплейта",{"2":{"451":1}}],["бойлерплейт",{"2":{"44":1}}],["боковую",{"2":{"172":1,"369":1,"377":1}}],["боковым",{"2":{"409":1,"411":2}}],["боковых",{"2":{"167":1,"168":1}}],["боковые",{"2":{"164":1}}],["боковой",{"2":{"167":1,"169":2,"174":1,"369":1,"374":1,"515":1}}],["бонусная",{"0":{"138":1},"1":{"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":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},"2":{"403":1}}],["бонусами",{"2":{"106":1}}],["бороться",{"2":{"106":1}}],["бота",{"2":{"461":2}}],["ботов",{"2":{"461":1}}],["бот",{"0":{"82":1},"2":{"82":1}}],["большая",{"2":{"128":1,"142":1,"191":1,"460":1}}],["большом",{"2":{"219":1,"308":1}}],["большому",{"2":{"125":1}}],["большого",{"2":{"191":1,"213":1,"229":1,"386":1}}],["большое",{"2":{"114":1,"115":1,"141":1,"148":1,"149":1,"169":2,"180":1,"270":1,"275":1,"298":1,"350":1,"386":2,"390":1}}],["большой",{"2":{"78":1,"138":1,"195":1,"218":2,"269":1,"277":1,"366":1}}],["большую",{"2":{"68":1,"116":1,"219":1,"275":1,"306":1,"308":1,"366":1,"451":1}}],["больших",{"2":{"195":1,"199":2,"314":1,"335":1,"408":1,"428":1,"450":1,"451":3,"504":1}}],["большинстве",{"2":{"191":1,"216":1,"235":1,"253":1,"308":2,"381":1,"382":1,"389":1,"448":1,"461":1,"524":1}}],["большинства",{"2":{"172":1,"293":1,"306":1}}],["большинством",{"2":{"430":1}}],["большинство",{"2":{"39":1,"47":1,"107":2,"141":2,"143":2,"169":2,"174":1,"177":1,"190":1,"213":1,"242":1,"274":1,"366":1,"380":1,"382":1,"389":1,"423":1,"460":1}}],["больший",{"2":{"135":1,"235":1}}],["большим",{"2":{"128":1,"169":1,"172":1,"194":1,"389":1,"448":1,"450":2}}],["большими",{"2":{"107":1,"158":1,"174":1,"284":1,"451":1}}],["большие",{"2":{"40":1,"106":1}}],["большей",{"2":{"152":1,"191":1,"195":1,"230":1,"266":1}}],["большее",{"2":{"125":1,"383":1}}],["больше",{"0":{"114":1},"2":{"10":1,"47":1,"115":1,"134":1,"140":1,"147":2,"148":1,"149":1,"162":1,"165":1,"167":1,"192":1,"199":1,"203":1,"204":1,"239":1,"253":3,"260":1,"269":1,"273":1,"277":1,"282":1,"298":1,"308":2,"314":2,"317":1,"319":1,"335":1,"350":2,"360":1,"364":1,"375":1,"383":1,"388":1,"444":2,"448":1,"451":2,"460":2,"461":2}}],["более",{"2":{"2":2,"13":1,"14":1,"39":1,"41":1,"64":1,"67":1,"90":1,"99":2,"106":1,"108":2,"109":1,"110":1,"111":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":2,"128":1,"140":2,"143":2,"147":1,"148":2,"152":1,"154":1,"156":1,"169":2,"182":1,"188":1,"191":1,"192":2,"194":1,"195":3,"200":1,"201":1,"209":1,"212":2,"214":2,"215":2,"217":1,"218":1,"219":1,"223":4,"232":2,"233":1,"235":1,"236":1,"237":1,"238":1,"240":1,"242":1,"249":2,"253":2,"261":2,"262":2,"266":1,"269":1,"274":1,"285":1,"287":1,"295":1,"300":1,"301":1,"302":1,"303":2,"306":2,"309":5,"317":2,"318":1,"323":1,"339":1,"344":1,"347":1,"349":1,"350":3,"358":2,"366":4,"374":2,"375":2,"381":2,"388":2,"390":1,"408":1,"409":1,"411":1,"412":1,"415":3,"418":2,"421":2,"425":1,"438":1,"439":1,"443":1,"448":2,"449":1,"451":3,"452":1,"460":2,"515":1}}],["бешено",{"2":{"444":1}}],["бета",{"2":{"440":1}}],["берет",{"2":{"367":1}}],["берем",{"2":{"352":1}}],["бегло",{"2":{"193":1}}],["беглый",{"2":{"173":1}}],["бене",{"2":{"149":1}}],["бен",{"2":{"149":1}}],["бена",{"0":{"149":1}}],["бесконечна",{"2":{"161":1}}],["бесконечного",{"2":{"161":3}}],["бесконечный",{"0":{"161":1},"1":{"162":1},"2":{"161":2,"162":1}}],["бесконечными",{"2":{"147":1}}],["бесполезное",{"2":{"527":1}}],["бесполезно",{"2":{"460":1}}],["бесполезными",{"2":{"460":1}}],["беспокоиться",{"2":{"215":1,"304":1,"332":1,"435":1}}],["беспокойство",{"2":{"159":1}}],["беспарольными",{"2":{"388":1}}],["беспарольный",{"2":{"387":1}}],["беспарольная",{"0":{"387":1},"2":{"387":1}}],["бесплатными",{"2":{"407":1}}],["бесплатных",{"2":{"180":1,"186":1,"386":1}}],["бесплатный",{"2":{"135":1,"213":1,"217":1,"218":1,"254":1}}],["бесплатные",{"2":{"107":3,"407":1,"460":2}}],["бесплатная",{"2":{"81":1,"135":1,"213":2}}],["бесплатно",{"2":{"213":2,"307":1,"460":1}}],["бесплатной",{"2":{"192":1}}],["бесплатное",{"2":{"186":1}}],["бесплатного",{"2":{"40":1,"136":1,"179":1}}],["бесплатность",{"2":{"39":1}}],["белое",{"2":{"142":1}}],["белого",{"2":{"142":1}}],["безвозвратно",{"2":{"445":1,"448":1}}],["безусловно",{"2":{"309":1}}],["безымянном",{"2":{"240":1}}],["безопасен",{"2":{"150":1}}],["безопасны",{"2":{"306":1}}],["безопасные",{"2":{"253":1}}],["безопасным",{"2":{"135":1,"366":1,"388":1}}],["безопасного",{"2":{"383":1}}],["безопасной",{"2":{"235":1}}],["безопасности",{"2":{"58":1,"67":1,"106":2,"124":1,"135":3,"248":1,"273":1,"327":1,"332":1,"383":1,"387":1,"388":2,"390":1,"391":1,"452":1}}],["безопасностью",{"2":{"274":1}}],["безопасность",{"0":{"58":1},"2":{"68":1,"76":1,"106":3,"382":1,"387":1}}],["безопасную",{"2":{"134":1}}],["безболезненного",{"2":{"20":1}}],["без",{"2":{"12":1,"20":2,"61":1,"107":2,"116":1,"125":1,"140":1,"143":1,"149":1,"159":1,"180":1,"191":1,"213":3,"217":1,"219":1,"222":1,"247":1,"252":1,"256":1,"260":1,"261":1,"262":1,"269":1,"288":1,"296":1,"303":1,"306":1,"308":1,"350":1,"366":2,"367":1,"371":1,"377":1,"383":3,"385":1,"405":1,"410":1,"411":2,"414":1,"438":1,"439":1,"444":1,"449":1,"450":1,"451":2,"459":1,"460":2,"461":1,"489":1,"492":2,"495":1,"499":1,"525":1,"536":1,"541":1,"542":1}}],["брейкпойнт",{"2":{"497":1}}],["бремя",{"2":{"262":1,"417":1}}],["брендом",{"2":{"150":1}}],["бренда",{"2":{"140":1,"544":1}}],["бренды",{"2":{"16":1}}],["брали",{"2":{"408":1}}],["брату",{"2":{"339":1}}],["брать",{"2":{"261":1,"451":1}}],["братьями",{"2":{"335":1,"374":1}}],["братья",{"2":{"230":1}}],["браузеру",{"2":{"235":1,"255":1,"314":1,"443":1}}],["браузеры",{"2":{"116":2,"121":1,"152":1,"286":1,"314":1,"350":3,"407":1,"448":1,"461":1}}],["браузерные",{"2":{"251":1,"366":1}}],["браузерных",{"2":{"116":1,"312":1,"389":1}}],["браузерными",{"2":{"98":1}}],["браузеров",{"2":{"116":1,"381":1,"389":1}}],["браузером",{"2":{"106":1,"333":1,"408":1,"461":1}}],["браузере",{"2":{"114":1,"116":1,"174":1,"192":1,"193":1,"214":4,"222":1,"256":1,"259":2,"260":1,"261":1,"263":1,"306":1,"314":1,"327":1,"350":3,"366":1,"369":2,"371":1,"383":1,"389":1,"412":1,"419":1,"423":1,"429":1,"461":3,"490":1,"543":1}}],["браузер",{"2":{"106":1,"108":3,"193":4,"194":1,"213":1,"219":1,"235":1,"248":1,"253":1,"308":1,"314":3,"350":2,"360":1,"366":1,"450":1}}],["браузерах",{"2":{"116":1,"214":1,"263":1,"349":1,"350":1}}],["браузерами",{"0":{"116":1},"2":{"110":1,"116":2,"152":1,"161":1,"190":1,"253":1,"335":1,"354":1}}],["браузера",{"0":{"350":1},"2":{"50":1,"108":2,"157":1,"165":1,"190":1,"193":1,"213":1,"251":1,"253":2,"256":2,"260":1,"261":1,"263":1,"288":1,"306":1,"307":2,"312":1,"314":1,"350":2,"353":1,"380":1,"389":1,"423":1,"424":1,"425":1,"426":1,"461":1,"533":1,"542":1}}],["бросают",{"2":{"173":1}}],["бригаду",{"2":{"26":1}}],["бинарные",{"2":{"436":1}}],["битная",{"2":{"432":1}}],["билдом",{"2":{"450":1}}],["билдер",{"0":{"493":1},"1":{"494":1,"495":1},"2":{"494":1}}],["билде",{"2":{"412":1}}],["билда",{"2":{"70":1,"405":1,"407":1,"408":2,"443":1,"496":1,"528":1,"530":1}}],["библиотекой",{"2":{"211":1,"216":1,"449":1,"453":1}}],["библиотеками",{"2":{"495":1}}],["библиотекам",{"2":{"283":1}}],["библиотека",{"2":{"191":4,"282":1,"324":1,"327":2,"381":2,"448":1,"449":4,"453":1,"524":1}}],["библиотеках",{"2":{"152":1,"345":1}}],["библиотеку",{"0":{"445":1},"2":{"20":1,"105":1,"191":2,"216":1,"261":1,"324":1,"327":1,"359":1,"381":3,"389":1,"449":1,"452":1,"454":1,"459":1,"492":1}}],["библиотеки",{"0":{"459":1},"2":{"20":1,"190":1,"191":3,"193":1,"194":1,"215":1,"216":1,"218":1,"222":1,"224":1,"225":2,"253":1,"306":2,"312":1,"324":1,"327":1,"328":1,"389":1,"409":1,"418":2,"425":1,"443":1,"446":1,"451":1,"454":1,"459":4,"492":2,"543":1}}],["библиотек",{"0":{"454":1},"2":{"20":2,"190":1,"191":2,"210":1,"216":4,"220":1,"224":1,"272":1,"306":1,"324":2,"350":3,"358":1,"385":1,"386":1,"389":1,"414":1,"445":1,"456":1,"459":7,"492":1,"496":1,"532":1}}],["бизнесом",{"2":{"495":1}}],["бизнеса",{"2":{"67":2}}],["бизнес",{"0":{"8":1,"67":1},"1":{"9":1,"10":1,"11":1,"12":1,"13":1,"14":1},"2":{"6":1,"14":1,"16":1,"66":1,"68":1,"107":1,"223":1,"241":1,"247":3,"274":1,"314":1,"318":3,"345":1,"418":1,"449":5,"451":1,"494":1,"495":1,"496":1,"499":1}}],["бд",{"2":{"17":2,"39":1,"44":1,"449":1}}],["бывают",{"2":{"251":1,"271":1,"273":1,"450":1}}],["бывает",{"2":{"50":1,"109":1,"163":1,"176":1,"271":1,"277":1,"449":1}}],["быстрей",{"2":{"443":1,"444":1,"451":1,"456":1}}],["быстрее",{"2":{"116":1,"253":1,"443":1}}],["быстр",{"2":{"324":1}}],["быстрая",{"2":{"161":1,"324":1,"350":1,"366":1}}],["быстрые",{"2":{"253":1}}],["быстрым",{"2":{"169":1,"214":1,"366":1}}],["быстрых",{"2":{"149":1}}],["быстрый",{"2":{"48":1,"128":2,"194":1,"314":1,"444":1}}],["быстрой",{"2":{"157":1,"314":1}}],["быстро",{"2":{"121":2,"149":1,"161":1,"191":1,"211":1,"214":1,"271":2,"273":1,"428":1,"430":1,"452":1,"459":1,"495":3,"496":1}}],["быстрого",{"2":{"17":1,"20":1,"450":1}}],["была",{"2":{"113":1,"116":1,"118":1,"142":1,"215":2,"217":1,"222":1,"244":1,"302":1,"308":1,"364":1,"438":1,"448":1,"459":1,"461":1}}],["были",{"2":{"39":2,"61":1,"117":1,"119":1,"141":1,"146":1,"158":1,"190":3,"231":1,"235":1,"246":1,"260":1,"349":1,"377":1,"380":1,"386":1,"421":1,"422":1}}],["было",{"2":{"9":1,"10":2,"12":2,"47":2,"123":1,"125":1,"138":1,"156":1,"160":1,"203":1,"238":1,"260":1,"269":1,"294":1,"301":1,"302":1,"303":1,"307":4,"310":1,"344":1,"366":2,"375":1,"388":1,"389":1,"411":1,"420":1,"423":2,"426":1,"428":1,"429":1,"430":1,"431":1,"436":1,"438":2,"439":1,"448":2,"449":1,"451":3,"492":1}}],["был",{"2":{"9":1,"12":1,"61":1,"81":1,"97":1,"116":1,"118":1,"125":1,"178":1,"191":1,"209":1,"214":1,"215":1,"219":1,"275":1,"286":1,"290":1,"323":1,"325":1,"339":1,"352":1,"377":1,"387":1,"407":2,"431":1,"438":1,"449":2,"461":1,"516":1}}],["бы",{"2":{"9":2,"12":3,"23":1,"99":1,"106":1,"122":2,"125":1,"132":1,"136":1,"143":2,"159":1,"187":1,"213":2,"223":1,"226":1,"242":1,"248":1,"250":1,"258":1,"269":1,"274":3,"290":2,"293":3,"301":1,"302":3,"306":1,"307":4,"314":1,"315":1,"323":1,"345":1,"349":1,"351":1,"367":1,"380":1,"381":1,"388":1,"415":1,"419":1,"421":1,"423":3,"426":1,"428":1,"439":1,"449":1,"460":2}}],["быть",{"0":{"143":1},"2":{"2":2,"3":1,"17":1,"44":1,"47":1,"48":1,"66":1,"75":2,"86":1,"87":1,"89":1,"94":1,"99":1,"106":1,"110":1,"113":1,"114":2,"115":1,"116":2,"125":3,"135":1,"142":1,"145":1,"147":1,"150":2,"154":1,"156":1,"157":1,"158":2,"159":1,"163":1,"169":2,"170":1,"176":1,"187":1,"191":3,"193":1,"194":1,"195":3,"198":1,"199":1,"202":1,"203":3,"218":1,"219":1,"226":1,"230":1,"232":1,"235":1,"236":2,"237":1,"238":3,"242":1,"247":2,"251":1,"252":1,"255":4,"259":1,"260":6,"261":1,"269":3,"272":2,"274":1,"275":1,"287":1,"295":1,"299":1,"300":2,"301":2,"303":2,"307":1,"309":1,"310":1,"314":5,"315":4,"318":1,"325":1,"330":2,"332":1,"336":1,"340":1,"344":2,"346":1,"347":1,"350":4,"351":1,"352":1,"358":1,"366":1,"368":1,"377":1,"382":1,"383":3,"387":1,"388":1,"389":1,"390":1,"408":4,"409":1,"411":4,"412":1,"417":2,"418":1,"420":3,"421":1,"427":1,"430":1,"433":1,"438":1,"448":1,"450":1,"455":1,"460":3,"461":3,"485":1,"495":1,"496":1,"542":1}}],["блестящих",{"2":{"363":1}}],["ближе",{"2":{"195":1}}],["близка",{"2":{"306":1}}],["близко",{"2":{"145":1,"461":1}}],["близость",{"0":{"145":1}}],["близости",{"2":{"144":1,"145":1}}],["блогов",{"2":{"366":2}}],["блог",{"2":{"106":1,"494":1,"495":1,"496":1}}],["блокчейне",{"2":{"389":1}}],["блокчейном",{"2":{"389":3}}],["блокчейнов",{"2":{"366":1,"389":1}}],["блокчейнами",{"2":{"389":1}}],["блокчейна",{"2":{"389":2}}],["блокчейну",{"2":{"389":2}}],["блокчейны",{"2":{"389":2}}],["блокчейн",{"2":{"389":3}}],["блок",{"2":{"309":1}}],["блоков",{"2":{"222":1,"496":1}}],["блоком",{"2":{"132":1}}],["блока",{"2":{"222":2,"377":1,"417":1,"422":1,"444":1}}],["блоке",{"2":{"23":1,"222":1,"388":1}}],["блокировка",{"2":{"350":1}}],["блокировать",{"2":{"350":1}}],["блокирующими",{"2":{"314":1}}],["блокируют",{"2":{"307":1}}],["блоки",{"2":{"4":1,"193":1,"233":1,"496":1}}],["благополучия",{"2":{"363":1}}],["благодарю",{"2":{"363":1}}],["благодаря",{"2":{"125":1,"131":1,"149":1,"151":1,"152":1,"167":1,"169":1,"222":1,"237":1,"306":1,"326":1,"366":1,"461":1}}],["благо",{"2":{"96":1}}],["благозвучно",{"2":{"2":1}}],["багов",{"2":{"417":2}}],["баги",{"2":{"2":1,"452":1}}],["байт",{"2":{"350":1}}],["бара",{"2":{"159":1}}],["бары",{"2":{"159":1}}],["балансировщика",{"2":{"131":1}}],["банк",{"2":{"388":1}}],["баннер",{"2":{"260":2}}],["баннеры",{"2":{"4":1}}],["бандла",{"2":{"412":1,"453":1}}],["бандл",{"2":{"107":1,"412":1,"448":1,"459":1,"528":1}}],["бандлер",{"2":{"286":1}}],["бандлеры",{"2":{"286":1}}],["бандле",{"2":{"58":1,"443":1}}],["базой",{"2":{"288":1,"312":1,"326":1,"439":1}}],["базовая",{"2":{"337":1}}],["базовую",{"2":{"216":1,"297":1,"452":1}}],["базовые",{"2":{"242":1,"359":1,"419":1}}],["базовым",{"2":{"215":1,"322":1,"419":1}}],["базовых",{"2":{"193":1,"213":1,"237":1,"261":1,"358":1}}],["базовый",{"0":{"419":1},"2":{"126":1,"127":1,"214":1,"262":1,"343":1}}],["базового",{"0":{"343":1},"1":{"344":1},"2":{"212":1,"220":1,"335":1,"342":1,"425":1}}],["базовом",{"2":{"191":1,"337":1,"345":1,"381":1,"460":1}}],["базовое",{"2":{"190":1}}],["базовой",{"2":{"152":1,"230":1,"256":1,"395":1}}],["базе",{"0":{"42":1},"1":{"43":1,"44":1,"45":1,"46":1,"47":1,"48":1},"2":{"40":1,"58":1,"107":3,"116":2,"293":1,"306":1,"323":1,"333":1,"382":2,"449":1}}],["базы",{"2":{"17":2,"39":1,"107":1,"173":1,"324":2,"325":1,"326":1,"350":3,"377":1,"382":1,"436":1}}],["базу",{"2":{"17":2,"40":2,"58":1,"107":1,"253":1,"324":1,"326":1,"350":2}}],["баз",{"0":{"17":1},"1":{"18":1,"19":1},"2":{"17":1,"48":1,"350":1,"418":1}}],["базам",{"2":{"444":1}}],["базами",{"2":{"312":1,"417":1}}],["базах",{"2":{"43":1,"44":1,"47":1}}],["база",{"2":{"6":2,"41":1,"78":1,"247":1,"253":1,"312":1,"320":1,"324":3,"350":1,"444":1,"449":1}}],["synctex",{"2":{"444":1}}],["system",{"2":{"430":2}}],["sans",{"2":{"545":1}}],["sass",{"2":{"444":1}}],["savedposition",{"2":{"371":1}}],["savenote",{"2":{"325":3}}],["save",{"2":{"262":1,"444":1}}],["saveprompt",{"2":{"260":2}}],["sftp",{"2":{"444":1}}],["sfc",{"2":{"194":3,"202":1,"203":1,"215":1,"423":1,"444":2,"451":1}}],["snickerbockers",{"2":{"408":2}}],["snake",{"2":{"44":1,"206":1}}],["s3",{"2":{"407":1}}],["smoothscrolling",{"2":{"444":1}}],["smart",{"2":{"389":1}}],["sms",{"2":{"388":2}}],["smith",{"2":{"114":1}}],["svelte",{"2":{"366":1,"444":3,"451":2}}],["svgo",{"2":{"444":10}}],["svgresources",{"2":{"414":4}}],["svg",{"2":{"215":1,"262":1,"413":2,"414":3,"443":1,"444":2,"501":1}}],["square",{"2":{"296":4}}],["sql",{"2":{"17":3,"39":1,"58":1,"109":1,"324":1,"408":1,"444":1,"449":2,"460":1}}],["slidingheader",{"0":{"522":1}}],["slider",{"2":{"447":1}}],["sln",{"2":{"436":1}}],["slots",{"2":{"240":1}}],["slot=",{"2":{"240":4}}],["slot",{"2":{"240":8}}],["slot>",{"2":{"240":5,"246":2}}],["slug",{"2":{"88":1}}],["skeuomorphism",{"2":{"216":1}}],["ssg",{"0":{"461":1},"2":{"461":3}}],["ssd",{"2":{"444":1}}],["ss06",{"2":{"444":1}}],["ss03",{"2":{"444":1}}],["ss02",{"2":{"444":1}}],["ss01",{"2":{"444":1}}],["ssr",{"0":{"461":1},"2":{"371":1,"436":1,"444":1,"449":2,"461":9}}],["ssl",{"2":{"254":1,"382":1,"407":2}}],["ssh",{"2":{"134":1,"135":2,"408":14,"444":2}}],["sso",{"2":{"106":2}}],["s",{"0":{"135":1},"2":{"122":1,"134":1,"135":4,"136":1,"147":1,"254":1,"402":1,"408":1,"412":1,"443":1,"449":1,"499":1}}],["swagger",{"2":{"460":1}}],["swiper",{"2":{"447":1}}],["switch",{"2":{"153":1,"247":2,"296":1,"300":1,"302":1}}],["sw",{"2":{"103":2,"436":1,"461":1,"484":1}}],["scs",{"2":{"430":1,"431":2}}],["scss",{"2":{"20":1,"413":1,"444":1,"492":1,"497":2,"545":1}}],["sc",{"2":{"430":1}}],["scope",{"2":{"384":2,"542":1}}],["scoped",{"2":{"194":2}}],["scoped>",{"2":{"160":1,"194":1,"221":1,"304":1,"349":1,"413":1}}],["scmitem",{"2":{"444":1}}],["scmgroupinline",{"2":{"444":1}}],["scmgroup",{"2":{"444":1}}],["scms",{"2":{"430":1}}],["scm",{"2":{"213":1,"444":2}}],["scaffolding",{"2":{"103":1,"215":1,"489":1}}],["scrollbehavior",{"2":{"371":1}}],["scrolly",{"2":{"241":2}}],["scroll",{"2":{"162":6,"241":2,"448":1}}],["scroller",{"2":{"161":1}}],["screenwidthfactor",{"2":{"497":1}}],["screenshots",{"2":{"258":1}}],["screen",{"0":{"544":1},"2":{"103":2,"172":1,"489":1,"494":2,"496":1,"503":1,"530":1}}],["scripts",{"2":{"215":1,"408":1,"420":2}}],["script>",{"2":{"97":1,"114":1,"160":1,"162":1,"192":3,"194":1,"195":5,"203":1,"221":1,"242":1,"246":1,"273":1,"304":1,"305":1,"325":1,"330":1,"338":1,"339":1,"342":1,"344":1,"349":1,"353":1,"374":1,"413":1,"497":1,"501":1,"517":3,"526":1}}],["script",{"0":{"195":1},"2":{"97":1,"113":1,"114":1,"116":1,"121":1,"160":1,"162":1,"192":3,"194":2,"195":4,"203":1,"215":1,"216":3,"220":1,"221":3,"222":2,"234":1,"236":2,"237":1,"241":1,"242":1,"246":2,"260":1,"273":2,"304":1,"305":1,"325":1,"330":1,"338":1,"339":1,"342":1,"344":1,"347":1,"349":1,"353":1,"374":3,"380":1,"408":2,"413":1,"438":1,"444":1,"448":1,"492":1,"497":1,"501":1,"517":1,"526":1}}],["src=",{"2":{"192":1,"197":1,"412":3,"413":1,"517":1}}],["src",{"0":{"127":1,"162":1,"325":1,"326":1,"327":1,"330":1,"371":1,"372":1,"377":1,"421":1,"425":1,"426":1},"2":{"86":1,"97":1,"127":1,"197":1,"215":2,"219":2,"221":1,"244":1,"246":5,"247":2,"256":1,"258":1,"262":3,"368":1,"374":1,"412":1,"419":1,"420":5,"427":1,"443":2,"503":1,"526":1}}],["srs",{"2":{"9":1,"68":1}}],["sdlc",{"2":{"66":1}}],["sdk",{"0":{"52":1},"1":{"53":1,"54":1},"2":{"52":1,"389":1}}],["social",{"2":{"412":1}}],["sockets",{"2":{"382":1}}],["solvery",{"2":{"460":1}}],["solana",{"2":{"389":1}}],["solid",{"2":{"160":1,"218":2,"222":3,"497":1}}],["software",{"0":{"76":1},"2":{"66":1,"68":1}}],["somearr",{"2":{"451":4}}],["someimage",{"2":{"412":1}}],["someid",{"2":{"162":1}}],["somecomponent",{"2":{"241":1}}],["somefunc",{"2":{"107":1}}],["somevalue",{"2":{"54":2,"55":2}}],["some",{"2":{"54":2,"55":2,"235":1,"236":2,"240":2}}],["source",{"0":{"427":1,"430":1},"2":{"12":1,"39":1,"61":1,"306":1,"408":1,"420":1,"430":3,"442":1,"444":3,"487":1,"515":1}}],["seed",{"2":{"500":1}}],["sentry",{"2":{"444":2}}],["sendtoserver",{"2":{"385":1,"386":2}}],["sendmessage",{"2":{"342":2}}],["senddata",{"2":{"330":2}}],["send",{"2":{"323":1,"330":3}}],["sendrequest",{"2":{"322":4}}],["semi",{"2":{"444":1}}],["separate",{"2":{"444":1}}],["separation",{"0":{"269":1},"2":{"266":1}}],["serif",{"2":{"545":1}}],["series",{"2":{"421":3}}],["servers",{"2":{"360":1}}],["server",{"0":{"332":1},"2":{"108":3,"128":1,"132":1,"332":1,"382":1,"408":3,"444":5,"461":1}}],["serviceworker",{"2":{"261":2}}],["services",{"0":{"321":1,"323":1,"326":1,"328":1,"341":1,"352":1},"2":{"105":1,"247":1,"318":1,"322":4,"323":1,"325":1,"327":2,"328":1,"329":2,"330":1,"342":1,"344":1,"353":1,"419":1,"421":1,"499":1}}],["service",{"0":{"261":1,"344":1,"543":1},"2":{"39":1,"78":1,"103":2,"107":1,"209":1,"238":2,"251":1,"253":1,"260":1,"261":5,"262":1,"265":1,"321":8,"322":3,"323":2,"326":2,"328":2,"352":1,"383":1,"444":1,"461":3,"484":1,"489":1,"494":1,"503":1,"530":1,"541":1,"543":2}}],["search",{"2":{"374":1,"444":1}}],["session",{"0":{"353":1}}],["sessionstorage",{"0":{"352":1},"2":{"350":6,"351":2,"352":4,"353":3,"355":2}}],["sessionstore",{"2":{"350":1}}],["self",{"2":{"261":1,"316":4,"317":1,"322":2}}],["selected",{"2":{"325":4,"377":1}}],["selected=ref",{"2":{"325":1}}],["select=",{"2":{"55":1}}],["select",{"2":{"54":2,"58":1,"103":5,"170":1,"201":1,"459":2,"489":5}}],["second",{"2":{"522":1}}],["seconds",{"2":{"387":3}}],["seconds=ref",{"2":{"387":1}}],["security",{"2":{"444":1}}],["secure",{"2":{"134":1,"135":1,"382":1}}],["section>",{"2":{"240":2,"325":6,"330":4,"338":2}}],["section",{"2":{"172":2,"457":1}}],["secrets",{"2":{"408":2}}],["secret",{"2":{"57":1,"383":3}}],["setlocale",{"2":{"526":2}}],["setlogoutcallback",{"2":{"105":1}}],["setoptions",{"2":{"500":1}}],["setsomearr",{"2":{"451":1}}],["setvalue",{"2":{"426":2}}],["setting",{"2":{"408":1,"444":1}}],["settings",{"2":{"408":1,"444":1,"515":1}}],["settimeout",{"2":{"316":2,"323":1}}],["settokencallback",{"2":{"105":1}}],["setimmediate",{"2":{"308":2,"309":1}}],["setitem",{"2":{"98":1,"350":2,"352":1,"408":1}}],["setdbmanager",{"2":{"293":1}}],["setbaseurl",{"2":{"105":1}}],["setup>",{"2":{"114":1,"160":1,"162":1,"194":1,"195":1,"203":1,"221":1,"242":1,"246":1,"273":1,"304":1,"305":1,"325":1,"330":1,"338":1,"339":1,"342":1,"344":1,"349":1,"353":1,"374":1,"413":1}}],["setup",{"0":{"195":1},"2":{"97":1,"113":1,"116":1,"121":1,"194":1,"195":5,"220":1,"236":2,"237":1,"241":1,"246":1,"273":1,"347":1,"374":1,"380":1,"408":4,"444":1,"448":1,"449":1,"492":1,"497":1,"501":1,"526":1}}],["set",{"2":{"97":2,"98":2,"105":1,"302":2,"303":1,"352":2,"414":2,"439":1}}],["seo",{"0":{"461":1},"2":{"78":1,"88":1,"461":1}}],["sponsors",{"2":{"444":1}}],["sp",{"2":{"383":1}}],["spec",{"2":{"420":1,"444":1}}],["specs",{"2":{"383":1}}],["special",{"2":{"203":1,"242":1}}],["specification",{"2":{"68":1}}],["splide",{"2":{"447":1}}],["splice",{"2":{"298":1}}],["splashscreen",{"2":{"489":1}}],["splash",{"0":{"544":1},"2":{"103":2,"489":1,"494":2,"496":1,"503":1,"530":1,"544":1}}],["spinnercomponent",{"2":{"235":2}}],["spinner",{"0":{"160":1},"2":{"160":2}}],["spree",{"2":{"41":1}}],["span>post",{"2":{"330":1}}],["span>get",{"2":{"330":1}}],["span>",{"2":{"97":1,"160":1,"200":1,"222":2,"330":2,"338":2,"339":1}}],["span",{"2":{"97":1,"154":1,"160":1,"200":2,"222":4,"339":1}}],["spa",{"0":{"127":1,"253":1,"254":1,"366":1,"461":1},"1":{"255":1,"256":1,"257":1,"258":1,"259":1,"260":1},"2":{"6":1,"106":1,"122":2,"126":1,"249":1,"251":3,"253":5,"258":1,"260":1,"261":3,"264":1,"265":1,"364":3,"366":12,"367":1,"380":1,"381":1,"382":3,"383":2,"386":1,"388":4,"389":2,"390":1,"391":3,"398":1,"461":11,"496":1}}],["sum",{"2":{"444":2}}],["suggestselection",{"2":{"444":1}}],["suo",{"2":{"436":1}}],["sudo",{"2":{"408":3,"433":4,"434":1}}],["success=false",{"2":{"322":1}}],["success",{"2":{"321":3,"322":2}}],["subversion",{"2":{"430":1}}],["substring",{"2":{"414":2}}],["submodules",{"2":{"408":4,"409":1}}],["submit",{"2":{"387":1}}],["sub",{"2":{"297":1,"301":1,"374":2,"375":1,"383":2}}],["sublime",{"2":{"213":1}}],["subtitle",{"2":{"17":1,"18":1}}],["suspense",{"2":{"203":1}}],["sue",{"2":{"114":1}}],["surname",{"2":{"114":6}}],["supabase",{"0":{"40":1,"51":1,"52":1,"55":1,"56":1},"1":{"52":1,"53":2,"54":2,"55":1,"57":1,"58":1},"2":{"39":2,"40":2,"41":4,"52":2,"53":2,"54":8,"55":9,"57":1,"58":2,"107":2,"460":1}}],["side",{"2":{"461":1}}],["sidebarlayout",{"2":{"411":2}}],["sidebar>",{"2":{"240":1,"374":2}}],["sidebars",{"2":{"164":1}}],["sidebar",{"0":{"30":1,"90":1},"2":{"28":1,"240":2,"374":8,"377":2}}],["siblings",{"2":{"335":1}}],["size",{"2":{"413":5}}],["sizes",{"2":{"256":1,"258":1,"262":3}}],["size=",{"2":{"99":1,"412":1}}],["siri",{"2":{"140":1}}],["sites",{"0":{"132":1},"2":{"131":1}}],["site",{"2":{"108":3,"408":14,"461":1}}],["signinuser",{"2":{"387":2}}],["signature",{"2":{"383":2}}],["sign",{"2":{"106":1}}],["singlequote",{"2":{"444":1}}],["singleclick",{"2":{"444":1}}],["singleton",{"0":{"283":1,"340":1},"1":{"284":1,"285":1,"286":1,"287":1,"341":1,"342":1},"2":{"97":1,"266":1,"279":1,"286":2,"287":6,"293":1,"298":2,"311":1,"335":1,"340":1,"343":1}}],["single",{"0":{"271":1},"2":{"54":1,"106":1,"266":1,"461":1}}],["simplenavbar",{"0":{"538":1}}],["simpleheader",{"0":{"519":1}}],["simplefooter",{"0":{"509":1}}],["simpledrawer",{"0":{"506":1},"2":{"489":2,"507":1}}],["simpledialog",{"2":{"444":1}}],["simplestate",{"0":{"344":1},"2":{"344":1}}],["simple",{"0":{"275":1},"2":{"2":1,"266":1,"344":1,"444":4}}],["shims",{"2":{"444":1}}],["shrinkwrap",{"2":{"444":2}}],["shnpx",{"2":{"443":1}}],["shpnpm",{"2":{"443":1}}],["shallowref",{"2":{"448":2}}],["shaking",{"2":{"414":1,"453":1}}],["shape2",{"2":{"296":2}}],["shape1",{"2":{"296":2}}],["sha",{"2":{"191":1}}],["shaming",{"0":{"185":1}}],["shared",{"2":{"128":1}}],["sharing",{"2":{"108":1,"332":1}}],["shortcuts",{"2":{"258":1}}],["short",{"0":{"275":1},"2":{"256":1,"258":1,"262":1,"542":1}}],["showdocumentation",{"2":{"444":1}}],["showsuggestionsassnippets",{"2":{"444":1}}],["showmessage",{"2":{"342":3}}],["showmodal",{"2":{"247":1}}],["show=",{"2":{"198":1,"222":2,"260":2}}],["show",{"0":{"198":1},"2":{"147":1,"198":1,"199":3,"203":1,"242":1,"246":6,"387":2}}],["shopping",{"2":{"12":1}}],["shell",{"2":{"134":1,"409":1,"444":1}}],["sheet",{"0":{"476":1},"1":{"477":1,"478":1,"479":1,"480":1,"481":1,"482":1},"2":{"17":1,"477":1,"478":1,"479":1,"480":4}}],["sh$",{"2":{"102":1,"103":2,"127":1,"214":3,"222":1,"262":1,"324":1,"327":1,"331":2,"368":1,"419":2,"420":2,"421":1,"424":2,"428":1,"429":2,"433":2,"435":4,"436":2,"439":4,"489":1,"490":1,"491":1,"494":1}}],["shcurl",{"2":{"55":1}}],["sh",{"2":{"53":1,"340":1,"345":1,"444":2}}],["stylus",{"2":{"448":1}}],["stylelint",{"2":{"444":4}}],["styleci",{"2":{"444":2}}],["style=",{"2":{"305":1,"413":2}}],["stylesheet",{"2":{"217":1,"218":3}}],["styles",{"2":{"215":1,"217":1,"372":2}}],["style>",{"2":{"160":1,"194":1,"221":1,"304":1,"349":1,"413":1}}],["style",{"2":{"68":1,"160":1,"194":2,"221":2,"222":1,"304":1,"349":1,"413":1,"444":1,"460":2}}],["steps",{"2":{"408":2}}],["storage",{"0":{"353":1},"2":{"353":1}}],["story",{"2":{"230":1,"444":1}}],["stores",{"0":{"347":1},"2":{"326":1,"349":1}}],["store",{"0":{"346":1},"2":{"14":1,"126":1,"213":1,"253":4,"335":1,"436":1,"449":4}}],["storefront",{"2":{"10":1,"41":1,"495":1}}],["study",{"2":{"253":1}}],["studio",{"2":{"213":1,"360":1,"432":1,"439":1}}],["stupid",{"2":{"2":1,"266":1}}],["stickyscroll",{"2":{"444":1}}],["sticky",{"2":{"164":1,"444":1,"519":1,"520":1,"521":1}}],["stackblitz",{"2":{"444":3}}],["stackable",{"2":{"303":1}}],["stash",{"2":{"444":3}}],["staged",{"2":{"444":2}}],["stage",{"2":{"435":1,"436":1,"438":2}}],["staging",{"2":{"408":5,"436":1}}],["standalone",{"2":{"256":2,"258":1,"262":1,"542":1}}],["starbucks",{"2":{"253":1}}],["startotptimer",{"2":{"387":2}}],["started",{"2":{"247":2}}],["start",{"2":{"141":1,"142":1,"147":1,"256":1,"258":1,"262":1,"419":1,"420":1,"542":1}}],["static",{"2":{"371":1,"412":1,"461":1}}],["status>200",{"2":{"387":1}}],["status>=200",{"2":{"328":2}}],["status",{"2":{"247":2,"328":2,"382":1,"387":1,"436":1}}],["states",{"2":{"375":1,"377":2}}],["stateful",{"2":{"241":1,"449":1}}],["state",{"0":{"118":1,"449":1},"2":{"96":2,"110":1,"327":1,"344":2,"346":7,"351":1,"375":2,"377":3,"381":1,"384":1,"385":1,"444":1,"449":5}}],["stringhelpers",{"2":{"409":1}}],["strings",{"2":{"378":1}}],["string",{"2":{"234":1,"236":3,"246":2,"384":2,"412":1,"413":6,"421":2}}],["stringify",{"2":{"98":1,"325":3,"350":1}}],["strategies",{"2":{"149":1}}],["strong>child",{"2":{"353":1}}],["strong>counter",{"2":{"338":1}}],["strong>state",{"2":{"344":1}}],["strong>received",{"2":{"342":1}}],["strong>",{"2":{"114":4,"325":2,"338":1,"342":1,"344":1,"353":1}}],["strongly",{"2":{"83":1}}],["karma",{"2":{"444":10}}],["known",{"2":{"421":1}}],["komodo",{"2":{"213":1}}],["kobold",{"2":{"174":2}}],["keen",{"2":{"447":1}}],["keepalive",{"2":{"203":2}}],["keep",{"0":{"273":1,"275":1},"2":{"2":1,"266":2,"273":1,"298":1}}],["kebab",{"2":{"221":2}}],["keys",{"2":{"449":1}}],["keyup",{"2":{"222":2}}],["key=",{"2":{"162":1,"200":1,"222":2,"325":1,"374":1,"377":1}}],["keyframes",{"2":{"160":1}}],["key",{"0":{"200":1},"2":{"54":1,"55":6,"200":1,"203":1,"222":1,"238":3,"302":5,"378":2,"383":4,"408":9}}],["kic",{"0":{"273":1},"2":{"266":1,"273":1}}],["kit",{"2":{"20":1}}],["kiss",{"0":{"275":1},"2":{"2":1,"266":1,"275":2}}],["сэкономит",{"2":{"453":1}}],["сэкономить",{"2":{"358":1,"459":1}}],["сжатие",{"2":{"414":1}}],["сдерживающим",{"2":{"382":1}}],["сделки",{"2":{"185":1}}],["сделав",{"2":{"327":1,"453":1}}],["сделанный",{"2":{"461":1}}],["сделана",{"2":{"438":1}}],["сделаны",{"2":{"422":1}}],["сделан",{"2":{"325":1}}],["сделано",{"2":{"223":1,"260":1,"436":1,"438":1}}],["сделал",{"2":{"276":1,"456":1}}],["сделали",{"2":{"223":2,"226":1,"366":1,"368":1,"435":1,"461":1}}],["сделайте",{"2":{"216":1,"385":1,"454":1,"460":2}}],["сделает",{"2":{"194":1,"209":1,"426":1}}],["сделаем",{"2":{"64":1,"88":1,"138":2,"226":1}}],["сделать",{"2":{"7":1,"11":1,"12":1,"25":1,"35":1,"61":1,"62":1,"106":2,"107":3,"126":1,"134":1,"136":1,"148":1,"177":1,"185":1,"214":1,"216":1,"218":2,"219":1,"223":3,"232":1,"246":1,"247":1,"248":1,"249":1,"254":1,"261":1,"276":2,"306":1,"314":3,"323":1,"335":1,"350":1,"358":1,"367":1,"371":1,"374":1,"385":1,"386":1,"389":1,"407":1,"436":1,"438":2,"439":1,"448":2,"449":1,"451":1,"452":1,"461":1,"543":1}}],["сдвигает",{"2":{"314":1}}],["сша",{"2":{"275":1}}],["сформировать",{"2":{"374":1}}],["сформулировал",{"2":{"149":1}}],["сферы",{"2":{"275":1}}],["сцену",{"2":{"231":1}}],["сцены",{"2":{"228":1}}],["сценарием",{"2":{"321":1}}],["сценариев",{"2":{"219":1,"358":1,"390":1}}],["сценариям",{"2":{"276":1}}],["сценариях",{"2":{"253":1,"374":1,"377":1}}],["сценария",{"2":{"112":1,"192":1,"225":1,"228":1,"315":1,"411":1,"422":1}}],["сценарий",{"0":{"514":1},"1":{"515":1,"516":1},"2":{"106":1,"261":1,"530":1}}],["сценарии",{"2":{"67":1,"225":1,"253":2,"387":1,"417":1,"533":1}}],["сюда",{"2":{"215":1,"484":1}}],["сбить",{"2":{"420":1}}],["сбивать",{"2":{"308":1}}],["сбивают",{"2":{"182":1}}],["сброса",{"2":{"222":1}}],["сбоя",{"2":{"261":1}}],["сбоку",{"2":{"155":1}}],["сбор",{"2":{"496":1}}],["сборник",{"2":{"414":1}}],["сборок",{"2":{"218":1,"440":1,"443":1}}],["сбора",{"2":{"140":1,"154":1,"369":1}}],["сборку",{"2":{"234":1,"440":1}}],["сборке",{"2":{"215":1,"216":1,"262":1,"350":1}}],["сборки",{"2":{"126":1,"192":1,"213":1,"219":1,"224":1,"262":1,"427":1}}],["сборка",{"0":{"443":1},"2":{"116":1,"192":1,"219":1,"408":1,"443":1}}],["сборщиков",{"2":{"215":1,"235":1}}],["сборщиком",{"2":{"115":1,"193":1,"194":1,"215":1,"219":1}}],["сборщики",{"2":{"193":1,"235":1}}],["сборщика",{"0":{"193":1},"2":{"118":1,"193":2,"194":1,"195":1,"212":2,"214":1,"262":1,"443":3,"492":1}}],["сборщик",{"2":{"110":1,"117":1,"192":1,"193":2,"194":1,"195":1,"215":2,"273":1,"359":1,"443":3}}],["схожих",{"2":{"418":1}}],["схожи",{"2":{"418":1,"451":1}}],["схожести",{"2":{"145":1}}],["схеме",{"2":{"299":1}}],["схема",{"2":{"94":1,"180":1,"184":1,"185":1,"186":1}}],["схемы",{"2":{"38":1,"174":1,"350":1,"364":1,"377":1}}],["схему",{"2":{"17":1,"131":1,"326":1}}],["сне",{"2":{"448":1}}],["снять",{"2":{"261":1,"273":1,"298":1,"461":1}}],["снятие",{"2":{"293":1}}],["снятии",{"2":{"222":1}}],["снятия",{"2":{"175":1}}],["сняты",{"2":{"119":1}}],["сначала",{"2":{"172":1,"190":1,"192":1,"193":1,"194":1,"195":1,"214":1,"223":1,"261":6,"303":1,"307":1,"326":1,"343":1,"345":1,"366":1,"370":1,"384":1,"387":1,"419":1}}],["снова",{"2":{"162":2,"203":1,"299":1,"302":1,"383":1,"387":1,"424":1}}],["сниппетов",{"2":{"530":1}}],["сниппет",{"2":{"308":2}}],["снизить",{"2":{"306":1,"383":1,"459":1}}],["снизу",{"2":{"29":1,"89":1}}],["снижает",{"2":{"461":1}}],["снижают",{"2":{"450":1}}],["снижаться",{"2":{"116":1}}],["снижением",{"2":{"191":1}}],["снимку",{"2":{"436":1}}],["снимке",{"2":{"142":1,"343":1}}],["снимок",{"2":{"377":1}}],["снимаем",{"2":{"262":1,"273":1,"374":1}}],["снимать",{"2":{"106":1}}],["снимаются",{"2":{"106":1}}],["считывать",{"2":{"449":1}}],["считывателем",{"2":{"388":1}}],["считывает",{"2":{"241":1,"501":1}}],["считая",{"2":{"309":1}}],["считаются",{"2":{"255":1}}],["считает",{"2":{"449":1}}],["считается",{"2":{"108":1,"135":1,"172":1,"174":1,"350":1,"377":1,"383":1,"388":1,"389":1,"460":1}}],["считаем",{"2":{"237":1,"332":1}}],["считаться",{"2":{"265":1}}],["считать",{"2":{"228":1,"255":1,"312":1,"319":1,"452":1}}],["счастливо",{"2":{"218":1}}],["счастью",{"2":{"135":1,"309":1}}],["счетчики",{"2":{"230":1}}],["счетчика",{"2":{"223":1,"337":1}}],["счетчик",{"2":{"214":1,"337":1,"339":1}}],["счет",{"2":{"114":1,"144":1,"191":1,"251":1}}],["сгенеренные",{"2":{"461":1}}],["сгенерировавшего",{"2":{"315":1}}],["сгенерированные",{"2":{"262":1}}],["сгенерированный",{"2":{"215":1}}],["сгенерировать",{"2":{"261":1,"407":1}}],["сгенерился",{"2":{"83":1}}],["сгенерить",{"2":{"81":1}}],["сгорания",{"2":{"460":1}}],["сгруппированы",{"2":{"299":1}}],["сгруппированные",{"2":{"269":1}}],["сгруппированных",{"2":{"269":1}}],["сгруппировать",{"2":{"114":1}}],["сгиба",{"2":{"174":1}}],["ссылаясь",{"2":{"426":1}}],["ссылаемся",{"2":{"374":1}}],["ссылаемой",{"2":{"201":1}}],["ссылается",{"2":{"316":1,"352":1}}],["ссылаются",{"2":{"302":1}}],["ссылающийся",{"2":{"216":1}}],["ссылаться",{"2":{"112":1,"195":2,"200":1,"215":2,"219":1,"222":1,"237":1,"298":1,"310":1,"426":1}}],["ссылок",{"2":{"165":1,"174":2,"273":2,"293":1,"374":1,"377":1}}],["ссылкой",{"2":{"173":1,"174":1}}],["ссылки",{"2":{"173":1,"174":1,"206":3,"212":1,"236":1,"238":1,"246":1,"253":1,"270":1,"283":1,"314":1,"321":2,"346":1,"374":1,"377":1,"380":1,"443":1}}],["ссылке",{"2":{"133":1,"195":1,"314":1,"337":1,"516":1}}],["ссылку",{"2":{"88":1,"127":1,"133":1,"162":3,"217":1,"260":1,"287":2,"298":1,"321":1,"350":1,"374":1}}],["ссылками",{"2":{"29":1,"33":1,"174":1,"238":1}}],["ссылка",{"0":{"173":1},"2":{"23":1,"88":1,"96":1,"114":1,"165":1,"173":2,"174":2,"236":1,"321":1,"369":1}}],["смартфоне",{"2":{"461":1}}],["смартфона",{"2":{"461":1}}],["смарт",{"2":{"389":1}}],["смог",{"2":{"427":1}}],["смогли",{"2":{"122":1,"143":1,"149":1}}],["смогло",{"2":{"61":1}}],["сможет",{"2":{"309":1,"314":1,"496":1}}],["сможете",{"2":{"213":1,"335":2,"456":1}}],["сможем",{"2":{"218":1,"269":1,"309":1,"326":1,"347":1,"432":1}}],["смонтируем",{"2":{"216":1}}],["смонтирован",{"2":{"195":1}}],["смонтировать",{"2":{"192":1,"425":1}}],["смесь",{"2":{"366":1}}],["смешивает",{"2":{"277":1,"451":1}}],["смешиваясь",{"2":{"145":1}}],["смена",{"2":{"524":1,"535":1}}],["смену",{"2":{"241":1,"451":1}}],["смене",{"2":{"41":1}}],["см",{"2":{"116":1,"164":1,"203":1,"230":1,"234":1,"247":1,"255":1,"298":1,"340":1,"350":1,"384":1,"438":1}}],["смысле",{"2":{"199":1,"275":1,"388":1,"449":1}}],["смысл",{"2":{"115":1,"159":1,"374":1,"461":1}}],["смысла",{"2":{"38":1,"178":1}}],["смыслом",{"2":{"16":1}}],["сродни",{"2":{"319":1}}],["срочным",{"2":{"156":2}}],["срока",{"2":{"125":1,"135":1}}],["срок",{"2":{"106":3,"135":1}}],["сроком",{"2":{"106":1}}],["сроков",{"2":{"67":1}}],["средних",{"2":{"344":1}}],["средним",{"2":{"297":1}}],["средний",{"2":{"297":3}}],["среднем",{"2":{"460":1}}],["средней",{"2":{"275":1}}],["среднего",{"2":{"191":2,"349":1,"460":1}}],["среда",{"2":{"214":1,"444":1}}],["средам",{"2":{"140":1,"275":1}}],["среде",{"2":{"188":1,"425":1}}],["среды",{"2":{"153":1,"167":1,"212":2,"241":1,"273":1,"307":1}}],["средство",{"2":{"383":1,"443":1,"495":1}}],["средством",{"2":{"187":1}}],["средствами",{"2":{"448":1,"459":1}}],["средствах",{"2":{"439":1}}],["средства",{"2":{"339":1,"439":3,"448":1,"450":1,"459":1}}],["средств",{"2":{"61":1,"128":1,"141":1,"179":1,"236":1,"388":1,"417":1}}],["среди",{"2":{"39":1,"213":2,"253":1,"324":1,"346":1,"450":1}}],["сработает",{"2":{"422":2}}],["срабатывание",{"2":{"421":1}}],["срабатывания",{"2":{"260":1}}],["срабатывают",{"2":{"371":1}}],["срабатывает",{"2":{"246":1,"260":1,"309":1,"315":2}}],["сравнится",{"2":{"461":1}}],["сравниваются",{"2":{"459":1}}],["сравним",{"2":{"111":1,"195":2}}],["сравнений",{"2":{"421":1}}],["сравнении",{"2":{"191":1}}],["сравнения",{"0":{"181":1},"2":{"246":1}}],["сравнению",{"2":{"115":1,"178":1,"190":1,"215":1,"247":1,"248":1,"264":1,"349":1,"366":1,"416":1,"528":1}}],["сравнение",{"2":{"4":1,"114":1,"181":1}}],["сразу",{"2":{"33":1,"61":1,"64":1,"89":1,"106":1,"201":1,"202":1,"299":1,"309":1,"312":1,"340":1,"412":1,"461":2,"496":1,"541":1}}],["скилл",{"2":{"460":1}}],["скидка",{"2":{"94":1}}],["склонений",{"2":{"448":1,"524":1}}],["сквозные",{"2":{"426":1}}],["сквозном",{"2":{"426":1}}],["скажется",{"2":{"218":1}}],["скажем",{"2":{"58":1}}],["скачивает",{"2":{"408":1}}],["скачивания",{"2":{"186":1}}],["скачок",{"2":{"344":1}}],["скачайте",{"2":{"217":1,"218":1}}],["скачает",{"2":{"214":1}}],["скачать",{"0":{"362":1},"2":{"186":2,"218":1,"460":1}}],["сканируют",{"2":{"173":1}}],["сказать",{"2":{"143":1,"230":1,"314":1,"380":1,"451":1}}],["сказано",{"2":{"125":1,"344":1,"389":1}}],["скриншота",{"2":{"375":1}}],["скриншот",{"2":{"353":1,"369":1}}],["скриншоты",{"2":{"314":1}}],["скриншоте",{"2":{"186":1,"314":1}}],["скриптов",{"2":{"428":1}}],["скриптом",{"2":{"350":1}}],["скрипту",{"2":{"350":1}}],["скрипты",{"2":{"314":1,"316":1,"317":1,"366":1}}],["скрипте",{"2":{"246":2}}],["скриптами",{"2":{"461":1}}],["скриптам",{"2":{"450":1}}],["скрипта",{"2":{"215":1,"222":1,"246":1,"262":2,"315":1,"316":1,"385":1,"421":1,"461":1}}],["скрипт",{"2":{"107":2,"262":1,"315":1,"316":1}}],["скрываем",{"2":{"387":1}}],["скрывается",{"2":{"534":1}}],["скрывает",{"2":{"181":1,"198":1,"337":1}}],["скрывать",{"2":{"271":1}}],["скрываться",{"2":{"199":1}}],["скрывая",{"2":{"199":1}}],["скрывают",{"2":{"182":1,"199":1}}],["скрываются",{"2":{"167":1}}],["скрытых",{"2":{"435":1}}],["скрытый",{"2":{"435":1}}],["скрытым",{"2":{"337":1}}],["скрытые",{"0":{"183":1},"2":{"435":1}}],["скрытие",{"2":{"306":1}}],["скрытия",{"2":{"170":1,"199":1}}],["скрыто",{"2":{"199":1}}],["скрыта",{"2":{"181":1}}],["скрыть",{"2":{"169":1,"306":1,"318":1}}],["скролбара",{"2":{"504":1}}],["скролл",{"2":{"241":1}}],["скроллера",{"2":{"161":3}}],["скроллер",{"0":{"161":1},"1":{"162":1},"2":{"161":2,"162":1}}],["скромный",{"2":{"303":1}}],["скромного",{"2":{"303":1}}],["скромное",{"2":{"192":1,"431":1}}],["скроем",{"2":{"86":1}}],["скомпрометирован",{"2":{"383":1}}],["скомпоновать",{"2":{"223":1}}],["скомпилированным",{"2":{"134":1}}],["скомпилировать",{"2":{"134":1}}],["скобок",{"2":{"222":1}}],["скобки",{"2":{"192":1}}],["скопировано",{"2":{"237":1}}],["скопированы",{"2":{"215":1}}],["скопировать",{"2":{"218":1,"374":1}}],["скопируйте",{"2":{"218":1,"453":1}}],["сколько",{"2":{"125":1,"159":2,"200":1,"220":1,"307":1,"350":1,"377":1,"387":1,"388":1,"421":2,"443":1}}],["скоро",{"2":{"430":1}}],["скоростью",{"2":{"191":1,"324":1}}],["скорость",{"2":{"116":1,"412":1}}],["скорости",{"2":{"116":2,"366":1,"461":1}}],["скорее",{"2":{"125":1,"128":1,"314":1}}],["скорей",{"2":{"34":1,"449":1}}],["скоуп",{"2":{"67":1}}],["скелета",{"2":{"103":1}}],["скелет",{"2":{"11":1,"214":1,"495":1}}],["супротив",{"2":{"525":1}}],["субд",{"2":{"431":1,"438":1}}],["субъективное",{"2":{"485":1}}],["субъекту",{"2":{"298":1}}],["субъекта",{"2":{"297":1,"383":1}}],["субъект",{"2":{"297":5,"298":2}}],["суффиксальной",{"2":{"317":1}}],["суффикса",{"2":{"316":1,"321":1}}],["суть",{"2":{"303":1,"345":1}}],["сути",{"2":{"13":1,"99":1,"106":1,"107":1,"172":1,"266":1,"270":1,"293":1,"366":1,"448":1,"449":1}}],["сумме",{"2":{"178":1}}],["суммарный",{"2":{"230":1}}],["сумма",{"2":{"178":1,"183":1}}],["сумму",{"2":{"178":1}}],["существенные",{"2":{"451":1}}],["существенный",{"2":{"276":1,"342":1}}],["существенное",{"2":{"323":1}}],["существенно",{"2":{"308":1}}],["существовало",{"2":{"430":1}}],["существовать",{"2":{"274":1,"283":1,"417":1,"430":1}}],["существование",{"2":{"230":1}}],["существовавшие",{"2":{"119":1}}],["существует",{"2":{"113":1,"116":2,"125":3,"133":1,"134":1,"135":1,"137":1,"141":1,"165":1,"167":1,"190":1,"191":2,"192":1,"195":2,"216":1,"223":1,"230":1,"232":1,"240":1,"247":1,"260":1,"261":1,"270":1,"278":1,"282":2,"285":1,"287":2,"298":1,"303":1,"308":1,"314":1,"315":1,"327":1,"350":3,"368":1,"375":1,"383":3,"386":2,"389":3,"417":1,"420":1,"445":1,"495":1}}],["существующей",{"2":{"489":1}}],["существующего",{"2":{"460":1}}],["существующем",{"2":{"415":1}}],["существующих",{"2":{"12":1,"226":1}}],["существующие",{"0":{"10":1},"2":{"294":1}}],["существуют",{"2":{"67":1,"121":1,"125":1,"137":1,"158":1,"172":2,"191":2,"203":1,"218":1,"230":1,"240":1,"285":1,"306":1,"308":1,"350":1,"386":1,"389":2,"417":1,"418":1,"434":1,"436":1,"451":1}}],["сущность",{"2":{"301":2,"318":2,"449":1}}],["сущностей",{"2":{"16":1,"67":1}}],["сущности",{"0":{"43":1},"2":{"16":1,"20":1,"43":1,"301":2,"306":1,"318":1,"343":1,"383":1,"451":1}}],["сущностями",{"2":{"3":1,"67":2}}],["сабмодулями",{"2":{"409":1}}],["сабхедер",{"2":{"29":1}}],["сахара",{"2":{"347":1}}],["санитизации",{"2":{"223":1}}],["сайд",{"2":{"62":1}}],["сайдбара",{"2":{"536":1}}],["сайдбаром",{"2":{"534":1}}],["сайдбаре",{"2":{"90":1}}],["сайдбар",{"2":{"30":1,"33":2,"35":1,"86":1,"534":1,"536":1}}],["сайтом",{"2":{"184":1,"460":1,"484":1}}],["сайтов",{"2":{"125":3,"174":1,"364":1,"366":1,"461":1}}],["сайту",{"2":{"106":1,"125":1,"261":1,"367":1,"389":1,"407":2}}],["сайте",{"2":{"48":1,"106":1,"107":1,"131":1,"164":1,"169":1,"186":2,"217":2,"218":2,"241":1,"317":1,"349":1,"361":1,"363":1,"383":1,"443":1,"448":1,"449":1,"460":1,"461":1,"524":1}}],["сайт",{"0":{"79":1},"2":{"26":1,"79":1,"103":2,"106":1,"135":1,"169":1,"181":1,"186":1,"213":5,"214":6,"215":2,"218":2,"220":1,"314":1,"366":3,"383":1,"405":1,"407":4,"408":1,"409":1,"428":2,"439":1,"452":1,"460":2,"461":2,"495":1,"515":1,"516":1}}],["сайты",{"0":{"23":1},"2":{"23":1,"107":1,"158":1,"312":1,"350":1}}],["сайтами",{"2":{"383":1,"461":1}}],["сайтах",{"2":{"89":1,"167":1,"169":1,"186":1,"271":1}}],["сайта",{"0":{"25":1},"2":{"9":1,"25":2,"26":1,"27":1,"39":1,"106":4,"122":1,"124":2,"131":1,"136":1,"138":1,"143":1,"144":1,"158":1,"165":1,"167":1,"168":1,"171":1,"172":1,"174":1,"186":1,"213":1,"217":2,"218":1,"383":1,"408":2,"419":1,"432":1,"448":1,"450":1,"451":1,"452":1,"461":3,"494":1,"496":2,"515":1,"524":2}}],["сама",{"2":{"149":1,"159":1,"257":1,"415":1}}],["самая",{"2":{"121":1,"314":1,"409":1,"433":1}}],["самых",{"2":{"161":1,"247":1,"283":1,"390":1}}],["самыми",{"2":{"261":1}}],["самым",{"2":{"159":1,"172":1,"176":1,"191":1,"194":1,"201":1,"424":1,"432":1,"438":1,"449":1,"461":1}}],["самые",{"2":{"145":1,"309":1,"324":1,"443":1,"451":1}}],["самый",{"2":{"17":1,"23":1,"32":1,"106":1,"235":1,"269":1,"283":1,"286":1,"298":1,"309":1,"339":1,"371":1,"378":1,"382":1,"384":1,"408":1,"450":1,"460":1}}],["сами",{"2":{"128":1,"138":1,"276":1,"407":1,"409":1,"443":1,"460":1,"503":1}}],["самим",{"2":{"11":1,"86":1,"461":1}}],["самую",{"2":{"25":1}}],["самоучитель",{"2":{"460":1}}],["самоуправляемые",{"2":{"389":1}}],["самописный",{"2":{"459":1}}],["само",{"2":{"430":1}}],["самообновляющийся",{"2":{"214":1}}],["самостоятельные",{"2":{"418":1}}],["самостоятельный",{"2":{"107":1,"241":1}}],["самостоятельной",{"2":{"421":1}}],["самостоятельно",{"2":{"124":1,"128":1,"271":1,"387":1,"407":2}}],["самой",{"2":{"34":1,"93":1,"214":1,"431":1,"450":1,"461":1}}],["самого",{"2":{"3":1,"141":1,"174":1,"204":1,"215":1,"229":2,"240":1,"371":1,"408":1,"426":1,"495":1}}],["самому",{"2":{"4":1,"26":1,"276":1,"292":1,"451":1,"459":1}}],["самом",{"2":{"3":1,"124":1,"128":1,"134":1,"135":1,"191":1,"209":1,"277":1,"314":1,"337":1,"366":1,"377":1,"381":1,"448":1}}],["самое",{"2":{"2":1,"3":1,"33":1,"35":1,"48":1,"88":1,"99":1,"106":2,"140":1,"143":1,"215":1,"222":1,"223":1,"238":1,"253":1,"293":2,"302":1,"383":1,"409":1,"444":1,"451":1,"454":1}}],["сам",{"2":{"3":1,"97":1,"103":1,"191":1,"253":1,"287":1,"297":1,"316":1,"358":1,"417":1,"448":1,"449":2,"455":1}}],["сенсорных",{"2":{"507":1}}],["сенсорное",{"2":{"141":1,"158":1}}],["сеансов",{"2":{"350":1}}],["сессий",{"2":{"354":1}}],["сессионного",{"2":{"353":1}}],["сессионное",{"2":{"353":1}}],["сессионные",{"0":{"350":1}}],["сессиях",{"2":{"161":1}}],["сессиями",{"0":{"98":1},"2":{"98":1}}],["сестры",{"2":{"230":1}}],["селекторы",{"2":{"192":1}}],["секретного",{"2":{"383":1}}],["секретный",{"2":{"383":4}}],["секундах",{"2":{"387":1}}],["секунды",{"2":{"316":1,"323":2}}],["секунду",{"2":{"314":2}}],["секунд",{"2":{"158":1,"387":1,"388":1,"444":1}}],["секцию",{"2":{"221":1,"353":1}}],["секцией",{"2":{"174":1}}],["секций",{"2":{"158":1}}],["секции",{"2":{"144":1,"169":1,"172":2,"194":1,"195":1,"216":2,"221":2,"222":4,"234":1,"255":1,"260":1,"383":1,"420":1}}],["секция",{"0":{"174":1},"2":{"4":1,"11":1,"215":1,"314":1,"383":2,"420":1}}],["сегодняшний",{"2":{"138":1,"429":1,"431":1}}],["сегодня",{"2":{"138":1,"149":1,"152":1,"167":2,"190":2,"261":1,"271":1,"327":1,"366":2,"390":1,"430":1}}],["сегментировать",{"2":{"390":1}}],["сегмент",{"2":{"230":1}}],["сегмента",{"2":{"222":1}}],["сегментах",{"2":{"126":1}}],["сегментом",{"2":{"125":1}}],["сегменты",{"2":{"125":1,"222":1}}],["сеттерами",{"2":{"449":1}}],["сетью",{"2":{"389":1}}],["сеть",{"2":{"261":4,"389":2}}],["сетям",{"2":{"389":2}}],["сетями",{"2":{"191":1}}],["сетях",{"2":{"180":1,"255":1}}],["сетке",{"2":{"167":1}}],["сетевое",{"2":{"312":1}}],["сетевой",{"2":{"307":1,"327":2,"332":1,"382":1}}],["сетевым",{"2":{"333":1}}],["сетевыми",{"2":{"253":1}}],["сетевые",{"2":{"309":1,"312":1,"327":1,"332":1,"417":1,"423":1}}],["сетевых",{"2":{"125":1,"261":1,"312":1,"327":2,"328":1,"331":1,"366":1,"381":3,"418":1}}],["сетей",{"0":{"174":1},"2":{"125":1,"174":2}}],["сети",{"2":{"11":1,"94":1,"125":5,"187":1,"192":1,"261":4,"314":1,"323":1,"327":1,"366":1,"389":6,"439":1}}],["семантические",{"2":{"457":1}}],["семантически",{"2":{"87":1}}],["сейчас",{"2":{"40":1,"150":1,"193":1,"210":1,"303":1,"325":1,"372":1,"386":1,"387":1,"407":1,"438":1,"460":1}}],["себя",{"0":{"124":1,"392":1},"1":{"125":1,"393":1,"394":1,"395":1,"396":1,"397":1,"398":1,"399":1,"400":1,"401":1,"402":1,"403":1,"404":1},"2":{"39":1,"68":2,"69":1,"73":1,"75":1,"122":1,"128":1,"134":1,"140":2,"154":2,"156":1,"157":1,"190":2,"191":1,"193":1,"199":1,"200":1,"202":1,"219":1,"240":1,"251":1,"261":1,"273":1,"274":1,"276":1,"297":1,"301":1,"318":1,"327":1,"351":1,"366":1,"367":1,"371":1,"412":1,"417":2,"435":1,"439":2,"440":1,"449":1,"451":2,"460":1,"495":1,"499":1,"533":1}}],["себе",{"2":{"26":2,"128":1,"138":1,"159":1,"193":1,"213":1,"271":1,"277":1,"366":1,"415":1,"430":1,"451":1}}],["серию",{"2":{"419":1}}],["серия",{"2":{"383":1}}],["сериализуя",{"2":{"326":1}}],["сериализуемой",{"2":{"325":1}}],["сериализуемыми",{"2":{"314":1}}],["сериализуемые",{"2":{"314":1,"318":1}}],["сериализовать",{"2":{"350":1}}],["сериализован",{"2":{"315":1}}],["сериализованы",{"2":{"299":1}}],["сериализовываться",{"2":{"300":1}}],["серьезная",{"2":{"350":1}}],["серьезной",{"2":{"314":1}}],["серьезных",{"2":{"10":1,"94":1,"149":1}}],["серебряной",{"2":{"232":1,"253":1}}],["середине",{"2":{"29":1}}],["серая",{"2":{"191":1}}],["серой",{"2":{"153":1}}],["сертификация",{"2":{"460":1}}],["сертификации",{"2":{"135":1,"460":1}}],["сертификатов",{"2":{"135":1}}],["сертификат",{"2":{"135":5,"254":1,"407":3}}],["сертификата",{"2":{"124":1,"135":7,"136":1}}],["сертификаты",{"2":{"4":1,"407":1}}],["сертифицированных",{"2":{"135":1}}],["сертифицирующим",{"2":{"135":1}}],["сердечка",{"2":{"96":1,"97":1}}],["сервиcа",{"2":{"107":1}}],["сервисе",{"2":{"323":1,"381":1,"387":1,"421":1}}],["сервисом",{"2":{"322":1,"383":1}}],["сервисов",{"2":{"39":1,"107":3,"134":1,"180":2,"322":2,"328":1,"333":1,"366":1,"381":1,"383":1,"386":1,"439":1}}],["сервису",{"2":{"318":1}}],["сервисный",{"2":{"499":1}}],["сервисных",{"2":{"241":1,"247":1}}],["сервисного",{"2":{"261":3}}],["сервисах",{"2":{"178":1,"316":1,"418":1}}],["сервиса",{"2":{"107":2,"109":1,"238":2,"247":2,"261":1,"262":2,"320":1,"321":1,"325":1,"340":1,"351":1,"382":1,"420":2,"421":1,"440":1,"461":1}}],["сервисами",{"2":{"125":1,"277":1,"318":1,"321":1,"349":1,"354":1,"420":1,"429":1,"496":1}}],["сервисам",{"2":{"41":1,"314":1,"318":2,"333":1}}],["сервисы",{"0":{"40":1},"2":{"106":1,"107":1,"128":1,"209":1,"312":1,"318":1,"381":1,"409":1,"418":1,"439":2,"441":1,"444":1,"449":1,"460":1,"533":1}}],["сервис",{"0":{"105":1},"2":{"10":1,"39":1,"40":2,"41":1,"58":1,"105":1,"107":1,"238":1,"261":4,"294":1,"295":1,"321":1,"323":2,"328":2,"330":1,"340":2,"343":1,"387":2,"389":1,"419":2,"420":1,"427":1,"451":1,"460":1,"484":1,"533":1}}],["серверу",{"2":{"135":2,"332":2,"366":1,"383":3,"386":1}}],["серверов",{"2":{"128":1,"131":1,"133":2}}],["сервером",{"2":{"11":1,"107":1,"128":1,"135":1,"215":1,"274":3,"302":1,"306":1,"318":1,"327":1,"332":2,"366":1,"381":1,"382":1,"384":2,"389":1,"421":1,"461":1}}],["серверы",{"0":{"125":1,"133":1},"1":{"127":1},"2":{"125":2,"137":1,"389":1}}],["серверами",{"2":{"324":1,"332":1}}],["серверам",{"2":{"275":1}}],["серверах",{"2":{"135":1,"213":1,"389":1}}],["сервера",{"0":{"128":1,"129":1,"131":1},"1":{"129":1,"130":2,"131":1,"132":2,"133":1},"2":{"108":1,"122":2,"124":1,"125":2,"126":1,"128":3,"131":4,"135":2,"214":1,"253":2,"274":1,"301":1,"307":1,"330":1,"331":1,"332":1,"371":1,"382":2,"386":1,"388":2,"412":1,"429":1,"439":1,"448":1,"461":6,"524":1}}],["сервере",{"2":{"40":1,"70":1,"107":1,"108":2,"125":1,"128":2,"134":3,"135":1,"254":1,"261":1,"300":1,"327":2,"366":2,"382":3,"383":1,"384":1,"402":1,"405":1,"407":1,"408":2,"461":1,"469":1,"470":1}}],["серверному",{"2":{"461":1}}],["серверного",{"2":{"332":1,"371":1}}],["серверной",{"2":{"128":1,"423":1}}],["серверный",{"2":{"382":1}}],["серверным",{"2":{"132":1}}],["серверных",{"2":{"109":1}}],["серверные",{"2":{"40":1,"253":1,"366":1}}],["серверная",{"0":{"6":1}}],["сервер",{"0":{"134":1,"331":1},"1":{"332":1},"2":{"39":1,"105":1,"107":2,"108":2,"109":2,"125":1,"126":2,"127":1,"128":9,"129":1,"131":1,"133":1,"134":3,"136":2,"137":1,"214":3,"215":1,"217":1,"222":1,"312":2,"327":2,"329":2,"330":3,"331":1,"332":4,"350":1,"366":1,"381":1,"382":1,"383":2,"385":2,"386":1,"387":2,"388":3,"407":1,"408":2,"419":1,"429":2,"440":1,"444":1,"460":1,"461":3}}],["спуститься",{"2":{"375":1}}],["спальни",{"2":{"461":1}}],["спать",{"2":{"461":1}}],["спагетти",{"2":{"276":2}}],["спам",{"0":{"187":1}}],["спланировать",{"2":{"250":1}}],["спиннера",{"2":{"159":3}}],["спиннер",{"2":{"159":1}}],["спиннеры",{"0":{"159":1},"1":{"160":1},"2":{"159":1}}],["списание",{"2":{"179":1}}],["список",{"0":{"268":1,"278":1},"1":{"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":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,"306":1,"307":1,"308":1,"309":1},"2":{"31":1,"98":2,"108":2,"110":3,"120":1,"128":1,"135":1,"151":1,"152":1,"154":3,"158":1,"161":2,"162":1,"165":1,"170":2,"187":1,"195":1,"202":1,"219":1,"220":1,"222":7,"223":2,"226":1,"230":5,"231":1,"248":1,"255":1,"263":1,"266":1,"277":1,"278":1,"282":1,"349":1,"350":1,"366":1,"369":2,"371":1,"374":1,"375":2,"380":3,"421":1,"425":1,"433":1}}],["списков",{"2":{"161":1,"170":1,"199":1,"369":1,"524":1}}],["списком",{"2":{"11":1,"41":1,"125":1,"223":1,"247":2,"369":1,"374":1}}],["списках",{"2":{"154":1,"220":1}}],["спискам",{"2":{"145":1}}],["списка",{"2":{"143":1,"153":1,"154":1,"161":2,"162":3,"167":1,"203":1,"212":1,"222":4,"230":1,"247":4,"251":1,"314":1,"325":1,"369":1}}],["списке",{"2":{"3":1,"162":1,"167":1,"247":1,"292":1,"306":1,"325":1}}],["спросить",{"2":{"374":1}}],["спроектированного",{"2":{"333":1}}],["спровоцировать",{"2":{"158":1}}],["спрайтовых",{"2":{"218":1}}],["справедливо",{"2":{"350":1}}],["справочную",{"2":{"460":1}}],["справочник",{"2":{"310":1,"460":1}}],["справочником",{"2":{"110":1}}],["справочного",{"2":{"295":1}}],["справочный",{"0":{"278":1},"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,"306":1,"307":1,"308":1,"309":1}}],["справку",{"2":{"219":1}}],["справки",{"2":{"155":1}}],["справиться",{"2":{"138":1,"159":1,"380":1}}],["справа",{"2":{"29":1,"89":1,"125":1,"153":2,"157":2}}],["спрятана",{"2":{"105":1}}],["спектру",{"2":{"345":1}}],["спектр",{"2":{"216":1,"288":1}}],["сперва",{"2":{"64":1,"81":1,"414":1,"449":1,"460":1,"461":1}}],["специфичных",{"2":{"495":1}}],["специфичной",{"2":{"134":1}}],["специфичное",{"2":{"109":1}}],["специфической",{"2":{"388":1}}],["специфического",{"2":{"234":1}}],["специфические",{"2":{"219":1,"328":1}}],["спецификаций",{"2":{"461":1}}],["спецификацию",{"2":{"258":1,"500":1}}],["спецификациях",{"2":{"350":1}}],["спецификация",{"2":{"255":1,"460":1}}],["спецификациями",{"2":{"333":1}}],["спецификациям",{"2":{"216":1}}],["спецификации",{"2":{"68":1,"69":1,"191":1,"255":3,"381":1}}],["специализированном",{"2":{"138":1}}],["специализированным",{"2":{"108":1,"138":1}}],["специальную",{"2":{"196":1}}],["специальным",{"2":{"242":1}}],["специальные",{"0":{"239":1},"1":{"240":1},"2":{"125":1,"196":1,"226":1,"240":1,"389":1}}],["специальный",{"0":{"422":1,"423":1},"2":{"119":1,"129":1,"203":1,"241":1,"242":2,"309":1,"435":1}}],["специальных",{"2":{"108":1,"238":1,"249":1,"253":1,"417":1}}],["специальная",{"2":{"115":1,"116":1,"436":1}}],["специальной",{"2":{"344":1,"371":2}}],["специально",{"2":{"159":1,"223":1,"228":1,"253":1,"263":1,"366":1,"438":1}}],["специального",{"2":{"109":1,"321":1}}],["специальному",{"2":{"13":1,"237":1}}],["спецпредложений",{"2":{"4":1}}],["спорным",{"2":{"495":1}}],["спонсировать",{"2":{"349":1}}],["способами",{"2":{"226":1,"250":1,"300":1}}],["способа",{"2":{"222":1,"337":1,"461":1}}],["способов",{"2":{"218":1,"230":1,"247":1,"285":1,"290":1,"306":1,"375":1,"382":1,"389":1}}],["способом",{"2":{"158":1,"161":1,"192":1,"194":1,"223":1,"275":1,"290":1,"309":2,"337":2,"344":1,"425":1,"428":1,"432":1}}],["способе",{"2":{"195":1,"489":1,"491":1}}],["способный",{"2":{"128":1}}],["способности",{"0":{"26":1}}],["способы",{"2":{"68":1,"172":1,"285":1,"308":1,"382":1,"434":1}}],["способ",{"0":{"111":1},"2":{"55":1,"106":1,"110":1,"111":1,"195":3,"240":1,"250":1,"256":1,"261":1,"286":1,"296":1,"298":1,"308":1,"314":1,"316":1,"325":1,"337":1,"339":1,"342":1,"346":1,"373":1,"374":1,"375":1,"382":2,"386":1,"408":2,"428":1,"437":1,"440":1,"443":1,"461":1}}],["спойлер",{"2":{"4":1}}],["симулированный",{"2":{"423":1}}],["симуляции",{"2":{"415":1}}],["символов",{"2":{"218":1,"350":1}}],["символом",{"2":{"154":1}}],["символ",{"2":{"141":1,"165":1,"350":1}}],["сигнатура",{"2":{"328":1}}],["сигнал",{"2":{"421":1}}],["сигнализирует",{"2":{"309":1}}],["сигналы",{"2":{"236":1}}],["сигнальные",{"2":{"230":1}}],["сиблингу",{"2":{"230":1}}],["ситуацией",{"2":{"449":1}}],["ситуаций",{"2":{"371":1,"382":1}}],["ситуациях",{"2":{"452":1}}],["ситуация",{"2":{"242":1,"374":1,"451":1}}],["ситуациями",{"2":{"159":1}}],["ситуации",{"2":{"148":1,"191":1,"344":1,"430":1}}],["ситуацию",{"2":{"138":1,"238":1}}],["сих",{"2":{"139":1,"169":1,"193":1,"202":1,"212":1,"235":1,"306":1,"344":1,"366":1,"375":1,"377":2}}],["синтез",{"2":{"449":1}}],["синтаксического",{"2":{"347":1}}],["синтаксисов",{"2":{"236":1}}],["синтаксисом",{"2":{"195":1,"203":1,"235":1,"309":2,"426":1}}],["синтаксису",{"2":{"235":1,"309":1}}],["синтаксисы",{"2":{"194":1}}],["синтаксис",{"2":{"116":1,"194":2,"195":6,"235":3,"237":2,"238":1,"240":3,"309":3,"317":2,"349":1,"421":1,"423":1,"492":1}}],["синтаксисе",{"2":{"114":1,"220":1,"236":2,"304":1,"347":1}}],["синтаксиса",{"2":{"112":1,"113":1,"121":1,"190":1,"194":1,"235":1,"240":2,"309":1,"346":1}}],["синдицированных",{"2":{"386":1}}],["синхронного",{"2":{"415":1}}],["синхронность",{"2":{"308":1}}],["синхронной",{"2":{"307":3,"308":1}}],["синхронный",{"0":{"308":1}}],["синхронные",{"2":{"307":1,"418":1}}],["синхронизирует",{"2":{"431":2}}],["синхронизируется",{"2":{"353":1}}],["синхронизированном",{"2":{"439":1}}],["синхронизирован",{"2":{"352":2}}],["синхронизировано",{"2":{"349":1,"353":1}}],["синхронизироваться",{"2":{"439":1}}],["синхронизировать",{"2":{"303":1,"344":1,"351":1,"439":2}}],["синхронизации",{"2":{"374":1}}],["синхронизация",{"2":{"327":1}}],["синхронизацию",{"2":{"134":1,"201":1,"324":1,"439":1}}],["синглтоном",{"2":{"321":1}}],["синглтоны",{"2":{"287":1}}],["синглтонами",{"2":{"286":1}}],["синглтона",{"2":{"285":1,"291":1,"293":1}}],["синглтон",{"2":{"216":1,"247":1,"266":1,"277":1,"283":1,"287":2,"294":2,"298":1,"341":1,"345":1,"351":1,"352":1,"374":1,"449":1}}],["синоним",{"2":{"125":1}}],["силами",{"2":{"275":1}}],["сила",{"2":{"242":1,"381":1}}],["сильный",{"2":{"240":1}}],["сильные",{"2":{"236":1}}],["сильное",{"2":{"414":1}}],["сильно",{"2":{"3":1,"23":1,"26":1,"29":1,"47":1,"50":1,"78":1,"103":1,"109":1,"124":1,"125":1,"195":2,"273":1,"425":1,"443":1,"448":1,"450":1,"451":2,"454":1,"459":1,"460":2,"461":1,"524":1,"543":1}}],["силу",{"2":{"12":1}}],["системные",{"2":{"433":1}}],["системным",{"2":{"157":1}}],["системой",{"2":{"253":2,"258":1,"306":1,"350":1,"401":1,"432":1}}],["системе",{"2":{"68":1,"131":1,"253":2,"255":1,"353":1,"360":1,"415":1,"431":1,"435":2,"451":1}}],["систему",{"2":{"3":1,"106":1,"128":1,"166":1,"269":2,"271":1,"275":1,"314":1,"337":1,"350":1,"385":2,"386":1,"387":1,"415":1,"432":1,"433":1}}],["систематическое",{"2":{"253":1}}],["системах",{"0":{"432":1,"433":1,"434":1},"2":{"213":1,"253":1,"260":1,"433":2,"434":1}}],["система",{"2":{"2":1,"68":1,"75":1,"106":2,"128":1,"140":1,"159":2,"182":1,"220":1,"253":1,"269":2,"274":1,"275":1,"306":1,"315":1,"344":1,"499":1}}],["системами",{"2":{"2":1,"251":1,"253":2,"366":1,"451":1}}],["системы",{"0":{"415":1},"1":{"416":1,"417":1,"418":1,"419":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,"442":1},"2":{"2":1,"12":1,"41":2,"68":3,"106":2,"135":1,"140":1,"153":1,"238":1,"243":1,"253":2,"269":1,"278":1,"301":1,"332":1,"382":1,"387":1,"415":1,"417":1,"432":1,"451":1,"452":1,"459":1}}],["систем",{"2":{"2":1,"333":1,"358":1,"430":1,"451":1}}],["слышат",{"2":{"439":1}}],["слышали",{"2":{"172":1}}],["слияний",{"2":{"438":1,"439":1}}],["слияния",{"2":{"438":1,"440":1}}],["слияниями",{"0":{"437":1}}],["слиянии",{"0":{"438":1},"2":{"438":1}}],["слияние",{"2":{"431":1,"437":1,"438":4}}],["слишком",{"2":{"148":1,"149":1,"150":1,"195":1,"219":1,"271":1,"275":1,"314":3,"389":1}}],["сладко",{"2":{"366":1}}],["слайдер",{"0":{"447":1}}],["слайдеров",{"2":{"158":1}}],["слайдеры",{"0":{"158":1},"2":{"158":3}}],["слабо",{"2":{"271":1,"409":1}}],["слабом",{"2":{"106":1}}],["слабосвязные",{"2":{"41":1}}],["слабосвязанными",{"2":{"7":1}}],["слабосвязанные",{"2":{"3":1,"4":1}}],["слабую",{"2":{"34":1}}],["слабая",{"0":{"34":1},"2":{"409":1}}],["слушателей",{"2":{"350":1,"451":1}}],["слушатель",{"2":{"319":1}}],["слушателями",{"2":{"297":1}}],["слушателя",{"2":{"241":1,"260":2}}],["служат",{"2":{"451":1}}],["служебный",{"2":{"419":1}}],["службе",{"2":{"332":1,"383":1}}],["службу",{"2":{"179":1,"326":1,"327":1,"388":1}}],["службы",{"2":{"126":1,"318":1}}],["служб",{"2":{"125":1,"261":1}}],["служит",{"2":{"108":1,"332":1}}],["служить",{"2":{"72":1,"418":1}}],["случаи",{"2":{"239":1,"240":1,"271":1,"273":1,"328":1,"342":1}}],["случаям",{"2":{"380":1}}],["случаями",{"2":{"219":1,"380":1}}],["случая",{"2":{"192":1,"232":1,"234":1,"276":1,"314":1,"342":1,"417":2,"421":1}}],["случаях",{"2":{"4":1,"114":1,"138":1,"140":1,"152":1,"154":1,"159":1,"169":1,"178":1,"186":1,"203":1,"214":1,"216":1,"232":1,"256":1,"285":1,"287":1,"307":1,"314":1,"334":1,"337":1,"366":1,"383":1,"389":1,"411":1,"422":1,"427":1,"449":2,"536":1}}],["случается",{"2":{"383":1}}],["случаен",{"2":{"295":1}}],["случаев",{"2":{"106":1,"216":1,"222":2,"226":1,"253":1,"262":1,"272":1,"298":3,"307":1,"308":2,"309":1,"411":1,"418":1,"419":1,"445":1,"448":2,"461":2,"524":1}}],["случае",{"2":{"12":1,"23":1,"41":1,"47":1,"106":3,"107":1,"108":1,"124":1,"126":1,"128":2,"131":2,"134":1,"135":2,"141":1,"146":1,"150":1,"154":1,"155":1,"161":2,"174":1,"181":1,"183":1,"191":2,"192":1,"194":1,"195":1,"209":1,"216":1,"222":3,"223":1,"235":1,"236":1,"237":2,"240":1,"241":1,"247":2,"260":1,"261":1,"262":1,"269":1,"276":1,"282":1,"291":1,"293":2,"297":1,"299":1,"300":1,"301":1,"303":1,"309":5,"314":1,"315":1,"318":2,"323":1,"326":1,"332":1,"340":1,"342":1,"343":1,"344":1,"346":1,"347":1,"350":2,"367":1,"374":3,"375":2,"377":2,"381":2,"382":3,"387":1,"388":2,"389":3,"407":1,"408":1,"409":1,"417":1,"418":2,"420":1,"421":4,"423":1,"425":2,"426":2,"428":1,"433":1,"436":1,"438":1,"443":1,"448":2,"449":1,"451":1}}],["случайно",{"2":{"173":1}}],["случай",{"0":{"422":1,"423":1},"2":{"9":1,"96":1,"242":1,"408":1,"421":1,"423":1,"439":1,"460":1}}],["слою",{"2":{"318":1}}],["сложен",{"2":{"306":2}}],["сложнее",{"2":{"269":1,"275":1,"309":1,"417":2}}],["сложную",{"2":{"177":1,"275":1}}],["сложны",{"2":{"310":1}}],["сложный",{"2":{"302":1,"449":1}}],["сложные",{"2":{"148":1,"201":1,"236":1,"238":1,"337":1,"366":1,"377":1}}],["сложных",{"2":{"114":1,"152":1,"169":1,"190":1,"236":1,"261":1,"301":1,"312":1,"335":1,"358":1,"375":1,"459":1}}],["сложным",{"2":{"3":1,"128":1,"306":1,"350":1,"352":1,"417":1,"461":1}}],["сложными",{"2":{"2":1,"114":1,"451":1}}],["сложная",{"2":{"109":1}}],["сложно",{"2":{"324":1,"460":1}}],["сложному",{"2":{"306":1,"425":1}}],["сложное",{"2":{"270":1}}],["сложностей",{"2":{"333":1}}],["сложностям",{"2":{"270":1}}],["сложность",{"2":{"105":1,"169":2,"275":1,"306":2,"318":1,"335":1,"430":1}}],["сложности",{"2":{"2":1,"148":1,"190":1,"195":1,"253":1,"269":1,"306":1,"366":1,"388":1,"415":2,"431":1,"451":2,"485":1}}],["сложной",{"2":{"41":1,"261":1,"315":1,"367":1}}],["сложного",{"0":{"2":1}}],["слоев",{"2":{"303":1,"314":1}}],["слоте",{"2":{"240":1}}],["слотом",{"2":{"240":2}}],["слотов",{"2":{"240":4,"245":1}}],["слотам",{"2":{"425":1}}],["слотами",{"2":{"240":1}}],["слота",{"2":{"240":3,"410":1}}],["слоту",{"2":{"240":1}}],["слот",{"2":{"240":4,"246":1}}],["слоты",{"0":{"240":3},"2":{"240":5}}],["сломает",{"2":{"223":1}}],["сломать",{"2":{"106":1}}],["слово",{"2":{"192":1,"195":3,"207":1,"209":1,"301":1,"309":1,"316":1,"346":1,"483":1}}],["словом",{"2":{"121":1,"309":1}}],["слов",{"2":{"177":1,"221":1,"439":1}}],["словами",{"2":{"405":1,"449":1,"461":1,"495":1}}],["словарь",{"2":{"321":1}}],["словаря",{"2":{"294":1,"298":1}}],["слова",{"2":{"155":1,"221":1}}],["слой",{"2":{"58":1,"297":1,"459":1,"499":1,"530":1}}],["слоями",{"2":{"318":1}}],["слоя",{"2":{"40":1,"318":3}}],["следам",{"2":{"430":1}}],["следит",{"2":{"451":1}}],["следить",{"2":{"298":1,"374":1,"436":1,"451":1}}],["следите",{"0":{"144":1}}],["следовало",{"2":{"344":1,"347":1,"349":1}}],["следовать",{"2":{"217":1,"272":1,"360":1,"371":1}}],["следовательно",{"2":{"192":1}}],["следование",{"2":{"164":1}}],["следствия",{"2":{"148":1}}],["следствием",{"2":{"147":1}}],["следуйте",{"2":{"244":1,"336":1}}],["следуя",{"2":{"216":2,"246":2,"258":1,"269":1,"285":1,"320":1,"369":1,"387":1,"432":1}}],["следуют",{"2":{"141":1,"176":1,"237":1,"337":1}}],["следующую",{"2":{"127":1,"191":1,"214":3,"222":1,"308":1,"327":1,"331":1,"368":1,"419":1,"421":1,"424":1,"428":1,"429":1,"435":2,"460":1}}],["следующем",{"2":{"202":1,"214":2,"220":1,"222":1,"237":2,"238":1,"246":1,"261":1,"385":1,"418":1,"427":1}}],["следующему",{"2":{"125":1,"143":1,"229":1,"295":1,"306":1,"339":1,"377":1}}],["следующего",{"0":{"276":1},"1":{"279":1,"280":1,"281":1,"282":1},"2":{"144":1,"172":1,"216":1,"222":1,"237":1,"240":1,"246":1,"261":1,"266":1,"308":1,"377":1,"381":1,"385":1,"417":1,"419":1,"423":1}}],["следующее",{"2":{"83":1,"113":1,"124":1,"138":1,"139":1,"202":1,"213":2,"214":1,"218":1,"220":1,"221":1,"222":1,"226":1,"227":1,"240":2,"246":2,"247":1,"251":1,"252":1,"261":1,"293":1,"313":1,"316":1,"336":1,"350":2,"360":1,"364":1,"365":1,"367":1,"382":1,"383":1,"416":1,"418":1,"427":2,"435":3,"438":3,"452":1}}],["следующей",{"2":{"81":1,"134":1,"210":1,"223":1,"224":1,"234":1,"249":1,"262":1,"298":1,"310":1,"318":1,"333":1,"340":1,"345":1,"354":1,"366":1,"374":1,"381":1,"383":1,"389":1,"390":1,"420":1,"424":1,"430":1,"435":1,"436":1,"439":1}}],["следующий",{"2":{"202":1,"219":1,"222":1,"223":1,"237":1,"240":1,"247":1,"273":1,"314":1,"321":1,"323":1,"380":1,"424":1,"425":1}}],["следующим",{"2":{"122":1,"125":2,"126":1,"148":1,"161":2,"174":1,"193":1,"200":1,"214":1,"217":3,"219":2,"220":1,"221":2,"222":1,"229":2,"231":1,"238":2,"240":1,"245":1,"246":3,"247":1,"251":1,"253":1,"260":1,"262":1,"290":1,"293":1,"295":1,"301":1,"303":1,"306":1,"308":1,"309":1,"315":2,"324":1,"328":1,"329":1,"331":1,"340":1,"341":1,"369":1,"370":1,"371":1,"375":1,"377":2,"384":1,"387":1,"389":1,"420":1,"424":1,"428":1,"429":2,"433":1,"435":1,"438":1,"499":1}}],["следующими",{"2":{"103":1,"150":1,"211":1,"222":1,"261":1,"298":1,"302":1,"346":1}}],["следующие",{"2":{"67":1,"116":1,"125":1,"146":1,"171":1,"175":1,"190":1,"194":1,"195":1,"212":1,"214":1,"217":1,"222":2,"228":1,"241":1,"243":1,"246":3,"250":1,"258":1,"260":1,"261":1,"263":1,"265":1,"286":1,"301":1,"303":1,"304":1,"307":1,"312":1,"315":1,"318":1,"324":1,"326":1,"335":1,"344":1,"345":1,"347":1,"368":2,"371":1,"373":1,"384":1,"391":1,"417":2,"419":1,"420":2,"421":1,"431":1,"433":1,"435":1,"436":1,"438":1,"439":1,"508":1}}],["следующих",{"2":{"66":1,"135":1,"191":1,"236":1,"277":1,"306":1,"371":1,"530":1}}],["следующая",{"2":{"17":1,"222":1,"326":1}}],["следует",{"2":{"110":1,"114":1,"121":1,"126":1,"130":1,"151":1,"153":1,"155":1,"164":1,"167":1,"169":1,"188":1,"189":1,"191":1,"209":1,"218":2,"229":1,"232":1,"241":1,"242":1,"247":2,"253":1,"258":1,"261":1,"262":1,"266":1,"271":1,"277":1,"284":1,"313":1,"314":1,"328":1,"337":1,"366":1,"371":1,"374":1,"382":2,"389":1,"423":1,"429":1,"449":1,"461":1}}],["слева",{"2":{"28":1,"29":1,"30":2,"33":1,"35":1,"90":1,"153":2,"174":1,"534":1}}],["студенты",{"2":{"360":1}}],["ступенькой",{"2":{"322":1}}],["стирают",{"2":{"253":1}}],["стимулировать",{"0":{"143":1}}],["стиля",{"2":{"246":1,"484":1,"496":1}}],["стилями",{"2":{"220":1,"222":2,"260":1}}],["стилях",{"2":{"20":1,"226":1}}],["стиль",{"2":{"198":1,"199":1,"209":1,"221":1,"459":1}}],["стиле",{"2":{"520":1,"521":1}}],["стилем",{"2":{"152":1,"190":1}}],["стилей",{"2":{"140":1,"143":1,"154":1,"190":1,"194":2,"215":2,"216":1,"217":2,"218":2,"220":1,"221":1,"222":1,"226":1,"257":1,"325":1,"373":1,"374":1}}],["стилизованной",{"2":{"459":1}}],["стилизовать",{"2":{"153":1}}],["стилизации",{"2":{"151":1,"159":1,"496":2}}],["стилизацию",{"2":{"89":1,"153":1,"451":1,"454":1}}],["стилизацией",{"2":{"25":1}}],["стили",{"2":{"99":1,"186":1,"194":2,"222":1,"226":1,"240":1,"246":1,"272":1,"373":1,"459":4}}],["стилю",{"2":{"68":1,"144":1}}],["стоящих",{"2":{"495":1}}],["сторы",{"2":{"449":2,"470":1,"472":1}}],["стором",{"2":{"449":1}}],["сторов",{"2":{"346":1,"449":1}}],["стороной",{"2":{"383":1}}],["сторонами",{"2":{"383":1}}],["сторона",{"2":{"175":1,"179":1}}],["стороне",{"2":{"138":1,"321":1,"325":1,"415":1,"461":2,"543":1}}],["стороны",{"2":{"108":1,"149":1,"159":1,"191":1,"230":1,"266":1,"495":1}}],["стороннюю",{"2":{"492":1}}],["сторонняя",{"0":{"383":1},"2":{"453":1}}],["сторонней",{"2":{"449":1}}],["стороннего",{"2":{"108":1,"461":1}}],["стороннее",{"2":{"13":1}}],["сторонние",{"2":{"215":2,"224":1,"225":1,"492":1,"543":1}}],["сторонних",{"0":{"454":1},"2":{"108":1,"109":1,"220":1,"306":1,"385":1,"389":1}}],["сторонний",{"2":{"106":1,"186":1}}],["сторонним",{"2":{"12":1,"75":1,"108":3,"180":1,"187":1}}],["сторон",{"2":{"9":1}}],["сторе",{"2":{"346":1,"352":1,"449":1}}],["стор",{"2":{"345":6,"346":1,"347":3,"348":1,"349":2,"449":4}}],["сторами",{"2":{"449":1}}],["сторам",{"2":{"349":1}}],["стора",{"0":{"345":1},"1":{"346":1,"347":1,"348":1,"349":1},"2":{"346":6,"349":1,"350":1,"352":1}}],["стола",{"2":{"440":1}}],["столбце",{"2":{"375":1}}],["столкнулась",{"2":{"431":1}}],["столкнуться",{"2":{"191":1,"301":1,"371":1}}],["столкнетесь",{"2":{"314":1}}],["столько",{"2":{"200":1,"350":1,"377":1,"388":1,"421":2}}],["столе",{"2":{"157":1,"256":1}}],["стоит",{"2":{"99":1,"116":1,"121":1,"134":1,"149":1,"158":1,"211":1,"238":1,"241":1,"247":1,"276":1,"282":1,"304":1,"343":1,"381":1,"411":1}}],["стоимость",{"2":{"94":1}}],["степенью",{"2":{"312":1}}],["степени",{"2":{"117":1,"141":1,"145":1,"190":1,"195":1,"266":1,"307":1,"421":1,"426":1,"430":1}}],["стейты",{"2":{"449":1}}],["стейт",{"2":{"449":2,"451":1}}],["стейта",{"2":{"241":2,"448":1,"449":3}}],["стейтом",{"2":{"34":1,"449":5}}],["стековые",{"2":{"167":1}}],["стек",{"0":{"20":1}}],["стрелку",{"2":{"347":1}}],["стрелками",{"2":{"214":2}}],["стрелочную",{"2":{"308":1}}],["стремитесь",{"2":{"149":1}}],["стремимся",{"2":{"128":1,"340":1}}],["стремящихся",{"2":{"121":1}}],["страшном",{"2":{"448":1}}],["стратегия",{"2":{"543":1}}],["стратегиями",{"2":{"261":1,"364":1}}],["стратегию",{"2":{"261":2,"371":1}}],["стратегий",{"2":{"261":2,"262":1,"460":1}}],["стратегией",{"2":{"261":1,"262":2}}],["стратегии",{"2":{"64":1,"261":1,"265":1}}],["страдает",{"2":{"195":1}}],["страну",{"2":{"377":1}}],["страны",{"2":{"375":1,"377":1}}],["страна",{"2":{"375":1}}],["странным",{"2":{"194":1,"371":1}}],["странно",{"2":{"193":1}}],["странички",{"2":{"461":1}}],["страничной",{"2":{"242":1}}],["страничным",{"2":{"161":1}}],["страничный",{"2":{"149":1}}],["страниц",{"2":{"36":1,"149":1,"161":2,"172":1,"190":2,"261":1,"263":1,"350":1,"366":4,"389":1,"459":1}}],["страницей",{"2":{"161":1,"164":1}}],["странице",{"2":{"23":1,"36":1,"47":1,"108":1,"158":1,"173":1,"186":1,"190":1,"191":1,"192":2,"200":1,"203":2,"248":1,"314":2,"350":2,"374":1,"412":1,"450":1}}],["страницах",{"2":{"168":1,"277":1}}],["страницами",{"2":{"161":1,"367":1,"369":1,"371":1}}],["страницам",{"2":{"108":3}}],["страница",{"2":{"4":1,"7":2,"30":1,"93":1,"96":1,"108":2,"142":1,"158":1,"173":2,"190":1,"193":1,"194":1,"218":1,"369":7,"461":1}}],["страницы",{"0":{"28":1,"228":1},"1":{"29":1,"30":1,"31":1,"32":1,"229":1,"230":1,"231":1,"232":1},"2":{"4":1,"23":1,"30":1,"36":1,"93":1,"108":2,"127":1,"142":2,"161":2,"165":3,"169":1,"173":2,"174":3,"192":2,"193":2,"215":1,"223":1,"229":1,"263":1,"306":1,"314":5,"350":3,"358":1,"366":3,"383":1,"389":1,"411":1,"461":4}}],["страницу",{"2":{"3":1,"7":1,"87":1,"125":1,"135":1,"142":1,"161":1,"162":2,"173":2,"174":1,"186":2,"193":2,"215":1,"226":1,"229":1,"260":2,"314":2,"350":1,"353":1,"366":2,"369":1,"374":3,"461":3,"522":1}}],["строчек",{"2":{"525":1}}],["строчкой",{"2":{"276":1}}],["строчками",{"2":{"98":1}}],["строя",{"2":{"415":1}}],["строятся",{"2":{"202":1}}],["строим",{"2":{"345":1}}],["строится",{"2":{"440":1}}],["строить",{"2":{"226":2,"335":1}}],["строительные",{"2":{"193":1,"233":1}}],["строительную",{"2":{"26":1}}],["строгость",{"2":{"109":1}}],["строковых",{"2":{"383":1}}],["строковые",{"2":{"350":2}}],["строковому",{"2":{"294":1}}],["строкой",{"2":{"47":1,"89":1,"323":1,"342":1,"350":1,"374":1,"380":1}}],["строк",{"2":{"236":2,"271":1,"332":1,"374":1,"389":1,"436":1,"453":1,"461":1}}],["строки",{"2":{"192":1,"195":1,"201":1,"212":1,"214":1,"215":1,"222":1,"224":1,"247":1,"298":1,"309":2,"315":1,"322":1,"323":1,"325":1,"326":3,"331":1,"332":1,"342":2,"346":1,"347":1,"350":1,"374":2,"376":1,"383":2,"384":1,"420":3,"421":2,"426":1,"429":1,"431":1,"432":1,"438":1,"443":1}}],["строку",{"2":{"106":1,"108":1,"130":1,"230":1,"242":1,"294":1,"303":1,"309":1,"316":1,"325":1,"326":1,"378":1,"380":1,"383":1,"385":1,"386":2,"426":1,"428":1,"429":1,"433":1,"438":2,"448":1}}],["строке",{"2":{"81":1,"132":4,"162":2,"222":9,"246":12,"257":1,"298":2,"302":4,"304":2,"305":4,"309":3,"314":1,"321":7,"322":3,"325":2,"326":4,"330":1,"332":1,"338":1,"339":4,"342":3,"344":1,"346":1,"347":3,"349":4,"352":2,"371":7,"389":1,"391":1,"421":2,"425":4,"426":9,"436":1}}],["строках",{"2":{"219":1,"222":2,"261":1,"426":1}}],["строками",{"2":{"108":1,"261":1,"298":1,"380":1}}],["строка",{"2":{"29":1,"89":1,"108":1,"218":1,"222":1,"230":2,"240":1,"242":1,"256":2,"257":3,"258":2,"300":1,"309":2,"314":1,"315":1,"321":3,"322":3,"326":1,"332":9,"338":3,"344":5,"346":4,"347":3,"350":1,"352":4,"371":2,"383":2,"384":1,"389":1,"438":1}}],["стройматериалы",{"2":{"26":1}}],["структурируя",{"2":{"455":1}}],["структурированное",{"2":{"68":1}}],["структурированность",{"2":{"17":1}}],["структур",{"2":{"279":1,"301":1}}],["структурные",{"0":{"281":1},"2":{"190":1}}],["структурных",{"2":{"68":2}}],["структура",{"0":{"215":1},"2":{"165":1,"191":1,"215":1,"293":1,"375":1}}],["структурой",{"2":{"126":1,"187":1,"190":1}}],["структуры",{"2":{"117":1,"165":1,"191":1,"212":1,"215":1,"299":1,"321":1,"340":1}}],["структуре",{"2":{"111":1,"126":1,"165":1,"215":1,"216":1,"461":1}}],["структуру",{"2":{"17":1,"23":1,"26":1,"214":2,"215":4,"216":1,"277":1,"340":1}}],["стакан",{"2":{"460":1}}],["стабильного",{"2":{"436":1}}],["стабильной",{"2":{"435":1}}],["стабильный",{"2":{"433":1}}],["стабильных",{"2":{"418":1}}],["стабилен",{"2":{"128":1}}],["стационарности",{"2":{"333":1}}],["ставшее",{"2":{"439":1}}],["ставший",{"2":{"167":1}}],["ставится",{"2":{"371":1}}],["ставиться",{"2":{"300":1}}],["ставить",{"2":{"106":1,"213":1}}],["ставим",{"2":{"86":1,"91":1,"100":1,"103":1}}],["сталкивались",{"2":{"247":1}}],["сталкиваемся",{"2":{"128":1}}],["стал",{"2":{"153":1,"164":1,"167":1,"179":1,"213":1,"247":1,"322":1,"417":1,"431":1}}],["стала",{"2":{"145":1,"172":1,"303":1,"367":1,"449":1}}],["стало",{"2":{"143":1,"366":1,"368":1,"449":1,"451":1}}],["стали",{"2":{"2":1,"151":1,"190":1,"448":1,"449":1,"459":1}}],["станут",{"2":{"195":1,"276":1,"346":1,"347":2}}],["станет",{"2":{"192":1,"325":1,"371":1,"430":1}}],["становиться",{"2":{"253":1}}],["становится",{"2":{"116":1,"174":1,"195":1,"234":1,"242":1,"261":1,"374":1,"381":1,"449":1}}],["становились",{"2":{"140":1}}],["становятся",{"2":{"108":1}}],["стандартизации",{"2":{"190":1}}],["стандартизирован",{"2":{"164":1}}],["стандартов",{"2":{"188":1,"327":1,"383":1,"390":1}}],["стандартом",{"2":{"145":1,"153":1,"172":1,"213":1,"238":1,"261":1,"368":1,"383":1,"387":1,"403":1,"500":1}}],["стандарты",{"0":{"457":1},"2":{"164":1,"190":1,"191":1,"381":1,"459":1}}],["стандартной",{"2":{"381":1}}],["стандартного",{"2":{"350":1,"445":1,"448":2}}],["стандартному",{"2":{"164":1}}],["стандартная",{"2":{"332":1}}],["стандартную",{"2":{"258":1}}],["стандартный",{"2":{"244":1,"296":1,"386":1,"534":1}}],["стандартных",{"2":{"167":1,"189":1,"253":2,"264":1,"312":1,"390":1}}],["стандартные",{"2":{"152":1,"390":1,"391":1}}],["стандартными",{"2":{"151":1}}],["стандартным",{"2":{"143":1,"164":1,"352":1}}],["стандарту",{"2":{"127":1,"128":1}}],["стандарте",{"2":{"108":1,"159":1,"383":1}}],["стандартами",{"2":{"141":1,"190":1,"209":1}}],["стандарта",{"2":{"106":1}}],["стандарт",{"2":{"106":1,"108":1,"109":1,"141":1}}],["старайтесь",{"2":{"456":1,"460":1}}],["старается",{"2":{"314":1}}],["старте",{"2":{"533":1,"544":1}}],["стартер",{"2":{"495":1}}],["старта",{"2":{"530":1}}],["стартапе",{"2":{"450":1}}],["старт",{"2":{"419":1}}],["стартовый",{"2":{"260":1}}],["стартовать",{"2":{"256":1}}],["стартовом",{"2":{"221":1}}],["стартового",{"2":{"191":1,"214":1}}],["старой",{"2":{"408":1}}],["старого",{"2":{"116":1,"216":1}}],["старых",{"2":{"116":2}}],["старыми",{"0":{"116":1},"2":{"116":2}}],["старый",{"2":{"61":1}}],["старший",{"2":{"106":1}}],["стадию",{"2":{"66":1}}],["стадии",{"0":{"66":1},"2":{"67":1,"78":1,"203":1}}],["статистика",{"2":{"430":1}}],["статистики",{"2":{"327":1,"443":1,"530":1}}],["статичен",{"2":{"374":1}}],["статическое",{"2":{"215":1}}],["статических",{"2":{"366":1,"377":1}}],["статическими",{"2":{"366":1}}],["статическим",{"2":{"286":1}}],["статически",{"2":{"235":1}}],["статический",{"0":{"235":1},"2":{"128":1,"366":1,"371":1,"428":1}}],["статические",{"2":{"128":1,"216":1,"366":1,"375":1}}],["статичной",{"2":{"190":1}}],["статичный",{"2":{"461":2}}],["статичных",{"2":{"407":1}}],["статичным",{"2":{"75":1,"452":1}}],["статичные",{"2":{"6":1}}],["статуса",{"2":{"381":1}}],["статус",{"2":{"247":1,"382":1}}],["статей",{"2":{"174":1,"459":1}}],["стать",{"2":{"169":1,"243":1,"277":1,"314":1,"322":1,"460":2}}],["статья",{"2":{"108":1,"450":1}}],["статье",{"2":{"106":1,"445":1,"448":1,"459":1}}],["статьи",{"0":{"0":1},"2":{"109":1,"174":1,"203":1,"253":1,"435":1}}],["сваливает",{"2":{"451":1}}],["светлой",{"2":{"545":1}}],["светлый",{"2":{"253":1}}],["свете",{"2":{"351":1}}],["сведем",{"2":{"312":1,"340":1}}],["сведите",{"2":{"148":1}}],["сверху",{"2":{"29":2,"35":1,"93":1,"260":1,"307":1,"485":1}}],["свыше",{"2":{"47":1}}],["связать",{"2":{"368":1}}],["связали",{"2":{"259":1}}],["связана",{"2":{"273":1,"302":1}}],["связан",{"2":{"149":1,"187":1,"255":1}}],["связано",{"2":{"127":1,"173":1,"214":1,"325":1,"326":1,"418":1,"438":1}}],["связанную",{"2":{"319":1,"383":1}}],["связанная",{"2":{"175":1,"259":1}}],["связанными",{"2":{"195":1}}],["связанные",{"2":{"122":1,"149":1,"409":1,"410":1}}],["связанный",{"2":{"105":1,"371":1}}],["связанных",{"2":{"68":1,"190":1,"222":1,"426":1}}],["связанного",{"2":{"274":1}}],["связанное",{"2":{"50":1,"240":1}}],["связанность",{"0":{"34":1},"2":{"34":1,"409":1}}],["связаны",{"2":{"2":1,"3":2,"106":1,"132":1,"145":1,"171":1,"228":1,"231":1,"418":1,"452":1}}],["связываем",{"2":{"338":1}}],["связывает",{"2":{"197":1,"202":1}}],["связывание",{"2":{"321":1}}],["связыванием",{"2":{"201":1}}],["связью",{"2":{"336":1}}],["связь",{"2":{"109":1,"149":1,"150":1,"274":2,"295":1,"318":1,"325":1,"337":1,"340":1}}],["связей",{"0":{"230":1},"2":{"67":1}}],["связями",{"2":{"17":1}}],["связи",{"0":{"104":1},"1":{"105":1},"2":{"6":1,"43":1,"73":1,"105":2,"110":1,"135":1,"142":1,"159":1,"195":1,"222":1,"226":1,"229":1,"247":1,"253":1,"304":1,"312":1,"314":1,"364":1,"366":1,"407":1,"411":1,"415":1,"417":2,"430":1,"500":1,"530":1}}],["своя",{"2":{"408":1,"448":1}}],["сворачивать",{"2":{"273":1}}],["сводка",{"2":{"247":1}}],["сводки",{"2":{"247":1}}],["сводные",{"2":{"247":1}}],["свою",{"2":{"142":1,"149":1,"192":1,"194":1,"261":1,"269":2,"309":1,"338":1,"366":1,"376":1,"389":1,"409":1,"421":1,"431":1,"449":2,"452":1,"453":1,"533":1}}],["свободный",{"2":{"383":1}}],["свободного",{"2":{"383":1}}],["свободно",{"2":{"153":1,"215":1,"324":1}}],["свободна",{"2":{"62":1}}],["свободу",{"2":{"128":1,"195":1}}],["свое",{"2":{"180":1,"199":1,"215":1,"309":1,"344":1,"358":1,"381":1,"388":1,"460":1}}],["своей",{"2":{"96":1,"107":1,"131":1,"149":1,"209":1,"266":1,"270":1,"309":1,"461":1}}],["своего",{"2":{"40":1,"107":2,"109":1,"125":1,"177":1,"263":1,"297":1,"302":1,"332":1,"337":1,"360":1,"461":1}}],["своему",{"2":{"215":1,"314":1,"333":1,"350":1,"438":1,"443":2}}],["своем",{"2":{"40":1,"216":1,"314":1,"381":1,"389":1,"459":1}}],["своё",{"2":{"26":1,"47":2}}],["свойству",{"2":{"290":1,"302":1}}],["свойств",{"2":{"114":2,"222":2,"247":1,"288":1,"302":1,"346":1,"380":1,"417":1}}],["свойством",{"2":{"114":1,"351":1}}],["свойство",{"0":{"113":1},"2":{"113":1,"222":2,"246":2,"271":1,"292":1,"302":1,"352":1,"425":1}}],["свойстве",{"2":{"110":1,"246":1,"291":1}}],["свойствам",{"2":{"425":1,"426":1}}],["свойствами",{"2":{"113":1,"114":1,"222":1,"301":1,"346":1,"347":1,"425":1,"461":1}}],["свойствах",{"2":{"290":1}}],["свойства",{"2":{"16":1,"113":1,"115":1,"195":1,"222":5,"223":1,"243":1,"302":1,"321":1,"345":1,"347":5,"352":1,"374":1}}],["свой",{"0":{"107":1},"2":{"4":1,"12":1,"20":1,"39":1,"41":1,"58":2,"107":2,"134":1,"141":1,"194":1,"195":2,"216":1,"260":1,"273":1,"276":4,"407":2,"408":1,"417":1,"439":1,"460":3}}],["своих",{"2":{"135":1,"140":1,"145":1,"217":1,"291":1,"312":1,"314":1,"339":1,"340":1,"376":1,"461":1}}],["своими",{"2":{"215":1,"314":1,"408":1}}],["своим",{"2":{"41":1,"58":1,"103":1,"152":1,"230":1,"337":1,"430":1,"436":1,"444":1,"449":1}}],["свои",{"2":{"3":1,"20":2,"114":1,"150":1,"209":1,"224":1,"239":1,"250":1,"264":1,"298":1,"299":1,"306":1,"342":1,"364":1,"366":1,"382":1,"409":1,"420":1,"430":1,"440":1,"441":1,"443":2,"449":2,"451":1,"454":1,"459":2}}],["соцсетями",{"2":{"530":1}}],["социальными",{"2":{"191":1}}],["социальных",{"0":{"174":1},"2":{"174":3,"180":1,"255":1}}],["сорс",{"2":{"460":1}}],["сортировки",{"2":{"167":1}}],["соединяться",{"2":{"389":1}}],["соединению",{"2":{"254":1}}],["соединений",{"2":{"128":1}}],["соединение",{"2":{"128":1,"253":1,"317":1}}],["соединения",{"2":{"109":1,"128":1,"350":1}}],["солидно",{"2":{"445":1}}],["солидных",{"2":{"88":1}}],["соли",{"2":{"191":1}}],["сопутствующей",{"2":{"449":2}}],["сопутствующие",{"2":{"449":1}}],["сопутствующих",{"2":{"183":1}}],["сопоставлены",{"2":{"380":1}}],["сопоставленный",{"2":{"219":1}}],["сопоставляет",{"2":{"367":1}}],["сопоставимое",{"2":{"450":1}}],["сопоставимости",{"2":{"337":1}}],["сопоставить",{"2":{"351":1}}],["сопровождение",{"2":{"390":1}}],["сопровождения",{"2":{"209":1}}],["сопровождаемым",{"2":{"179":1}}],["сопровождаемость",{"2":{"68":1,"267":1}}],["сопровождать",{"2":{"159":1}}],["сопровождаться",{"2":{"154":1}}],["соглашению",{"2":{"237":1,"241":1}}],["соглашений",{"2":{"204":1,"209":1,"210":1,"216":1,"273":1}}],["соглашениям",{"2":{"374":1}}],["соглашения",{"0":{"204":1},"1":{"205":1,"206":1,"207":1,"208":1,"209":1},"2":{"209":3,"211":1,"215":1,"238":1,"276":1}}],["соглашением",{"2":{"238":1}}],["соглашение",{"2":{"180":1,"195":1,"238":1,"368":1,"420":2}}],["соглашается",{"2":{"187":1,"253":1,"260":1}}],["согласовать",{"2":{"287":1}}],["согласования",{"2":{"253":1}}],["согласование",{"2":{"68":1}}],["согласованность",{"2":{"218":1}}],["согласованности",{"2":{"143":1}}],["согласия",{"2":{"260":2}}],["согласиться",{"2":{"260":1}}],["согласие",{"2":{"180":1,"350":2}}],["согласны",{"2":{"209":1}}],["согласно",{"2":{"125":1,"127":1,"143":1,"172":1,"255":1,"275":1,"422":1}}],["сотен",{"2":{"275":1}}],["сотрудничества",{"2":{"188":1}}],["сотрудничестве",{"2":{"140":1}}],["сотни",{"2":{"175":1,"417":1}}],["сослаться",{"2":{"375":1}}],["сосредоточен",{"2":{"222":1}}],["сосредоточились",{"2":{"293":1,"335":1}}],["сосредоточимся",{"2":{"192":1,"219":1,"241":1,"247":1,"251":1,"335":1,"350":1,"364":1,"389":1,"415":1}}],["сосредоточиться",{"2":{"168":1,"314":1,"325":1,"417":1,"418":2}}],["состав",{"2":{"386":1}}],["составному",{"2":{"524":1}}],["составной",{"2":{"241":1}}],["составными",{"2":{"335":1}}],["составление",{"0":{"228":1},"1":{"229":1,"230":1,"231":1,"232":1}}],["составлять",{"2":{"230":1}}],["составляющая",{"2":{"366":1}}],["составляющие",{"2":{"125":1,"347":1,"388":1}}],["составляют",{"2":{"140":1,"366":1}}],["составляет",{"2":{"125":1,"350":1}}],["составителя",{"2":{"485":1}}],["составит",{"2":{"58":1}}],["состоящую",{"2":{"269":1}}],["состоящее",{"2":{"125":1}}],["состоять",{"2":{"449":1}}],["состоят",{"2":{"125":1,"269":1,"275":1,"321":2}}],["состоянию",{"2":{"230":1,"284":1,"346":2}}],["состояний",{"2":{"209":1,"223":1,"247":4,"351":1}}],["состояние",{"2":{"154":1,"159":1,"164":1,"199":2,"203":1,"230":3,"245":1,"246":1,"247":3,"343":2,"344":2,"345":2,"346":1,"349":1,"384":1,"449":2}}],["состоянием",{"2":{"110":1,"118":2,"230":1,"240":1,"343":2,"344":1,"345":3,"355":1,"359":1,"374":1,"452":1}}],["состоянии",{"2":{"153":2,"159":1,"246":1,"247":1,"273":1,"309":2,"336":1,"382":1,"439":1}}],["состояния",{"0":{"343":1},"1":{"344":1},"2":{"153":2,"201":1,"203":1,"222":1,"223":1,"228":1,"230":2,"231":2,"245":1,"246":1,"247":2,"261":1,"335":1,"342":2,"344":1,"349":1,"354":1,"436":1}}],["состояниями",{"2":{"110":1,"247":2,"249":1,"349":1,"399":1}}],["состоит",{"2":{"28":1,"66":1,"68":1,"135":1,"190":1,"193":1,"194":1,"306":1,"318":1,"346":1,"501":1}}],["сочетании",{"2":{"157":1,"200":1,"284":1,"296":1}}],["сожалению",{"2":{"150":1,"176":1,"274":1,"444":1,"460":1}}],["сокращения",{"0":{"484":1}}],["сокращение",{"0":{"197":1,"202":1},"2":{"202":1,"417":1}}],["сокращенное",{"2":{"240":1}}],["сокращенный",{"2":{"197":1}}],["сокращенайте",{"2":{"149":1}}],["сокращайте",{"2":{"149":1}}],["сократить",{"2":{"125":1}}],["содержимым",{"2":{"203":1,"246":1,"370":1}}],["содержимого",{"2":{"149":2,"158":1,"161":1,"162":1,"168":1,"240":1,"489":1,"535":1}}],["содержимое",{"2":{"144":1,"172":1,"174":1,"192":2,"194":1,"214":1,"215":1,"221":1,"240":6,"245":1,"314":1,"461":1}}],["содержится",{"2":{"315":1,"383":1}}],["содержите",{"2":{"276":1}}],["содержит",{"2":{"108":2,"194":1,"195":1,"197":1,"215":1,"230":1,"241":1,"247":2,"301":1,"315":1,"383":2,"386":1,"425":1,"426":1}}],["содержатся",{"2":{"332":1}}],["содержат",{"2":{"273":1,"319":1,"332":1,"459":1}}],["содержать",{"2":{"193":1,"195":1,"222":2,"235":1,"258":1,"315":1,"345":2,"350":1,"374":1,"383":2,"384":1,"387":1,"389":1,"522":1}}],["содержащая",{"2":{"315":1,"383":1,"449":1}}],["содержащиеся",{"2":{"421":1}}],["содержащим",{"2":{"371":1}}],["содержащимся",{"2":{"300":1}}],["содержащий",{"2":{"194":1,"195":1,"247":1,"258":1,"346":1}}],["содержащих",{"2":{"135":1,"439":1}}],["содержащее",{"2":{"169":1}}],["содержанием",{"2":{"165":1}}],["содержание",{"2":{"140":1,"211":1,"246":1}}],["соблюсти",{"2":{"270":1}}],["соблюдения",{"2":{"253":1}}],["соблюдение",{"2":{"238":1}}],["соблюдаем",{"2":{"339":1}}],["соблюдаться",{"2":{"267":1}}],["соблюдая",{"2":{"216":1}}],["соблюдали",{"2":{"209":1}}],["соблазн",{"2":{"177":1}}],["событии",{"2":{"273":1}}],["событий",{"0":{"230":1,"340":1},"1":{"341":1,"342":1},"2":{"222":1,"235":1,"236":1,"237":2,"241":1,"297":4,"298":2,"306":1,"319":1,"341":1,"343":1,"355":1,"367":1,"374":2,"424":1,"426":1,"439":1}}],["событию",{"2":{"222":1,"246":1,"273":1,"338":1}}],["событиях",{"2":{"319":1}}],["событиям",{"2":{"241":1,"425":1}}],["событиями",{"2":{"238":1,"282":1,"297":1}}],["события",{"0":{"208":1,"236":1},"2":{"195":1,"228":1,"230":2,"231":2,"236":2,"237":3,"241":1,"247":1,"260":2,"261":1,"273":3,"297":1,"298":1,"319":1,"322":1,"337":2,"339":1,"340":2,"342":3,"371":1,"374":2,"377":1,"426":5,"436":1}}],["событием",{"2":{"273":2,"319":1,"338":1}}],["событие",{"2":{"115":1,"154":1,"156":1,"161":1,"202":4,"231":2,"237":2,"260":5,"261":1,"273":1,"297":4,"298":3,"302":1,"315":3,"320":1,"340":2,"342":2,"374":1,"377":1,"419":1,"426":8,"435":1}}],["собеседованию",{"2":{"460":1}}],["собеседник",{"2":{"156":1}}],["соберет",{"2":{"192":1}}],["собирать",{"2":{"388":2}}],["собирают",{"2":{"325":1}}],["собираются",{"2":{"180":1,"203":1,"276":1}}],["собирались",{"2":{"274":1}}],["собирает",{"2":{"230":1,"382":1,"431":1,"443":1}}],["собираемся",{"2":{"214":1}}],["собираемого",{"2":{"118":1}}],["собственную",{"2":{"350":1,"352":1,"421":2,"431":1}}],["собственная",{"2":{"324":1}}],["собственными",{"2":{"314":1}}],["собственные",{"2":{"152":1,"196":1,"209":1,"222":1,"306":1,"418":1}}],["собственный",{"2":{"141":1,"194":1,"260":1,"321":1,"383":1,"417":1,"427":1}}],["собственных",{"2":{"128":1,"441":1}}],["собственной",{"2":{"327":1,"382":2,"386":1,"420":1,"421":1}}],["собственно",{"2":{"176":1,"369":1}}],["собственного",{"2":{"161":1,"332":1,"352":1,"391":1}}],["собственное",{"2":{"157":1,"170":1,"215":1,"306":1,"389":1}}],["собственном",{"2":{"136":1,"253":1,"314":1,"370":1}}],["собственному",{"2":{"125":1}}],["собственности",{"2":{"125":1}}],["собрана",{"2":{"241":1}}],["собранных",{"2":{"382":1}}],["собранные",{"2":{"127":1}}],["собранной",{"2":{"230":1}}],["собранную",{"2":{"215":1}}],["собрано",{"2":{"194":1}}],["собрать",{"2":{"127":1,"215":1,"387":1,"443":1}}],["собой",{"2":{"3":1,"6":1,"17":1,"125":1,"146":1,"152":1,"164":1,"172":1,"177":1,"188":1,"190":2,"191":1,"193":1,"194":1,"215":2,"222":1,"228":1,"229":1,"234":1,"247":1,"256":1,"257":1,"273":1,"303":1,"311":1,"321":1,"327":1,"331":1,"337":1,"350":2,"366":1,"383":1,"393":1,"426":1,"444":1}}],["соображения",{"0":{"411":1},"2":{"293":1,"391":1}}],["сообщает",{"2":{"436":1}}],["сообществе",{"2":{"431":1}}],["сообщество",{"2":{"219":1}}],["сообщением",{"2":{"438":1}}],["сообщение",{"2":{"156":1,"261":1,"301":1,"315":4,"316":1,"319":1,"320":1,"321":2,"322":1,"323":1,"327":1,"420":1,"438":2,"483":1}}],["сообщений",{"2":{"109":2,"314":1,"321":1,"322":1,"335":1,"339":1,"340":4,"341":1,"343":1,"355":1,"387":1,"421":1}}],["сообщениями",{"2":{"315":1,"321":1,"439":1}}],["сообщения",{"2":{"109":1,"157":1,"314":1,"319":2,"321":2,"332":1,"341":1,"387":1}}],["сообщить",{"2":{"159":1,"235":1,"387":1}}],["соотношения",{"2":{"430":1}}],["соотноситься",{"2":{"230":1}}],["соответствовал",{"2":{"214":1}}],["соответствовать",{"2":{"126":1,"253":1,"265":1,"309":1,"371":1}}],["соответствует",{"2":{"128":1,"191":1,"222":1,"263":2,"290":1,"367":1,"377":1,"408":1}}],["соответствуют",{"2":{"126":1,"151":1,"327":1,"421":1}}],["соответствующие",{"2":{"313":1,"368":1,"374":1,"377":1,"381":1,"417":1}}],["соответствующим",{"2":{"273":1,"382":1,"425":1}}],["соответствующих",{"2":{"216":1,"269":1,"328":1,"396":1,"495":1}}],["соответствующий",{"2":{"103":1,"240":1,"247":1,"300":1,"319":1,"322":1,"327":1,"374":1,"383":1,"448":1}}],["соответствующую",{"2":{"127":1,"220":1,"345":1,"408":1,"420":1,"429":1}}],["соответствующему",{"2":{"299":2,"318":1,"378":1}}],["соответствующем",{"2":{"273":1}}],["соответствующее",{"2":{"200":1}}],["соответствующей",{"2":{"58":1,"327":1,"492":1}}],["соответствующего",{"2":{"17":1,"335":1,"388":1,"419":1}}],["соответствия",{"2":{"246":1,"381":1,"415":1,"417":1}}],["соответствии",{"2":{"126":1,"153":1,"191":1,"215":1,"222":2,"229":1,"253":1,"261":1,"262":1,"274":1,"299":1,"300":2,"333":1,"382":1,"387":1,"417":1,"432":1,"460":1,"542":1}}],["соответствие",{"2":{"68":1,"333":1,"377":1,"417":1,"426":1}}],["соответственно",{"2":{"47":1,"58":2,"108":1,"118":1,"122":1,"219":1,"246":1,"314":1,"382":1,"459":1,"461":1}}],["сохраненные",{"2":{"324":1}}],["сохранения",{"2":{"195":1,"203":1,"421":1}}],["сохранением",{"2":{"241":2,"524":1}}],["сохранение",{"0":{"98":1},"2":{"350":1,"351":1}}],["сохранил",{"2":{"408":1}}],["сохранили",{"2":{"305":1}}],["сохранив",{"2":{"306":1}}],["сохранится",{"2":{"353":1}}],["сохраните",{"2":{"222":1,"438":2}}],["сохранить",{"2":{"34":1,"106":1,"168":1,"260":1,"301":1,"314":1,"382":1,"389":1,"438":1,"461":1}}],["сохраним",{"2":{"214":1,"246":1,"273":1}}],["сохраняющий",{"2":{"303":1}}],["сохраняются",{"2":{"241":1,"350":1}}],["сохраняем",{"2":{"260":1,"287":1,"305":1,"321":1,"330":2}}],["сохраняется",{"2":{"191":1,"350":1}}],["сохраняет",{"2":{"106":1,"203":1,"287":1,"302":1,"408":1,"443":1}}],["сохраняя",{"2":{"218":1,"303":1}}],["сохраняться",{"2":{"369":1}}],["сохранять",{"2":{"98":2,"107":1,"216":1,"430":1}}],["сохранялся",{"2":{"98":1}}],["софт",{"2":{"62":1}}],["создаётся",{"2":{"543":1}}],["создателем",{"2":{"431":1}}],["создать",{"2":{"26":1,"57":1,"62":1,"64":1,"86":1,"125":2,"137":1,"140":2,"145":1,"150":1,"188":1,"215":1,"219":1,"220":1,"222":1,"224":1,"226":2,"232":2,"246":1,"250":1,"269":1,"275":1,"304":2,"315":1,"319":1,"325":1,"330":1,"340":1,"345":1,"351":1,"367":1,"368":1,"370":1,"371":1,"372":1,"374":1,"377":1,"387":1,"412":1,"421":3,"431":1,"435":1,"437":1,"439":1,"444":1,"449":1,"452":1,"494":1,"495":1}}],["создающим",{"2":{"495":1}}],["создающий",{"2":{"415":1}}],["создающего",{"2":{"495":1}}],["создают",{"2":{"200":1,"216":1,"251":1,"277":1,"327":1,"350":1}}],["создаются",{"2":{"125":1,"188":1,"306":1,"398":1}}],["создайте",{"2":{"244":1,"246":1,"321":1,"331":1,"368":1,"370":1,"420":1,"424":1,"425":1,"437":1,"438":1,"515":1}}],["создав",{"2":{"229":1,"343":1,"352":1,"438":1}}],["создавали",{"2":{"375":1}}],["создавалось",{"2":{"339":1}}],["создавало",{"2":{"113":1}}],["создаваемый",{"2":{"350":1}}],["создаваемой",{"2":{"262":1}}],["создавая",{"2":{"159":1,"161":1,"218":1,"314":1,"366":1,"411":1}}],["создавать",{"2":{"58":2,"190":2,"196":1,"222":1,"224":1,"237":2,"243":1,"251":1,"270":1,"275":1,"303":1,"310":1,"320":1,"324":1,"350":1,"364":1,"367":1,"369":2,"375":1,"377":1,"401":1,"424":1,"426":1,"459":1,"495":1,"496":1}}],["создаст",{"2":{"195":1,"214":1,"371":1,"489":2}}],["создастся",{"2":{"103":1}}],["созданы",{"2":{"435":1,"461":1}}],["создано",{"2":{"324":1,"419":1}}],["создана",{"2":{"215":2,"408":1}}],["созданном",{"2":{"417":1,"461":1}}],["созданному",{"2":{"195":1}}],["созданного",{"2":{"261":1,"420":1}}],["созданными",{"2":{"352":1}}],["созданные",{"2":{"314":1}}],["созданных",{"2":{"222":1}}],["созданный",{"2":{"214":1,"315":1,"431":1}}],["создан",{"2":{"116":1,"162":1,"228":1,"428":1,"435":1,"485":1}}],["созданию",{"2":{"195":1,"215":1,"241":1,"279":1}}],["создания",{"2":{"60":1,"103":1,"111":1,"112":1,"114":1,"125":2,"136":1,"141":1,"148":1,"149":1,"172":1,"191":4,"192":2,"193":2,"195":1,"203":1,"212":1,"214":2,"215":2,"222":1,"223":1,"224":2,"226":1,"228":2,"238":1,"240":1,"242":1,"243":1,"247":1,"251":1,"252":1,"253":1,"262":1,"264":1,"272":1,"273":1,"296":2,"301":1,"306":2,"316":2,"320":1,"321":1,"323":1,"324":1,"325":3,"331":2,"332":4,"335":1,"340":1,"343":1,"346":1,"351":1,"354":1,"358":1,"359":1,"366":1,"367":1,"368":1,"369":1,"374":1,"375":1,"377":1,"383":2,"384":1,"397":1,"400":1,"419":1,"420":1,"421":1,"425":1,"426":1,"429":1,"435":2,"450":1,"451":1,"495":2}}],["созданием",{"2":{"58":1,"122":1}}],["создание",{"0":{"57":1,"101":1,"395":1,"443":1},"1":{"102":1,"103":1},"2":{"212":1,"215":1,"225":1,"237":1,"253":1,"258":1,"284":1,"315":1,"367":1,"382":1,"415":2,"430":1,"440":1,"443":2,"444":1,"461":1,"492":1,"495":1,"496":2,"545":1}}],["создании",{"0":{"126":1,"529":1},"1":{"127":1,"530":1,"531":1,"532":1,"533":1},"2":{"41":1,"108":1,"113":1,"191":3,"299":1,"303":1,"335":1,"351":1,"374":1,"420":1,"496":2}}],["создадим",{"2":{"94":1,"124":1,"212":1,"214":2,"221":2,"243":1,"249":1,"273":1,"293":1,"306":1,"320":1,"322":1,"324":2,"325":1,"327":1,"352":1,"364":1,"419":1,"421":1,"436":1}}],["создаем",{"2":{"93":1,"99":1,"102":1,"162":1,"192":1,"202":1,"222":2,"237":1,"238":1,"241":2,"246":2,"294":1,"298":1,"315":1,"321":1,"326":1,"332":1,"339":1,"344":1,"349":1,"352":2,"371":2,"374":1,"384":1,"395":1}}],["создается",{"2":{"192":1,"232":1,"260":1,"383":1,"436":1}}],["создает",{"2":{"48":1,"106":1,"125":1,"144":1,"215":1,"222":1,"223":1,"231":1,"253":1,"287":1,"295":1,"344":1,"388":1,"431":1,"448":1,"499":1}}],["создали",{"2":{"17":1,"223":1,"224":1,"229":1,"246":1,"247":1,"249":1,"259":1,"326":1,"369":1,"374":1,"390":1}}],["совпадении",{"2":{"461":1}}],["совпадения",{"2":{"436":1}}],["совпадать",{"2":{"377":1}}],["совпадают",{"2":{"295":1,"383":1,"408":1}}],["совпадает",{"2":{"240":1}}],["совокупность",{"2":{"350":1,"418":1}}],["совсем",{"2":{"305":1,"369":1,"451":1,"461":1}}],["совместим",{"2":{"421":1}}],["совместимости",{"2":{"195":1,"241":1}}],["совместимость",{"0":{"116":1},"2":{"110":1,"116":3,"301":1}}],["совместимых",{"2":{"135":1}}],["совместимым",{"2":{"110":1}}],["совместному",{"2":{"243":1}}],["совместного",{"2":{"237":1,"239":1,"342":1,"351":1}}],["совместно",{"2":{"128":1,"195":1,"314":1,"343":1,"427":1,"431":1,"439":1}}],["совместное",{"2":{"108":1,"241":1}}],["совместную",{"2":{"68":1}}],["совершенствования",{"2":{"225":1}}],["совершенствование",{"2":{"223":1}}],["совершенствовать",{"2":{"223":1,"320":1,"364":1}}],["совершенно",{"2":{"194":1,"203":1,"350":1}}],["совершается",{"2":{"179":1}}],["совершать",{"2":{"83":1}}],["совершить",{"2":{"176":1,"246":1}}],["советуется",{"2":{"408":1,"448":1}}],["советы",{"0":{"446":1},"1":{"447":1,"448":1},"2":{"63":1,"452":1,"467":1,"473":1}}],["совет",{"2":{"23":1,"195":1,"199":1,"209":1,"271":1,"276":1,"293":1,"389":1,"460":1,"500":1}}],["современная",{"2":{"190":1}}],["современный",{"2":{"213":1,"360":1,"414":1,"443":1,"448":1,"460":1}}],["современных",{"2":{"213":1,"306":1,"333":2,"349":1,"354":1,"360":1,"390":1}}],["современным",{"2":{"194":1,"492":1}}],["современными",{"2":{"152":1,"354":1}}],["современные",{"0":{"457":1},"2":{"44":1,"61":1,"251":1,"275":1,"381":1,"407":1,"439":1,"443":1}}],["современной",{"2":{"213":1,"272":1,"441":1}}],["современном",{"2":{"193":1,"314":1}}],["современного",{"2":{"116":1,"496":1}}],["современное",{"2":{"2":1}}],["со",{"0":{"116":1},"2":{"11":1,"12":1,"17":1,"25":1,"41":1,"58":1,"75":1,"103":2,"108":2,"114":2,"116":2,"122":1,"126":1,"138":1,"144":1,"149":1,"159":1,"164":1,"174":2,"195":1,"197":1,"206":1,"214":2,"215":2,"218":1,"222":4,"236":1,"242":1,"246":1,"247":1,"251":1,"260":1,"261":1,"262":1,"293":1,"297":1,"302":1,"306":1,"309":1,"314":1,"322":1,"323":1,"331":1,"333":1,"337":1,"342":2,"346":1,"349":1,"352":1,"369":2,"370":1,"371":1,"374":2,"377":1,"383":2,"408":1,"414":1,"425":2,"448":1,"449":1,"461":4}}],["с",{"0":{"50":1,"104":1,"110":1,"135":1,"151":1,"177":1,"216":1,"226":1,"228":1,"238":1,"242":1,"263":1,"312":1,"320":1,"324":1,"340":1,"345":1,"351":1,"396":1,"400":1,"404":1,"431":1,"439":1},"1":{"105":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"217":1,"227":1,"228":1,"229":2,"230":2,"231":2,"232":2,"233":1,"234":1,"235":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,"313":1,"314":1,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":2,"322":2,"323":2,"324":1,"325":2,"326":2,"327":2,"328":2,"329":2,"330":2,"331":1,"332":1,"333":1,"334":1,"341":1,"342":1,"346":1,"347":1,"348":1,"349":1,"352":1,"353":1},"2":{"2":2,"3":5,"6":1,"9":3,"11":3,"12":2,"17":3,"20":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,"58":1,"61":1,"62":1,"66":1,"67":1,"68":3,"73":1,"75":4,"78":1,"81":2,"83":1,"86":1,"88":1,"89":4,"93":1,"96":3,"97":3,"98":1,"99":3,"105":3,"106":13,"107":10,"108":3,"109":4,"110":4,"111":1,"114":3,"115":4,"116":1,"121":2,"122":5,"123":1,"125":5,"126":1,"127":1,"128":7,"130":1,"131":4,"132":2,"134":4,"135":4,"136":4,"138":7,"140":5,"141":4,"142":3,"143":2,"144":1,"145":4,"146":1,"147":1,"148":1,"149":4,"150":3,"151":2,"152":1,"153":3,"154":2,"155":3,"156":1,"157":3,"158":4,"159":2,"161":2,"162":3,"164":2,"166":1,"167":4,"168":1,"169":2,"171":1,"172":5,"173":2,"174":2,"175":2,"176":2,"177":1,"178":1,"179":2,"182":2,"184":1,"185":1,"186":2,"187":3,"188":4,"190":4,"191":9,"192":3,"193":3,"194":8,"195":5,"196":1,"199":2,"200":1,"201":1,"202":4,"203":1,"204":1,"206":2,"207":1,"209":1,"210":1,"212":6,"213":6,"214":10,"215":11,"217":4,"218":7,"219":2,"220":5,"221":4,"222":20,"223":4,"225":3,"226":9,"228":3,"229":5,"230":6,"231":3,"232":2,"233":1,"234":3,"235":5,"236":3,"237":2,"238":8,"240":10,"241":7,"242":3,"243":1,"244":1,"245":2,"246":14,"247":8,"248":1,"249":2,"250":3,"251":3,"252":1,"253":14,"254":1,"255":2,"256":4,"258":3,"259":2,"260":5,"261":7,"262":4,"263":2,"264":6,"266":3,"267":1,"269":3,"270":2,"271":2,"272":2,"273":8,"274":6,"276":1,"277":3,"282":3,"284":1,"285":1,"287":2,"288":2,"290":1,"293":1,"295":3,"296":1,"298":3,"299":3,"300":3,"301":6,"302":1,"303":7,"304":3,"306":9,"307":1,"308":5,"309":15,"310":3,"312":5,"313":1,"314":6,"316":3,"317":3,"318":7,"319":3,"320":5,"321":5,"322":3,"323":2,"324":5,"325":8,"326":5,"327":3,"328":2,"329":1,"330":3,"332":7,"333":3,"334":2,"335":6,"336":1,"337":3,"338":2,"339":3,"340":3,"342":6,"343":2,"344":5,"345":2,"346":3,"347":3,"349":3,"350":8,"351":4,"352":7,"353":3,"354":2,"358":3,"360":1,"362":1,"364":8,"366":8,"367":5,"368":3,"369":4,"371":8,"372":1,"373":3,"374":8,"375":4,"376":3,"377":7,"378":2,"380":8,"381":4,"382":2,"383":3,"384":1,"385":1,"386":4,"387":4,"388":9,"389":11,"390":3,"396":2,"399":1,"400":2,"401":2,"402":1,"407":4,"408":4,"409":4,"411":3,"412":3,"414":2,"415":4,"416":1,"417":11,"418":4,"419":3,"420":8,"421":10,"422":1,"423":1,"424":4,"425":2,"426":14,"427":1,"428":2,"429":4,"430":3,"431":5,"432":2,"433":1,"435":4,"436":4,"437":1,"438":9,"439":10,"440":1,"443":3,"444":4,"445":1,"446":1,"448":4,"449":11,"450":4,"451":3,"452":5,"453":1,"454":1,"456":1,"460":12,"461":11,"467":1,"484":3,"489":3,"492":2,"494":1,"495":5,"496":6,"497":1,"499":1,"500":1,"501":3,"507":2,"515":1,"521":1,"524":3,"527":1,"528":1,"530":1,"531":1,"532":1,"533":2,"534":1,"542":1}}],["дня",{"2":{"460":1}}],["дней",{"2":{"456":1,"460":1}}],["дни",{"2":{"270":1,"386":1}}],["дюймов",{"2":{"444":1}}],["дэвиду",{"2":{"274":1}}],["думать",{"2":{"358":1}}],["думаю",{"2":{"271":1}}],["дубликаты",{"2":{"298":1}}],["дубликата",{"2":{"247":1}}],["дублированию",{"2":{"350":1}}],["дублирование",{"2":{"223":1,"274":1,"282":1,"350":1}}],["дублировать",{"2":{"106":1,"427":1}}],["дыхательной",{"2":{"269":1}}],["длительных",{"2":{"309":1,"350":1}}],["длительному",{"2":{"415":1}}],["длительное",{"2":{"159":1}}],["длительного",{"2":{"159":2}}],["длиной",{"2":{"271":1}}],["длину",{"2":{"222":1}}],["длинных",{"2":{"226":1,"309":1}}],["длинными",{"2":{"219":1}}],["длинный",{"2":{"161":1}}],["для",{"0":{"64":1,"107":1,"126":1,"137":1,"151":1,"163":1,"171":1,"179":1,"189":1,"211":1,"225":1,"250":1,"265":1,"276":1,"311":1,"331":1,"334":1,"355":1,"359":1,"391":1,"442":1,"514":1},"1":{"127":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"172":1,"173":1,"174":1,"175":1,"279":1,"280":1,"281":1,"282":1,"332":1,"515":1,"516":1},"2":{"2":1,"3":1,"4":1,"7":2,"9":2,"10":1,"12":2,"13":1,"17":5,"18":1,"20":3,"23":4,"27":2,"35":1,"36":1,"39":2,"40":2,"41":3,"47":3,"48":1,"50":1,"52":1,"57":1,"58":4,"61":1,"62":3,"66":1,"67":2,"68":2,"70":1,"75":3,"77":1,"78":2,"81":2,"82":1,"86":3,"88":3,"89":1,"93":1,"94":1,"96":1,"97":1,"98":2,"103":1,"105":1,"106":4,"107":3,"108":3,"109":6,"110":2,"111":1,"112":5,"113":1,"114":5,"116":5,"118":2,"119":1,"121":3,"122":4,"124":3,"125":20,"126":1,"127":2,"128":5,"131":2,"132":2,"133":2,"134":3,"135":10,"136":1,"137":1,"138":3,"140":4,"141":4,"142":2,"143":3,"144":2,"145":2,"146":1,"147":1,"148":3,"149":3,"150":5,"152":2,"153":2,"154":6,"155":4,"156":1,"157":3,"158":4,"159":3,"160":3,"161":3,"162":2,"164":4,"165":2,"166":1,"167":5,"168":3,"169":5,"170":1,"172":6,"174":1,"177":1,"178":1,"179":1,"182":2,"185":1,"186":1,"188":3,"190":4,"191":8,"192":5,"193":5,"194":9,"195":11,"199":2,"200":2,"202":3,"203":6,"204":1,"206":1,"209":4,"210":1,"211":2,"212":3,"213":7,"214":8,"215":8,"216":2,"218":8,"219":13,"220":2,"221":3,"222":22,"224":2,"226":2,"228":2,"229":1,"230":7,"232":7,"234":3,"235":3,"236":2,"237":3,"238":5,"239":2,"240":5,"241":3,"242":2,"243":3,"245":1,"246":14,"247":11,"249":1,"251":5,"252":2,"253":12,"255":3,"256":3,"257":1,"258":2,"260":6,"261":12,"262":4,"263":1,"264":2,"265":2,"266":4,"269":2,"270":3,"271":1,"272":1,"273":4,"274":1,"275":1,"276":3,"277":7,"283":1,"285":1,"287":3,"288":2,"290":1,"292":3,"293":6,"294":5,"295":2,"297":1,"298":5,"299":5,"300":2,"301":6,"302":7,"303":4,"304":1,"305":1,"306":10,"307":7,"309":15,"310":2,"312":4,"313":1,"314":7,"315":2,"316":1,"317":4,"318":3,"319":2,"320":3,"321":2,"322":1,"323":3,"324":3,"325":7,"326":3,"327":7,"328":4,"329":1,"330":5,"331":5,"332":10,"333":2,"334":1,"335":6,"336":3,"337":4,"338":1,"339":3,"341":1,"342":5,"343":4,"344":4,"346":2,"347":1,"348":2,"349":7,"350":15,"351":1,"352":4,"353":2,"354":2,"355":2,"358":3,"359":3,"360":2,"361":1,"363":1,"364":1,"366":6,"367":2,"368":4,"369":3,"370":1,"371":3,"374":6,"375":1,"376":2,"377":5,"378":2,"380":3,"381":8,"382":3,"383":13,"384":3,"385":1,"386":3,"387":9,"388":6,"389":14,"390":2,"391":2,"394":1,"395":1,"397":1,"398":1,"399":1,"400":1,"401":1,"402":1,"404":1,"405":1,"407":3,"408":12,"409":4,"411":2,"412":2,"413":1,"414":2,"415":5,"417":5,"418":5,"419":6,"420":7,"421":5,"422":1,"423":3,"424":3,"425":4,"426":3,"427":2,"428":6,"429":6,"430":4,"431":5,"432":2,"433":1,"435":1,"436":3,"437":2,"438":1,"439":6,"440":2,"441":4,"442":2,"443":8,"444":9,"445":2,"446":1,"447":1,"448":8,"449":6,"450":3,"451":8,"452":1,"454":1,"455":2,"456":1,"458":1,"459":2,"460":6,"461":18,"485":1,"491":1,"492":5,"494":1,"495":6,"497":2,"499":1,"500":3,"501":1,"504":1,"506":2,"515":1,"517":1,"524":4,"527":2,"530":6,"533":5,"540":1,"543":4,"544":1}}],["дриллинг",{"2":{"449":1}}],["др",{"2":{"213":1,"253":1,"533":1}}],["драйверами",{"2":{"167":1}}],["древовидной",{"2":{"165":1,"340":1}}],["древней",{"2":{"138":1}}],["дружелюбие",{"2":{"146":1}}],["дружественный",{"0":{"187":1}}],["дружественные",{"2":{"125":1}}],["дружественного",{"2":{"125":1}}],["другую",{"2":{"184":1,"235":1,"303":1,"344":1,"350":1,"352":1,"374":1,"382":1,"422":1,"437":1,"454":1}}],["другу",{"2":{"145":1,"230":1,"319":1}}],["другая",{"2":{"301":1,"303":1,"486":1}}],["друга",{"2":{"142":1,"169":1,"176":1,"230":1,"303":1,"337":1,"389":1,"420":1,"427":1}}],["другого",{"2":{"87":1,"119":1,"124":1,"169":1,"178":2,"195":1,"226":1,"274":1,"276":2,"293":1,"301":1,"302":1,"306":1,"332":1,"368":1,"418":1,"449":2}}],["другой",{"0":{"111":1},"2":{"34":1,"39":1,"41":2,"108":1,"144":1,"191":1,"193":1,"222":1,"235":1,"247":1,"250":1,"260":2,"266":1,"293":1,"297":1,"300":1,"308":1,"342":1,"349":1,"366":1,"374":1,"381":1,"387":1,"408":1,"411":1,"449":4,"452":1,"460":1,"495":1,"499":1}}],["другое",{"2":{"26":1,"36":1,"81":1,"131":1,"191":1,"195":1,"203":1,"214":1,"230":1,"233":1,"246":1,"260":1,"309":1,"389":1,"439":1,"449":1}}],["другому",{"2":{"237":1,"247":1,"276":1,"299":1}}],["другом",{"2":{"2":1,"3":1,"68":1,"107":1,"145":2,"147":1,"172":1,"195":1,"216":1,"226":1,"228":1,"230":1,"234":1,"250":1,"273":1,"307":1,"335":2,"346":1,"350":1,"409":1,"414":1,"496":1}}],["другими",{"2":{"99":1,"128":2,"138":1,"140":1,"142":1,"161":1,"185":1,"215":1,"232":1,"253":1,"260":1,"269":1,"273":1,"280":1,"284":1,"296":1,"306":1,"309":1,"312":1,"314":1,"321":1,"366":1,"367":1,"374":1,"405":1,"421":1,"449":1,"452":1,"461":1,"495":1}}],["другим",{"2":{"64":1,"99":1,"125":1,"140":1,"147":1,"163":1,"165":1,"191":1,"195":1,"215":1,"230":1,"317":1,"344":1,"350":1,"387":1,"389":1,"428":1,"438":1}}],["другие",{"0":{"119":1,"120":1,"133":1,"175":1},"2":{"4":1,"58":1,"94":1,"98":1,"107":1,"109":1,"110":3,"117":1,"128":1,"141":1,"151":1,"159":1,"175":1,"190":3,"191":1,"193":1,"194":3,"195":2,"202":1,"218":1,"221":1,"230":1,"234":1,"235":1,"239":1,"240":1,"249":1,"253":1,"254":1,"272":1,"286":1,"293":1,"297":1,"301":1,"302":1,"309":1,"316":1,"324":1,"325":1,"335":1,"344":1,"350":2,"359":1,"368":1,"371":1,"374":1,"375":1,"376":1,"389":1,"393":1,"403":1,"407":1,"411":1,"412":1,"418":2,"421":1,"427":2,"429":1,"434":1,"437":1,"439":1,"444":1,"451":1,"458":1,"461":1,"533":2}}],["других",{"0":{"0":1},"2":{"16":1,"22":1,"41":1,"81":1,"86":1,"121":1,"125":3,"133":2,"142":1,"154":1,"169":4,"181":1,"191":2,"203":2,"212":1,"215":1,"216":1,"218":1,"224":1,"229":1,"241":1,"242":1,"255":1,"270":1,"271":1,"276":1,"285":1,"287":2,"288":1,"314":1,"316":1,"325":1,"327":1,"328":1,"332":2,"342":2,"345":1,"358":1,"381":1,"407":1,"439":1,"451":2,"495":1,"533":1}}],["друг",{"2":{"2":1,"3":1,"68":1,"142":1,"145":3,"147":1,"169":1,"172":1,"176":1,"226":1,"228":1,"230":3,"250":1,"273":1,"303":1,"307":1,"319":1,"335":2,"337":1,"389":1,"409":1,"420":1,"427":1,"496":1}}],["д",{"0":{"231":1},"2":{"67":2,"107":1,"110":1,"111":1,"115":1,"140":5,"144":2,"149":2,"153":1,"155":1,"156":1,"157":1,"161":2,"191":1,"192":1,"194":1,"195":2,"201":1,"203":1,"213":1,"215":3,"218":1,"240":1,"241":1,"248":2,"253":3,"255":1,"256":1,"257":1,"269":1,"294":1,"297":1,"301":1,"304":1,"309":1,"314":1,"315":1,"327":1,"337":1,"366":3,"371":1,"380":1,"381":1,"382":1,"386":1,"387":1,"388":2,"415":1,"417":3,"418":1,"421":3,"423":1,"424":1,"437":1,"440":1,"457":1,"461":1,"494":2,"496":4}}],["динамичного",{"2":{"531":1,"533":1}}],["динамично",{"2":{"412":1,"451":1,"496":1,"497":1}}],["динамичным",{"2":{"271":1,"501":1}}],["динамичными",{"2":{"38":1}}],["динамичных",{"2":{"228":1}}],["динамическая",{"2":{"367":1}}],["динамической",{"2":{"461":1}}],["динамическому",{"2":{"242":1}}],["динамического",{"2":{"235":2,"242":1,"371":1}}],["динамическое",{"2":{"196":1,"235":1,"380":1}}],["динамических",{"2":{"366":1,"377":1,"382":1}}],["динамически",{"2":{"242":1,"366":1,"374":1,"461":1}}],["динамические",{"0":{"242":1},"2":{"228":1,"231":1,"349":1,"367":1,"375":1}}],["динамический",{"0":{"235":1},"2":{"215":1,"235":1}}],["диспетчере",{"2":{"298":1}}],["диспетчером",{"2":{"297":1}}],["диспетчера",{"2":{"297":2,"298":1,"322":1,"341":1}}],["дисплее",{"2":{"141":1}}],["дистрибутивов",{"2":{"433":1}}],["дистрибутивах",{"2":{"433":2}}],["дистрибутива",{"2":{"127":1,"134":1,"136":1,"433":1}}],["дистрибуция",{"2":{"140":1}}],["дисциплину",{"2":{"417":1,"419":1}}],["дисциплине",{"2":{"363":1}}],["дисциплина",{"2":{"417":1,"430":2}}],["дисциплинах",{"2":{"271":1}}],["дисциплинами",{"2":{"140":2}}],["дисциплиной",{"2":{"266":1}}],["дисциплины",{"2":{"138":1,"140":1,"417":1,"419":1}}],["диске",{"2":{"360":1}}],["дисковое",{"2":{"350":1,"443":1}}],["дискуссия",{"2":{"155":1}}],["диска",{"2":{"132":1}}],["диск",{"2":{"106":1,"444":1}}],["диалога",{"2":{"245":2,"246":2,"247":1}}],["диалоге",{"2":{"166":1,"167":1}}],["диалог",{"2":{"166":2,"185":1,"231":2,"232":3,"245":2,"246":4}}],["диалоги",{"0":{"166":1},"2":{"149":1,"166":1,"230":1,"232":1,"243":1,"369":1}}],["диалоговые",{"2":{"229":1}}],["диалоговое",{"2":{"184":1}}],["диалогов",{"0":{"231":1},"2":{"149":1,"166":1,"230":1,"231":1,"232":1,"238":1,"249":1}}],["диапазоны",{"2":{"161":1}}],["диапазон",{"2":{"125":1}}],["диаграмме",{"2":{"231":2,"269":1}}],["диаграмму",{"2":{"193":1}}],["диаграмма",{"0":{"14":1},"2":{"14":2}}],["диаграммы",{"2":{"5":1,"14":2,"67":1,"230":1,"314":1,"318":1,"340":1,"458":1}}],["директивой",{"2":{"240":1}}],["директиве",{"2":{"222":1,"237":1}}],["директивы",{"2":{"194":1,"196":2,"199":1,"202":2,"211":1,"215":1,"222":2,"237":1,"240":1,"243":1}}],["директиву",{"2":{"162":1,"237":2,"240":1}}],["директив",{"0":{"196":1},"1":{"197":1,"198":1,"199":1,"200":1,"201":1,"202":1},"2":{"112":1,"202":1,"203":2,"210":1,"242":1}}],["директивами",{"2":{"196":1}}],["директива",{"0":{"236":1},"2":{"99":2,"196":1,"197":1,"198":1,"201":1,"202":1,"240":1}}],["директорий",{"2":{"413":1}}],["директория",{"2":{"408":2}}],["директориях",{"2":{"368":1}}],["директории",{"2":{"94":1,"126":2,"218":1,"247":1,"331":1,"420":1,"428":1,"436":1,"489":2,"501":1,"503":1}}],["директорию",{"2":{"87":1,"408":1}}],["дирректорию",{"2":{"86":1}}],["дизайна",{"0":{"140":1},"2":{"141":2,"142":1,"143":1,"146":1,"147":1,"168":1,"172":1,"174":1,"216":1,"229":1,"250":1,"366":1,"382":1,"396":1,"451":1,"494":1,"496":1}}],["дизайну",{"2":{"23":1,"260":1}}],["дизайнерское",{"2":{"374":1}}],["дизайнером",{"2":{"216":1,"403":1}}],["дизайнер",{"2":{"141":2,"142":1,"143":1,"145":1}}],["дизайнеру",{"2":{"141":1}}],["дизайнерами",{"2":{"138":1,"188":1}}],["дизайне",{"2":{"23":2,"141":1,"247":1,"417":1}}],["дизайн",{"0":{"1":1,"24":1,"25":1,"68":1,"140":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"25":1,"26":1},"2":{"25":2,"26":1,"66":1,"68":2,"140":4,"149":1,"150":1,"172":1,"223":1,"228":3,"229":3,"246":1,"247":1,"281":1,"417":2,"484":1}}],["дойти",{"2":{"461":1}}],["дойдем",{"2":{"162":1}}],["доскролил",{"2":{"448":1}}],["дословно",{"2":{"261":1}}],["достойны",{"2":{"460":1}}],["достоинствами",{"2":{"270":1}}],["достигнем",{"2":{"269":1}}],["достигнет",{"2":{"147":1}}],["достигается",{"2":{"251":1,"383":1}}],["достижений",{"2":{"194":1}}],["достижению",{"2":{"147":1}}],["достижения",{"2":{"75":1,"169":1,"222":1,"269":1,"369":1}}],["достичь",{"2":{"64":1,"172":1}}],["доступе",{"2":{"460":1}}],["доступен",{"2":{"125":1,"350":1,"407":1,"431":1,"516":1}}],["доступной",{"2":{"449":1}}],["доступное",{"2":{"350":1}}],["доступном",{"2":{"350":1}}],["доступно",{"0":{"531":1},"2":{"246":1,"350":1,"530":1}}],["доступный",{"2":{"350":1,"515":1}}],["доступные",{"0":{"530":1},"2":{"218":1,"253":1,"318":1,"349":1,"371":1,"496":1}}],["доступными",{"2":{"349":1}}],["доступным",{"2":{"161":1,"223":1,"234":1,"240":1,"336":1,"343":1}}],["доступных",{"2":{"148":1,"152":1,"261":1,"324":1,"358":1,"380":1,"491":1}}],["доступны",{"2":{"141":1,"195":1,"237":1,"238":1,"242":1,"355":1,"380":2,"412":1,"508":1}}],["доступна",{"2":{"134":1,"350":1,"361":1,"449":1}}],["доступом",{"2":{"128":1}}],["доступ",{"0":{"58":1},"2":{"58":1,"105":1,"106":3,"107":3,"108":8,"128":1,"135":3,"161":1,"169":1,"174":1,"187":1,"195":4,"222":1,"240":1,"263":1,"284":1,"301":1,"314":2,"323":1,"327":1,"345":1,"346":2,"350":2,"364":1,"382":1,"387":1,"391":1,"407":1,"410":1,"412":1,"425":1,"426":1,"449":2}}],["доступа",{"0":{"324":1},"1":{"325":1,"326":1,"327":1,"328":1,"329":1,"330":1},"2":{"17":1,"40":1,"52":1,"57":1,"106":5,"107":1,"108":1,"114":1,"125":2,"128":1,"195":1,"232":1,"240":1,"283":1,"284":1,"287":1,"312":1,"314":1,"318":3,"320":1,"332":1,"333":1,"337":1,"383":1,"408":1,"444":1}}],["доставка",{"0":{"440":1},"2":{"405":1,"439":1,"440":2}}],["доставки",{"2":{"4":1,"70":1,"78":1,"134":1,"192":1,"440":1}}],["достаточным",{"2":{"419":1}}],["достаточный",{"0":{"142":1}}],["достаточную",{"2":{"166":1}}],["достаточное",{"2":{"216":1,"219":1}}],["достаточно",{"2":{"40":1,"57":1,"58":1,"81":1,"131":2,"154":1,"159":1,"215":1,"219":1,"222":1,"230":1,"240":1,"241":1,"246":1,"253":1,"260":2,"274":1,"286":1,"295":1,"303":1,"308":1,"315":1,"317":1,"320":1,"328":1,"329":1,"337":1,"338":1,"339":1,"342":1,"350":2,"352":1,"368":1,"372":1,"382":1,"386":2,"409":1,"428":1,"429":1,"438":1,"441":1,"444":1,"445":1,"448":1,"451":1,"461":1,"495":1}}],["дождаться",{"2":{"260":1}}],["допускает",{"2":{"426":1}}],["допускают",{"2":{"253":1}}],["допустимы",{"2":{"381":1}}],["допустим",{"2":{"240":1,"382":1,"452":1}}],["дополненного",{"2":{"332":1}}],["дополнение",{"2":{"295":1}}],["дополнением",{"2":{"258":1}}],["дополнениями",{"2":{"219":1}}],["дополнили",{"2":{"306":1}}],["дополнительную",{"2":{"383":1}}],["дополнительных",{"2":{"195":1,"214":1,"218":1,"222":1,"231":1,"258":2,"313":1,"333":1,"381":1,"389":1,"405":1,"416":1,"417":1,"420":1}}],["дополнительным",{"2":{"193":1,"248":1,"342":1}}],["дополнительными",{"2":{"167":1,"215":1,"318":1,"366":1}}],["дополнительные",{"2":{"190":1,"191":1,"219":1,"299":1,"303":1,"318":1,"381":1,"400":1,"424":1,"439":1,"461":1}}],["дополнительный",{"2":{"29":1,"178":1,"216":1,"309":1}}],["дополнительная",{"2":{"94":1}}],["дополнительного",{"2":{"252":1,"390":1,"430":1}}],["дополнительной",{"2":{"191":2,"303":1}}],["дополнительное",{"2":{"48":1,"214":1,"371":1,"383":1}}],["дополнительно",{"2":{"16":1}}],["дополняем",{"2":{"305":1}}],["дополнять",{"2":{"304":1}}],["дополняющего",{"2":{"303":1}}],["дорогой",{"2":{"418":1}}],["дорогостоящим",{"2":{"415":1}}],["дорогостоящей",{"2":{"388":1}}],["дорогим",{"2":{"301":1}}],["дороги",{"2":{"199":1}}],["доработаем",{"2":{"246":1}}],["доработки",{"2":{"223":1}}],["дорабатывать",{"2":{"212":1}}],["дочерняя",{"2":{"237":1,"339":1}}],["дочернему",{"2":{"237":1,"338":1}}],["дочернем",{"2":{"236":1,"238":2,"353":1,"377":1}}],["дочернего",{"2":{"195":1,"237":2,"338":1}}],["дочерний",{"2":{"231":1,"236":1,"271":2,"339":1}}],["дочерними",{"2":{"237":1}}],["дочерним",{"2":{"230":1,"237":1,"247":1,"337":2}}],["дочерних",{"2":{"222":1,"231":1,"238":1,"240":1,"337":1,"339":1,"343":1}}],["дочерние",{"2":{"203":1,"337":3,"376":2,"377":1}}],["договаривается",{"2":{"350":1}}],["договоре",{"2":{"180":1}}],["догадались",{"2":{"194":1,"214":1,"293":1}}],["доходит",{"2":{"161":1,"386":1}}],["додо",{"2":{"140":1}}],["доведем",{"2":{"220":1}}],["доверенных",{"2":{"108":2}}],["доводить",{"2":{"210":1}}],["довольно",{"2":{"3":1,"9":1,"25":1,"39":1,"81":1,"107":2,"109":1,"122":1,"128":1,"168":1,"178":1,"179":1,"180":1,"214":1,"218":2,"219":1,"246":1,"260":1,"277":1,"287":1,"296":1,"301":2,"302":1,"309":1,"314":1,"315":1,"319":1,"324":1,"337":1,"339":1,"367":1,"386":1,"435":1,"438":1,"444":1,"460":2,"461":1,"495":3,"527":1}}],["документ",{"2":{"459":1}}],["документируйте",{"0":{"458":1},"2":{"411":1}}],["документирован",{"2":{"324":1}}],["документированная",{"2":{"324":1}}],["документирования",{"2":{"230":1,"458":1}}],["документирование",{"0":{"72":1},"2":{"66":1}}],["документов",{"2":{"324":2}}],["документом",{"2":{"179":1}}],["документной",{"2":{"314":1}}],["документа",{"2":{"111":1,"198":1,"241":2}}],["документаций",{"2":{"461":1}}],["документацию",{"2":{"131":1,"191":1,"203":1,"212":1,"276":1,"349":1,"495":1}}],["документации",{"2":{"110":1,"119":1,"120":1,"128":1,"129":1,"133":1,"141":1,"202":1,"203":1,"213":1,"240":1,"242":1,"261":1,"262":1,"309":1,"317":1,"328":1,"350":1,"371":1,"380":2,"408":1,"411":1,"412":1,"421":2,"425":1,"433":1,"434":1,"460":1,"484":1}}],["документацией",{"2":{"72":1,"213":1,"352":1,"389":1,"439":1}}],["документация",{"2":{"67":1,"230":1,"411":1,"449":1,"460":4,"485":1}}],["доброжелательные",{"2":{"460":1}}],["добрый",{"2":{"61":1}}],["добились",{"2":{"248":1,"249":1}}],["добиться",{"2":{"172":1,"263":1,"368":1}}],["добавятся",{"2":{"438":1}}],["добавьте",{"2":{"219":1,"222":1,"316":1,"326":1,"408":1,"438":1}}],["добавив",{"2":{"217":1,"421":1,"438":1}}],["добавили",{"2":{"195":1,"247":1}}],["добавились",{"2":{"83":1}}],["добавит",{"2":{"108":1,"420":1,"435":1}}],["добавить",{"2":{"29":1,"218":1,"253":1,"303":1,"427":1,"429":1,"433":1,"435":2,"444":1,"452":2,"459":1}}],["добавим",{"2":{"36":1,"222":1,"323":1,"328":1,"420":1}}],["добавленные",{"2":{"438":1}}],["добавления",{"2":{"191":1,"222":1,"270":1,"300":1,"301":1,"303":3}}],["добавление",{"2":{"12":1,"78":1,"217":1,"255":1,"322":1,"380":1,"448":1,"451":1,"483":1,"492":1,"530":1}}],["добавлен",{"2":{"178":2}}],["добавляются",{"2":{"461":1}}],["добавляют",{"2":{"442":1}}],["добавляя",{"2":{"297":1,"305":1}}],["добавлялись",{"2":{"190":1}}],["добавляется",{"2":{"412":1}}],["добавляет",{"2":{"108":1,"115":1,"303":1,"313":1,"326":1,"452":1,"459":1,"507":1,"517":1,"540":1}}],["добавляем",{"2":{"88":1,"89":1,"241":1,"247":1,"374":1,"439":1}}],["добавлять",{"2":{"18":1,"178":1,"248":1,"306":1,"344":1}}],["долларов",{"2":{"125":1}}],["доля",{"2":{"116":1}}],["дольше",{"2":{"106":1,"314":1}}],["долгосрочной",{"2":{"68":1}}],["долгого",{"2":{"39":1}}],["должна",{"2":{"75":1,"143":1,"159":1,"188":1,"191":1,"194":1,"195":1,"203":1,"238":1,"269":3,"307":1,"330":1,"337":1,"384":1,"389":1,"408":1,"426":1,"460":1}}],["должны",{"2":{"23":1,"41":1,"75":1,"113":1,"114":1,"142":2,"145":1,"147":2,"149":1,"150":1,"157":1,"162":1,"166":1,"175":1,"191":1,"193":2,"216":1,"218":1,"222":2,"223":1,"230":1,"237":1,"238":1,"240":1,"246":1,"253":1,"259":1,"263":1,"266":1,"267":2,"271":1,"272":3,"274":1,"275":1,"276":1,"277":1,"298":1,"309":1,"314":1,"319":1,"327":1,"336":1,"339":1,"342":1,"344":1,"346":1,"368":1,"377":1,"382":3,"383":1,"387":1,"409":1,"412":1,"421":1,"427":1,"448":1,"455":1}}],["должном",{"2":{"459":1}}],["должно",{"2":{"11":1,"44":1,"78":1,"106":1,"107":1,"150":1,"173":1,"202":1,"220":1,"237":2,"253":3,"255":1,"256":1,"257":1,"265":1,"314":1,"346":1,"377":1,"417":1,"419":1,"420":1,"421":1,"422":4,"450":1,"496":1}}],["должен",{"2":{"11":1,"20":2,"48":1,"75":1,"86":1,"106":1,"113":1,"125":1,"135":1,"150":2,"153":1,"173":1,"180":1,"188":1,"191":2,"200":1,"214":1,"217":1,"220":1,"235":1,"236":1,"237":1,"246":2,"253":1,"255":2,"258":1,"260":1,"261":1,"270":1,"271":1,"273":1,"274":1,"283":1,"291":1,"293":2,"297":1,"300":1,"301":1,"304":3,"314":2,"315":1,"322":1,"337":1,"342":1,"360":1,"382":1,"383":2,"386":1,"387":1,"389":1,"408":2,"417":1,"420":1,"427":1,"428":1,"449":1,"461":1,"542":1}}],["домашний",{"2":{"174":1,"461":1,"542":1}}],["домашняя",{"0":{"173":1},"2":{"173":1}}],["домашнюю",{"2":{"142":1}}],["домашнего",{"2":{"125":1}}],["домашней",{"2":{"125":1}}],["домене",{"2":{"125":2}}],["домену",{"2":{"125":1}}],["доменным",{"2":{"131":1}}],["доменные",{"2":{"125":1}}],["доменных",{"0":{"125":1},"1":{"127":1},"2":{"125":1}}],["доменное",{"2":{"124":1,"125":2}}],["домены",{"0":{"125":1},"1":{"127":1},"2":{"125":3,"132":1,"135":1}}],["доменов",{"2":{"108":1,"125":1,"269":1}}],["доменом",{"2":{"103":1,"108":1,"126":1}}],["домен",{"2":{"108":1,"125":9,"126":1,"134":1,"135":1,"137":1,"178":1,"328":1,"407":3,"460":1,"516":2}}],["доменами",{"2":{"125":1}}],["домена",{"2":{"108":4,"122":1,"125":4,"126":1,"130":1,"135":1,"136":1,"137":2,"324":1,"332":2,"350":1,"407":1}}],["дом",{"2":{"26":1}}],["до",{"0":{"254":1},"1":{"255":1,"256":1,"257":1,"258":1,"259":1,"260":1},"2":{"23":1,"60":1,"96":1,"112":1,"116":1,"125":2,"135":1,"139":1,"147":1,"152":1,"161":1,"162":1,"166":1,"169":1,"174":1,"178":1,"179":1,"185":1,"190":2,"191":2,"193":1,"195":1,"202":1,"203":1,"210":2,"212":1,"216":4,"220":1,"224":1,"229":1,"232":1,"235":2,"240":1,"257":1,"261":1,"269":1,"276":1,"290":1,"301":1,"303":1,"304":1,"306":1,"309":1,"314":4,"344":2,"352":1,"366":1,"367":1,"371":2,"374":1,"375":1,"377":2,"382":1,"386":1,"387":2,"396":1,"412":1,"417":2,"424":1,"429":1,"439":1,"440":1,"448":1,"461":3,"496":1}}],["декларируемое",{"2":{"449":1}}],["декомпозиции",{"2":{"451":1}}],["декодирован",{"2":{"383":1}}],["декодированной",{"2":{"380":1}}],["декодирует",{"2":{"383":1}}],["декораторов",{"2":{"303":2}}],["декораторы",{"2":{"303":3,"305":1}}],["декораторами",{"2":{"306":1}}],["декораторам",{"2":{"303":1}}],["декоратора",{"2":{"277":1,"303":2,"305":1,"306":1,"352":1}}],["декоратор",{"0":{"303":1},"1":{"304":1,"305":1},"2":{"216":1,"266":1,"302":1,"303":3,"304":2,"352":2}}],["дебаге",{"2":{"448":1}}],["дебажить",{"2":{"55":1}}],["девопс",{"2":{"405":1}}],["девичестве",{"2":{"50":1}}],["децентрализованные",{"2":{"389":2}}],["децентрализованных",{"2":{"366":1,"389":1}}],["детей",{"2":{"460":1}}],["детьми",{"2":{"335":1}}],["детали",{"0":{"502":1},"1":{"503":1,"504":1},"2":{"374":1,"458":1}}],["детализирована",{"2":{"269":1}}],["детализации",{"2":{"169":1}}],["деталей",{"2":{"275":1}}],["деталях",{"0":{"233":1},"1":{"234":1,"235":1,"236":1,"237":1,"238":1},"2":{"201":1,"383":1}}],["деталям",{"2":{"122":2,"375":1}}],["детальную",{"2":{"452":1}}],["детального",{"2":{"249":1}}],["детально",{"2":{"141":1}}],["детальный",{"2":{"14":1}}],["дефисами",{"2":{"221":1}}],["деятельность",{"2":{"156":1}}],["деятельностью",{"2":{"64":1}}],["деактивации",{"2":{"153":2}}],["демонстрации",{"2":{"145":1,"358":1}}],["демонстрирующий",{"2":{"269":1,"345":1}}],["демонстрируют",{"2":{"139":1}}],["демонстрирует",{"2":{"144":1,"162":1,"289":1,"430":1,"449":1}}],["деньги",{"2":{"444":1}}],["день",{"2":{"125":1,"138":1,"149":1,"429":1,"431":1}}],["денег",{"2":{"62":1}}],["держи",{"0":{"275":1},"2":{"266":2}}],["держим",{"2":{"23":1}}],["держателем",{"2":{"242":1}}],["держать",{"2":{"214":1,"460":1}}],["деревьев",{"2":{"375":1}}],["дереву",{"2":{"238":1,"290":1,"337":1,"339":2,"449":1}}],["дереве",{"2":{"230":1,"237":1,"342":1}}],["дерево",{"2":{"193":1,"270":1}}],["дерева",{"2":{"119":1,"203":1,"216":1,"230":1,"339":1}}],["де",{"2":{"109":1,"368":1,"500":1}}],["деплое",{"2":{"408":1}}],["деплоится",{"2":{"408":1}}],["деплоить",{"2":{"408":1}}],["деплой",{"2":{"408":1,"469":1,"470":1}}],["деплоя",{"2":{"70":1,"408":4,"439":1,"460":1,"496":1,"530":1,"533":1}}],["депозитами",{"2":{"106":1}}],["действовать",{"2":{"304":1,"382":1}}],["действовало",{"2":{"251":1}}],["действительному",{"2":{"386":1}}],["действительно",{"2":{"186":1,"295":1,"303":1,"411":1,"414":1,"450":1}}],["действительная",{"2":{"106":1}}],["действию",{"0":{"174":1},"2":{"142":1,"174":3,"186":1}}],["действии",{"0":{"363":1},"2":{"139":1,"166":1,"193":1,"213":1,"214":1,"222":1,"227":1,"252":1,"272":2,"306":1,"313":1,"335":1,"336":1,"363":1,"365":1,"416":1}}],["действием",{"2":{"154":1,"155":1}}],["действие",{"2":{"106":2,"154":1,"155":1,"177":1,"186":1,"193":1,"232":1,"234":1,"300":1,"303":1,"437":1}}],["действиями",{"2":{"167":1}}],["действиях",{"2":{"142":1,"149":1}}],["действия",{"2":{"83":1,"106":1,"135":1,"149":2,"155":1,"159":1,"167":1,"176":2,"237":1,"241":1,"243":1,"246":2,"263":1,"297":1,"314":2,"327":1,"368":1,"419":1,"439":2,"450":1}}],["действий",{"2":{"63":1,"143":1,"149":1,"159":2,"185":2,"186":1,"320":1,"342":1,"405":1}}],["действующего",{"2":{"306":1}}],["действуют",{"2":{"3":1}}],["действуя",{"2":{"261":1}}],["действует",{"2":{"20":1,"135":1,"261":1,"277":1,"301":1,"383":1,"389":1}}],["дестабилизируют",{"2":{"277":1}}],["десктоп",{"2":{"461":1}}],["десктопными",{"2":{"366":1}}],["десктопных",{"2":{"218":1}}],["десктопе",{"2":{"33":1}}],["десятилетнем",{"2":{"414":1}}],["десятилетиям",{"2":{"17":1}}],["десяток",{"2":{"149":1}}],["десятками",{"2":{"48":1}}],["десятки",{"2":{"47":1,"443":1,"444":1}}],["делиться",{"2":{"241":1,"306":1,"449":1}}],["делится",{"2":{"161":1}}],["делсостояние",{"2":{"230":1}}],["делсобытия",{"2":{"230":1}}],["дело",{"2":{"229":1,"271":1,"301":1,"386":2}}],["дел",{"2":{"212":1,"220":1,"222":7,"223":1,"226":2,"230":5,"231":1,"247":2,"369":2,"374":1}}],["делайте",{"2":{"453":1,"455":1}}],["делающее",{"2":{"449":1}}],["делаются",{"2":{"43":1,"503":1}}],["делают",{"2":{"41":1,"218":1,"311":1,"350":1,"418":2}}],["делая",{"2":{"251":1,"303":1}}],["делали",{"2":{"222":1,"328":1,"335":1,"366":1,"412":1,"425":1}}],["дела",{"2":{"125":1,"375":1,"452":1}}],["делать",{"2":{"35":1,"38":1,"41":1,"47":1,"50":1,"86":1,"97":1,"99":1,"107":1,"108":1,"132":1,"150":2,"155":1,"158":1,"220":1,"253":1,"269":1,"271":1,"277":1,"314":1,"346":1,"375":1,"417":1,"421":1,"436":1,"444":1,"448":1,"449":1,"461":2,"545":1}}],["делаться",{"2":{"34":1,"173":1}}],["делается",{"2":{"58":1,"98":1,"106":1,"125":1,"195":1,"272":1,"302":1,"358":1,"382":1,"411":1,"492":1}}],["делает",{"2":{"48":1,"106":1,"109":1,"114":1,"137":1,"149":1,"150":1,"169":1,"192":1,"194":1,"213":1,"221":1,"235":1,"246":1,"290":1,"293":1,"309":1,"317":1,"323":1,"340":1,"342":1,"347":1,"366":2,"387":1,"390":1,"417":1,"421":1,"438":1,"439":1,"443":1,"444":1,"449":1,"451":1,"515":1}}],["делаете",{"2":{"26":1}}],["делаем",{"2":{"23":1,"58":1,"64":1,"89":1,"195":1,"273":1,"309":1,"316":1,"332":1,"386":1}}],["делегатора",{"2":{"322":1}}],["делегировать",{"2":{"274":1,"293":1}}],["делегируется",{"2":{"299":1}}],["делегирует",{"2":{"247":1}}],["деле",{"2":{"3":1,"128":1,"209":1,"277":1,"314":1}}],["даны",{"2":{"212":1}}],["данную",{"2":{"268":1}}],["данная",{"2":{"162":1,"212":1,"298":1,"326":1,"438":1,"451":1,"461":1}}],["данном",{"2":{"112":1,"126":1,"132":1,"135":2,"142":2,"150":1,"161":1,"178":1,"181":1,"183":1,"191":1,"192":1,"194":1,"195":1,"214":1,"222":2,"223":1,"232":1,"235":1,"238":1,"240":1,"247":1,"293":2,"322":1,"324":2,"326":1,"328":1,"332":1,"337":1,"342":1,"343":1,"366":1,"375":1,"377":1,"386":1,"387":1,"389":1,"408":1,"409":1,"421":1,"425":2,"426":2,"449":1,"451":1,"486":1,"489":1,"491":1}}],["данное",{"2":{"72":1,"419":1,"496":1}}],["данной",{"2":{"67":1,"106":1,"134":1,"148":1,"172":1,"173":1,"196":1,"216":1,"228":1,"231":1,"262":1,"266":1,"271":1,"273":1,"277":1,"382":1,"386":1,"389":2,"439":1,"460":1,"543":1}}],["данного",{"0":{"75":1,"483":1},"2":{"64":1,"154":1,"167":1,"220":1,"228":1,"261":1,"301":1,"314":1,"315":1,"323":1,"343":2,"408":1,"448":1,"449":1,"452":1}}],["данным",{"2":{"108":1,"161":1,"283":1,"312":1,"337":1,"388":1,"460":1}}],["данными",{"0":{"151":1},"1":{"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1},"2":{"17":1,"38":1,"39":1,"41":1,"47":1,"97":1,"107":3,"135":1,"223":1,"230":1,"237":1,"238":1,"241":1,"303":1,"319":1,"332":1,"337":1,"342":1,"343":1,"344":1,"355":1,"366":1,"382":1,"383":1,"411":1,"542":1}}],["данный",{"2":{"11":1,"16":1,"36":1,"43":1,"125":1,"169":1,"195":1,"215":1,"219":1,"246":1,"268":1,"271":1,"290":1,"297":1,"300":1,"302":1,"374":1,"424":1,"459":1,"485":1,"489":1,"492":1,"505":1,"508":1,"524":1,"530":1,"537":1}}],["данные",{"0":{"44":1,"94":1},"1":{"45":1,"46":1,"47":1},"2":{"3":1,"11":2,"17":2,"47":2,"94":1,"97":1,"106":2,"107":3,"108":1,"180":1,"206":1,"221":1,"230":2,"235":1,"237":2,"238":4,"240":1,"247":1,"272":2,"298":3,"299":2,"301":1,"303":1,"305":1,"314":3,"315":1,"316":1,"318":1,"319":1,"320":1,"321":2,"326":1,"327":5,"328":1,"329":2,"330":2,"332":2,"337":2,"339":3,"340":1,"342":1,"350":7,"351":1,"377":2,"382":4,"383":1,"384":1,"385":1,"388":2,"389":2,"410":4,"411":1,"448":2,"449":3,"451":4,"460":1,"461":3}}],["данных",{"0":{"15":1,"17":1,"42":2,"230":1,"335":1,"350":1,"399":1},"1":{"16":1,"17":1,"18":2,"19":2,"43":2,"44":2,"45":2,"46":2,"47":2,"48":2,"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,"349":1,"350":1,"351":1,"352":1,"353":1,"354":1,"355":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":1,"58":2,"61":1,"67":1,"78":1,"107":7,"108":1,"109":1,"114":2,"118":1,"140":1,"154":1,"161":5,"191":2,"195":3,"200":1,"201":1,"222":1,"230":1,"231":1,"236":3,"238":1,"240":1,"243":1,"251":1,"260":1,"261":1,"273":1,"279":1,"282":1,"288":3,"295":1,"296":1,"299":1,"306":1,"312":3,"315":2,"323":1,"324":6,"325":2,"326":3,"327":1,"330":1,"332":1,"333":1,"335":1,"337":3,"342":4,"343":1,"344":1,"349":1,"350":13,"351":2,"354":1,"366":2,"371":1,"374":1,"375":1,"377":2,"382":8,"383":2,"387":1,"388":2,"399":1,"411":1,"417":2,"418":1,"444":2,"449":4,"451":2,"452":1,"460":1,"461":1}}],["дат",{"2":{"448":1,"524":1}}],["дата",{"0":{"448":1}}],["датами",{"2":{"445":1}}],["дату",{"2":{"408":1,"440":2}}],["датой",{"2":{"408":1,"448":1}}],["датчики",{"2":{"241":1}}],["даты",{"2":{"152":2}}],["дать",{"2":{"106":1,"122":1,"149":1,"188":1,"232":1,"350":1,"428":1,"496":2}}],["даст",{"2":{"110":1,"341":1,"345":1,"451":1}}],["дал",{"2":{"180":1,"215":1,"449":1}}],["далеко",{"2":{"107":1,"170":1,"213":1,"214":1,"274":1,"389":1,"450":1,"453":1}}],["далее",{"0":{"112":1},"2":{"86":2,"103":1,"106":1,"134":1,"147":1,"150":1,"164":1,"191":1,"195":1,"209":1,"214":2,"215":1,"221":2,"222":1,"241":1,"251":1,"253":2,"259":1,"269":2,"285":1,"308":1,"327":1,"332":1,"349":1,"351":1,"374":1,"382":1,"385":1,"388":1,"389":1,"417":1,"426":1,"428":1,"439":1}}],["дальше",{"2":{"106":1,"155":1,"191":1,"214":1,"219":1,"436":1,"456":1}}],["дальнейшего",{"2":{"150":1,"389":1,"439":1,"495":1}}],["дальнейшей",{"2":{"68":1,"169":1,"203":1,"211":1,"494":1,"496":1}}],["дальнейшем",{"2":{"11":1,"16":1,"18":1,"29":1,"34":1,"40":1,"57":1,"58":1,"88":1,"98":1,"162":1,"193":1,"202":1,"277":1,"385":1,"459":1,"497":1,"499":1}}],["дальнейшая",{"2":{"38":1,"439":1}}],["дальнейших",{"2":{"9":1,"12":1,"363":1}}],["дальнейшую",{"2":{"3":1}}],["дала",{"2":{"97":1}}],["дает",{"2":{"83":1,"106":1,"109":2,"159":1,"195":1,"198":1,"219":1,"266":1,"277":1,"302":1,"314":1,"334":1,"337":1,"345":1,"367":1,"419":1,"425":1,"448":1}}],["даёт",{"2":{"64":1,"83":1,"444":1,"451":1,"460":1}}],["давид",{"2":{"363":1}}],["давным",{"2":{"138":1}}],["давно",{"2":{"39":1,"138":1,"159":1}}],["давайте",{"2":{"110":1,"111":1,"124":1,"133":1,"141":1,"150":1,"176":1,"191":2,"192":1,"194":1,"195":2,"204":1,"212":1,"216":1,"217":1,"218":1,"228":1,"235":1,"237":1,"240":1,"242":1,"246":4,"253":1,"254":1,"277":1,"282":1,"289":1,"295":1,"297":1,"298":1,"301":1,"302":1,"307":1,"314":1,"322":2,"323":1,"324":1,"330":1,"337":1,"338":1,"339":1,"340":1,"343":1,"346":1,"366":1,"367":1,"368":1,"369":1,"372":1,"373":1,"383":3,"418":1,"420":1,"427":1,"431":1,"436":1,"438":1}}],["давать",{"2":{"106":1}}],["давая",{"2":{"2":1,"253":1}}],["дают",{"2":{"17":2,"124":1,"441":1}}],["даже",{"2":{"12":1,"40":1,"48":1,"67":1,"106":1,"108":1,"135":1,"140":2,"143":1,"145":1,"158":1,"173":1,"176":2,"190":2,"191":2,"203":1,"210":1,"218":2,"223":1,"234":1,"238":1,"239":1,"240":1,"253":1,"261":1,"264":1,"268":1,"274":1,"277":1,"292":1,"300":1,"301":1,"306":1,"314":2,"324":1,"339":1,"344":1,"353":1,"366":2,"374":1,"375":2,"377":1,"383":1,"388":2,"389":1,"415":1,"417":1,"418":1,"420":1,"426":1,"429":1,"430":1,"439":1,"448":1,"449":2,"451":1,"459":1,"460":3,"524":1}}],["да",{"2":{"10":1,"195":2,"214":1,"219":1,"225":1,"287":1,"303":1,"309":1,"352":1}}],["двинемся",{"2":{"436":1}}],["двигателя",{"2":{"460":1}}],["двигаться",{"2":{"219":1,"437":1}}],["двигаясь",{"2":{"366":1}}],["движок",{"2":{"324":1}}],["движущихся",{"2":{"306":1,"314":1}}],["движению",{"2":{"306":1}}],["движение",{"2":{"241":1}}],["движения",{"2":{"147":1}}],["движки",{"2":{"251":1}}],["движке",{"2":{"213":1,"253":1,"350":1}}],["движка",{"2":{"116":1,"326":1,"348":1}}],["двоеточия",{"2":{"202":1,"377":1}}],["двоеточие",{"2":{"197":1,"371":1}}],["двойной",{"2":{"326":1}}],["двойных",{"2":{"222":1}}],["двойные",{"2":{"192":1}}],["двойная",{"2":{"156":1}}],["двусмысленное",{"2":{"449":1}}],["двусторонним",{"2":{"201":1}}],["двум",{"2":{"219":1,"273":1}}],["двумя",{"2":{"98":1,"215":1,"218":1,"302":1,"326":1,"333":1,"369":1}}],["двунаправленную",{"2":{"109":1}}],["двухдневный",{"2":{"460":1}}],["двухфакторная",{"0":{"388":1},"2":{"387":1}}],["двух",{"2":{"99":1,"128":1,"134":1,"142":1,"191":1,"238":1,"242":1,"253":1,"332":1,"371":1,"388":1,"426":1,"505":1,"537":1}}],["двадцатилетней",{"2":{"460":1}}],["дважды",{"2":{"274":1}}],["два",{"2":{"3":2,"17":2,"47":1,"57":1,"106":1,"114":1,"116":1,"125":1,"135":1,"140":1,"153":2,"161":1,"195":1,"200":1,"203":1,"222":4,"223":1,"234":1,"235":1,"246":3,"256":1,"260":3,"276":1,"296":1,"297":1,"302":1,"307":1,"309":1,"312":1,"317":1,"327":1,"328":1,"346":1,"352":1,"373":1,"377":1,"383":1,"388":1,"409":1,"411":1,"421":1,"427":1,"452":1,"460":2,"461":2,"522":1}}],["двери",{"2":{"274":1}}],["две",{"2":{"2":1,"16":1,"106":1,"109":1,"126":1,"142":1,"195":1,"222":1,"247":1,"309":2,"312":1,"332":1,"352":1,"377":1,"387":1,"421":1}}],["иллюстрации",{"2":{"492":1}}],["илья",{"2":{"460":1}}],["или",{"0":{"37":1,"109":1,"142":1,"154":1,"156":1,"158":1,"253":1,"387":1,"447":1},"1":{"38":1,"39":1,"40":1,"41":1},"2":{"3":1,"16":1,"17":1,"23":1,"40":1,"41":2,"48":1,"50":1,"61":1,"62":1,"63":1,"66":1,"89":1,"94":1,"96":2,"98":1,"99":1,"105":2,"106":2,"107":1,"108":4,"109":2,"112":1,"114":2,"115":1,"116":1,"122":2,"125":7,"126":2,"128":2,"129":1,"131":1,"134":3,"138":1,"140":6,"141":4,"142":2,"143":2,"144":3,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"152":1,"153":7,"154":4,"155":3,"157":1,"158":1,"159":2,"161":3,"163":1,"164":2,"167":2,"169":3,"170":2,"171":1,"172":5,"173":1,"174":3,"176":3,"177":1,"178":1,"179":1,"180":2,"181":3,"182":1,"183":2,"184":1,"185":1,"186":1,"187":3,"191":9,"192":2,"193":1,"194":1,"195":6,"196":1,"198":4,"199":3,"200":1,"201":1,"202":1,"203":3,"212":1,"213":5,"214":4,"215":1,"216":7,"218":1,"219":2,"220":2,"221":2,"222":5,"223":5,"225":1,"226":1,"228":2,"229":2,"230":1,"231":2,"232":3,"234":2,"235":2,"236":2,"237":1,"238":3,"239":3,"240":3,"241":2,"243":2,"246":2,"247":3,"248":2,"249":1,"250":1,"251":1,"253":5,"255":4,"260":6,"261":3,"263":3,"269":2,"270":3,"271":3,"272":1,"273":1,"274":4,"275":2,"276":3,"277":3,"278":1,"284":2,"286":1,"288":3,"293":3,"294":1,"295":1,"296":1,"297":2,"299":2,"300":2,"301":6,"302":2,"303":4,"304":2,"306":5,"307":3,"308":2,"309":5,"310":1,"314":6,"316":2,"318":6,"319":2,"320":1,"321":1,"322":1,"324":2,"325":1,"329":1,"330":1,"335":1,"339":1,"340":2,"342":2,"343":1,"344":1,"347":1,"349":2,"350":4,"352":4,"353":1,"355":1,"360":2,"366":1,"368":3,"369":1,"371":2,"374":2,"375":1,"376":1,"377":1,"381":4,"382":5,"383":2,"384":1,"387":2,"388":7,"389":4,"407":1,"409":1,"410":3,"412":1,"414":1,"415":4,"417":3,"418":6,"420":3,"421":4,"423":1,"426":1,"427":1,"428":2,"430":2,"432":1,"433":1,"435":2,"438":1,"439":1,"440":1,"442":1,"443":2,"448":3,"449":11,"451":2,"452":1,"453":1,"454":2,"459":3,"460":5,"461":3,"483":3,"492":1,"495":4,"499":1,"524":1}}],["иерарxичную",{"2":{"459":1}}],["иерархия",{"2":{"229":1,"239":1}}],["иерархии",{"2":{"194":1,"215":1,"226":1,"229":2,"230":1,"237":1,"239":1,"293":1,"295":1,"449":2}}],["иерархические",{"2":{"247":1}}],["иерархический",{"2":{"165":1}}],["иерархическому",{"2":{"238":1}}],["иерархичных",{"2":{"17":1}}],["иерархичного",{"2":{"17":1,"451":1}}],["иерархичное",{"2":{"2":1}}],["иерархию",{"2":{"142":1,"224":1,"229":1}}],["ивент",{"2":{"449":1}}],["ивенты",{"2":{"449":1}}],["ивентов",{"2":{"449":1}}],["ищутся",{"2":{"417":1}}],["играет",{"2":{"451":1}}],["играй",{"2":{"389":1}}],["игры",{"2":{"389":1}}],["игру",{"2":{"177":1}}],["игрушек",{"2":{"62":1}}],["игрушки",{"2":{"19":1,"61":2}}],["игрушка",{"2":{"18":1}}],["игнорировать",{"2":{"286":1}}],["игнорируют",{"2":{"230":1}}],["игнорируйте",{"2":{"215":1}}],["иконографическое",{"2":{"230":1}}],["иконографических",{"2":{"220":1}}],["иконографию",{"2":{"216":1}}],["иконография",{"2":{"145":1}}],["иконок",{"2":{"167":1,"174":1,"216":1,"218":7,"224":1,"226":1,"253":1,"258":1,"501":1}}],["иконке",{"2":{"99":1}}],["иконкой",{"2":{"99":2,"222":1,"260":1}}],["иконкам",{"2":{"103":1}}],["иконками",{"2":{"89":1,"218":1,"412":1}}],["иконка",{"0":{"96":1},"2":{"96":2,"159":1,"167":5,"461":1}}],["иконки",{"0":{"167":1,"174":1},"2":{"89":1,"167":1,"174":1,"215":1,"218":1,"226":1,"412":2,"414":1,"443":1,"501":1,"531":1}}],["иконку",{"2":{"86":1,"97":1,"99":1,"256":1,"412":2,"506":1,"534":1,"536":1}}],["идущими",{"2":{"238":1}}],["идущие",{"2":{"93":1}}],["идеально",{"2":{"327":1,"420":1,"451":1}}],["идеале",{"2":{"20":1,"449":1}}],["идею",{"2":{"318":1,"461":1}}],["идее",{"2":{"269":1}}],["идеей",{"2":{"225":1,"427":1}}],["идентифицировать",{"2":{"367":1,"389":1}}],["идентифицировал",{"2":{"332":1}}],["идентифицирует",{"2":{"350":1}}],["идентифицирующее",{"2":{"246":1}}],["идентификацией",{"2":{"389":1}}],["идентификационных",{"2":{"388":1}}],["идентификационный",{"2":{"125":1}}],["идентификационная",{"2":{"383":1}}],["идентификацию",{"2":{"377":1,"389":1}}],["идентификации",{"2":{"214":1,"246":1,"321":1,"381":1,"389":1,"420":1}}],["идентификаторы",{"2":{"501":1}}],["идентификатору",{"2":{"389":1}}],["идентификатора",{"2":{"321":1,"346":1,"389":1}}],["идентификатор",{"2":{"195":1,"371":1,"374":2,"383":1,"384":1,"389":2}}],["идентификатором",{"2":{"192":1,"321":1}}],["идентификаторов",{"2":{"162":1}}],["идея",{"2":{"203":1,"251":1,"274":1,"275":1,"303":1,"387":1,"449":1,"495":1}}],["идет",{"2":{"149":1,"174":1,"253":1,"418":1,"444":1,"485":1}}],["идете",{"2":{"26":1}}],["итерируйте",{"2":{"229":1}}],["итерацией",{"2":{"389":1}}],["итераций",{"2":{"66":1}}],["итеративный",{"2":{"223":1,"225":1}}],["итераторе",{"2":{"200":1}}],["итак",{"2":{"191":1,"228":1,"292":1,"301":1,"306":1,"345":1,"383":1,"420":1}}],["итог",{"0":{"121":1}}],["итоговый",{"2":{"459":1}}],["итогов",{"0":{"136":1,"188":1,"210":1,"224":1,"249":1,"264":1,"310":1,"333":1,"354":1,"390":1,"441":1}}],["итогового",{"2":{"78":1}}],["итого",{"2":{"106":1}}],["итоге",{"0":{"528":1},"2":{"47":1,"90":1,"98":1,"209":1,"235":1,"271":1,"274":1,"388":1,"444":1,"449":1}}],["имитировать",{"2":{"426":1}}],["имитирует",{"2":{"450":1}}],["имитирующей",{"2":{"425":1}}],["имитирующих",{"2":{"417":1}}],["имитирующую",{"2":{"417":1}}],["имитирующая",{"2":{"324":1}}],["имитируют",{"2":{"324":1}}],["имитируя",{"2":{"186":1}}],["имитацией",{"2":{"418":1}}],["имитации",{"2":{"242":1}}],["ими",{"2":{"125":1,"230":1,"237":1,"243":1,"253":1,"318":1,"367":1,"411":1,"441":1,"527":1}}],["импорты",{"2":{"387":1}}],["импорт",{"0":{"235":1},"2":{"216":1,"219":2,"235":1,"449":1}}],["импорта",{"2":{"191":1,"222":1,"235":1,"241":1,"246":2,"286":1,"298":1,"316":1,"317":1,"321":1,"322":2,"325":1,"344":1,"346":1,"347":1,"352":1,"371":2,"413":1,"426":1}}],["импортирую",{"2":{"449":1}}],["импортируя",{"2":{"203":1,"342":1}}],["импортируется",{"2":{"195":1}}],["импортирует",{"2":{"193":1}}],["импортируем",{"2":{"111":1,"192":1,"195":2,"220":1,"238":2,"247":3,"289":1,"323":1,"326":1,"328":1,"330":1,"332":1,"342":1,"344":1,"349":1,"371":2,"377":1,"389":1,"421":2,"425":2}}],["импортировав",{"2":{"241":1}}],["импортировали",{"2":{"221":1,"235":1,"305":1}}],["импортированы",{"2":{"412":1}}],["импортированными",{"2":{"234":1}}],["импортированным",{"2":{"234":1}}],["импортированных",{"2":{"221":1}}],["импортирование",{"2":{"219":1}}],["импортирован",{"2":{"191":1,"215":1,"286":1}}],["импортировать",{"2":{"111":1,"191":1,"192":1,"193":1,"195":2,"215":1,"219":1,"221":1,"234":2,"241":1,"246":1,"286":1,"294":1,"295":1,"316":1,"348":1,"371":1,"381":1,"412":2,"414":1,"421":1}}],["импорте",{"2":{"61":1,"215":1,"219":1}}],["имя",{"2":{"86":1,"124":1,"125":3,"195":2,"209":1,"214":6,"215":1,"221":2,"237":2,"240":6,"246":2,"255":3,"256":2,"258":1,"294":2,"298":1,"315":1,"346":1,"352":1,"374":2,"377":2,"380":1,"388":1,"408":1,"420":1,"433":1,"483":1}}],["им",{"2":{"81":1,"106":1,"238":1,"241":1,"377":1,"417":1,"459":1,"461":1,"495":1}}],["имейте",{"2":{"381":1}}],["имели",{"2":{"140":1,"193":1}}],["имея",{"2":{"140":1,"213":1,"253":1}}],["имеющую",{"2":{"332":1}}],["имеющих",{"2":{"125":1}}],["имеются",{"2":{"380":1}}],["имеют",{"2":{"115":1,"141":1,"142":1,"144":1,"164":1,"178":1,"194":1,"195":2,"196":1,"247":1,"253":1,"261":1,"271":2,"274":1,"303":1,"309":1,"314":2,"321":1,"337":3,"350":1,"441":1,"448":1,"449":1,"459":1}}],["именованного",{"2":{"371":1}}],["именованных",{"2":{"375":1}}],["именованными",{"2":{"240":1}}],["именованные",{"0":{"375":1},"1":{"376":1,"377":1},"2":{"240":2,"375":2}}],["именование",{"2":{"238":1}}],["именовании",{"2":{"237":1,"238":2,"241":1,"276":1}}],["именования",{"2":{"167":1}}],["именовать",{"2":{"44":1}}],["имени",{"0":{"382":1},"2":{"125":1,"214":1,"236":1,"238":2,"240":1,"246":4,"256":1,"293":1,"294":2,"295":1,"298":1,"301":1,"304":1,"306":1,"323":1,"350":1,"367":1,"377":1,"382":3,"388":1,"390":1,"412":1,"501":1,"531":1}}],["именам",{"2":{"294":1,"326":1,"374":1}}],["именами",{"2":{"222":1,"309":2,"377":1,"382":1,"383":1,"412":1,"430":1}}],["имена",{"0":{"207":1,"208":1},"2":{"108":1,"125":2,"192":1,"262":1,"294":1,"309":1,"377":1,"501":1}}],["именем",{"2":{"108":1,"115":1,"217":1,"221":1,"222":1,"238":2,"240":2,"242":1,"246":2,"260":1,"303":1,"304":1,"316":1,"326":1,"350":1,"352":1,"371":3,"377":1,"414":1,"426":1}}],["имен",{"0":{"125":1},"1":{"127":1},"2":{"44":1,"125":1,"229":1,"234":1,"236":1,"295":1,"302":1,"376":1,"383":1}}],["именно",{"2":{"2":1,"39":1,"106":1,"125":1,"127":1,"130":1,"135":1,"176":1,"190":2,"193":1,"194":1,"195":1,"212":1,"215":2,"218":1,"231":1,"237":1,"253":1,"297":1,"302":1,"307":1,"316":1,"317":2,"337":1,"342":1,"346":1,"369":1,"374":1,"377":1,"388":1,"417":1,"425":1,"449":1,"451":1,"460":2}}],["имеем",{"2":{"41":1,"128":1,"135":1,"195":1,"215":1,"247":1,"386":1}}],["имеет",{"2":{"38":1,"41":1,"50":1,"106":4,"107":1,"109":1,"113":1,"114":2,"116":1,"121":1,"127":1,"128":1,"131":1,"141":1,"150":1,"152":1,"153":1,"178":1,"182":1,"192":1,"195":1,"198":1,"200":1,"218":1,"229":1,"230":1,"235":3,"236":1,"239":1,"246":1,"253":1,"255":1,"256":1,"260":2,"269":1,"273":1,"287":1,"295":1,"298":1,"301":1,"302":1,"315":1,"318":1,"327":1,"337":1,"340":1,"342":2,"344":1,"350":1,"371":1,"382":1,"383":2,"416":1,"418":1,"420":1,"426":1,"430":1,"451":2}}],["имеется",{"2":{"4":1,"164":1,"216":1,"342":1}}],["иметь",{"2":{"11":1,"18":1,"20":1,"115":1,"119":1,"125":3,"128":1,"142":2,"145":1,"150":1,"162":1,"169":1,"190":1,"195":1,"198":1,"209":1,"219":1,"222":1,"223":1,"228":1,"232":1,"237":2,"248":1,"255":1,"261":1,"271":1,"277":1,"286":1,"293":1,"297":1,"312":1,"342":1,"360":1,"376":1,"380":1,"382":2,"388":1,"410":1,"420":2,"431":1,"438":1,"444":1,"449":1}}],["изнутри",{"2":{"316":1}}],["изначально",{"2":{"29":1,"324":1,"409":1,"461":1}}],["изложенные",{"2":{"312":1}}],["излишняя",{"2":{"271":1}}],["издателя",{"2":{"297":1}}],["издревле",{"2":{"2":1}}],["изощренных",{"2":{"444":1}}],["изоляции",{"2":{"287":1,"388":1}}],["изолированные",{"2":{"193":1}}],["изобретено",{"2":{"451":1}}],["изобретайте",{"2":{"306":1}}],["изобретать",{"2":{"216":1,"266":1,"298":1}}],["изобразить",{"2":{"193":1}}],["изображению",{"2":{"256":1}}],["изображение",{"2":{"229":1}}],["изображений",{"0":{"158":1},"2":{"152":1,"158":4,"248":1}}],["изображениями",{"2":{"158":1,"174":1}}],["изображения",{"2":{"16":1,"142":1,"144":1,"215":1,"256":1,"258":3,"412":2,"436":1}}],["извлекать",{"2":{"426":1}}],["извлекает",{"2":{"426":1}}],["извлекаем",{"2":{"192":1,"326":1}}],["извлеченного",{"2":{"325":1}}],["извлечения",{"2":{"324":1,"325":1,"350":1}}],["известен",{"2":{"274":1}}],["известно",{"2":{"383":1}}],["известной",{"2":{"180":1,"213":1}}],["известную",{"2":{"327":1}}],["известны",{"2":{"387":1}}],["известных",{"2":{"260":1,"367":1,"389":1}}],["известный",{"2":{"128":1,"371":1,"383":1,"447":1,"448":1}}],["известными",{"2":{"255":1,"389":1}}],["известным",{"2":{"125":1}}],["известные",{"2":{"9":1,"345":2}}],["измерения",{"2":{"417":1}}],["измерить",{"2":{"264":1}}],["измеримые",{"2":{"146":1}}],["изменено",{"0":{"465":1,"467":1,"470":1,"473":1},"2":{"191":1}}],["изменении",{"2":{"172":1,"191":1,"222":1,"351":1,"353":1,"451":2}}],["изменений",{"0":{"462":1},"1":{"463":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"470":1,"471":1,"472":1,"473":1,"474":1,"475":1},"2":{"110":3,"114":2,"120":1,"121":1,"191":1,"200":1,"213":1,"231":1,"327":1,"349":1,"366":1,"374":2,"405":1,"415":1,"421":1,"424":1,"427":1,"429":1,"430":2,"431":1,"435":2,"448":1,"483":1}}],["изменениям",{"2":{"358":1,"404":1}}],["изменениями",{"2":{"297":1,"324":1,"353":1,"374":1,"424":1,"444":1,"451":2}}],["изменениях",{"2":{"157":1,"247":1,"297":1,"449":1}}],["изменения",{"0":{"115":1,"117":1,"118":1,"119":1,"120":1},"2":{"40":1,"41":1,"110":7,"111":1,"117":1,"121":1,"132":1,"137":1,"172":1,"190":3,"214":1,"219":1,"222":1,"236":1,"247":1,"273":2,"277":1,"303":1,"306":1,"344":1,"350":1,"374":1,"415":2,"431":3,"435":1,"438":1,"439":3,"440":2,"441":1,"448":2,"470":1,"499":1}}],["изменение",{"2":{"38":2,"115":1,"118":1,"126":1,"127":1,"231":1,"236":1,"241":1,"247":2,"309":1,"342":1,"343":1,"344":1,"345":1,"346":1,"349":1,"430":1,"438":1}}],["изменяя",{"2":{"379":1}}],["изменяет",{"2":{"304":1,"337":1,"339":1,"344":2,"371":1}}],["изменяете",{"2":{"303":1,"442":1}}],["изменяется",{"2":{"191":1,"297":1,"309":1,"442":1}}],["изменяем",{"2":{"247":1,"305":2}}],["изменяются",{"2":{"241":1}}],["изменяющие",{"2":{"145":1,"190":1}}],["изменяться",{"2":{"261":2,"451":1}}],["изменять",{"2":{"129":1,"190":1,"195":1,"218":1,"230":1,"346":1,"377":1,"451":1,"543":1}}],["изменит",{"2":{"420":1}}],["измените",{"2":{"219":1,"262":1}}],["изменится",{"2":{"203":1,"323":1,"419":1,"444":1}}],["изменить",{"2":{"126":2,"140":1,"195":1,"199":1,"215":1,"221":1,"301":2,"308":1,"326":1,"334":1,"343":1,"388":1,"427":1,"451":1,"452":1,"459":1}}],["изменил",{"2":{"430":1}}],["изменилась",{"2":{"309":1}}],["изменили",{"2":{"250":1}}],["изменилось",{"2":{"111":1,"195":1,"376":1,"430":1}}],["изменился",{"2":{"106":1,"111":1,"217":1}}],["изменим",{"2":{"86":1,"289":1,"328":1,"374":1,"424":1}}],["изучили",{"2":{"390":1}}],["изучим",{"2":{"190":1,"364":1}}],["изучите",{"2":{"138":1}}],["изучить",{"2":{"22":1,"67":1,"134":1,"150":1,"191":1,"216":1,"240":1,"258":1,"317":1,"408":1,"496":1}}],["изучайте",{"2":{"460":1}}],["изучаемые",{"2":{"325":1}}],["изучающей",{"2":{"141":1}}],["изучать",{"2":{"23":1,"143":1,"191":1,"465":1,"467":1}}],["изученных",{"2":{"265":1}}],["изученный",{"2":{"9":1}}],["изучению",{"2":{"232":1,"421":1}}],["изучении",{"2":{"216":1,"251":1,"495":1}}],["изучения",{"2":{"210":1,"266":1,"277":1,"309":1,"419":1,"460":2}}],["изучение",{"0":{"22":1,"196":1,"460":1},"1":{"197":1,"198":1,"199":1,"200":1,"201":1,"202":1},"2":{"175":1,"358":1,"456":1,"460":1}}],["из",{"0":{"491":1},"2":{"14":1,"20":1,"28":1,"34":1,"39":1,"41":2,"48":1,"50":2,"66":1,"68":2,"75":1,"78":1,"81":1,"86":1,"96":1,"99":1,"103":1,"106":1,"107":1,"109":1,"110":1,"111":2,"114":3,"117":1,"125":4,"126":1,"128":1,"134":1,"135":1,"138":1,"141":1,"143":1,"144":1,"147":2,"148":1,"151":1,"153":2,"154":1,"155":1,"158":3,"159":1,"160":1,"161":1,"163":1,"164":1,"165":1,"166":1,"167":1,"172":3,"173":2,"174":2,"175":1,"176":1,"177":1,"185":1,"186":2,"188":1,"190":3,"191":5,"192":2,"193":2,"194":2,"195":7,"196":1,"198":1,"199":2,"200":1,"203":1,"212":1,"213":3,"214":1,"215":3,"216":3,"218":6,"220":1,"221":3,"222":5,"226":1,"228":1,"229":1,"230":1,"232":2,"235":1,"236":3,"237":2,"238":2,"239":1,"240":2,"241":2,"242":1,"246":3,"247":2,"251":2,"252":1,"253":2,"255":1,"256":1,"258":1,"260":3,"261":1,"262":1,"267":1,"269":3,"270":1,"271":2,"273":1,"275":1,"276":2,"282":1,"283":1,"285":1,"287":2,"291":1,"293":1,"297":3,"298":1,"301":1,"303":4,"306":3,"307":2,"308":4,"309":3,"314":6,"319":1,"320":1,"321":4,"322":2,"325":1,"326":1,"327":4,"330":1,"332":3,"335":3,"337":1,"339":1,"340":1,"342":1,"343":3,"344":1,"345":2,"346":2,"347":1,"349":1,"350":5,"352":4,"353":1,"366":3,"367":1,"369":1,"371":3,"374":5,"375":2,"376":1,"377":6,"380":1,"381":2,"382":1,"383":3,"388":2,"389":1,"391":1,"408":4,"412":5,"413":1,"415":2,"418":2,"419":1,"420":2,"421":5,"424":2,"425":2,"426":1,"427":1,"430":3,"431":3,"435":1,"438":1,"439":3,"443":2,"448":1,"449":5,"450":1,"451":1,"452":1,"456":1,"460":2,"461":2,"495":1,"499":1,"501":2,"505":1,"537":1}}],["избыточности",{"2":{"274":1}}],["избавляет",{"2":{"162":1}}],["избегаемы",{"2":{"448":1}}],["избегаем",{"2":{"328":1}}],["избегания",{"2":{"274":1}}],["избегание",{"2":{"158":1}}],["избегая",{"2":{"241":1}}],["избегать",{"2":{"164":1,"175":1,"187":1,"189":1,"234":1,"271":1}}],["избегайте",{"0":{"453":1},"2":{"148":1,"271":1,"411":1}}],["избежание",{"2":{"221":1}}],["избежания",{"2":{"9":1,"533":1}}],["избежать",{"2":{"44":1,"149":1,"174":1,"217":1,"226":1,"238":1,"273":1,"286":1,"287":1,"451":1}}],["избранном",{"2":{"96":1}}],["избранного",{"2":{"89":1}}],["избранное",{"0":{"95":1},"1":{"96":1,"97":1,"98":1,"99":1,"100":1},"2":{"4":1,"29":1,"33":1,"96":3,"98":2,"99":1}}],["исчезновении",{"2":{"504":1}}],["исчезают",{"2":{"248":1}}],["исчезла",{"2":{"138":1,"438":1}}],["исчерпывающий",{"2":{"266":1}}],["исчерпывающим",{"2":{"110":1,"195":1}}],["исчерпывающее",{"2":{"183":1}}],["истинным",{"2":{"425":1}}],["истины",{"2":{"274":1,"344":1,"345":1}}],["истечения",{"2":{"135":1,"387":1}}],["истечении",{"2":{"125":1,"135":1,"235":1}}],["историю",{"2":{"378":1,"431":1}}],["история",{"0":{"462":1},"1":{"463":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"470":1,"471":1,"472":1,"473":1,"474":1,"475":1},"2":{"140":1,"303":1,"431":1}}],["истории",{"2":{"118":2,"126":1,"127":1,"128":1,"130":1,"136":1,"137":1,"380":2}}],["историческим",{"2":{"430":1}}],["исторически",{"2":{"44":1,"449":1}}],["источники",{"2":{"460":1,"485":1}}],["источнику",{"2":{"108":1,"460":1}}],["источник",{"2":{"108":1,"238":1,"344":1,"345":1,"431":1}}],["источников",{"2":{"108":3,"332":2}}],["искренне",{"2":{"363":1}}],["искренней",{"2":{"223":1}}],["искусственной",{"2":{"323":1}}],["искусственного",{"2":{"140":1}}],["искушению",{"2":{"270":1}}],["исключительных",{"2":{"461":1}}],["исключительным",{"2":{"275":1}}],["исключить",{"2":{"427":1}}],["исключают",{"2":{"427":1}}],["исключается",{"2":{"215":1}}],["исключена",{"2":{"350":1}}],["исключение",{"2":{"173":2}}],["исключением",{"2":{"124":1,"157":1,"173":1,"215":1,"226":1,"272":2,"325":1,"418":1,"449":1}}],["исключения",{"2":{"173":1,"191":1,"435":1}}],["искать",{"2":{"48":1,"143":2,"358":1,"414":1}}],["исходящие",{"2":{"272":1}}],["исходящими",{"2":{"187":1}}],["исходя",{"2":{"221":1,"258":1,"335":1,"337":1,"374":1}}],["исходному",{"2":{"273":1,"352":1}}],["исходном",{"2":{"238":1,"421":1,"426":1,"427":1,"441":1}}],["исходного",{"2":{"134":2,"247":1,"303":1,"330":1,"350":1,"417":1,"430":1,"431":1,"444":1}}],["исходные",{"2":{"431":1}}],["исходными",{"0":{"431":1}}],["исходным",{"2":{"320":1,"415":1,"420":1,"427":1,"430":1,"436":1}}],["исходных",{"0":{"401":1},"2":{"213":1,"215":2,"429":1,"430":1}}],["исходный",{"2":{"139":1,"161":1,"185":1,"222":1,"231":1,"261":1,"294":1,"302":1,"352":1,"416":1,"420":1,"436":1,"438":1}}],["исходная",{"2":{"12":1}}],["исхода",{"2":{"78":1}}],["исследование",{"0":{"381":1},"1":{"382":1,"383":1,"384":1,"385":1,"386":1,"387":1,"388":1,"389":1}}],["исследований",{"2":{"146":1,"417":1}}],["исследования",{"2":{"39":1,"138":1}}],["исследовать",{"2":{"4":1,"215":1}}],["исследуем",{"2":{"22":1,"309":1}}],["испытываем",{"2":{"386":1}}],["испортит",{"2":{"450":1}}],["испорчен",{"2":{"383":1}}],["исполнение",{"2":{"299":1}}],["исполнения",{"2":{"192":1}}],["используйте",{"0":{"145":1,"454":1,"456":1,"457":1},"2":{"114":2,"152":1,"194":2,"199":2,"209":1,"214":1,"216":1,"355":1,"391":1,"421":1,"448":2,"454":1,"459":1}}],["использующей",{"2":{"492":1}}],["использующем",{"2":{"387":1}}],["использующего",{"2":{"108":1,"340":1}}],["использующим",{"2":{"389":1}}],["использующими",{"2":{"314":1,"347":1}}],["использующие",{"2":{"388":1}}],["использующий",{"2":{"144":1}}],["использующая",{"2":{"241":1}}],["используют",{"2":{"116":1,"158":1,"170":1,"190":1,"204":1,"213":1,"238":1,"251":1,"339":1,"389":1}}],["используются",{"2":{"23":1,"67":1,"106":1,"118":1,"128":1,"137":1,"140":1,"152":1,"154":1,"191":1,"203":1,"211":1,"215":1,"222":1,"232":1,"235":2,"236":1,"251":1,"255":1,"282":1,"295":1,"301":1,"309":2,"354":1,"383":1,"386":1,"408":1,"443":1,"451":1,"543":1}}],["использую",{"2":{"93":1,"192":1,"449":1}}],["используя",{"2":{"83":1,"107":1,"125":1,"128":1,"143":1,"191":1,"193":1,"195":1,"214":1,"216":3,"221":1,"222":1,"224":1,"226":1,"238":1,"240":2,"247":1,"261":1,"262":1,"270":1,"276":1,"302":1,"306":1,"307":1,"320":1,"321":1,"325":1,"339":1,"347":1,"349":1,"350":1,"352":1,"360":1,"371":3,"375":1,"377":1,"383":1,"389":1,"395":1,"408":1,"421":2,"426":1,"440":1,"443":2,"483":1}}],["используете",{"2":{"116":1,"276":1,"432":1,"454":1}}],["использует",{"2":{"114":2,"127":1,"142":1,"145":1,"158":1,"216":1,"219":1,"242":1,"253":1,"262":1,"301":1,"325":1,"371":1,"382":1,"408":1,"413":1,"419":1,"420":1,"421":1,"429":1,"443":1,"448":2,"449":1,"501":1,"515":1}}],["используется",{"2":{"7":1,"20":1,"50":1,"106":1,"108":1,"125":3,"127":1,"128":1,"129":1,"142":2,"153":1,"155":1,"157":1,"159":1,"161":1,"165":1,"167":2,"168":2,"169":2,"182":1,"184":1,"185":1,"190":1,"195":1,"200":1,"202":1,"215":1,"222":1,"234":1,"240":1,"247":1,"256":1,"257":1,"273":1,"284":1,"298":1,"301":1,"306":1,"318":1,"344":1,"346":1,"349":1,"371":1,"380":1,"383":2,"408":1,"427":1,"430":1,"436":1,"438":1,"443":1,"448":1,"451":2,"460":1,"485":1,"492":4,"500":1,"543":1}}],["используемую",{"2":{"256":1,"383":1}}],["используемая",{"2":{"191":1}}],["используемом",{"2":{"217":1}}],["используемое",{"2":{"168":1,"256":1}}],["используемого",{"2":{"108":1,"112":1,"135":1,"161":1,"191":1,"440":1}}],["используемым",{"2":{"232":1}}],["используемыми",{"2":{"226":1,"380":1}}],["используемых",{"2":{"133":1,"324":1,"327":1,"380":1,"390":1}}],["используемые",{"2":{"116":1,"152":1,"193":1,"195":1,"196":1,"215":1,"377":1,"380":1,"409":1}}],["используемый",{"2":{"106":1,"155":1,"182":1,"203":1,"222":1,"237":1,"253":1,"327":1,"381":1,"383":1}}],["используем",{"2":{"17":1,"20":3,"89":2,"103":1,"113":1,"125":1,"126":1,"128":1,"132":1,"162":3,"192":2,"194":2,"195":2,"197":1,"201":1,"218":2,"221":3,"222":1,"223":1,"237":1,"238":1,"240":4,"241":1,"247":2,"287":2,"289":1,"294":1,"300":1,"302":1,"308":1,"316":2,"321":1,"326":1,"327":1,"330":1,"332":1,"342":1,"344":1,"346":1,"347":2,"349":1,"350":2,"351":1,"369":1,"371":1,"374":3,"376":1,"383":2,"384":1,"386":1,"387":1,"421":1,"425":1,"426":1,"438":1}}],["использовалось",{"2":{"345":1}}],["использовал",{"2":{"143":1,"431":1}}],["использовались",{"2":{"415":1,"448":1}}],["использовали",{"2":{"97":1,"237":1,"249":1,"274":1,"293":1,"349":1,"366":1,"374":1,"377":2,"380":1,"423":1}}],["использована",{"2":{"195":1,"203":1}}],["использован",{"2":{"191":1,"195":1}}],["использованы",{"2":{"145":1,"383":2}}],["использовано",{"2":{"125":1,"309":1}}],["использованию",{"2":{"151":1,"217":1,"222":1,"224":1,"243":1,"253":1,"326":1,"422":1,"435":1,"448":1}}],["использованием",{"2":{"126":1,"142":1,"175":1,"180":1,"212":1,"231":1,"240":1,"242":1,"249":2,"253":1,"264":1,"271":1,"285":1,"290":1,"293":1,"309":1,"321":2,"333":1,"335":1,"350":1,"351":1,"364":1,"375":1,"389":1,"412":1,"417":1,"418":1,"421":1,"422":1,"433":1,"461":1}}],["использование",{"0":{"54":1,"192":1,"420":1,"435":1,"526":1},"1":{"193":1,"421":1,"436":1},"2":{"40":1,"58":1,"76":1,"108":1,"125":1,"134":1,"135":1,"139":1,"144":1,"149":1,"155":1,"158":1,"161":2,"165":1,"169":1,"172":1,"185":1,"189":1,"191":1,"195":2,"203":1,"212":1,"216":1,"218":2,"219":1,"235":1,"237":1,"241":2,"242":1,"246":1,"247":2,"253":1,"261":2,"273":1,"296":1,"306":1,"309":1,"333":1,"334":1,"344":1,"346":1,"347":1,"349":2,"352":1,"358":1,"366":3,"374":1,"376":1,"380":1,"382":1,"383":1,"386":1,"388":1,"417":1,"418":2,"421":2,"422":1,"423":1,"437":1,"449":2,"451":1,"459":1,"461":1,"484":1,"492":1}}],["использовании",{"2":{"39":1,"109":1,"113":1,"114":1,"121":1,"127":1,"134":1,"136":1,"137":1,"140":1,"144":1,"159":1,"169":1,"172":1,"180":1,"182":1,"193":2,"195":1,"199":1,"218":1,"221":1,"222":1,"237":1,"314":2,"316":1,"317":1,"345":1,"359":1,"366":1,"367":1,"380":1,"389":1,"411":1,"431":1}}],["использования",{"2":{"20":1,"75":1,"83":1,"97":1,"114":1,"115":1,"116":2,"125":2,"134":1,"150":2,"159":1,"169":1,"175":1,"189":1,"191":1,"192":2,"195":2,"218":1,"222":1,"228":1,"232":1,"234":2,"236":1,"239":2,"240":1,"241":1,"251":1,"253":2,"262":1,"265":1,"267":1,"273":1,"277":1,"287":1,"288":1,"290":1,"293":1,"294":1,"298":1,"301":1,"306":1,"311":1,"312":1,"324":1,"326":1,"342":1,"343":1,"345":1,"350":2,"351":2,"364":1,"367":1,"374":1,"377":1,"378":1,"381":1,"383":1,"385":1,"387":2,"388":1,"389":1,"391":1,"411":1,"427":1,"436":1,"439":1,"448":1,"449":1,"460":1,"461":1,"492":1,"500":1,"526":1}}],["использоваться",{"2":{"75":1,"127":1,"154":1,"158":1,"159":1,"197":1,"214":2,"218":1,"234":1,"267":1,"321":1,"345":1,"369":1,"371":1,"383":1,"395":1,"499":1}}],["использовать",{"0":{"284":1},"2":{"10":1,"17":1,"39":1,"55":1,"58":2,"67":1,"81":1,"87":1,"96":1,"107":1,"109":1,"114":5,"116":1,"127":1,"128":1,"132":1,"134":2,"138":1,"151":1,"153":1,"156":1,"159":1,"161":1,"165":1,"167":1,"191":7,"192":2,"193":2,"194":7,"195":4,"198":1,"201":1,"202":3,"203":2,"204":1,"209":2,"212":1,"213":4,"214":2,"215":1,"216":1,"218":5,"219":1,"221":2,"229":1,"232":3,"234":2,"235":1,"240":2,"241":2,"242":1,"243":1,"246":4,"250":1,"251":1,"253":2,"255":2,"257":2,"258":1,"259":1,"261":11,"262":1,"265":1,"266":1,"270":1,"274":2,"277":1,"278":1,"286":1,"287":1,"289":1,"292":1,"294":1,"298":3,"303":1,"304":1,"306":3,"308":2,"309":5,"310":1,"312":1,"314":2,"317":5,"318":1,"320":1,"321":1,"324":2,"325":1,"327":2,"333":2,"337":1,"339":1,"340":1,"342":2,"343":2,"345":1,"346":1,"347":1,"348":1,"349":2,"350":3,"351":1,"352":3,"353":1,"359":1,"367":1,"368":2,"374":1,"376":2,"377":2,"380":2,"381":4,"382":1,"383":1,"384":1,"385":2,"389":4,"390":1,"391":2,"409":3,"412":3,"420":1,"421":1,"423":1,"426":2,"427":1,"430":1,"431":2,"435":2,"436":1,"443":1,"449":1,"451":2,"452":3,"456":1,"492":1,"496":1,"497":1,"501":1}}],["исправить",{"2":{"263":1,"426":1,"438":1}}],["исправление",{"2":{"73":1,"470":1}}],["исправлять",{"2":{"2":1}}],["испускающую",{"2":{"340":1}}],["испускает",{"2":{"298":1}}],["испускаемые",{"2":{"426":1}}],["испускаем",{"2":{"115":1}}],["испуская",{"2":{"231":1}}],["иная",{"2":{"451":1}}],["иначе",{"2":{"141":1,"180":1,"194":1,"202":1,"213":1,"382":1,"421":1,"425":1,"449":1}}],["ингридиент",{"2":{"450":1}}],["инкремента",{"2":{"337":1,"338":1,"339":1}}],["инкапсуляций",{"2":{"241":1}}],["инкапсуляции",{"2":{"209":1,"216":1,"241":1,"292":1,"306":1,"374":1}}],["инкапсуляция",{"0":{"3":1,"272":1},"2":{"266":1,"272":1}}],["инкапсулировав",{"2":{"422":1}}],["инкапсулировать",{"2":{"284":1}}],["инкапсулировали",{"2":{"97":1,"451":1}}],["инкапсулируя",{"2":{"318":1}}],["инкапсулируют",{"2":{"218":1}}],["инкапсулирует",{"2":{"194":1,"321":1,"451":1}}],["иным",{"2":{"428":1}}],["иные",{"2":{"310":1}}],["иных",{"2":{"63":1,"461":1}}],["инвокер",{"2":{"287":1,"291":1,"293":1,"299":2,"300":2}}],["инвокеру",{"2":{"287":1,"299":1}}],["инвертирует",{"2":{"191":1}}],["инициировать",{"2":{"319":1}}],["инициируя",{"2":{"261":1}}],["инициирует",{"2":{"260":1}}],["инициирующей",{"2":{"108":1}}],["инициализация",{"0":{"490":1},"2":{"500":1,"526":1}}],["инициализации",{"2":{"344":1,"501":1,"517":1}}],["инициализировать",{"2":{"380":1}}],["инициализирован",{"2":{"435":1}}],["инициализированную",{"2":{"342":1}}],["инициализировано",{"2":{"298":1}}],["инициализируя",{"2":{"352":1}}],["инициализируем",{"2":{"241":1,"302":1}}],["инициативе",{"2":{"260":1}}],["инъекцией",{"2":{"290":1}}],["инъекцию",{"2":{"243":1,"289":1,"339":1}}],["инъекция",{"0":{"238":1,"288":1},"1":{"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1},"2":{"237":1,"266":1}}],["инъекциях",{"2":{"103":1}}],["инъекции",{"0":{"503":1},"2":{"232":1,"238":1,"239":1,"249":1,"262":1,"288":1,"290":1,"293":1,"503":1}}],["инжектируете",{"2":{"411":1}}],["инжектируется",{"2":{"389":1}}],["инжектирует",{"2":{"373":1}}],["инжектируемого",{"2":{"496":1}}],["инжектируем",{"2":{"246":2}}],["инжектируемый",{"2":{"238":1,"243":1,"246":1}}],["инжектируемых",{"2":{"206":1}}],["инжектируемые",{"2":{"206":1}}],["инжектируйте",{"2":{"246":1}}],["инжектировать",{"2":{"410":1}}],["инжектироваться",{"2":{"245":1,"262":1}}],["инжектированный",{"2":{"247":1,"389":1}}],["инжектированы",{"2":{"238":1}}],["инженеру",{"2":{"405":1}}],["инженерные",{"2":{"223":1}}],["инженерной",{"2":{"141":1}}],["инженерии",{"2":{"190":1,"191":1,"269":1,"277":1}}],["инженер",{"2":{"188":1}}],["инноваций",{"2":{"169":1}}],["интрасетей",{"2":{"125":1}}],["интеллектуальные",{"2":{"389":1}}],["интеллекта",{"2":{"140":1}}],["интегрирует",{"2":{"432":1}}],["интегрируется",{"2":{"420":1}}],["интегрирующие",{"2":{"269":1}}],["интегрируются",{"2":{"253":1,"424":1,"541":1}}],["интегрированные",{"2":{"273":1}}],["интегрированной",{"2":{"212":1}}],["интегрировать",{"2":{"215":1,"224":1,"225":1,"428":1}}],["интеграцию",{"2":{"492":1}}],["интеграционное",{"2":{"417":1}}],["интеграционные",{"2":{"71":1,"450":1}}],["интеграция",{"0":{"216":1,"440":1},"1":{"217":1},"2":{"78":1,"212":1,"405":1,"439":1,"440":1,"449":1,"533":1}}],["интеграции",{"2":{"41":1,"134":1,"225":1,"251":1,"258":1,"309":1,"354":1,"417":1,"496":2}}],["интерактивные",{"2":{"366":1}}],["интерактивных",{"2":{"228":1,"366":1}}],["интерактивность",{"2":{"366":2,"426":1}}],["интерактивности",{"0":{"231":1},"2":{"229":1,"366":2,"451":1}}],["интерполяции",{"2":{"222":1}}],["интерполяцией",{"2":{"192":1,"200":1}}],["интерполируем",{"2":{"304":1}}],["интерполируя",{"2":{"222":1}}],["интерполированное",{"2":{"200":1}}],["интерпретатору",{"2":{"309":1}}],["интерпретатора",{"2":{"67":1}}],["интерпретации",{"2":{"195":1}}],["интерпретировано",{"2":{"198":1}}],["интерпретировать",{"2":{"193":1,"194":1}}],["интерпретируются",{"2":{"192":1}}],["интерпретируют",{"2":{"180":1}}],["интерпретируется",{"2":{"174":1}}],["интересная",{"2":{"486":1}}],["интересными",{"2":{"485":1}}],["интересный",{"2":{"408":1}}],["интересное",{"2":{"212":1,"449":1}}],["интересного",{"2":{"125":1,"317":1}}],["интересующих",{"2":{"302":1}}],["интерес",{"2":{"215":1}}],["интересам",{"2":{"182":1}}],["интервал",{"2":{"145":1}}],["интервалам",{"2":{"145":1}}],["интервалом",{"2":{"144":1,"158":1}}],["интернационализационным",{"2":{"448":1,"524":1}}],["интернационализации",{"2":{"448":1,"524":1}}],["интернационализация",{"2":{"77":1,"410":1,"448":1,"532":1}}],["интернету",{"2":{"128":1,"264":1}}],["интернет",{"2":{"108":4,"128":1,"135":1,"174":1,"190":1,"306":1,"460":1}}],["интернета",{"2":{"107":1,"176":1,"366":1,"389":1,"440":1,"460":1}}],["интернете",{"2":{"27":1,"61":1,"86":1,"89":1,"107":1,"109":1,"122":2,"125":3,"136":1,"137":1,"158":1,"184":1,"216":2,"264":1,"327":1,"383":1,"430":1,"440":1,"459":1,"460":1}}],["интерфейсе",{"2":{"429":1}}],["интерфейсной",{"2":{"247":1}}],["интерфейсом",{"2":{"247":1,"267":1,"306":1,"318":1}}],["интерфейсов",{"2":{"68":1,"141":2,"145":1,"148":1,"149":1,"191":2,"214":1,"224":1,"226":1,"228":1,"253":2,"306":1,"358":1,"377":1,"396":1}}],["интерфейс",{"0":{"429":1},"2":{"67":1,"134":1,"140":1,"143":1,"145":1,"194":1,"216":1,"238":1,"243":1,"260":3,"261":1,"272":1,"296":1,"303":1,"305":1,"306":1,"308":1,"314":1,"318":1,"345":1,"350":3,"366":1,"375":1,"388":1,"428":1,"432":1}}],["интерфейсами",{"2":{"141":1}}],["интерфейса",{"0":{"141":1,"146":1,"226":1,"229":1,"396":1},"1":{"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":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},"2":{"67":1,"107":1,"115":1,"138":1,"140":2,"141":6,"142":2,"145":3,"147":1,"154":2,"158":1,"169":1,"174":1,"194":2,"201":1,"220":1,"228":1,"240":1,"241":1,"253":1,"256":1,"270":1,"271":2,"273":1,"295":2,"303":2,"304":1,"307":1,"322":1,"325":1,"339":1,"350":1,"366":1,"367":1,"403":1,"429":1,"450":1}}],["интерфейсы",{"2":{"20":1,"140":1,"143":1,"176":1,"226":2,"366":1}}],["интерьерные",{"2":{"61":1}}],["информирования",{"2":{"157":1}}],["информатике",{"2":{"430":1}}],["информативную",{"2":{"149":1}}],["информативен",{"2":{"141":1}}],["информационной",{"2":{"408":1}}],["информационного",{"2":{"335":1}}],["информационный",{"2":{"123":1,"139":1,"188":1}}],["информацией",{"2":{"155":1,"157":1,"194":1,"214":1,"299":1,"335":1,"339":1,"374":1,"383":2,"408":1}}],["информации",{"2":{"106":1,"119":1,"140":1,"149":1,"152":1,"158":1,"187":2,"230":1,"330":1,"335":2,"336":1,"337":1,"342":1,"350":1,"383":1,"399":1,"439":1,"460":1,"485":2}}],["информация",{"2":{"31":1,"47":1,"94":1,"106":1,"155":1,"325":1,"337":1,"355":1,"375":1,"420":1,"441":1,"485":1,"486":1}}],["информацию",{"2":{"11":1,"118":1,"147":1,"148":1,"150":1,"152":1,"154":1,"155":1,"166":1,"203":1,"214":1,"217":1,"230":1,"319":1,"320":1,"325":1,"329":1,"332":1,"377":1,"380":1,"382":1,"383":3,"410":1,"428":1,"460":1}}],["инфраструктуры",{"2":{"128":1}}],["инфраструктуре",{"2":{"125":1}}],["инсталляторов",{"2":{"432":1}}],["инсталляторах",{"2":{"148":1}}],["инсталируемым",{"2":{"358":1}}],["инстанцированный",{"2":{"296":1}}],["инстанцировании",{"2":{"287":2}}],["инстанцирования",{"2":{"270":1,"284":1,"287":1,"292":1,"317":1}}],["инстанцирование",{"2":{"111":2}}],["инстанцировать",{"2":{"216":1,"314":1,"316":1}}],["инстанцию",{"2":{"112":1}}],["инструкцию",{"2":{"308":1}}],["инструкций",{"2":{"136":1}}],["инструкциями",{"2":{"247":1}}],["инструкциям",{"2":{"216":1,"244":1,"336":1,"432":1}}],["инструкция",{"2":{"135":1}}],["инструкции",{"2":{"135":2,"216":1,"408":1}}],["инструменту",{"2":{"263":1}}],["инструментах",{"2":{"349":1,"415":1,"417":1,"436":1}}],["инструментария",{"2":{"277":1}}],["инструментам",{"2":{"219":1,"314":1}}],["инструментами",{"2":{"134":1,"263":1,"401":1,"419":1}}],["инструмента",{"2":{"213":2,"215":1,"263":1,"426":1,"440":1,"495":1}}],["инструментов",{"2":{"212":2,"224":1,"261":1,"270":1,"295":1,"314":1,"344":1,"345":1,"349":1,"354":1,"358":1,"360":1,"415":2,"417":1,"418":1,"420":1,"423":1,"439":1}}],["инструменты",{"0":{"214":1},"2":{"122":1,"212":1,"213":3,"224":1,"226":1,"259":2,"263":2,"265":1,"314":1,"333":1,"353":1,"389":1,"395":1,"398":1,"405":1,"418":2,"421":1,"423":1,"424":1,"432":2,"439":1,"441":2,"461":1}}],["инструмент",{"2":{"50":1,"192":1,"215":2,"219":1,"239":1,"240":1,"262":1,"345":1,"428":1,"429":1,"458":1}}],["инета",{"2":{"107":1}}],["индустрии",{"2":{"390":1,"441":1}}],["индивидуальных",{"2":{"253":1}}],["индивидуальные",{"2":{"181":1}}],["индивидуально",{"2":{"106":1}}],["индикатором",{"2":{"159":2}}],["индикаторов",{"2":{"159":1}}],["индикаторы",{"2":{"159":1}}],["индикатора",{"2":{"159":1}}],["индексу",{"2":{"426":1}}],["индексный",{"2":{"326":1}}],["индексировать",{"2":{"461":1}}],["индексироваться",{"2":{"253":1,"326":1}}],["индексированные",{"2":{"326":1}}],["индексируемыми",{"2":{"326":1}}],["индексируется",{"2":{"461":1}}],["индексирует",{"2":{"48":1}}],["индексы",{"2":{"200":1}}],["индекс",{"2":{"200":1}}],["индексация",{"2":{"48":1}}],["индексации",{"2":{"17":1,"366":1,"461":2}}],["индекса",{"2":{"17":1}}],["ином",{"2":{"277":1,"448":1}}],["иной",{"2":{"110":1,"118":1,"144":1,"191":2,"364":1,"408":1,"495":1}}],["иное",{"2":{"58":1,"114":1,"255":1,"495":1}}],["иного",{"2":{"23":1,"459":1}}],["иногда",{"2":{"4":1,"140":1,"223":1,"297":1,"308":1,"366":1,"409":2,"440":1,"449":1,"459":1,"461":2}}],["их",{"2":{"2":1,"12":1,"20":1,"26":1,"38":1,"61":1,"68":3,"88":1,"89":1,"107":1,"114":3,"115":1,"125":4,"127":1,"136":1,"144":1,"148":1,"149":2,"153":1,"159":1,"167":1,"170":1,"175":1,"176":1,"187":1,"188":1,"189":1,"191":3,"193":2,"194":2,"195":1,"203":4,"209":1,"210":1,"212":1,"214":1,"215":7,"216":3,"218":4,"219":1,"220":1,"228":1,"230":1,"231":1,"235":2,"236":3,"237":1,"238":2,"240":2,"241":1,"243":2,"247":1,"251":2,"253":3,"255":1,"261":2,"266":1,"269":2,"272":1,"273":1,"276":1,"277":1,"282":1,"285":1,"289":1,"294":1,"295":1,"297":1,"299":2,"303":1,"306":1,"307":2,"309":2,"310":2,"312":2,"314":2,"319":1,"322":2,"324":1,"326":1,"327":1,"329":1,"332":1,"333":1,"334":1,"335":1,"339":1,"341":1,"342":2,"344":1,"347":1,"349":4,"350":4,"364":2,"366":4,"369":1,"370":1,"371":1,"374":2,"376":2,"380":4,"381":2,"382":2,"383":1,"386":1,"387":1,"388":1,"389":1,"390":1,"398":1,"408":1,"410":4,"411":3,"412":4,"415":1,"417":2,"418":1,"419":1,"420":3,"421":1,"424":1,"426":2,"427":1,"431":1,"432":1,"435":1,"436":1,"438":1,"441":2,"445":1,"448":1,"449":6,"450":1,"451":3,"454":1,"455":1,"460":1,"492":1,"496":1,"501":1}}],["и",{"0":{"1":1,"3":1,"16":1,"58":1,"68":1,"71":1,"74":1,"79":1,"94":1,"100":1,"106":1,"111":1,"112":1,"115":1,"117":1,"118":1,"119":1,"125":1,"128":1,"143":1,"144":1,"145":1,"153":1,"159":1,"161":1,"163":1,"174":1,"184":1,"195":1,"199":1,"200":1,"202":1,"205":1,"207":1,"208":1,"214":1,"215":1,"229":1,"230":1,"231":1,"232":1,"234":1,"235":1,"236":1,"238":1,"240":1,"241":1,"266":1,"275":1,"340":1,"350":1,"351":1,"356":1,"370":1,"375":1,"382":1,"383":1,"394":1,"401":1,"411":1,"415":1,"417":1,"420":1,"430":1,"437":1,"440":1,"443":1,"448":1,"454":1,"457":1,"459":1,"461":1,"484":1,"490":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"75":1,"76":1,"77":1,"78":1,"127":1,"129":1,"130":1,"131":1,"132":1,"133":1,"160":1,"162":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"242":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,"306":1,"307":1,"308":1,"309":1,"310":1,"311":1,"341":1,"342":1,"352":1,"353":1,"357":1,"358":1,"359":1,"360":1,"361":1,"362":1,"363":1,"371":1,"372":1,"376":1,"377":1,"416":1,"417":1,"418":1,"419":1,"420":1,"421":2,"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,"442":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,"20":3,"22":2,"23":5,"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,"57":2,"58":4,"60":1,"61":3,"62":3,"63":1,"64":1,"66":4,"67":8,"68":10,"70":2,"73":2,"75":4,"77":1,"78":5,"81":5,"83":1,"86":7,"87":1,"88":3,"89":4,"91":2,"93":3,"94":1,"96":2,"97":4,"98":4,"99":6,"100":1,"103":3,"105":3,"106":23,"107":16,"108":3,"109":4,"110":10,"111":4,"112":3,"113":1,"114":8,"115":7,"116":8,"117":2,"118":6,"121":2,"122":8,"124":1,"125":10,"126":2,"127":2,"128":11,"129":2,"130":1,"131":4,"132":4,"133":2,"134":6,"135":15,"136":8,"137":4,"138":13,"140":17,"141":5,"142":6,"143":8,"144":9,"145":8,"146":2,"147":4,"148":2,"149":11,"150":7,"151":1,"152":6,"153":10,"154":3,"155":4,"156":3,"157":4,"158":11,"159":8,"160":2,"161":13,"162":7,"163":2,"164":4,"165":2,"166":1,"167":8,"168":2,"169":6,"170":5,"171":1,"172":4,"173":4,"174":13,"175":4,"176":2,"177":1,"178":2,"179":2,"180":3,"181":2,"182":2,"184":1,"185":2,"186":1,"187":1,"188":7,"189":2,"190":24,"191":29,"192":15,"193":9,"194":15,"195":33,"196":1,"199":3,"200":1,"201":4,"202":4,"203":9,"204":2,"205":1,"206":4,"207":1,"208":1,"209":5,"210":4,"211":1,"212":7,"213":14,"214":21,"215":22,"216":13,"217":2,"218":17,"219":10,"220":8,"221":3,"222":26,"223":11,"224":5,"225":1,"226":8,"227":1,"228":4,"229":5,"230":10,"231":2,"232":6,"233":2,"234":4,"235":8,"236":5,"237":7,"238":12,"239":1,"240":6,"241":11,"242":2,"243":6,"245":1,"246":23,"247":15,"248":2,"249":5,"250":2,"251":9,"253":35,"255":5,"256":2,"257":3,"258":4,"259":2,"260":11,"261":11,"262":8,"263":4,"264":7,"265":3,"266":13,"267":5,"268":1,"269":6,"270":2,"271":13,"272":7,"273":14,"274":9,"275":5,"276":6,"277":9,"278":2,"279":1,"280":1,"281":1,"282":6,"283":4,"286":3,"287":4,"289":1,"290":1,"291":1,"292":1,"293":3,"294":3,"295":4,"296":2,"297":8,"298":10,"299":6,"300":1,"301":11,"302":13,"303":13,"304":2,"305":2,"306":10,"307":5,"308":6,"309":23,"310":5,"311":2,"312":6,"314":22,"315":2,"316":2,"317":4,"318":8,"319":6,"320":4,"321":12,"322":7,"323":9,"324":10,"325":6,"326":7,"327":6,"328":4,"329":2,"330":5,"331":1,"332":9,"333":9,"335":9,"336":3,"337":15,"338":2,"339":6,"340":5,"341":1,"342":11,"343":8,"344":10,"345":8,"346":7,"347":5,"349":13,"350":31,"351":5,"352":6,"353":5,"354":4,"355":3,"358":11,"359":5,"360":6,"363":3,"364":2,"366":33,"367":10,"368":4,"369":5,"371":18,"372":1,"373":4,"374":14,"375":8,"376":2,"377":9,"378":1,"379":1,"380":13,"381":5,"382":19,"383":20,"384":1,"385":3,"386":8,"387":11,"388":16,"389":24,"390":8,"391":3,"393":1,"394":2,"396":1,"398":1,"399":2,"400":1,"402":1,"403":3,"404":1,"405":3,"407":5,"408":18,"409":11,"410":2,"411":6,"412":7,"415":15,"417":22,"418":15,"419":9,"420":17,"421":20,"422":1,"423":3,"424":6,"425":2,"426":20,"427":4,"428":5,"429":5,"430":11,"431":10,"432":3,"433":3,"435":3,"436":10,"437":3,"438":11,"439":12,"440":10,"441":6,"442":4,"443":8,"444":20,"445":3,"448":19,"449":34,"450":6,"451":24,"452":11,"453":1,"455":5,"456":4,"457":2,"458":2,"459":22,"460":37,"461":31,"470":2,"483":1,"484":3,"485":7,"486":1,"487":1,"489":2,"491":2,"492":5,"494":4,"495":10,"496":14,"497":2,"500":1,"501":3,"506":2,"507":1,"515":2,"524":2,"526":1,"527":1,"530":2,"533":8,"534":6,"536":2,"541":2,"542":1,"543":3,"544":1,"545":2}}]],"serializationVersion":2}';export{t as default}; diff --git a/assets/chunks/VPLocalSearchBox.ZnZAS8RJ.js b/assets/chunks/VPLocalSearchBox.8sPgtWqN.js similarity index 99% rename from assets/chunks/VPLocalSearchBox.ZnZAS8RJ.js rename to assets/chunks/VPLocalSearchBox.8sPgtWqN.js index 90764ee4c..649e18483 100644 --- a/assets/chunks/VPLocalSearchBox.ZnZAS8RJ.js +++ b/assets/chunks/VPLocalSearchBox.8sPgtWqN.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.VAmOuqsF.js";const nr={en:()=>Ce(()=>import("./@localSearchIndexen.QcUKwSxw.js"),__vite__mapDeps([])),root:()=>Ce(()=>import("./@localSearchIndexroot.X3vpm1a5.js"),__vite__mapDeps([])),ru:()=>Ce(()=>import("./@localSearchIndexru.8KmQLKYF.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.HGQKPfzt.js";const nr={en:()=>Ce(()=>import("./@localSearchIndexen.JtUCui32.js"),__vite__mapDeps([])),root:()=>Ce(()=>import("./@localSearchIndexroot.X3vpm1a5.js"),__vite__mapDeps([])),ru:()=>Ce(()=>import("./@localSearchIndexru.3tdeHB2v.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.VAmOuqsF.js b/assets/chunks/theme.HGQKPfzt.js similarity index 99% rename from assets/chunks/theme.VAmOuqsF.js rename to assets/chunks/theme.HGQKPfzt.js index 3c192d5d2..76fc670c6 100644 --- a/assets/chunks/theme.VAmOuqsF.js +++ b/assets/chunks/theme.HGQKPfzt.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.ZnZAS8RJ.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.8sPgtWqN.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.ZnZAS8RJ.js","assets/chunks/framework.P5TqXf0g.js"] + __vite__mapDeps.viteFileDeps = ["assets/chunks/VPLocalSearchBox.8sPgtWqN.js","assets/chunks/framework.P5TqXf0g.js"] } return indexes.map((i) => __vite__mapDeps.viteFileDeps[i]) } diff --git a/assets/en_backend_api.md.fOTmtTnZ.js b/assets/en_backend_api.md.C8jG14qD.js similarity index 99% rename from assets/en_backend_api.md.fOTmtTnZ.js rename to assets/en_backend_api.md.C8jG14qD.js index 11fd7e22a..f1e4a7b6e 100644 --- a/assets/en_backend_api.md.fOTmtTnZ.js +++ b/assets/en_backend_api.md.C8jG14qD.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":1706078328000}'),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":1706078525000}'),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.fOTmtTnZ.lean.js b/assets/en_backend_api.md.C8jG14qD.lean.js
similarity index 85%
rename from assets/en_backend_api.md.fOTmtTnZ.lean.js
rename to assets/en_backend_api.md.C8jG14qD.lean.js
index 8280d2161..622ae713a 100644
--- a/assets/en_backend_api.md.fOTmtTnZ.lean.js
+++ b/assets/en_backend_api.md.C8jG14qD.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":1706078328000}'),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":1706078525000}'),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.VCwAetUT.js b/assets/en_backend_auth.md.VUJXworq.js
similarity index 98%
rename from assets/en_backend_auth.md.VCwAetUT.js
rename to assets/en_backend_auth.md.VUJXworq.js
index b4640e6f0..ea93f7e22 100644
--- a/assets/en_backend_auth.md.VCwAetUT.js
+++ b/assets/en_backend_auth.md.VUJXworq.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":1706078328000}'),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":1706078525000}'),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.VCwAetUT.lean.js b/assets/en_backend_auth.md.VUJXworq.lean.js similarity index 85% rename from assets/en_backend_auth.md.VCwAetUT.lean.js rename to assets/en_backend_auth.md.VUJXworq.lean.js index 3a91c58b1..214f84d45 100644 --- a/assets/en_backend_auth.md.VCwAetUT.lean.js +++ b/assets/en_backend_auth.md.VUJXworq.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":1706078328000}'),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":1706078525000}'),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.oFbiOTdF.js b/assets/en_backend_backend.md.TA1D0dzM.js similarity index 98% rename from assets/en_backend_backend.md.oFbiOTdF.js rename to assets/en_backend_backend.md.TA1D0dzM.js index 5d1888a26..f0e7a48f5 100644 --- a/assets/en_backend_backend.md.oFbiOTdF.js +++ b/assets/en_backend_backend.md.TA1D0dzM.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":1706078328000}'),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":1706078525000}'),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.oFbiOTdF.lean.js b/assets/en_backend_backend.md.TA1D0dzM.lean.js similarity index 86% rename from assets/en_backend_backend.md.oFbiOTdF.lean.js rename to assets/en_backend_backend.md.TA1D0dzM.lean.js index 4ea5182d0..838f5d51d 100644 --- a/assets/en_backend_backend.md.oFbiOTdF.lean.js +++ b/assets/en_backend_backend.md.TA1D0dzM.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":1706078328000}'),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":1706078525000}'),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.ksIYzqNo.js b/assets/en_backend_cors.md.fKg28v57.js similarity index 98% rename from assets/en_backend_cors.md.ksIYzqNo.js rename to assets/en_backend_cors.md.fKg28v57.js index 4997c6aab..b756c352d 100644 --- a/assets/en_backend_cors.md.ksIYzqNo.js +++ b/assets/en_backend_cors.md.fKg28v57.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":1706078328000}'),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":1706078525000}'),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.ksIYzqNo.lean.js b/assets/en_backend_cors.md.fKg28v57.lean.js similarity index 84% rename from assets/en_backend_cors.md.ksIYzqNo.lean.js rename to assets/en_backend_cors.md.fKg28v57.lean.js index c52570ae7..28fc02b89 100644 --- a/assets/en_backend_cors.md.ksIYzqNo.lean.js +++ b/assets/en_backend_cors.md.fKg28v57.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":1706078328000}'),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":1706078525000}'),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.TeXddRl-.js b/assets/en_backend_protocols.md.znkJxW5g.js similarity index 97% rename from assets/en_backend_protocols.md.TeXddRl-.js rename to assets/en_backend_protocols.md.znkJxW5g.js index 13eb2a440..a6884e5ff 100644 --- a/assets/en_backend_protocols.md.TeXddRl-.js +++ b/assets/en_backend_protocols.md.znkJxW5g.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":1706078328000}'),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":1706078525000}'),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.TeXddRl-.lean.js b/assets/en_backend_protocols.md.znkJxW5g.lean.js similarity index 85% rename from assets/en_backend_protocols.md.TeXddRl-.lean.js rename to assets/en_backend_protocols.md.znkJxW5g.lean.js index 565eba2a4..543086da9 100644 --- a/assets/en_backend_protocols.md.TeXddRl-.lean.js +++ b/assets/en_backend_protocols.md.znkJxW5g.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":1706078328000}'),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":1706078525000}'),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.kJ3yNfg2.js b/assets/en_deployment_ci-cd.md.z8agpEui.js similarity index 90% rename from assets/en_deployment_ci-cd.md.kJ3yNfg2.js rename to assets/en_deployment_ci-cd.md.z8agpEui.js index 514dbdf4f..3567eaed0 100644 --- a/assets/en_deployment_ci-cd.md.kJ3yNfg2.js +++ b/assets/en_deployment_ci-cd.md.z8agpEui.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":1706078328000}'),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":1706078525000}'),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.kJ3yNfg2.lean.js b/assets/en_deployment_ci-cd.md.z8agpEui.lean.js similarity index 90% rename from assets/en_deployment_ci-cd.md.kJ3yNfg2.lean.js rename to assets/en_deployment_ci-cd.md.z8agpEui.lean.js index 514dbdf4f..3567eaed0 100644 --- a/assets/en_deployment_ci-cd.md.kJ3yNfg2.lean.js +++ b/assets/en_deployment_ci-cd.md.z8agpEui.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":1706078328000}'),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":1706078525000}'),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.d3SjcHSs.js b/assets/en_deployment_docker.md.9Qo7IdAe.js similarity index 88% rename from assets/en_deployment_docker.md.d3SjcHSs.js rename to assets/en_deployment_docker.md.9Qo7IdAe.js index 545084b27..2f6fbdae0 100644 --- a/assets/en_deployment_docker.md.d3SjcHSs.js +++ b/assets/en_deployment_docker.md.9Qo7IdAe.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":1706078328000}'),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":1706078525000}'),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.d3SjcHSs.lean.js b/assets/en_deployment_docker.md.9Qo7IdAe.lean.js similarity index 88% rename from assets/en_deployment_docker.md.d3SjcHSs.lean.js rename to assets/en_deployment_docker.md.9Qo7IdAe.lean.js index 545084b27..2f6fbdae0 100644 --- a/assets/en_deployment_docker.md.d3SjcHSs.lean.js +++ b/assets/en_deployment_docker.md.9Qo7IdAe.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":1706078328000}'),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":1706078525000}'),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.QJWxCvzn.js b/assets/en_deployment_github-actions.md.bHq4YEkP.js similarity index 99% rename from assets/en_deployment_github-actions.md.QJWxCvzn.js rename to assets/en_deployment_github-actions.md.bHq4YEkP.js index e23594041..6a927aac9 100644 --- a/assets/en_deployment_github-actions.md.QJWxCvzn.js +++ b/assets/en_deployment_github-actions.md.bHq4YEkP.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":1706078328000}'),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":1706078525000}'),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.QJWxCvzn.lean.js b/assets/en_deployment_github-actions.md.bHq4YEkP.lean.js
similarity index 86%
rename from assets/en_deployment_github-actions.md.QJWxCvzn.lean.js
rename to assets/en_deployment_github-actions.md.bHq4YEkP.lean.js
index 588bbb60c..6d2e8f5ef 100644
--- a/assets/en_deployment_github-actions.md.QJWxCvzn.lean.js
+++ b/assets/en_deployment_github-actions.md.bHq4YEkP.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":1706078328000}'),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":1706078525000}'),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.BjbmvaRj.js b/assets/en_deployment_hosting.md.Kuz3iEbk.js
similarity index 95%
rename from assets/en_deployment_hosting.md.BjbmvaRj.js
rename to assets/en_deployment_hosting.md.Kuz3iEbk.js
index 70b9fbac1..89c43a559 100644
--- a/assets/en_deployment_hosting.md.BjbmvaRj.js
+++ b/assets/en_deployment_hosting.md.Kuz3iEbk.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":1706078328000}'),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":1706078525000}'),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.BjbmvaRj.lean.js b/assets/en_deployment_hosting.md.Kuz3iEbk.lean.js similarity index 70% rename from assets/en_deployment_hosting.md.BjbmvaRj.lean.js rename to assets/en_deployment_hosting.md.Kuz3iEbk.lean.js index 25835cdff..7ee7b2191 100644 --- a/assets/en_deployment_hosting.md.BjbmvaRj.lean.js +++ b/assets/en_deployment_hosting.md.Kuz3iEbk.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":1706078328000}'),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":1706078525000}'),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.fjOcPVii.js b/assets/en_development_architectural-patterns.md.fiE-BAVD.js similarity index 99% rename from assets/en_development_architectural-patterns.md.fjOcPVii.js rename to assets/en_development_architectural-patterns.md.fiE-BAVD.js index dfbefedec..39d168431 100644 --- a/assets/en_development_architectural-patterns.md.fjOcPVii.js +++ b/assets/en_development_architectural-patterns.md.fiE-BAVD.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":"Architectural patterns","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/architectural-patterns.md","filePath":"en/development/architectural-patterns.md","lastUpdated":1706078328000}'),e={name:"en/development/architectural-patterns.md"},n=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 u=JSON.parse('{"title":"Architectural patterns","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/architectural-patterns.md","filePath":"en/development/architectural-patterns.md","lastUpdated":1706078525000}'),e={name:"en/development/architectural-patterns.md"},n=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.fjOcPVii.lean.js b/assets/en_development_architectural-patterns.md.fiE-BAVD.lean.js
similarity index 87%
rename from assets/en_development_architectural-patterns.md.fjOcPVii.lean.js
rename to assets/en_development_architectural-patterns.md.fiE-BAVD.lean.js
index dd124effc..28b1d4e42 100644
--- a/assets/en_development_architectural-patterns.md.fjOcPVii.lean.js
+++ b/assets/en_development_architectural-patterns.md.fiE-BAVD.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":"Architectural patterns","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/architectural-patterns.md","filePath":"en/development/architectural-patterns.md","lastUpdated":1706078328000}'),e={name:"en/development/architectural-patterns.md"},n=t("",5),l=[n];function p(h,o,r,k,E,d){return a(),i("div",null,l)}const g=s(e,[["render",p]]);export{u as __pageData,g as default};
+import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"Architectural patterns","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/architectural-patterns.md","filePath":"en/development/architectural-patterns.md","lastUpdated":1706078525000}'),e={name:"en/development/architectural-patterns.md"},n=t("",5),l=[n];function p(h,o,r,k,E,d){return a(),i("div",null,l)}const g=s(e,[["render",p]]);export{u as __pageData,g as default};
diff --git a/assets/en_development_assets.md.78aSzn81.js b/assets/en_development_assets.md.MXSFxr7Y.js
similarity index 99%
rename from assets/en_development_assets.md.78aSzn81.js
rename to assets/en_development_assets.md.MXSFxr7Y.js
index 50a52a5a3..d7ac12139 100644
--- a/assets/en_development_assets.md.78aSzn81.js
+++ b/assets/en_development_assets.md.MXSFxr7Y.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":1706078328000}'),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":1706078525000}'),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.78aSzn81.lean.js b/assets/en_development_assets.md.MXSFxr7Y.lean.js
similarity index 85%
rename from assets/en_development_assets.md.78aSzn81.lean.js
rename to assets/en_development_assets.md.MXSFxr7Y.lean.js
index 66215194f..0955ab95a 100644
--- a/assets/en_development_assets.md.78aSzn81.lean.js
+++ b/assets/en_development_assets.md.MXSFxr7Y.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":1706078328000}'),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":1706078525000}'),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.d3DijPJt.js b/assets/en_development_building.md.zVYdFGlE.js
similarity index 99%
rename from assets/en_development_building.md.d3DijPJt.js
rename to assets/en_development_building.md.zVYdFGlE.js
index 15d82120e..210713f35 100644
--- a/assets/en_development_building.md.d3DijPJt.js
+++ b/assets/en_development_building.md.zVYdFGlE.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":1706078328000}'),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":1706078525000}'),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.d3DijPJt.lean.js b/assets/en_development_building.md.zVYdFGlE.lean.js
similarity index 86%
rename from assets/en_development_building.md.d3DijPJt.lean.js
rename to assets/en_development_building.md.zVYdFGlE.lean.js
index 7007c19ef..e6baaa6f5 100644
--- a/assets/en_development_building.md.d3DijPJt.lean.js
+++ b/assets/en_development_building.md.zVYdFGlE.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":1706078328000}'),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":1706078525000}'),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.Wi1UfkMA.js b/assets/en_development_ide.md.g5mGMNm9.js
similarity index 99%
rename from assets/en_development_ide.md.Wi1UfkMA.js
rename to assets/en_development_ide.md.g5mGMNm9.js
index b9e5c882e..4fe7adb12 100644
--- a/assets/en_development_ide.md.Wi1UfkMA.js
+++ b/assets/en_development_ide.md.g5mGMNm9.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":1706078328000}'),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":1706078525000}'),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.Wi1UfkMA.lean.js b/assets/en_development_ide.md.g5mGMNm9.lean.js
similarity index 85%
rename from assets/en_development_ide.md.Wi1UfkMA.lean.js
rename to assets/en_development_ide.md.g5mGMNm9.lean.js
index 45bd8edf1..bfc25474d 100644
--- a/assets/en_development_ide.md.Wi1UfkMA.lean.js
+++ b/assets/en_development_ide.md.g5mGMNm9.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":1706078328000}'),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":1706078525000}'),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._3p5VPdU.js b/assets/en_development_libraries.md.djdvKxjo.js
similarity index 95%
rename from assets/en_development_libraries.md._3p5VPdU.js
rename to assets/en_development_libraries.md.djdvKxjo.js
index 3dc769867..d5b388877 100644
--- a/assets/en_development_libraries.md._3p5VPdU.js
+++ b/assets/en_development_libraries.md.djdvKxjo.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":1706078328000}'),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":1706078525000}'),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._3p5VPdU.lean.js b/assets/en_development_libraries.md.djdvKxjo.lean.js similarity index 86% rename from assets/en_development_libraries.md._3p5VPdU.lean.js rename to assets/en_development_libraries.md.djdvKxjo.lean.js index b495a1471..aad204b3b 100644 --- a/assets/en_development_libraries.md._3p5VPdU.lean.js +++ b/assets/en_development_libraries.md.djdvKxjo.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":1706078328000}'),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":1706078525000}'),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.ci4G-_Af.js b/assets/en_development_misc.md.0LsDPnY5.js similarity index 99% rename from assets/en_development_misc.md.ci4G-_Af.js rename to assets/en_development_misc.md.0LsDPnY5.js index 8f462f8e9..681191943 100644 --- a/assets/en_development_misc.md.ci4G-_Af.js +++ b/assets/en_development_misc.md.0LsDPnY5.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":1706078328000}'),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":1706078525000}'),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.ci4G-_Af.lean.js b/assets/en_development_misc.md.0LsDPnY5.lean.js
similarity index 85%
rename from assets/en_development_misc.md.ci4G-_Af.lean.js
rename to assets/en_development_misc.md.0LsDPnY5.lean.js
index bbcaafd0b..2b730af1a 100644
--- a/assets/en_development_misc.md.ci4G-_Af.lean.js
+++ b/assets/en_development_misc.md.0LsDPnY5.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":1706078328000}'),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":1706078525000}'),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.v2mpDEqV.js b/assets/en_development_stores.md.Z0qhdX9O.js
similarity index 99%
rename from assets/en_development_stores.md.v2mpDEqV.js
rename to assets/en_development_stores.md.Z0qhdX9O.js
index 0b7e6d98d..275cec5f8 100644
--- a/assets/en_development_stores.md.v2mpDEqV.js
+++ b/assets/en_development_stores.md.Z0qhdX9O.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":1706078328000}'),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":1706078525000}'),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.v2mpDEqV.lean.js b/assets/en_development_stores.md.Z0qhdX9O.lean.js similarity index 85% rename from assets/en_development_stores.md.v2mpDEqV.lean.js rename to assets/en_development_stores.md.Z0qhdX9O.lean.js index af38b248c..66c54434e 100644 --- a/assets/en_development_stores.md.v2mpDEqV.lean.js +++ b/assets/en_development_stores.md.Z0qhdX9O.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":1706078328000}'),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":1706078525000}'),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.PBu_-M1r.js b/assets/en_development_testing.md.KkwNShRA.js similarity index 97% rename from assets/en_development_testing.md.PBu_-M1r.js rename to assets/en_development_testing.md.KkwNShRA.js index a65271de0..2d2c34a9b 100644 --- a/assets/en_development_testing.md.PBu_-M1r.js +++ b/assets/en_development_testing.md.KkwNShRA.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":1706078328000}'),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":1706078525000}'),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.PBu_-M1r.lean.js b/assets/en_development_testing.md.KkwNShRA.lean.js similarity index 85% rename from assets/en_development_testing.md.PBu_-M1r.lean.js rename to assets/en_development_testing.md.KkwNShRA.lean.js index af9817e7c..4a71e02ee 100644 --- a/assets/en_development_testing.md.PBu_-M1r.lean.js +++ b/assets/en_development_testing.md.KkwNShRA.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":1706078328000}'),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":1706078525000}'),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.fGpNsaJv.js b/assets/en_frontend_about-frameworks.md.gkfAEBzW.js similarity index 99% rename from assets/en_frontend_about-frameworks.md.fGpNsaJv.js rename to assets/en_frontend_about-frameworks.md.gkfAEBzW.js index a5aa65aa7..760ce5fa3 100644 --- a/assets/en_frontend_about-frameworks.md.fGpNsaJv.js +++ b/assets/en_frontend_about-frameworks.md.gkfAEBzW.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":1706078328000}'),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":1706078525000}'),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.fGpNsaJv.lean.js b/assets/en_frontend_about-frameworks.md.gkfAEBzW.lean.js
similarity index 86%
rename from assets/en_frontend_about-frameworks.md.fGpNsaJv.lean.js
rename to assets/en_frontend_about-frameworks.md.gkfAEBzW.lean.js
index 3299e0fb8..d9669b6ce 100644
--- a/assets/en_frontend_about-frameworks.md.fGpNsaJv.lean.js
+++ b/assets/en_frontend_about-frameworks.md.gkfAEBzW.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":1706078328000}'),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":1706078525000}'),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.i8ecT60o.js b/assets/en_frontend_architecture.md.69bxDI3Z.js
similarity index 98%
rename from assets/en_frontend_architecture.md.i8ecT60o.js
rename to assets/en_frontend_architecture.md.69bxDI3Z.js
index 0f3c5ab38..92e0ed88d 100644
--- a/assets/en_frontend_architecture.md.i8ecT60o.js
+++ b/assets/en_frontend_architecture.md.69bxDI3Z.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":1706078328000}'),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":1706078525000}'),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.i8ecT60o.lean.js b/assets/en_frontend_architecture.md.69bxDI3Z.lean.js similarity index 86% rename from assets/en_frontend_architecture.md.i8ecT60o.lean.js rename to assets/en_frontend_architecture.md.69bxDI3Z.lean.js index 566462b7b..b37968ee6 100644 --- a/assets/en_frontend_architecture.md.i8ecT60o.lean.js +++ b/assets/en_frontend_architecture.md.69bxDI3Z.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":1706078328000}'),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":1706078525000}'),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.YrlLekij.js b/assets/en_frontend_css-ui-libs.md.xej_txAG.js similarity index 98% rename from assets/en_frontend_css-ui-libs.md.YrlLekij.js rename to assets/en_frontend_css-ui-libs.md.xej_txAG.js index 21dc982ad..88903a128 100644 --- a/assets/en_frontend_css-ui-libs.md.YrlLekij.js +++ b/assets/en_frontend_css-ui-libs.md.xej_txAG.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":1706078328000}'),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":1706078525000}'),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.YrlLekij.lean.js b/assets/en_frontend_css-ui-libs.md.xej_txAG.lean.js similarity index 85% rename from assets/en_frontend_css-ui-libs.md.YrlLekij.lean.js rename to assets/en_frontend_css-ui-libs.md.xej_txAG.lean.js index 626a18f40..9d0013d6f 100644 --- a/assets/en_frontend_css-ui-libs.md.YrlLekij.lean.js +++ b/assets/en_frontend_css-ui-libs.md.xej_txAG.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":1706078328000}'),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":1706078525000}'),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.iBgul5M4.js b/assets/en_frontend_learning.md.t4V0phF7.js similarity index 99% rename from assets/en_frontend_learning.md.iBgul5M4.js rename to assets/en_frontend_learning.md.t4V0phF7.js index 9e212d933..ae014b79c 100644 --- a/assets/en_frontend_learning.md.iBgul5M4.js +++ b/assets/en_frontend_learning.md.t4V0phF7.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":1706078328000}'),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":1706078525000}'),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.iBgul5M4.lean.js b/assets/en_frontend_learning.md.t4V0phF7.lean.js similarity index 85% rename from assets/en_frontend_learning.md.iBgul5M4.lean.js rename to assets/en_frontend_learning.md.t4V0phF7.lean.js index 4f7142d79..5d5a61600 100644 --- a/assets/en_frontend_learning.md.iBgul5M4.lean.js +++ b/assets/en_frontend_learning.md.t4V0phF7.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":1706078328000}'),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":1706078525000}'),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.sXWCbBjq.js b/assets/en_frontend_spa-pwa-ssr-ssg.md.DqW-O9WS.js similarity index 99% rename from assets/en_frontend_spa-pwa-ssr-ssg.md.sXWCbBjq.js rename to assets/en_frontend_spa-pwa-ssr-ssg.md.DqW-O9WS.js index 34811fa28..a617b1f14 100644 --- a/assets/en_frontend_spa-pwa-ssr-ssg.md.sXWCbBjq.js +++ b/assets/en_frontend_spa-pwa-ssr-ssg.md.DqW-O9WS.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":1706078328000}'),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":1706078525000}'),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.sXWCbBjq.lean.js b/assets/en_frontend_spa-pwa-ssr-ssg.md.DqW-O9WS.lean.js similarity index 88% rename from assets/en_frontend_spa-pwa-ssr-ssg.md.sXWCbBjq.lean.js rename to assets/en_frontend_spa-pwa-ssr-ssg.md.DqW-O9WS.lean.js index e39424276..7748e8d42 100644 --- a/assets/en_frontend_spa-pwa-ssr-ssg.md.sXWCbBjq.lean.js +++ b/assets/en_frontend_spa-pwa-ssr-ssg.md.DqW-O9WS.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":1706078328000}'),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":1706078525000}'),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.2gs5RwXl.js b/assets/en_index.md.O4v7EP7k.js similarity index 94% rename from assets/en_index.md.2gs5RwXl.js rename to assets/en_index.md.O4v7EP7k.js index 9266cc0f3..c4bdbf3e7 100644 --- a/assets/en_index.md.2gs5RwXl.js +++ b/assets/en_index.md.O4v7EP7k.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":1706078328000}'),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":1706078525000}'),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.2gs5RwXl.lean.js b/assets/en_index.md.O4v7EP7k.lean.js similarity index 94% rename from assets/en_index.md.2gs5RwXl.lean.js rename to assets/en_index.md.O4v7EP7k.lean.js index 9266cc0f3..c4bdbf3e7 100644 --- a/assets/en_index.md.2gs5RwXl.lean.js +++ b/assets/en_index.md.O4v7EP7k.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":1706078328000}'),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":1706078525000}'),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.bGOHABNi.js b/assets/en_misc_CHANGELOG.md.I8AFHh2F.js similarity index 97% rename from assets/en_misc_CHANGELOG.md.bGOHABNi.js rename to assets/en_misc_CHANGELOG.md.I8AFHh2F.js index a93927664..0a07b3639 100644 --- a/assets/en_misc_CHANGELOG.md.bGOHABNi.js +++ b/assets/en_misc_CHANGELOG.md.I8AFHh2F.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":1706078328000}'),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":1706078525000}'),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.bGOHABNi.lean.js b/assets/en_misc_CHANGELOG.md.I8AFHh2F.lean.js similarity index 84% rename from assets/en_misc_CHANGELOG.md.bGOHABNi.lean.js rename to assets/en_misc_CHANGELOG.md.I8AFHh2F.lean.js index dedacf2f7..b9e49eb61 100644 --- a/assets/en_misc_CHANGELOG.md.bGOHABNi.lean.js +++ b/assets/en_misc_CHANGELOG.md.I8AFHh2F.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":1706078328000}'),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":1706078525000}'),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.jFn1NHma.js b/assets/en_misc_cheat-sheets.md.UC8Bg9PY.js similarity index 97% rename from assets/en_misc_cheat-sheets.md.jFn1NHma.js rename to assets/en_misc_cheat-sheets.md.UC8Bg9PY.js index 32c0f6a25..37dce6aab 100644 --- a/assets/en_misc_cheat-sheets.md.jFn1NHma.js +++ b/assets/en_misc_cheat-sheets.md.UC8Bg9PY.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":1706078328000}'),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":1706078525000}'),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.jFn1NHma.lean.js b/assets/en_misc_cheat-sheets.md.UC8Bg9PY.lean.js similarity index 85% rename from assets/en_misc_cheat-sheets.md.jFn1NHma.lean.js rename to assets/en_misc_cheat-sheets.md.UC8Bg9PY.lean.js index ba3e4cb02..007881c4f 100644 --- a/assets/en_misc_cheat-sheets.md.jFn1NHma.lean.js +++ b/assets/en_misc_cheat-sheets.md.UC8Bg9PY.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":1706078328000}'),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":1706078525000}'),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.NW5Ys4fU.js b/assets/en_misc_contribute.md.-WzmVyTJ.js similarity index 97% rename from assets/en_misc_contribute.md.NW5Ys4fU.js rename to assets/en_misc_contribute.md.-WzmVyTJ.js index 8b85d5251..82e1a83d2 100644 --- a/assets/en_misc_contribute.md.NW5Ys4fU.js +++ b/assets/en_misc_contribute.md.-WzmVyTJ.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":1706078328000}'),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":1706078525000}'),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.NW5Ys4fU.lean.js b/assets/en_misc_contribute.md.-WzmVyTJ.lean.js similarity index 97% rename from assets/en_misc_contribute.md.NW5Ys4fU.lean.js rename to assets/en_misc_contribute.md.-WzmVyTJ.lean.js index 8b85d5251..82e1a83d2 100644 --- a/assets/en_misc_contribute.md.NW5Ys4fU.lean.js +++ b/assets/en_misc_contribute.md.-WzmVyTJ.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":1706078328000}'),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":1706078525000}'),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.REDREdzT.js b/assets/en_misc_glossary.md.Jhk0ly_l.js similarity index 95% rename from assets/en_misc_glossary.md.REDREdzT.js rename to assets/en_misc_glossary.md.Jhk0ly_l.js index 1ee9886dc..64466b8b8 100644 --- a/assets/en_misc_glossary.md.REDREdzT.js +++ b/assets/en_misc_glossary.md.Jhk0ly_l.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":1706078328000}'),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":1706078525000}'),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.REDREdzT.lean.js b/assets/en_misc_glossary.md.Jhk0ly_l.lean.js similarity index 95% rename from assets/en_misc_glossary.md.REDREdzT.lean.js rename to assets/en_misc_glossary.md.Jhk0ly_l.lean.js index 1ee9886dc..64466b8b8 100644 --- a/assets/en_misc_glossary.md.REDREdzT.lean.js +++ b/assets/en_misc_glossary.md.Jhk0ly_l.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":1706078328000}'),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":1706078525000}'),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.gK6keJLl.js b/assets/en_misc_introduction.md.y6kYpZwE.js similarity index 97% rename from assets/en_misc_introduction.md.gK6keJLl.js rename to assets/en_misc_introduction.md.y6kYpZwE.js index 38a7ba206..0a590eae9 100644 --- a/assets/en_misc_introduction.md.gK6keJLl.js +++ b/assets/en_misc_introduction.md.y6kYpZwE.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":1706078328000}'),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":1706078525000}'),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.gK6keJLl.lean.js b/assets/en_misc_introduction.md.y6kYpZwE.lean.js similarity index 85% rename from assets/en_misc_introduction.md.gK6keJLl.lean.js rename to assets/en_misc_introduction.md.y6kYpZwE.lean.js index 2db225d79..4e3832089 100644 --- a/assets/en_misc_introduction.md.gK6keJLl.lean.js +++ b/assets/en_misc_introduction.md.y6kYpZwE.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":1706078328000}'),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":1706078525000}'),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.E_6ZArOb.js b/assets/en_vue-webapp_contribution.md.9CmrCSUD.js similarity index 94% rename from assets/en_vue-webapp_contribution.md.E_6ZArOb.js rename to assets/en_vue-webapp_contribution.md.9CmrCSUD.js index 8b00e3e1d..8c810d3b0 100644 --- a/assets/en_vue-webapp_contribution.md.E_6ZArOb.js +++ b/assets/en_vue-webapp_contribution.md.9CmrCSUD.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":1706078328000}'),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":1706078525000}'),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.E_6ZArOb.lean.js b/assets/en_vue-webapp_contribution.md.9CmrCSUD.lean.js similarity index 94% rename from assets/en_vue-webapp_contribution.md.E_6ZArOb.lean.js rename to assets/en_vue-webapp_contribution.md.9CmrCSUD.lean.js index 8b00e3e1d..8c810d3b0 100644 --- a/assets/en_vue-webapp_contribution.md.E_6ZArOb.lean.js +++ b/assets/en_vue-webapp_contribution.md.9CmrCSUD.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":1706078328000}'),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":1706078525000}'),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.IbWDibZS.js b/assets/en_vue-webapp_getting-started.md.IbWDibZS.js new file mode 100644 index 000000000..fbd0d11c3 --- /dev/null +++ b/assets/en_vue-webapp_getting-started.md.IbWDibZS.js @@ -0,0 +1,39 @@ +import{_ as a,c as s,o as i,U as t,ad as d}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":1706078525000}'),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 b(l,e,k,F,v,r){return i(),s("div",null,p)}const E=a(n,[["render",b],["__scopeId","data-v-ba9538db"]]);export{o as __pageData,E as default}; diff --git a/assets/en_vue-webapp_getting-started.md.o2wpVpAd.lean.js b/assets/en_vue-webapp_getting-started.md.IbWDibZS.lean.js similarity index 55% rename from assets/en_vue-webapp_getting-started.md.o2wpVpAd.lean.js rename to assets/en_vue-webapp_getting-started.md.IbWDibZS.lean.js index 622622dd1..cffcda898 100644 --- a/assets/en_vue-webapp_getting-started.md.o2wpVpAd.lean.js +++ b/assets/en_vue-webapp_getting-started.md.IbWDibZS.lean.js @@ -1 +1 @@ -import{_ as a,c as s,o as i,U as t,ad as e}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":1706078328000}'),n={name:"en/vue-webapp/getting-started.md"},h=t("",13),p=[h];function l(d,k,c,F,v,r){return i(),s("div",null,p)}const o=a(n,[["render",l],["__scopeId","data-v-536e3cf9"]]);export{g as __pageData,o as default}; +import{_ as a,c as s,o as i,U as t,ad as d}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":1706078525000}'),n={name:"en/vue-webapp/getting-started.md"},h=t("",13),p=[h];function b(l,e,k,F,v,r){return i(),s("div",null,p)}const E=a(n,[["render",b],["__scopeId","data-v-ba9538db"]]);export{o as __pageData,E as default}; diff --git a/assets/en_vue-webapp_getting-started.md.o2wpVpAd.js b/assets/en_vue-webapp_getting-started.md.o2wpVpAd.js deleted file mode 100644 index 66aff10de..000000000 --- a/assets/en_vue-webapp_getting-started.md.o2wpVpAd.js +++ /dev/null @@ -1,39 +0,0 @@ -import{_ as a,c as s,o as i,U as t,ad as e}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":1706078328000}'),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,k,c,F,v,r){return i(),s("div",null,p)}const o=a(n,[["render",l],["__scopeId","data-v-536e3cf9"]]);export{g as __pageData,o as default}; diff --git a/assets/en_vue-webapp_guidelines.md.A-w_L8Cf.js b/assets/en_vue-webapp_guidelines.md.BTO4w0wx.js similarity index 97% rename from assets/en_vue-webapp_guidelines.md.A-w_L8Cf.js rename to assets/en_vue-webapp_guidelines.md.BTO4w0wx.js index ebf8b527c..5de266387 100644 --- a/assets/en_vue-webapp_guidelines.md.A-w_L8Cf.js +++ b/assets/en_vue-webapp_guidelines.md.BTO4w0wx.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":1706078328000}'),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":1706078525000}'),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.A-w_L8Cf.lean.js b/assets/en_vue-webapp_guidelines.md.BTO4w0wx.lean.js similarity index 90% rename from assets/en_vue-webapp_guidelines.md.A-w_L8Cf.lean.js rename to assets/en_vue-webapp_guidelines.md.BTO4w0wx.lean.js index 5b7e11160..6c320894d 100644 --- a/assets/en_vue-webapp_guidelines.md.A-w_L8Cf.lean.js +++ b/assets/en_vue-webapp_guidelines.md.BTO4w0wx.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":1706078328000}'),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":1706078525000}'),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.F9Vxz5_Y.js b/assets/en_vue-webapp_index.md.F9Vxz5_Y.js new file mode 100644 index 000000000..3fe6a05a0 --- /dev/null +++ b/assets/en_vue-webapp_index.md.F9Vxz5_Y.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 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":1706078525000}'),d={name:"en/vue-webapp/index.md"},n=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=[n];function h(p,o,r,k,F,b){return i(),s("div",null,l)}const g=a(d,[["render",h],["__scopeId","data-v-8d45d48b"]]);export{v as __pageData,g as default}; diff --git a/assets/en_vue-webapp_index.md.mvJfEFBe.lean.js b/assets/en_vue-webapp_index.md.F9Vxz5_Y.lean.js similarity index 64% rename from assets/en_vue-webapp_index.md.mvJfEFBe.lean.js rename to assets/en_vue-webapp_index.md.F9Vxz5_Y.lean.js index c9b357126..001c56711 100644 --- a/assets/en_vue-webapp_index.md.mvJfEFBe.lean.js +++ b/assets/en_vue-webapp_index.md.F9Vxz5_Y.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":1706078328000}'),n={name:"en/vue-webapp/index.md"},l=t("",11),h=[l];function d(p,c,o,r,k,f){return i(),s("div",null,h)}const g=a(n,[["render",d],["__scopeId","data-v-17cf1a47"]]);export{v as __pageData,g as default}; +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":1706078525000}'),d={name:"en/vue-webapp/index.md"},n=t("",11),l=[n];function h(p,o,r,k,F,b){return i(),s("div",null,l)}const g=a(d,[["render",h],["__scopeId","data-v-8d45d48b"]]);export{v as __pageData,g as default}; diff --git a/assets/en_vue-webapp_index.md.mvJfEFBe.js b/assets/en_vue-webapp_index.md.mvJfEFBe.js deleted file mode 100644 index 90646cfa1..000000000 --- a/assets/en_vue-webapp_index.md.mvJfEFBe.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":1706078328000}'),n={name:"en/vue-webapp/index.md"},l=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),h=[l];function d(p,c,o,r,k,f){return i(),s("div",null,h)}const g=a(n,[["render",d],["__scopeId","data-v-17cf1a47"]]);export{v as __pageData,g as default}; diff --git a/assets/en_vue-webapp_objectives.md.mrFAMs2n.js b/assets/en_vue-webapp_objectives.md.zOqBl503.js similarity index 97% rename from assets/en_vue-webapp_objectives.md.mrFAMs2n.js rename to assets/en_vue-webapp_objectives.md.zOqBl503.js index e35ea0ee3..f4d83dbfe 100644 --- a/assets/en_vue-webapp_objectives.md.mrFAMs2n.js +++ b/assets/en_vue-webapp_objectives.md.zOqBl503.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":1706078328000}'),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":1706078525000}'),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.mrFAMs2n.lean.js b/assets/en_vue-webapp_objectives.md.zOqBl503.lean.js similarity index 90% rename from assets/en_vue-webapp_objectives.md.mrFAMs2n.lean.js rename to assets/en_vue-webapp_objectives.md.zOqBl503.lean.js index 6a6c35f2d..0d18b26ad 100644 --- a/assets/en_vue-webapp_objectives.md.mrFAMs2n.lean.js +++ b/assets/en_vue-webapp_objectives.md.zOqBl503.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":1706078328000}'),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":1706078525000}'),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.5TbPL-AH.js b/assets/en_vue-webapp_options_adaptability.md.hT3eE2co.js similarity index 99% rename from assets/en_vue-webapp_options_adaptability.md.5TbPL-AH.js rename to assets/en_vue-webapp_options_adaptability.md.hT3eE2co.js index 261adcba0..a60441744 100644 --- a/assets/en_vue-webapp_options_adaptability.md.5TbPL-AH.js +++ b/assets/en_vue-webapp_options_adaptability.md.hT3eE2co.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":1706078328000}'),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":1706078525000}'),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.5TbPL-AH.lean.js b/assets/en_vue-webapp_options_adaptability.md.hT3eE2co.lean.js
similarity index 90%
rename from assets/en_vue-webapp_options_adaptability.md.5TbPL-AH.lean.js
rename to assets/en_vue-webapp_options_adaptability.md.hT3eE2co.lean.js
index 0402575de..a454521d1 100644
--- a/assets/en_vue-webapp_options_adaptability.md.5TbPL-AH.lean.js
+++ b/assets/en_vue-webapp_options_adaptability.md.hT3eE2co.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":1706078328000}'),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":1706078525000}'),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.Tthg1NPO.js b/assets/en_vue-webapp_options_api.md.WQnDXHgw.js
similarity index 99%
rename from assets/en_vue-webapp_options_api.md.Tthg1NPO.js
rename to assets/en_vue-webapp_options_api.md.WQnDXHgw.js
index 493fb6f95..451defb94 100644
--- a/assets/en_vue-webapp_options_api.md.Tthg1NPO.js
+++ b/assets/en_vue-webapp_options_api.md.WQnDXHgw.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":1706078328000}'),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":1706078525000}'),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.Tthg1NPO.lean.js b/assets/en_vue-webapp_options_api.md.WQnDXHgw.lean.js
similarity index 90%
rename from assets/en_vue-webapp_options_api.md.Tthg1NPO.lean.js
rename to assets/en_vue-webapp_options_api.md.WQnDXHgw.lean.js
index f4ec5f741..faf5142c7 100644
--- a/assets/en_vue-webapp_options_api.md.Tthg1NPO.lean.js
+++ b/assets/en_vue-webapp_options_api.md.WQnDXHgw.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":1706078328000}'),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":1706078525000}'),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.LVLyYgz6.js b/assets/en_vue-webapp_options_baseIcon.md.BO4aY1SI.js
similarity index 99%
rename from assets/en_vue-webapp_options_baseIcon.md.LVLyYgz6.js
rename to assets/en_vue-webapp_options_baseIcon.md.BO4aY1SI.js
index 2c7246c71..0809704ee 100644
--- a/assets/en_vue-webapp_options_baseIcon.md.LVLyYgz6.js
+++ b/assets/en_vue-webapp_options_baseIcon.md.BO4aY1SI.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":1706078328000}'),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":1706078525000}'),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.LVLyYgz6.lean.js b/assets/en_vue-webapp_options_baseIcon.md.BO4aY1SI.lean.js
similarity index 90%
rename from assets/en_vue-webapp_options_baseIcon.md.LVLyYgz6.lean.js
rename to assets/en_vue-webapp_options_baseIcon.md.BO4aY1SI.lean.js
index 3de19e789..dc458c300 100644
--- a/assets/en_vue-webapp_options_baseIcon.md.LVLyYgz6.lean.js
+++ b/assets/en_vue-webapp_options_baseIcon.md.BO4aY1SI.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":1706078328000}'),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":1706078525000}'),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.DfBd-LCi.js b/assets/en_vue-webapp_options_description.md.EuGxJ0Zj.js
similarity index 98%
rename from assets/en_vue-webapp_options_description.md.DfBd-LCi.js
rename to assets/en_vue-webapp_options_description.md.EuGxJ0Zj.js
index dc253369f..b81b07409 100644
--- a/assets/en_vue-webapp_options_description.md.DfBd-LCi.js
+++ b/assets/en_vue-webapp_options_description.md.EuGxJ0Zj.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":1706078328000}'),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":1706078525000}'),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.DfBd-LCi.lean.js b/assets/en_vue-webapp_options_description.md.EuGxJ0Zj.lean.js similarity index 90% rename from assets/en_vue-webapp_options_description.md.DfBd-LCi.lean.js rename to assets/en_vue-webapp_options_description.md.EuGxJ0Zj.lean.js index 602c4eb19..013753655 100644 --- a/assets/en_vue-webapp_options_description.md.DfBd-LCi.lean.js +++ b/assets/en_vue-webapp_options_description.md.EuGxJ0Zj.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":1706078328000}'),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":1706078525000}'),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.9T--jZaf.js b/assets/en_vue-webapp_options_drawer.md.9T--jZaf.js new file mode 100644 index 000000000..c95f0bed5 --- /dev/null +++ b/assets/en_vue-webapp_options_drawer.md.9T--jZaf.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":1706078525000}'),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 s(p,l,b,u,m,h){return t(),e("div",null,i)}const w=a(n,[["render",s],["__scopeId","data-v-fb4ceaa1"]]);export{v as __pageData,w as default}; diff --git a/assets/en_vue-webapp_options_drawer.md.gVz4E2za.lean.js b/assets/en_vue-webapp_options_drawer.md.9T--jZaf.lean.js similarity index 52% rename from assets/en_vue-webapp_options_drawer.md.gVz4E2za.lean.js rename to assets/en_vue-webapp_options_drawer.md.9T--jZaf.lean.js index bd5e2f968..d9d128a0f 100644 --- a/assets/en_vue-webapp_options_drawer.md.gVz4E2za.lean.js +++ b/assets/en_vue-webapp_options_drawer.md.9T--jZaf.lean.js @@ -1 +1 @@ -import{_ as a,c as e,o as t,U as o,af as r,ag as d}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":"en/vue-webapp/options/drawer.md","filePath":"en/vue-webapp/options/drawer.md","lastUpdated":1706078328000}'),n={name:"en/vue-webapp/options/drawer.md"},i=o("",9),s=[i];function c(p,l,u,m,h,v){return t(),e("div",null,s)}const b=a(n,[["render",c],["__scopeId","data-v-d7185799"]]);export{_ as __pageData,b 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":1706078525000}'),n={name:"en/vue-webapp/options/drawer.md"},d=o("",9),i=[d];function s(p,l,b,u,m,h){return t(),e("div",null,i)}const w=a(n,[["render",s],["__scopeId","data-v-fb4ceaa1"]]);export{v as __pageData,w as default}; diff --git a/assets/en_vue-webapp_options_drawer.md.gVz4E2za.js b/assets/en_vue-webapp_options_drawer.md.gVz4E2za.js deleted file mode 100644 index 23e62849c..000000000 --- a/assets/en_vue-webapp_options_drawer.md.gVz4E2za.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as e,o as t,U as o,af as r,ag as d}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":"en/vue-webapp/options/drawer.md","filePath":"en/vue-webapp/options/drawer.md","lastUpdated":1706078328000}'),n={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,u,m,h,v){return t(),e("div",null,s)}const b=a(n,[["render",c],["__scopeId","data-v-d7185799"]]);export{_ as __pageData,b as default}; diff --git a/assets/en_vue-webapp_options_footer.md.IvJafQS2.js b/assets/en_vue-webapp_options_footer.md.IvJafQS2.js deleted file mode 100644 index 48f288300..000000000 --- a/assets/en_vue-webapp_options_footer.md.IvJafQS2.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as e,o as t,U as o,ah as d,ai as r,aj as i,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":1706078328000}'),l={name:"en/vue-webapp/options/footer.md"},p=o('

Footers

The following types of footers are currently available:

SimpleFooter

image

RichFooter

image

MantineSimpleFooter

image

MantineRichFooter

image

DistributedFooter

image

',12),m=[p];function c(b,h,_,f,v,u){return t(),e("div",null,m)}const q=a(l,[["render",c],["__scopeId","data-v-04dd6ba4"]]);export{F as __pageData,q as default}; diff --git a/assets/en_vue-webapp_options_footer.md.QUXIPfsC.js b/assets/en_vue-webapp_options_footer.md.QUXIPfsC.js new file mode 100644 index 000000000..b254547c5 --- /dev/null +++ b/assets/en_vue-webapp_options_footer.md.QUXIPfsC.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 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":1706078525000}'),l={name:"en/vue-webapp/options/footer.md"},p=o('

Footers

The following types of footers are currently available:

SimpleFooter

image

RichFooter

image

MantineSimpleFooter

image

MantineRichFooter

image

DistributedFooter

image

',12),m=[p];function c(b,h,_,f,v,u){return t(),e("div",null,m)}const q=a(l,[["render",c],["__scopeId","data-v-64359d0b"]]);export{F as __pageData,q as default}; diff --git a/assets/en_vue-webapp_options_footer.md.IvJafQS2.lean.js b/assets/en_vue-webapp_options_footer.md.QUXIPfsC.lean.js similarity index 74% rename from assets/en_vue-webapp_options_footer.md.IvJafQS2.lean.js rename to assets/en_vue-webapp_options_footer.md.QUXIPfsC.lean.js index 90f88461f..6d7e3dc04 100644 --- a/assets/en_vue-webapp_options_footer.md.IvJafQS2.lean.js +++ b/assets/en_vue-webapp_options_footer.md.QUXIPfsC.lean.js @@ -1 +1 @@ -import{_ as a,c as e,o as t,U as o,ah as d,ai as r,aj as i,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":1706078328000}'),l={name:"en/vue-webapp/options/footer.md"},p=o("",12),m=[p];function c(b,h,_,f,v,u){return t(),e("div",null,m)}const q=a(l,[["render",c],["__scopeId","data-v-04dd6ba4"]]);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 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":1706078525000}'),l={name:"en/vue-webapp/options/footer.md"},p=o("",12),m=[p];function c(b,h,_,f,v,u){return t(),e("div",null,m)}const q=a(l,[["render",c],["__scopeId","data-v-64359d0b"]]);export{F as __pageData,q as default}; diff --git a/assets/en_vue-webapp_options_ga-gp.md._dHTUGs7.js b/assets/en_vue-webapp_options_ga-gp.md.aIon36tt.js similarity index 98% rename from assets/en_vue-webapp_options_ga-gp.md._dHTUGs7.js rename to assets/en_vue-webapp_options_ga-gp.md.aIon36tt.js index d2cccaae8..60508606b 100644 --- a/assets/en_vue-webapp_options_ga-gp.md._dHTUGs7.js +++ b/assets/en_vue-webapp_options_ga-gp.md.aIon36tt.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":1706078328000}'),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":1706078525000}'),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._dHTUGs7.lean.js b/assets/en_vue-webapp_options_ga-gp.md.aIon36tt.lean.js similarity index 91% rename from assets/en_vue-webapp_options_ga-gp.md._dHTUGs7.lean.js rename to assets/en_vue-webapp_options_ga-gp.md.aIon36tt.lean.js index 75e9cb544..acdc3751d 100644 --- a/assets/en_vue-webapp_options_ga-gp.md._dHTUGs7.lean.js +++ b/assets/en_vue-webapp_options_ga-gp.md.aIon36tt.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":1706078328000}'),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":1706078525000}'),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.ek0a1NvD.js b/assets/en_vue-webapp_options_google-analytics.md.T03LpbGA.js similarity index 98% rename from assets/en_vue-webapp_options_google-analytics.md.ek0a1NvD.js rename to assets/en_vue-webapp_options_google-analytics.md.T03LpbGA.js index e1235ede4..7fc3a5415 100644 --- a/assets/en_vue-webapp_options_google-analytics.md.ek0a1NvD.js +++ b/assets/en_vue-webapp_options_google-analytics.md.T03LpbGA.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":1706078328000}'),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":1706078525000}'),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.ek0a1NvD.lean.js b/assets/en_vue-webapp_options_google-analytics.md.T03LpbGA.lean.js
similarity index 91%
rename from assets/en_vue-webapp_options_google-analytics.md.ek0a1NvD.lean.js
rename to assets/en_vue-webapp_options_google-analytics.md.T03LpbGA.lean.js
index c5bdfadde..5fb9048b5 100644
--- a/assets/en_vue-webapp_options_google-analytics.md.ek0a1NvD.lean.js
+++ b/assets/en_vue-webapp_options_google-analytics.md.T03LpbGA.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":1706078328000}'),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":1706078525000}'),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.Exe2yMU1.js b/assets/en_vue-webapp_options_header.md.Exe2yMU1.js
deleted file mode 100644
index 091e802b1..000000000
--- a/assets/en_vue-webapp_options_header.md.Exe2yMU1.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import{_ as e,c as a,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":1706078328000}'),h={name:"en/vue-webapp/options/header.md"},l=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),r=[l];function k(f,E,v,o,g,c){return s(),a("div",null,r)}const _=e(h,[["render",k],["__scopeId","data-v-e8ef1e68"]]);export{y as __pageData,_ as default}; diff --git a/assets/en_vue-webapp_options_header.md.WcfCmhgT.js b/assets/en_vue-webapp_options_header.md.WcfCmhgT.js new file mode 100644 index 000000000..f4b0160e5 --- /dev/null +++ b/assets/en_vue-webapp_options_header.md.WcfCmhgT.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 _=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":1706078525000}'),h={name:"en/vue-webapp/options/header.md"},l=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),r=[l];function k(E,v,o,g,c,m){return s(),e("div",null,r)}const F=a(h,[["render",k],["__scopeId","data-v-d75e1772"]]);export{_ as __pageData,F as default}; diff --git a/assets/en_vue-webapp_options_header.md.Exe2yMU1.lean.js b/assets/en_vue-webapp_options_header.md.WcfCmhgT.lean.js similarity index 51% rename from assets/en_vue-webapp_options_header.md.Exe2yMU1.lean.js rename to assets/en_vue-webapp_options_header.md.WcfCmhgT.lean.js index e256aa9f1..9dccf9bed 100644 --- a/assets/en_vue-webapp_options_header.md.Exe2yMU1.lean.js +++ b/assets/en_vue-webapp_options_header.md.WcfCmhgT.lean.js @@ -1 +1 @@ -import{_ as e,c as a,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":1706078328000}'),h={name:"en/vue-webapp/options/header.md"},l=i("",15),r=[l];function k(f,E,v,o,g,c){return s(),a("div",null,r)}const _=e(h,[["render",k],["__scopeId","data-v-e8ef1e68"]]);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 _=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":1706078525000}'),h={name:"en/vue-webapp/options/header.md"},l=i("",15),r=[l];function k(E,v,o,g,c,m){return s(),e("div",null,r)}const F=a(h,[["render",k],["__scopeId","data-v-d75e1772"]]);export{_ as __pageData,F as default}; diff --git a/assets/en_vue-webapp_options_i18n.md.Bza7PTBY.js b/assets/en_vue-webapp_options_i18n.md.rT4Hx32t.js similarity index 99% rename from assets/en_vue-webapp_options_i18n.md.Bza7PTBY.js rename to assets/en_vue-webapp_options_i18n.md.rT4Hx32t.js index 79118823e..869706e7b 100644 --- a/assets/en_vue-webapp_options_i18n.md.Bza7PTBY.js +++ b/assets/en_vue-webapp_options_i18n.md.rT4Hx32t.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":1706078328000}'),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":1706078525000}'),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.Bza7PTBY.lean.js b/assets/en_vue-webapp_options_i18n.md.rT4Hx32t.lean.js
similarity index 90%
rename from assets/en_vue-webapp_options_i18n.md.Bza7PTBY.lean.js
rename to assets/en_vue-webapp_options_i18n.md.rT4Hx32t.lean.js
index 81e22e0e4..83fc506a5 100644
--- a/assets/en_vue-webapp_options_i18n.md.Bza7PTBY.lean.js
+++ b/assets/en_vue-webapp_options_i18n.md.rT4Hx32t.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":1706078328000}'),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":1706078525000}'),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.BXnQ7g6P.js b/assets/en_vue-webapp_options_index.md.3L11TA9h.js
similarity index 98%
rename from assets/en_vue-webapp_options_index.md.BXnQ7g6P.js
rename to assets/en_vue-webapp_options_index.md.3L11TA9h.js
index 2cbde9bb9..0c5c95e72 100644
--- a/assets/en_vue-webapp_options_index.md.BXnQ7g6P.js
+++ b/assets/en_vue-webapp_options_index.md.3L11TA9h.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":1706078328000}'),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":1706078525000}'),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.BXnQ7g6P.lean.js b/assets/en_vue-webapp_options_index.md.3L11TA9h.lean.js similarity index 90% rename from assets/en_vue-webapp_options_index.md.BXnQ7g6P.lean.js rename to assets/en_vue-webapp_options_index.md.3L11TA9h.lean.js index 3c519d3b7..df96e6160 100644 --- a/assets/en_vue-webapp_options_index.md.BXnQ7g6P.lean.js +++ b/assets/en_vue-webapp_options_index.md.3L11TA9h.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":1706078328000}'),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":1706078525000}'),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.Kbs0wC6o.js b/assets/en_vue-webapp_options_layout-main.md.vsDWh0rA.js similarity index 95% rename from assets/en_vue-webapp_options_layout-main.md.Kbs0wC6o.js rename to assets/en_vue-webapp_options_layout-main.md.vsDWh0rA.js index 65858c498..eb2a90271 100644 --- a/assets/en_vue-webapp_options_layout-main.md.Kbs0wC6o.js +++ b/assets/en_vue-webapp_options_layout-main.md.vsDWh0rA.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":1706078328000}'),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":1706078525000}'),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.Kbs0wC6o.lean.js b/assets/en_vue-webapp_options_layout-main.md.vsDWh0rA.lean.js similarity index 90% rename from assets/en_vue-webapp_options_layout-main.md.Kbs0wC6o.lean.js rename to assets/en_vue-webapp_options_layout-main.md.vsDWh0rA.lean.js index 72930e0a6..3ea2b28d6 100644 --- a/assets/en_vue-webapp_options_layout-main.md.Kbs0wC6o.lean.js +++ b/assets/en_vue-webapp_options_layout-main.md.vsDWh0rA.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":1706078328000}'),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":1706078525000}'),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.uMlQe1za.js b/assets/en_vue-webapp_options_layout-one-column.md.xrNPjI-c.js similarity index 95% rename from assets/en_vue-webapp_options_layout-one-column.md.uMlQe1za.js rename to assets/en_vue-webapp_options_layout-one-column.md.xrNPjI-c.js index f75e632ec..f407ca930 100644 --- a/assets/en_vue-webapp_options_layout-one-column.md.uMlQe1za.js +++ b/assets/en_vue-webapp_options_layout-one-column.md.xrNPjI-c.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":1706078328000}'),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":1706078525000}'),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.uMlQe1za.lean.js b/assets/en_vue-webapp_options_layout-one-column.md.xrNPjI-c.lean.js similarity index 91% rename from assets/en_vue-webapp_options_layout-one-column.md.uMlQe1za.lean.js rename to assets/en_vue-webapp_options_layout-one-column.md.xrNPjI-c.lean.js index dcbd7c135..be058c835 100644 --- a/assets/en_vue-webapp_options_layout-one-column.md.uMlQe1za.lean.js +++ b/assets/en_vue-webapp_options_layout-one-column.md.xrNPjI-c.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":1706078328000}'),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":1706078525000}'),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.6zdjC6CZ.js b/assets/en_vue-webapp_options_navbar.md.6zdjC6CZ.js deleted file mode 100644 index 17951f80e..000000000 --- a/assets/en_vue-webapp_options_navbar.md.6zdjC6CZ.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as e,o as t,U as n,as as o,at as i}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":1706078328000}'),r={name:"en/vue-webapp/options/navbar.md"},s=n('

Navbar

The Navbar is located inside the NavigationDrawer

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

SimpleNavbar

image

MantineSimpleNavbar

image

',7),c=[s];function p(d,b,m,v,l,_){return t(),e("div",null,c)}const g=a(r,[["render",p],["__scopeId","data-v-1816abc9"]]);export{u as __pageData,g as default}; diff --git a/assets/en_vue-webapp_options_navbar.md.HmWLL8MS.js b/assets/en_vue-webapp_options_navbar.md.HmWLL8MS.js new file mode 100644 index 000000000..53c5bf433 --- /dev/null +++ b/assets/en_vue-webapp_options_navbar.md.HmWLL8MS.js @@ -0,0 +1 @@ +import{_ as a,c as e,o as t,U as d,as as c,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":"en/vue-webapp/options/navbar.md","filePath":"en/vue-webapp/options/navbar.md","lastUpdated":1706078525000}'),o={name:"en/vue-webapp/options/navbar.md"},i=d('

Navbar

The Navbar is located inside the NavigationDrawer

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

SimpleNavbar

image

MantineSimpleNavbar

image

',7),r=[i];function s(p,m,v,l,_,b){return t(),e("div",null,r)}const g=a(o,[["render",s],["__scopeId","data-v-9ddd46cc"]]);export{u as __pageData,g as default}; diff --git a/assets/en_vue-webapp_options_navbar.md.6zdjC6CZ.lean.js b/assets/en_vue-webapp_options_navbar.md.HmWLL8MS.lean.js similarity index 55% rename from assets/en_vue-webapp_options_navbar.md.6zdjC6CZ.lean.js rename to assets/en_vue-webapp_options_navbar.md.HmWLL8MS.lean.js index 827f7decd..921c46d07 100644 --- a/assets/en_vue-webapp_options_navbar.md.6zdjC6CZ.lean.js +++ b/assets/en_vue-webapp_options_navbar.md.HmWLL8MS.lean.js @@ -1 +1 @@ -import{_ as a,c as e,o as t,U as n,as as o,at as i}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":1706078328000}'),r={name:"en/vue-webapp/options/navbar.md"},s=n("",7),c=[s];function p(d,b,m,v,l,_){return t(),e("div",null,c)}const g=a(r,[["render",p],["__scopeId","data-v-1816abc9"]]);export{u as __pageData,g as default}; +import{_ as a,c as e,o as t,U as d,as as c,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":"en/vue-webapp/options/navbar.md","filePath":"en/vue-webapp/options/navbar.md","lastUpdated":1706078525000}'),o={name:"en/vue-webapp/options/navbar.md"},i=d("",7),r=[i];function s(p,m,v,l,_,b){return t(),e("div",null,r)}const g=a(o,[["render",s],["__scopeId","data-v-9ddd46cc"]]);export{u as __pageData,g as default}; diff --git a/assets/en_vue-webapp_options_open-graph.md.VJxbg_NW.js b/assets/en_vue-webapp_options_open-graph.md.1cA3KPiv.js similarity index 99% rename from assets/en_vue-webapp_options_open-graph.md.VJxbg_NW.js rename to assets/en_vue-webapp_options_open-graph.md.1cA3KPiv.js index be667a8a0..a00e41bd3 100644 --- a/assets/en_vue-webapp_options_open-graph.md.VJxbg_NW.js +++ b/assets/en_vue-webapp_options_open-graph.md.1cA3KPiv.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":1706078328000}'),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":1706078525000}'),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.VJxbg_NW.lean.js b/assets/en_vue-webapp_options_open-graph.md.1cA3KPiv.lean.js
similarity index 90%
rename from assets/en_vue-webapp_options_open-graph.md.VJxbg_NW.lean.js
rename to assets/en_vue-webapp_options_open-graph.md.1cA3KPiv.lean.js
index 930abcf8b..85532ebec 100644
--- a/assets/en_vue-webapp_options_open-graph.md.VJxbg_NW.lean.js
+++ b/assets/en_vue-webapp_options_open-graph.md.1cA3KPiv.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":1706078328000}'),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":1706078525000}'),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.AFwSutlq.js b/assets/en_vue-webapp_options_pwa.md.MLFoO88Y.js
similarity index 99%
rename from assets/en_vue-webapp_options_pwa.md.AFwSutlq.js
rename to assets/en_vue-webapp_options_pwa.md.MLFoO88Y.js
index 6635633b3..8a91b575e 100644
--- a/assets/en_vue-webapp_options_pwa.md.AFwSutlq.js
+++ b/assets/en_vue-webapp_options_pwa.md.MLFoO88Y.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":1706078328000}'),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":1706078525000}'),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.AFwSutlq.lean.js b/assets/en_vue-webapp_options_pwa.md.MLFoO88Y.lean.js
similarity index 90%
rename from assets/en_vue-webapp_options_pwa.md.AFwSutlq.lean.js
rename to assets/en_vue-webapp_options_pwa.md.MLFoO88Y.lean.js
index 443e53faf..c2dd278e8 100644
--- a/assets/en_vue-webapp_options_pwa.md.AFwSutlq.lean.js
+++ b/assets/en_vue-webapp_options_pwa.md.MLFoO88Y.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":1706078328000}'),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":1706078525000}'),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.C3kI2LC8.js b/assets/en_vue-webapp_options_splash-screen.md.C3kI2LC8.js
new file mode 100644
index 000000000..ba44d8fc8
--- /dev/null
+++ b/assets/en_vue-webapp_options_splash-screen.md.C3kI2LC8.js
@@ -0,0 +1 @@
+import{_ as e,c as a,o as c,U as t,au as s}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":1706078525000}'),n={name:"en/vue-webapp/options/splash-screen.md"},o=t('

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 d(r,i,l,h,_,m){return c(),a("div",null,p)}const g=e(n,[["render",d],["__scopeId","data-v-ec06cc3a"]]);export{u as __pageData,g as default}; diff --git a/assets/en_vue-webapp_options_splash-screen.md.M3pCGpim.lean.js b/assets/en_vue-webapp_options_splash-screen.md.C3kI2LC8.lean.js similarity index 51% rename from assets/en_vue-webapp_options_splash-screen.md.M3pCGpim.lean.js rename to assets/en_vue-webapp_options_splash-screen.md.C3kI2LC8.lean.js index 01c1a7bda..ed9773038 100644 --- a/assets/en_vue-webapp_options_splash-screen.md.M3pCGpim.lean.js +++ b/assets/en_vue-webapp_options_splash-screen.md.C3kI2LC8.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,U as s,au as n}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":1706078328000}'),o={name:"en/vue-webapp/options/splash-screen.md"},p=s("",5),c=[p];function d(r,i,l,h,f,_){return t(),a("div",null,c)}const u=e(o,[["render",d],["__scopeId","data-v-39f7573f"]]);export{v as __pageData,u as default}; +import{_ as e,c as a,o as c,U as t,au as s}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":1706078525000}'),n={name:"en/vue-webapp/options/splash-screen.md"},o=t("",5),p=[o];function d(r,i,l,h,_,m){return c(),a("div",null,p)}const g=e(n,[["render",d],["__scopeId","data-v-ec06cc3a"]]);export{u as __pageData,g as default}; diff --git a/assets/en_vue-webapp_options_splash-screen.md.M3pCGpim.js b/assets/en_vue-webapp_options_splash-screen.md.M3pCGpim.js deleted file mode 100644 index bcba60156..000000000 --- a/assets/en_vue-webapp_options_splash-screen.md.M3pCGpim.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,c as a,o as t,U as s,au as n}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":1706078328000}'),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,f,_){return t(),a("div",null,c)}const u=e(o,[["render",d],["__scopeId","data-v-39f7573f"]]);export{v as __pageData,u as default}; diff --git a/assets/en_vue-webapp_options_themes.md.G3jKyM1z.js b/assets/en_vue-webapp_options_themes.md.KxFEOIr3.js similarity index 99% rename from assets/en_vue-webapp_options_themes.md.G3jKyM1z.js rename to assets/en_vue-webapp_options_themes.md.KxFEOIr3.js index 7bb98d152..92f97eb3e 100644 --- a/assets/en_vue-webapp_options_themes.md.G3jKyM1z.js +++ b/assets/en_vue-webapp_options_themes.md.KxFEOIr3.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":1706078328000}'),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":1706078525000}'),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.G3jKyM1z.lean.js b/assets/en_vue-webapp_options_themes.md.KxFEOIr3.lean.js
similarity index 90%
rename from assets/en_vue-webapp_options_themes.md.G3jKyM1z.lean.js
rename to assets/en_vue-webapp_options_themes.md.KxFEOIr3.lean.js
index c35880444..9b0532204 100644
--- a/assets/en_vue-webapp_options_themes.md.G3jKyM1z.lean.js
+++ b/assets/en_vue-webapp_options_themes.md.KxFEOIr3.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":1706078328000}'),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":1706078525000}'),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.t66lxH38.js b/assets/index.md.z5bTLNnp.js
similarity index 94%
rename from assets/index.md.t66lxH38.js
rename to assets/index.md.z5bTLNnp.js
index b04915701..18301956d 100644
--- a/assets/index.md.t66lxH38.js
+++ b/assets/index.md.z5bTLNnp.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":1706078328000}'),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":1706078525000}'),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.t66lxH38.lean.js b/assets/index.md.z5bTLNnp.lean.js
similarity index 94%
rename from assets/index.md.t66lxH38.lean.js
rename to assets/index.md.z5bTLNnp.lean.js
index b04915701..18301956d 100644
--- a/assets/index.md.t66lxH38.lean.js
+++ b/assets/index.md.z5bTLNnp.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":1706078328000}'),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":1706078525000}'),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.PLOQy8xx.js b/assets/ru_articles_index.md.-CrIAaFR.js
similarity index 98%
rename from assets/ru_articles_index.md.PLOQy8xx.js
rename to assets/ru_articles_index.md.-CrIAaFR.js
index d33cfcb8b..5104bf6cc 100644
--- a/assets/ru_articles_index.md.PLOQy8xx.js
+++ b/assets/ru_articles_index.md.-CrIAaFR.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-7c2e6f56"),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":1706078328000}'),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-7c2e6f56"]]);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-40fc89de"),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":1706078525000}'),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-40fc89de"]]);export{G as __pageData,L as default}; diff --git a/assets/ru_articles_index.md.PLOQy8xx.lean.js b/assets/ru_articles_index.md.-CrIAaFR.lean.js similarity index 98% rename from assets/ru_articles_index.md.PLOQy8xx.lean.js rename to assets/ru_articles_index.md.-CrIAaFR.lean.js index d33cfcb8b..5104bf6cc 100644 --- a/assets/ru_articles_index.md.PLOQy8xx.lean.js +++ b/assets/ru_articles_index.md.-CrIAaFR.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-7c2e6f56"),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":1706078328000}'),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-7c2e6f56"]]);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-40fc89de"),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":1706078525000}'),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-40fc89de"]]);export{G as __pageData,L as default}; diff --git a/assets/ru_arty-crafty_analysis_architecture-and-design.md.xnJCArnJ.js b/assets/ru_arty-crafty_analysis_architecture-and-design.md.QOQ_N_y5.js similarity index 99% rename from assets/ru_arty-crafty_analysis_architecture-and-design.md.xnJCArnJ.js rename to assets/ru_arty-crafty_analysis_architecture-and-design.md.QOQ_N_y5.js index 48b9011e6..872b625a9 100644 --- a/assets/ru_arty-crafty_analysis_architecture-and-design.md.xnJCArnJ.js +++ b/assets/ru_arty-crafty_analysis_architecture-and-design.md.QOQ_N_y5.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":1706078328000}'),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":1706078525000}'),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.xnJCArnJ.lean.js b/assets/ru_arty-crafty_analysis_architecture-and-design.md.QOQ_N_y5.lean.js similarity index 93% rename from assets/ru_arty-crafty_analysis_architecture-and-design.md.xnJCArnJ.lean.js rename to assets/ru_arty-crafty_analysis_architecture-and-design.md.QOQ_N_y5.lean.js index e685e7e01..18232fa1d 100644 --- a/assets/ru_arty-crafty_analysis_architecture-and-design.md.xnJCArnJ.lean.js +++ b/assets/ru_arty-crafty_analysis_architecture-and-design.md.QOQ_N_y5.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":1706078328000}'),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":1706078525000}'),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.HGrhbiRC.js b/assets/ru_arty-crafty_analysis_business-analysis.md.du7KU9Bk.js similarity index 99% rename from assets/ru_arty-crafty_analysis_business-analysis.md.HGrhbiRC.js rename to assets/ru_arty-crafty_analysis_business-analysis.md.du7KU9Bk.js index d8c0a765f..ae8428787 100644 --- a/assets/ru_arty-crafty_analysis_business-analysis.md.HGrhbiRC.js +++ b/assets/ru_arty-crafty_analysis_business-analysis.md.du7KU9Bk.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":1706078328000}'),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":1706078525000}'),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.HGrhbiRC.lean.js b/assets/ru_arty-crafty_analysis_business-analysis.md.du7KU9Bk.lean.js similarity index 92% rename from assets/ru_arty-crafty_analysis_business-analysis.md.HGrhbiRC.lean.js rename to assets/ru_arty-crafty_analysis_business-analysis.md.du7KU9Bk.lean.js index 046dcfe2d..64f6ed1f0 100644 --- a/assets/ru_arty-crafty_analysis_business-analysis.md.HGrhbiRC.lean.js +++ b/assets/ru_arty-crafty_analysis_business-analysis.md.du7KU9Bk.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":1706078328000}'),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":1706078525000}'),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.cZPzgAu5.js b/assets/ru_arty-crafty_analysis_data-model.md.GePqZknl.js similarity index 99% rename from assets/ru_arty-crafty_analysis_data-model.md.cZPzgAu5.js rename to assets/ru_arty-crafty_analysis_data-model.md.GePqZknl.js index 74f9abcc5..42d0ba6dc 100644 --- a/assets/ru_arty-crafty_analysis_data-model.md.cZPzgAu5.js +++ b/assets/ru_arty-crafty_analysis_data-model.md.GePqZknl.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":1706078328000}'),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":1706078525000}'),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.cZPzgAu5.lean.js b/assets/ru_arty-crafty_analysis_data-model.md.GePqZknl.lean.js
similarity index 92%
rename from assets/ru_arty-crafty_analysis_data-model.md.cZPzgAu5.lean.js
rename to assets/ru_arty-crafty_analysis_data-model.md.GePqZknl.lean.js
index 6c35ce5c0..a5ac41167 100644
--- a/assets/ru_arty-crafty_analysis_data-model.md.cZPzgAu5.lean.js
+++ b/assets/ru_arty-crafty_analysis_data-model.md.GePqZknl.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":1706078328000}'),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":1706078525000}'),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.ouiP0KR_.js b/assets/ru_arty-crafty_analysis_research.md.0Vj2L4jI.js
similarity index 98%
rename from assets/ru_arty-crafty_analysis_research.md.ouiP0KR_.js
rename to assets/ru_arty-crafty_analysis_research.md.0Vj2L4jI.js
index 1f662d441..ac5aa1808 100644
--- a/assets/ru_arty-crafty_analysis_research.md.ouiP0KR_.js
+++ b/assets/ru_arty-crafty_analysis_research.md.0Vj2L4jI.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":1706078328000}'),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":1706078525000}'),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.ouiP0KR_.lean.js b/assets/ru_arty-crafty_analysis_research.md.0Vj2L4jI.lean.js similarity index 91% rename from assets/ru_arty-crafty_analysis_research.md.ouiP0KR_.lean.js rename to assets/ru_arty-crafty_analysis_research.md.0Vj2L4jI.lean.js index 124448d62..1555b99a8 100644 --- a/assets/ru_arty-crafty_analysis_research.md.ouiP0KR_.lean.js +++ b/assets/ru_arty-crafty_analysis_research.md.0Vj2L4jI.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":1706078328000}'),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":1706078525000}'),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.uCjnFy4s.js b/assets/ru_arty-crafty_analysis_tech-stack.md.YA4k4VO6.js similarity index 97% rename from assets/ru_arty-crafty_analysis_tech-stack.md.uCjnFy4s.js rename to assets/ru_arty-crafty_analysis_tech-stack.md.YA4k4VO6.js index f506fee23..8279d1214 100644 --- a/assets/ru_arty-crafty_analysis_tech-stack.md.uCjnFy4s.js +++ b/assets/ru_arty-crafty_analysis_tech-stack.md.YA4k4VO6.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":1706078328000}'),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":1706078525000}'),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.uCjnFy4s.lean.js b/assets/ru_arty-crafty_analysis_tech-stack.md.YA4k4VO6.lean.js similarity index 91% rename from assets/ru_arty-crafty_analysis_tech-stack.md.uCjnFy4s.lean.js rename to assets/ru_arty-crafty_analysis_tech-stack.md.YA4k4VO6.lean.js index 77f15f389..a19171aad 100644 --- a/assets/ru_arty-crafty_analysis_tech-stack.md.uCjnFy4s.lean.js +++ b/assets/ru_arty-crafty_analysis_tech-stack.md.YA4k4VO6.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":1706078328000}'),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":1706078525000}'),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.pN4gTeIJ.js b/assets/ru_arty-crafty_analysis_ui-design.md.HFRXemhN.js similarity index 97% rename from assets/ru_arty-crafty_analysis_ui-design.md.pN4gTeIJ.js rename to assets/ru_arty-crafty_analysis_ui-design.md.HFRXemhN.js index e1730617d..1bb594077 100644 --- a/assets/ru_arty-crafty_analysis_ui-design.md.pN4gTeIJ.js +++ b/assets/ru_arty-crafty_analysis_ui-design.md.HFRXemhN.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":1706078328000}'),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":1706078525000}'),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.pN4gTeIJ.lean.js b/assets/ru_arty-crafty_analysis_ui-design.md.HFRXemhN.lean.js similarity index 91% rename from assets/ru_arty-crafty_analysis_ui-design.md.pN4gTeIJ.lean.js rename to assets/ru_arty-crafty_analysis_ui-design.md.HFRXemhN.lean.js index c1049e7c3..7c61c7b13 100644 --- a/assets/ru_arty-crafty_analysis_ui-design.md.pN4gTeIJ.lean.js +++ b/assets/ru_arty-crafty_analysis_ui-design.md.HFRXemhN.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":1706078328000}'),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":1706078525000}'),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.edIBThWB.js b/assets/ru_arty-crafty_analysis_ui-layout.md.oTh_5u9W.js similarity index 99% rename from assets/ru_arty-crafty_analysis_ui-layout.md.edIBThWB.js rename to assets/ru_arty-crafty_analysis_ui-layout.md.oTh_5u9W.js index 005150884..e17c1cb24 100644 --- a/assets/ru_arty-crafty_analysis_ui-layout.md.edIBThWB.js +++ b/assets/ru_arty-crafty_analysis_ui-layout.md.oTh_5u9W.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":1706078328000}'),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":1706078525000}'),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.edIBThWB.lean.js b/assets/ru_arty-crafty_analysis_ui-layout.md.oTh_5u9W.lean.js similarity index 91% rename from assets/ru_arty-crafty_analysis_ui-layout.md.edIBThWB.lean.js rename to assets/ru_arty-crafty_analysis_ui-layout.md.oTh_5u9W.lean.js index 6f1da5248..1ff9e4eb2 100644 --- a/assets/ru_arty-crafty_analysis_ui-layout.md.edIBThWB.lean.js +++ b/assets/ru_arty-crafty_analysis_ui-layout.md.oTh_5u9W.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":1706078328000}'),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":1706078525000}'),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.WTuYOjgB.js b/assets/ru_arty-crafty_backend_baas-choosing.md.e-VfsTdu.js similarity index 99% rename from assets/ru_arty-crafty_backend_baas-choosing.md.WTuYOjgB.js rename to assets/ru_arty-crafty_backend_baas-choosing.md.e-VfsTdu.js index 88ae85dab..98f998a0d 100644 --- a/assets/ru_arty-crafty_backend_baas-choosing.md.WTuYOjgB.js +++ b/assets/ru_arty-crafty_backend_baas-choosing.md.e-VfsTdu.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":1706078328000}'),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":1706078525000}'),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.WTuYOjgB.lean.js b/assets/ru_arty-crafty_backend_baas-choosing.md.e-VfsTdu.lean.js similarity index 92% rename from assets/ru_arty-crafty_backend_baas-choosing.md.WTuYOjgB.lean.js rename to assets/ru_arty-crafty_backend_baas-choosing.md.e-VfsTdu.lean.js index b7f4b31d2..ef7b839e2 100644 --- a/assets/ru_arty-crafty_backend_baas-choosing.md.WTuYOjgB.lean.js +++ b/assets/ru_arty-crafty_backend_baas-choosing.md.e-VfsTdu.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":1706078328000}'),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":1706078525000}'),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.lUoLunaj.js b/assets/ru_arty-crafty_backend_db-data-model.md.Cg1X41I7.js similarity index 99% rename from assets/ru_arty-crafty_backend_db-data-model.md.lUoLunaj.js rename to assets/ru_arty-crafty_backend_db-data-model.md.Cg1X41I7.js index 2b8f90315..5b3360c0a 100644 --- a/assets/ru_arty-crafty_backend_db-data-model.md.lUoLunaj.js +++ b/assets/ru_arty-crafty_backend_db-data-model.md.Cg1X41I7.js @@ -1 +1 @@ -import{_ as a,c as t,o as e,U as o}from"./chunks/framework.P5TqXf0g.js";const c="/assets/db-schema-1.8Qdr8y5i.webp",r="/assets/db-categories-data.zpLjtPpl.webp",d="/assets/db-products-data.twuripFM.webp",s="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":1706078328000}'),n={name:"ru/arty-crafty/backend/db-data-model.md"},i=o('

Модель данных в базе данных

Сущности

На данный момент у нас есть сущности product и category. Отношение между ними - many-to-many. Один продукт может находиться в нескольких категориях (с учетом того, что конкретный магазин маркетплейса тоже можно рассматривать как категорию).

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

image

Данные

Исторически название полей в реляционных базах данных должно быть snake_case, но современные БД хорошо различают регистр, и поэтому удобно именовать поля так же, как они будут в JavaScript на фронтенде - тогда можно избежать преобразования имен туда-обратно, что зачастую может вылиться в очень немаленький бойлерплейт на бэкенде.

Category table

image

Product table

image

Category-product join table

image

В классических реляционных базах данных все данные находились в таблицах, большинство полей (колонок таблиц) было либо числом, либо строкой, либо timestamp. Соответственно, для firstName пользователя было своё поле, для lastName - своё. В итоге у Magento, например, свыше 200 таблиц в минимальной версии, и у некоторых таблиц могут быть десятки полей.

JSON поля сильно упрощают работу с данными и таблицами. В нашем случае у product есть два json поля - desc и data. В первом будут храниться данные, которые надо передать на фронтенд при запросе категории товаров (краткая информация по товарам), в data - уже полное описание товара для показа на странице товара, включая, например, отзывы пользователей. data будет намного больше по объему, чем desc. Это позволит делать запросы на бэкенд эффективно.

Поиск по json полям

Одно из преимуществ реляционных баз данных - индексация полей и быстрый поиск по ним даже с десятками миллионов записей в таблице.

У нас есть форма поиска на сайте, мы захотим искать по полному описанию товара, который находится в data поле таблицы product. Это тоже возможно, потому что MySQL, например, по каждому параметру внутри json поля, по которому должен быть поиск, создает дополнительное виртуальное поле в этой таблице, и индексирует его для оптимизации поиска или join-ов. Postgres наверняка делает примерно то же самое.

',18),l=[i];function p(b,m,f,h,g,u){return e(),t("div",null,l)}const A=a(n,[["render",p]]);export{P as __pageData,A as default}; +import{_ as a,c as t,o as e,U as o}from"./chunks/framework.P5TqXf0g.js";const c="/assets/db-schema-1.8Qdr8y5i.webp",r="/assets/db-categories-data.zpLjtPpl.webp",d="/assets/db-products-data.twuripFM.webp",s="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":1706078525000}'),n={name:"ru/arty-crafty/backend/db-data-model.md"},i=o('

Модель данных в базе данных

Сущности

На данный момент у нас есть сущности product и category. Отношение между ними - many-to-many. Один продукт может находиться в нескольких категориях (с учетом того, что конкретный магазин маркетплейса тоже можно рассматривать как категорию).

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

image

Данные

Исторически название полей в реляционных базах данных должно быть snake_case, но современные БД хорошо различают регистр, и поэтому удобно именовать поля так же, как они будут в JavaScript на фронтенде - тогда можно избежать преобразования имен туда-обратно, что зачастую может вылиться в очень немаленький бойлерплейт на бэкенде.

Category table

image

Product table

image

Category-product join table

image

В классических реляционных базах данных все данные находились в таблицах, большинство полей (колонок таблиц) было либо числом, либо строкой, либо timestamp. Соответственно, для firstName пользователя было своё поле, для lastName - своё. В итоге у Magento, например, свыше 200 таблиц в минимальной версии, и у некоторых таблиц могут быть десятки полей.

JSON поля сильно упрощают работу с данными и таблицами. В нашем случае у product есть два json поля - desc и data. В первом будут храниться данные, которые надо передать на фронтенд при запросе категории товаров (краткая информация по товарам), в data - уже полное описание товара для показа на странице товара, включая, например, отзывы пользователей. data будет намного больше по объему, чем desc. Это позволит делать запросы на бэкенд эффективно.

Поиск по json полям

Одно из преимуществ реляционных баз данных - индексация полей и быстрый поиск по ним даже с десятками миллионов записей в таблице.

У нас есть форма поиска на сайте, мы захотим искать по полному описанию товара, который находится в data поле таблицы product. Это тоже возможно, потому что MySQL, например, по каждому параметру внутри json поля, по которому должен быть поиск, создает дополнительное виртуальное поле в этой таблице, и индексирует его для оптимизации поиска или join-ов. Postgres наверняка делает примерно то же самое.

',18),l=[i];function p(b,m,f,h,g,u){return e(),t("div",null,l)}const A=a(n,[["render",p]]);export{P as __pageData,A as default}; diff --git a/assets/ru_arty-crafty_backend_db-data-model.md.lUoLunaj.lean.js b/assets/ru_arty-crafty_backend_db-data-model.md.Cg1X41I7.lean.js similarity index 98% rename from assets/ru_arty-crafty_backend_db-data-model.md.lUoLunaj.lean.js rename to assets/ru_arty-crafty_backend_db-data-model.md.Cg1X41I7.lean.js index 375b77a56..40a1af966 100644 --- a/assets/ru_arty-crafty_backend_db-data-model.md.lUoLunaj.lean.js +++ b/assets/ru_arty-crafty_backend_db-data-model.md.Cg1X41I7.lean.js @@ -1 +1 @@ -import{_ as a,c as t,o as e,U as o}from"./chunks/framework.P5TqXf0g.js";const c="/assets/db-schema-1.8Qdr8y5i.webp",r="/assets/db-categories-data.zpLjtPpl.webp",d="/assets/db-products-data.twuripFM.webp",s="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":1706078328000}'),n={name:"ru/arty-crafty/backend/db-data-model.md"},i=o("",18),l=[i];function p(b,m,f,h,g,u){return e(),t("div",null,l)}const A=a(n,[["render",p]]);export{P as __pageData,A as default}; +import{_ as a,c as t,o as e,U as o}from"./chunks/framework.P5TqXf0g.js";const c="/assets/db-schema-1.8Qdr8y5i.webp",r="/assets/db-categories-data.zpLjtPpl.webp",d="/assets/db-products-data.twuripFM.webp",s="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":1706078525000}'),n={name:"ru/arty-crafty/backend/db-data-model.md"},i=o("",18),l=[i];function p(b,m,f,h,g,u){return e(),t("div",null,l)}const A=a(n,[["render",p]]);export{P as __pageData,A as default}; diff --git a/assets/ru_arty-crafty_backend_hoppscotch.md.bOqtfBwr.js b/assets/ru_arty-crafty_backend_hoppscotch.md.qLzyLp5M.js similarity index 96% rename from assets/ru_arty-crafty_backend_hoppscotch.md.bOqtfBwr.js rename to assets/ru_arty-crafty_backend_hoppscotch.md.qLzyLp5M.js index 43afc9f52..fa66df18a 100644 --- a/assets/ru_arty-crafty_backend_hoppscotch.md.bOqtfBwr.js +++ b/assets/ru_arty-crafty_backend_hoppscotch.md.qLzyLp5M.js @@ -1 +1 @@ -import{_ as t,c as a,o as e,U as o}from"./chunks/framework.P5TqXf0g.js";const c="/assets/hoppscotch.tbrEXPoC.webp",g=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":1706078328000}'),s={name:"ru/arty-crafty/backend/hoppscotch.md"},r=o('

Hoppscotch

Работа с API

Для работы и тестирования API обычно используется инструмент типа Postman, умеющий делать REST запросы и всё остальное, с ним связанное. Однако, как это часто бывает с монополистом, Postman сильно отяжелел за последние годы и работать с ним не очень комфортно.

Одной из удобных альтернатив является Hopscotch, в девичестве - Postwoman. Он работает из браузера или как PWA приложение, имеет весь необходимый нам функционал и написан на Vue.

image

',5),p=[r];function n(h,d,i,_,m,l){return e(),a("div",null,p)}const y=t(s,[["render",n]]);export{g as __pageData,y as default}; +import{_ as t,c as a,o as e,U as o}from"./chunks/framework.P5TqXf0g.js";const c="/assets/hoppscotch.tbrEXPoC.webp",g=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":1706078525000}'),s={name:"ru/arty-crafty/backend/hoppscotch.md"},r=o('

Hoppscotch

Работа с API

Для работы и тестирования API обычно используется инструмент типа Postman, умеющий делать REST запросы и всё остальное, с ним связанное. Однако, как это часто бывает с монополистом, Postman сильно отяжелел за последние годы и работать с ним не очень комфортно.

Одной из удобных альтернатив является Hopscotch, в девичестве - Postwoman. Он работает из браузера или как PWA приложение, имеет весь необходимый нам функционал и написан на Vue.

image

',5),p=[r];function n(h,d,i,_,m,l){return e(),a("div",null,p)}const y=t(s,[["render",n]]);export{g as __pageData,y as default}; diff --git a/assets/ru_arty-crafty_backend_hoppscotch.md.bOqtfBwr.lean.js b/assets/ru_arty-crafty_backend_hoppscotch.md.qLzyLp5M.lean.js similarity index 91% rename from assets/ru_arty-crafty_backend_hoppscotch.md.bOqtfBwr.lean.js rename to assets/ru_arty-crafty_backend_hoppscotch.md.qLzyLp5M.lean.js index 769581be2..c5eecb844 100644 --- a/assets/ru_arty-crafty_backend_hoppscotch.md.bOqtfBwr.lean.js +++ b/assets/ru_arty-crafty_backend_hoppscotch.md.qLzyLp5M.lean.js @@ -1 +1 @@ -import{_ as t,c as a,o as e,U as o}from"./chunks/framework.P5TqXf0g.js";const c="/assets/hoppscotch.tbrEXPoC.webp",g=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":1706078328000}'),s={name:"ru/arty-crafty/backend/hoppscotch.md"},r=o("",5),p=[r];function n(h,d,i,_,m,l){return e(),a("div",null,p)}const y=t(s,[["render",n]]);export{g as __pageData,y as default}; +import{_ as t,c as a,o as e,U as o}from"./chunks/framework.P5TqXf0g.js";const c="/assets/hoppscotch.tbrEXPoC.webp",g=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":1706078525000}'),s={name:"ru/arty-crafty/backend/hoppscotch.md"},r=o("",5),p=[r];function n(h,d,i,_,m,l){return e(),a("div",null,p)}const y=t(s,[["render",n]]);export{g as __pageData,y as default}; diff --git a/assets/ru_arty-crafty_backend_supabase-api.md.qSRdOuNP.js b/assets/ru_arty-crafty_backend_supabase-api.md.REoxAKZv.js similarity index 99% rename from assets/ru_arty-crafty_backend_supabase-api.md.qSRdOuNP.js rename to assets/ru_arty-crafty_backend_supabase-api.md.REoxAKZv.js index ec6212312..d29e112e5 100644 --- a/assets/ru_arty-crafty_backend_supabase-api.md.qSRdOuNP.js +++ b/assets/ru_arty-crafty_backend_supabase-api.md.REoxAKZv.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":1706078328000}'),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":1706078525000}'),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.qSRdOuNP.lean.js b/assets/ru_arty-crafty_backend_supabase-api.md.REoxAKZv.lean.js
similarity index 91%
rename from assets/ru_arty-crafty_backend_supabase-api.md.qSRdOuNP.lean.js
rename to assets/ru_arty-crafty_backend_supabase-api.md.REoxAKZv.lean.js
index b6dda775e..2aa21f119 100644
--- a/assets/ru_arty-crafty_backend_supabase-api.md.qSRdOuNP.lean.js
+++ b/assets/ru_arty-crafty_backend_supabase-api.md.REoxAKZv.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":1706078328000}'),t={name:"ru/arty-crafty/backend/supabase-api.md"},h=n("",11),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":1706078525000}'),t={name:"ru/arty-crafty/backend/supabase-api.md"},h=n("",11),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.i95ffB3y.js b/assets/ru_arty-crafty_backend_supabase.md.e48nvkaf.js
similarity index 98%
rename from assets/ru_arty-crafty_backend_supabase.md.i95ffB3y.js
rename to assets/ru_arty-crafty_backend_supabase.md.e48nvkaf.js
index 1757e10c4..096ecb923 100644
--- a/assets/ru_arty-crafty_backend_supabase.md.i95ffB3y.js
+++ b/assets/ru_arty-crafty_backend_supabase.md.e48nvkaf.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":1706078328000}'),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":1706078525000}'),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.i95ffB3y.lean.js b/assets/ru_arty-crafty_backend_supabase.md.e48nvkaf.lean.js similarity index 92% rename from assets/ru_arty-crafty_backend_supabase.md.i95ffB3y.lean.js rename to assets/ru_arty-crafty_backend_supabase.md.e48nvkaf.lean.js index 16b84834e..39ca34266 100644 --- a/assets/ru_arty-crafty_backend_supabase.md.i95ffB3y.lean.js +++ b/assets/ru_arty-crafty_backend_supabase.md.e48nvkaf.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":1706078328000}'),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":1706078525000}'),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.poLetM_l.js b/assets/ru_arty-crafty_index.md.-Ix5pgur.js similarity index 98% rename from assets/ru_arty-crafty_index.md.poLetM_l.js rename to assets/ru_arty-crafty_index.md.-Ix5pgur.js index ab4f841e7..a28d069fc 100644 --- a/assets/ru_arty-crafty_index.md.poLetM_l.js +++ b/assets/ru_arty-crafty_index.md.-Ix5pgur.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":1706078328000}'),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":1706078525000}'),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.poLetM_l.lean.js b/assets/ru_arty-crafty_index.md.-Ix5pgur.lean.js similarity index 92% rename from assets/ru_arty-crafty_index.md.poLetM_l.lean.js rename to assets/ru_arty-crafty_index.md.-Ix5pgur.lean.js index 71f65fa79..84cd2da1c 100644 --- a/assets/ru_arty-crafty_index.md.poLetM_l.lean.js +++ b/assets/ru_arty-crafty_index.md.-Ix5pgur.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":1706078328000}'),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":1706078525000}'),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.wNQgsr61.js b/assets/ru_arty-crafty_introduction_development-stages.md.ntdUZyjD.js similarity index 99% rename from assets/ru_arty-crafty_introduction_development-stages.md.wNQgsr61.js rename to assets/ru_arty-crafty_introduction_development-stages.md.ntdUZyjD.js index c074731ce..f51775fff 100644 --- a/assets/ru_arty-crafty_introduction_development-stages.md.wNQgsr61.js +++ b/assets/ru_arty-crafty_introduction_development-stages.md.ntdUZyjD.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":1706078328000}'),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":1706078525000}'),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.wNQgsr61.lean.js b/assets/ru_arty-crafty_introduction_development-stages.md.ntdUZyjD.lean.js similarity index 92% rename from assets/ru_arty-crafty_introduction_development-stages.md.wNQgsr61.lean.js rename to assets/ru_arty-crafty_introduction_development-stages.md.ntdUZyjD.lean.js index 8925069ad..96f4f537a 100644 --- a/assets/ru_arty-crafty_introduction_development-stages.md.wNQgsr61.lean.js +++ b/assets/ru_arty-crafty_introduction_development-stages.md.ntdUZyjD.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":1706078328000}'),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":1706078525000}'),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.9Hc3AsGU.js b/assets/ru_arty-crafty_introduction_goals.md.qisZy36U.js similarity index 98% rename from assets/ru_arty-crafty_introduction_goals.md.9Hc3AsGU.js rename to assets/ru_arty-crafty_introduction_goals.md.qisZy36U.js index 187a2df90..19807ac0d 100644 --- a/assets/ru_arty-crafty_introduction_goals.md.9Hc3AsGU.js +++ b/assets/ru_arty-crafty_introduction_goals.md.qisZy36U.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":1706078328000}'),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":1706078525000}'),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.9Hc3AsGU.lean.js b/assets/ru_arty-crafty_introduction_goals.md.qisZy36U.lean.js similarity index 91% rename from assets/ru_arty-crafty_introduction_goals.md.9Hc3AsGU.lean.js rename to assets/ru_arty-crafty_introduction_goals.md.qisZy36U.lean.js index dee0bfc92..699669930 100644 --- a/assets/ru_arty-crafty_introduction_goals.md.9Hc3AsGU.lean.js +++ b/assets/ru_arty-crafty_introduction_goals.md.qisZy36U.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":1706078328000}'),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":1706078525000}'),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.oUCpa4H0.js b/assets/ru_arty-crafty_introduction_repository.md.aNI639d7.js similarity index 95% rename from assets/ru_arty-crafty_introduction_repository.md.oUCpa4H0.js rename to assets/ru_arty-crafty_introduction_repository.md.aNI639d7.js index c7ffdb7d8..648e584d5 100644 --- a/assets/ru_arty-crafty_introduction_repository.md.oUCpa4H0.js +++ b/assets/ru_arty-crafty_introduction_repository.md.aNI639d7.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":1706078328000}'),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":1706078525000}'),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.oUCpa4H0.lean.js b/assets/ru_arty-crafty_introduction_repository.md.aNI639d7.lean.js similarity index 95% rename from assets/ru_arty-crafty_introduction_repository.md.oUCpa4H0.lean.js rename to assets/ru_arty-crafty_introduction_repository.md.aNI639d7.lean.js index c7ffdb7d8..648e584d5 100644 --- a/assets/ru_arty-crafty_introduction_repository.md.oUCpa4H0.lean.js +++ b/assets/ru_arty-crafty_introduction_repository.md.aNI639d7.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":1706078328000}'),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":1706078525000}'),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_codeium.md.dss6giiD.js b/assets/ru_arty-crafty_showcase_codeium.md.lfBhaW0U.js similarity index 99% rename from assets/ru_arty-crafty_showcase_codeium.md.dss6giiD.js rename to assets/ru_arty-crafty_showcase_codeium.md.lfBhaW0U.js index cd19b0a28..03d78b4ae 100644 --- a/assets/ru_arty-crafty_showcase_codeium.md.dss6giiD.js +++ b/assets/ru_arty-crafty_showcase_codeium.md.lfBhaW0U.js @@ -1,4 +1,4 @@ -import{_ as a,c as s,o as i,U as e}from"./chunks/framework.P5TqXf0g.js";const t="/assets/codeium-1.gKCzPkWo.jpg",n="/assets/codeium-2.OnH7ZaKW.jpg",o="/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":1706078328000}'),r={name:"ru/arty-crafty/showcase/codeium.md"},p=e('

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 i,U as e}from"./chunks/framework.P5TqXf0g.js";const t="/assets/codeium-1.gKCzPkWo.jpg",n="/assets/codeium-2.OnH7ZaKW.jpg",o="/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":1706078525000}'),r={name:"ru/arty-crafty/showcase/codeium.md"},p=e('

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.dss6giiD.lean.js b/assets/ru_arty-crafty_showcase_codeium.md.lfBhaW0U.lean.js
similarity index 92%
rename from assets/ru_arty-crafty_showcase_codeium.md.dss6giiD.lean.js
rename to assets/ru_arty-crafty_showcase_codeium.md.lfBhaW0U.lean.js
index a295b9f02..9a1202532 100644
--- a/assets/ru_arty-crafty_showcase_codeium.md.dss6giiD.lean.js
+++ b/assets/ru_arty-crafty_showcase_codeium.md.lfBhaW0U.lean.js
@@ -1 +1 @@
-import{_ as a,c as s,o as i,U as e}from"./chunks/framework.P5TqXf0g.js";const t="/assets/codeium-1.gKCzPkWo.jpg",n="/assets/codeium-2.OnH7ZaKW.jpg",o="/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":1706078328000}'),r={name:"ru/arty-crafty/showcase/codeium.md"},p=e("",21),l=[p];function c(h,d,k,u,m,g){return i(),s("div",null,l)}const _=a(r,[["render",c]]);export{f as __pageData,_ as default};
+import{_ as a,c as s,o as i,U as e}from"./chunks/framework.P5TqXf0g.js";const t="/assets/codeium-1.gKCzPkWo.jpg",n="/assets/codeium-2.OnH7ZaKW.jpg",o="/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":1706078525000}'),r={name:"ru/arty-crafty/showcase/codeium.md"},p=e("",21),l=[p];function c(h,d,k,u,m,g){return i(),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.THGYI84f.js b/assets/ru_arty-crafty_showcase_customization.md.THGYI84f.js
new file mode 100644
index 000000000..5707cbb9e
--- /dev/null
+++ b/assets/ru_arty-crafty_showcase_customization.md.THGYI84f.js
@@ -0,0 +1,19 @@
+import{_ as a,c as t,o as s,U as e}from"./chunks/framework.P5TqXf0g.js";const i="/assets/header-1.2JwfDLlb.gif",d="/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":1706078525000}'),b={name:"ru/arty-crafty/showcase/customization.md"},n=e(`

Кастомизация

Персонализация

Заменим везде имя на "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,c,h,f,v){return s(),t("div",null,o)}const g=a(b,[["render",p],["__scopeId","data-v-ba67b7f9"]]);export{E as __pageData,g as default}; diff --git a/assets/ru_arty-crafty_showcase_customization.md.U-kUafIC.lean.js b/assets/ru_arty-crafty_showcase_customization.md.THGYI84f.lean.js similarity index 57% rename from assets/ru_arty-crafty_showcase_customization.md.U-kUafIC.lean.js rename to assets/ru_arty-crafty_showcase_customization.md.THGYI84f.lean.js index 3ccfd10c2..169c8cf66 100644 --- a/assets/ru_arty-crafty_showcase_customization.md.U-kUafIC.lean.js +++ b/assets/ru_arty-crafty_showcase_customization.md.THGYI84f.lean.js @@ -1 +1 @@ -import{_ as a,c as t,o as s,U as e}from"./chunks/framework.P5TqXf0g.js";const i="/assets/header-1.2JwfDLlb.gif",f="/assets/website-1.oaXSktFw.gif",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/customization.md","filePath":"ru/arty-crafty/showcase/customization.md","lastUpdated":1706078328000}'),d={name:"ru/arty-crafty/showcase/customization.md"},n=e("",29),o=[n];function p(r,l,c,h,v,k){return s(),t("div",null,o)}const u=a(d,[["render",p],["__scopeId","data-v-f272f964"]]);export{g as __pageData,u as default}; +import{_ as a,c as t,o as s,U as e}from"./chunks/framework.P5TqXf0g.js";const i="/assets/header-1.2JwfDLlb.gif",d="/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":1706078525000}'),b={name:"ru/arty-crafty/showcase/customization.md"},n=e("",29),o=[n];function p(r,l,c,h,f,v){return s(),t("div",null,o)}const g=a(b,[["render",p],["__scopeId","data-v-ba67b7f9"]]);export{E as __pageData,g as default}; diff --git a/assets/ru_arty-crafty_showcase_customization.md.U-kUafIC.js b/assets/ru_arty-crafty_showcase_customization.md.U-kUafIC.js deleted file mode 100644 index 5afe6cfe9..000000000 --- a/assets/ru_arty-crafty_showcase_customization.md.U-kUafIC.js +++ /dev/null @@ -1,19 +0,0 @@ -import{_ as a,c as t,o as s,U as e}from"./chunks/framework.P5TqXf0g.js";const i="/assets/header-1.2JwfDLlb.gif",f="/assets/website-1.oaXSktFw.gif",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/customization.md","filePath":"ru/arty-crafty/showcase/customization.md","lastUpdated":1706078328000}'),d={name:"ru/arty-crafty/showcase/customization.md"},n=e(`

Кастомизация

Персонализация

Заменим везде имя на "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,c,h,v,k){return s(),t("div",null,o)}const u=a(d,[["render",p],["__scopeId","data-v-f272f964"]]);export{g as __pageData,u as default}; diff --git a/assets/ru_arty-crafty_showcase_favourites.md.E-9LKXN1.js b/assets/ru_arty-crafty_showcase_favourites.md.xJvPnA3z.js similarity index 99% rename from assets/ru_arty-crafty_showcase_favourites.md.E-9LKXN1.js rename to assets/ru_arty-crafty_showcase_favourites.md.xJvPnA3z.js index 570887b43..8ab6efe37 100644 --- a/assets/ru_arty-crafty_showcase_favourites.md.E-9LKXN1.js +++ b/assets/ru_arty-crafty_showcase_favourites.md.xJvPnA3z.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":1706078328000}'),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":1706078525000}'),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.E-9LKXN1.lean.js b/assets/ru_arty-crafty_showcase_favourites.md.xJvPnA3z.lean.js
similarity index 91%
rename from assets/ru_arty-crafty_showcase_favourites.md.E-9LKXN1.lean.js
rename to assets/ru_arty-crafty_showcase_favourites.md.xJvPnA3z.lean.js
index 3c9727f66..35a78cff3 100644
--- a/assets/ru_arty-crafty_showcase_favourites.md.E-9LKXN1.lean.js
+++ b/assets/ru_arty-crafty_showcase_favourites.md.xJvPnA3z.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":1706078328000}'),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":1706078525000}'),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.Vv2kiAPO.js b/assets/ru_arty-crafty_showcase_product-category.md.0PK5e7Ji.js
similarity index 98%
rename from assets/ru_arty-crafty_showcase_product-category.md.Vv2kiAPO.js
rename to assets/ru_arty-crafty_showcase_product-category.md.0PK5e7Ji.js
index 38f563581..826a88de3 100644
--- a/assets/ru_arty-crafty_showcase_product-category.md.Vv2kiAPO.js
+++ b/assets/ru_arty-crafty_showcase_product-category.md.0PK5e7Ji.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":1706078328000}'),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":1706078525000}'),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.Vv2kiAPO.lean.js b/assets/ru_arty-crafty_showcase_product-category.md.0PK5e7Ji.lean.js similarity index 92% rename from assets/ru_arty-crafty_showcase_product-category.md.Vv2kiAPO.lean.js rename to assets/ru_arty-crafty_showcase_product-category.md.0PK5e7Ji.lean.js index 4e6def059..564fd6caf 100644 --- a/assets/ru_arty-crafty_showcase_product-category.md.Vv2kiAPO.lean.js +++ b/assets/ru_arty-crafty_showcase_product-category.md.0PK5e7Ji.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":1706078328000}'),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":1706078525000}'),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.ddO3qUl_.js b/assets/ru_arty-crafty_showcase_project-setup.md.ddO3qUl_.js new file mode 100644 index 000000000..9f651b374 --- /dev/null +++ b/assets/ru_arty-crafty_showcase_project-setup.md.ddO3qUl_.js @@ -0,0 +1,21 @@ +import{_ as a,c as s,o as i,U as t}from"./chunks/framework.P5TqXf0g.js";const h="/assets/project-setup.hs31F5ED.png",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/project-setup.md","filePath":"ru/arty-crafty/showcase/project-setup.md","lastUpdated":1706078525000}'),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,c,r,f){return i(),s("div",null,k)}const y=a(n,[["render",d],["__scopeId","data-v-5496c0af"]]);export{g as __pageData,y as default}; diff --git a/assets/ru_arty-crafty_showcase_project-setup.md.xtexHM57.lean.js b/assets/ru_arty-crafty_showcase_project-setup.md.ddO3qUl_.lean.js similarity index 66% rename from assets/ru_arty-crafty_showcase_project-setup.md.xtexHM57.lean.js rename to assets/ru_arty-crafty_showcase_project-setup.md.ddO3qUl_.lean.js index dce915c64..2c3c63e6b 100644 --- a/assets/ru_arty-crafty_showcase_project-setup.md.xtexHM57.lean.js +++ b/assets/ru_arty-crafty_showcase_project-setup.md.ddO3qUl_.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":1706078328000}'),n={name:"ru/arty-crafty/showcase/project-setup.md"},p=t("",16),k=[p];function d(e,l,F,c,r,v){return i(),s("div",null,k)}const C=a(n,[["render",d],["__scopeId","data-v-c33222a2"]]);export{y as __pageData,C as default}; +import{_ as a,c as s,o as i,U as t}from"./chunks/framework.P5TqXf0g.js";const h="/assets/project-setup.hs31F5ED.png",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/project-setup.md","filePath":"ru/arty-crafty/showcase/project-setup.md","lastUpdated":1706078525000}'),n={name:"ru/arty-crafty/showcase/project-setup.md"},p=t("",16),k=[p];function d(e,l,F,c,r,f){return i(),s("div",null,k)}const y=a(n,[["render",d],["__scopeId","data-v-5496c0af"]]);export{g as __pageData,y as default}; diff --git a/assets/ru_arty-crafty_showcase_project-setup.md.xtexHM57.js b/assets/ru_arty-crafty_showcase_project-setup.md.xtexHM57.js deleted file mode 100644 index 8efa764a6..000000000 --- a/assets/ru_arty-crafty_showcase_project-setup.md.xtexHM57.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":1706078328000}'),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,c,r,v){return i(),s("div",null,k)}const C=a(n,[["render",d],["__scopeId","data-v-c33222a2"]]);export{y as __pageData,C as default}; diff --git a/assets/ru_backend_api.md.aOyJvsBW.js b/assets/ru_backend_api.md.9OxIP-t-.js similarity index 99% rename from assets/ru_backend_api.md.aOyJvsBW.js rename to assets/ru_backend_api.md.9OxIP-t-.js index b02f03c53..8f0d208e9 100644 --- a/assets/ru_backend_api.md.aOyJvsBW.js +++ b/assets/ru_backend_api.md.9OxIP-t-.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":1706078328000}'),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":1706078525000}'),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.aOyJvsBW.lean.js b/assets/ru_backend_api.md.9OxIP-t-.lean.js
similarity index 86%
rename from assets/ru_backend_api.md.aOyJvsBW.lean.js
rename to assets/ru_backend_api.md.9OxIP-t-.lean.js
index 3d2b703ba..37398f6c5 100644
--- a/assets/ru_backend_api.md.aOyJvsBW.lean.js
+++ b/assets/ru_backend_api.md.9OxIP-t-.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":1706078328000}'),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":1706078525000}'),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.dhIjGStg.js b/assets/ru_backend_auth.md.tfvWBsS9.js
similarity index 99%
rename from assets/ru_backend_auth.md.dhIjGStg.js
rename to assets/ru_backend_auth.md.tfvWBsS9.js
index 8e6b9cddb..f32e06e88 100644
--- a/assets/ru_backend_auth.md.dhIjGStg.js
+++ b/assets/ru_backend_auth.md.tfvWBsS9.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":1706078328000}'),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":1706078525000}'),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.dhIjGStg.lean.js b/assets/ru_backend_auth.md.tfvWBsS9.lean.js similarity index 86% rename from assets/ru_backend_auth.md.dhIjGStg.lean.js rename to assets/ru_backend_auth.md.tfvWBsS9.lean.js index 0a242e3e7..0fadeacb7 100644 --- a/assets/ru_backend_auth.md.dhIjGStg.lean.js +++ b/assets/ru_backend_auth.md.tfvWBsS9.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":1706078328000}'),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":1706078525000}'),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.ecvqfmDv.js b/assets/ru_backend_backend.md.oIhArsbT.js similarity index 99% rename from assets/ru_backend_backend.md.ecvqfmDv.js rename to assets/ru_backend_backend.md.oIhArsbT.js index 9f6c3485f..04d9e4ba4 100644 --- a/assets/ru_backend_backend.md.ecvqfmDv.js +++ b/assets/ru_backend_backend.md.oIhArsbT.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":1706078328000}'),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":1706078525000}'),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.ecvqfmDv.lean.js b/assets/ru_backend_backend.md.oIhArsbT.lean.js similarity index 87% rename from assets/ru_backend_backend.md.ecvqfmDv.lean.js rename to assets/ru_backend_backend.md.oIhArsbT.lean.js index d48370ec0..1b849592b 100644 --- a/assets/ru_backend_backend.md.ecvqfmDv.lean.js +++ b/assets/ru_backend_backend.md.oIhArsbT.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":1706078328000}'),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":1706078525000}'),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.qr-BBstv.js b/assets/ru_backend_cors.md.pv8nZLQz.js similarity index 99% rename from assets/ru_backend_cors.md.qr-BBstv.js rename to assets/ru_backend_cors.md.pv8nZLQz.js index 735c8a342..6d0d188a3 100644 --- a/assets/ru_backend_cors.md.qr-BBstv.js +++ b/assets/ru_backend_cors.md.pv8nZLQz.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":1706078328000}'),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":1706078525000}'),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.qr-BBstv.lean.js b/assets/ru_backend_cors.md.pv8nZLQz.lean.js similarity index 84% rename from assets/ru_backend_cors.md.qr-BBstv.lean.js rename to assets/ru_backend_cors.md.pv8nZLQz.lean.js index 129568cc9..62c35878d 100644 --- a/assets/ru_backend_cors.md.qr-BBstv.lean.js +++ b/assets/ru_backend_cors.md.pv8nZLQz.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":1706078328000}'),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":1706078525000}'),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.yBqCcP0e.js b/assets/ru_backend_protocols.md.SaCfczhK.js similarity index 98% rename from assets/ru_backend_protocols.md.yBqCcP0e.js rename to assets/ru_backend_protocols.md.SaCfczhK.js index 0661d7684..73c23c2c8 100644 --- a/assets/ru_backend_protocols.md.yBqCcP0e.js +++ b/assets/ru_backend_protocols.md.SaCfczhK.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":1706078328000}'),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":1706078525000}'),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.yBqCcP0e.lean.js b/assets/ru_backend_protocols.md.SaCfczhK.lean.js similarity index 86% rename from assets/ru_backend_protocols.md.yBqCcP0e.lean.js rename to assets/ru_backend_protocols.md.SaCfczhK.lean.js index 569df2541..3ffb1fb51 100644 --- a/assets/ru_backend_protocols.md.yBqCcP0e.lean.js +++ b/assets/ru_backend_protocols.md.SaCfczhK.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":1706078328000}'),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":1706078525000}'),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.T2WlOnoi.js b/assets/ru_book_Appendix__Migrating_from_Vue_2.md.HRQ8RZbn.js similarity index 99% rename from assets/ru_book_Appendix__Migrating_from_Vue_2.md.T2WlOnoi.js rename to assets/ru_book_Appendix__Migrating_from_Vue_2.md.HRQ8RZbn.js index 452d95562..32f69bce4 100644 --- a/assets/ru_book_Appendix__Migrating_from_Vue_2.md.T2WlOnoi.js +++ b/assets/ru_book_Appendix__Migrating_from_Vue_2.md.HRQ8RZbn.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":1706078328000}'),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":1706078525000}'),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.T2WlOnoi.lean.js b/assets/ru_book_Appendix__Migrating_from_Vue_2.md.HRQ8RZbn.lean.js
similarity index 93%
rename from assets/ru_book_Appendix__Migrating_from_Vue_2.md.T2WlOnoi.lean.js
rename to assets/ru_book_Appendix__Migrating_from_Vue_2.md.HRQ8RZbn.lean.js
index 99fdbea91..07873d2ea 100644
--- a/assets/ru_book_Appendix__Migrating_from_Vue_2.md.T2WlOnoi.lean.js
+++ b/assets/ru_book_Appendix__Migrating_from_Vue_2.md.HRQ8RZbn.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":1706078328000}'),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":1706078525000}'),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.quHj4Tvl.js b/assets/ru_book_Chapter_10__Deploying_Your_Application.md.cNFuqagN.js
similarity index 99%
rename from assets/ru_book_Chapter_10__Deploying_Your_Application.md.quHj4Tvl.js
rename to assets/ru_book_Chapter_10__Deploying_Your_Application.md.cNFuqagN.js
index 66ce99740..57b42fa84 100644
--- a/assets/ru_book_Chapter_10__Deploying_Your_Application.md.quHj4Tvl.js
+++ b/assets/ru_book_Chapter_10__Deploying_Your_Application.md.cNFuqagN.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":1706078328000}'),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":1706078525000}'),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.quHj4Tvl.lean.js b/assets/ru_book_Chapter_10__Deploying_Your_Application.md.cNFuqagN.lean.js
similarity index 93%
rename from assets/ru_book_Chapter_10__Deploying_Your_Application.md.quHj4Tvl.lean.js
rename to assets/ru_book_Chapter_10__Deploying_Your_Application.md.cNFuqagN.lean.js
index 6f1d2a4b5..8ecd6eec5 100644
--- a/assets/ru_book_Chapter_10__Deploying_Your_Application.md.quHj4Tvl.lean.js
+++ b/assets/ru_book_Chapter_10__Deploying_Your_Application.md.cNFuqagN.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":1706078328000}'),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":1706078525000}'),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.ac6MOo8b.js b/assets/ru_book_Chapter_11__Bonus_Chapter_-_UX_Patterns.md.jeaX63My.js
similarity index 99%
rename from assets/ru_book_Chapter_11__Bonus_Chapter_-_UX_Patterns.md.ac6MOo8b.js
rename to assets/ru_book_Chapter_11__Bonus_Chapter_-_UX_Patterns.md.jeaX63My.js
index ad7525862..53b0b34b5 100644
--- a/assets/ru_book_Chapter_11__Bonus_Chapter_-_UX_Patterns.md.ac6MOo8b.js
+++ b/assets/ru_book_Chapter_11__Bonus_Chapter_-_UX_Patterns.md.jeaX63My.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":1706078328000}'),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":1706078525000}'),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.ac6MOo8b.lean.js b/assets/ru_book_Chapter_11__Bonus_Chapter_-_UX_Patterns.md.jeaX63My.lean.js
similarity index 97%
rename from assets/ru_book_Chapter_11__Bonus_Chapter_-_UX_Patterns.md.ac6MOo8b.lean.js
rename to assets/ru_book_Chapter_11__Bonus_Chapter_-_UX_Patterns.md.jeaX63My.lean.js
index 3426c8368..478d05c4a 100644
--- a/assets/ru_book_Chapter_11__Bonus_Chapter_-_UX_Patterns.md.ac6MOo8b.lean.js
+++ b/assets/ru_book_Chapter_11__Bonus_Chapter_-_UX_Patterns.md.jeaX63My.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":1706078328000}'),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":1706078525000}'),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.FPOT0e1D.js b/assets/ru_book_Chapter_1__The_Vue_3_Framework.md.WiSUY9VU.js
similarity index 99%
rename from assets/ru_book_Chapter_1__The_Vue_3_Framework.md.FPOT0e1D.js
rename to assets/ru_book_Chapter_1__The_Vue_3_Framework.md.WiSUY9VU.js
index 0d74b6d9f..510b01ced 100644
--- a/assets/ru_book_Chapter_1__The_Vue_3_Framework.md.FPOT0e1D.js
+++ b/assets/ru_book_Chapter_1__The_Vue_3_Framework.md.WiSUY9VU.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":1706078328000}'),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":1706078525000}'),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.FPOT0e1D.lean.js b/assets/ru_book_Chapter_1__The_Vue_3_Framework.md.WiSUY9VU.lean.js
similarity index 97%
rename from assets/ru_book_Chapter_1__The_Vue_3_Framework.md.FPOT0e1D.lean.js
rename to assets/ru_book_Chapter_1__The_Vue_3_Framework.md.WiSUY9VU.lean.js
index e1ac44dd3..96b52518d 100644
--- a/assets/ru_book_Chapter_1__The_Vue_3_Framework.md.FPOT0e1D.lean.js
+++ b/assets/ru_book_Chapter_1__The_Vue_3_Framework.md.WiSUY9VU.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":1706078328000}'),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":1706078525000}'),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.xLNtjfDe.js b/assets/ru_book_Chapter_2__Software_Design_Principles_and_Patterns.md.tuf2sQ7N.js
similarity index 99%
rename from assets/ru_book_Chapter_2__Software_Design_Principles_and_Patterns.md.xLNtjfDe.js
rename to assets/ru_book_Chapter_2__Software_Design_Principles_and_Patterns.md.tuf2sQ7N.js
index 2d9f40c25..ae66c2bf7 100644
--- a/assets/ru_book_Chapter_2__Software_Design_Principles_and_Patterns.md.xLNtjfDe.js
+++ b/assets/ru_book_Chapter_2__Software_Design_Principles_and_Patterns.md.tuf2sQ7N.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":1706078328000}'),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":1706078525000}'),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.xLNtjfDe.lean.js b/assets/ru_book_Chapter_2__Software_Design_Principles_and_Patterns.md.tuf2sQ7N.lean.js
similarity index 95%
rename from assets/ru_book_Chapter_2__Software_Design_Principles_and_Patterns.md.xLNtjfDe.lean.js
rename to assets/ru_book_Chapter_2__Software_Design_Principles_and_Patterns.md.tuf2sQ7N.lean.js
index b8832d6c6..5ea4fb5ce 100644
--- a/assets/ru_book_Chapter_2__Software_Design_Principles_and_Patterns.md.xLNtjfDe.lean.js
+++ b/assets/ru_book_Chapter_2__Software_Design_Principles_and_Patterns.md.tuf2sQ7N.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":1706078328000}'),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":1706078525000}'),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.Bx3HYAGu.js b/assets/ru_book_Chapter_3__Setting_Up_a_Working_Project.md.XNVRrbK-.js
similarity index 99%
rename from assets/ru_book_Chapter_3__Setting_Up_a_Working_Project.md.Bx3HYAGu.js
rename to assets/ru_book_Chapter_3__Setting_Up_a_Working_Project.md.XNVRrbK-.js
index 290b07039..68337d71f 100644
--- a/assets/ru_book_Chapter_3__Setting_Up_a_Working_Project.md.Bx3HYAGu.js
+++ b/assets/ru_book_Chapter_3__Setting_Up_a_Working_Project.md.XNVRrbK-.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":1706078328000}'),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":1706078525000}'),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.Bx3HYAGu.lean.js b/assets/ru_book_Chapter_3__Setting_Up_a_Working_Project.md.XNVRrbK-.lean.js
similarity index 94%
rename from assets/ru_book_Chapter_3__Setting_Up_a_Working_Project.md.Bx3HYAGu.lean.js
rename to assets/ru_book_Chapter_3__Setting_Up_a_Working_Project.md.XNVRrbK-.lean.js
index 88e854e15..f3caff33e 100644
--- a/assets/ru_book_Chapter_3__Setting_Up_a_Working_Project.md.Bx3HYAGu.lean.js
+++ b/assets/ru_book_Chapter_3__Setting_Up_a_Working_Project.md.XNVRrbK-.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":1706078328000}'),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":1706078525000}'),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.3mr0vS25.js b/assets/ru_book_Chapter_4__User_Interface_Composition_with_Components.md.KkS6afCk.js
similarity index 99%
rename from assets/ru_book_Chapter_4__User_Interface_Composition_with_Components.md.3mr0vS25.js
rename to assets/ru_book_Chapter_4__User_Interface_Composition_with_Components.md.KkS6afCk.js
index 1d78159b4..b3830c973 100644
--- a/assets/ru_book_Chapter_4__User_Interface_Composition_with_Components.md.3mr0vS25.js
+++ b/assets/ru_book_Chapter_4__User_Interface_Composition_with_Components.md.KkS6afCk.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":1706078328000}'),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":1706078525000}'),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.3mr0vS25.lean.js b/assets/ru_book_Chapter_4__User_Interface_Composition_with_Components.md.KkS6afCk.lean.js
similarity index 97%
rename from assets/ru_book_Chapter_4__User_Interface_Composition_with_Components.md.3mr0vS25.lean.js
rename to assets/ru_book_Chapter_4__User_Interface_Composition_with_Components.md.KkS6afCk.lean.js
index 77f2c3361..ab9a9dd38 100644
--- a/assets/ru_book_Chapter_4__User_Interface_Composition_with_Components.md.3mr0vS25.lean.js
+++ b/assets/ru_book_Chapter_4__User_Interface_Composition_with_Components.md.KkS6afCk.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":1706078328000}'),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":1706078525000}'),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.aDPn9mj8.js b/assets/ru_book_Chapter_5__Single-Page_Applications.md.5ILwH92x.js
similarity index 99%
rename from assets/ru_book_Chapter_5__Single-Page_Applications.md.aDPn9mj8.js
rename to assets/ru_book_Chapter_5__Single-Page_Applications.md.5ILwH92x.js
index 7cab8663c..01419fe03 100644
--- a/assets/ru_book_Chapter_5__Single-Page_Applications.md.aDPn9mj8.js
+++ b/assets/ru_book_Chapter_5__Single-Page_Applications.md.5ILwH92x.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":1706078328000}'),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":1706078525000}'),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.aDPn9mj8.lean.js b/assets/ru_book_Chapter_5__Single-Page_Applications.md.5ILwH92x.lean.js
similarity index 95%
rename from assets/ru_book_Chapter_5__Single-Page_Applications.md.aDPn9mj8.lean.js
rename to assets/ru_book_Chapter_5__Single-Page_Applications.md.5ILwH92x.lean.js
index 5d6b28134..03c946c3d 100644
--- a/assets/ru_book_Chapter_5__Single-Page_Applications.md.aDPn9mj8.lean.js
+++ b/assets/ru_book_Chapter_5__Single-Page_Applications.md.5ILwH92x.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":1706078328000}'),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":1706078525000}'),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.rTLx9IV1.js b/assets/ru_book_Chapter_6__Progressive_Web_Applications.md.IRnpWuk4.js
similarity index 99%
rename from assets/ru_book_Chapter_6__Progressive_Web_Applications.md.rTLx9IV1.js
rename to assets/ru_book_Chapter_6__Progressive_Web_Applications.md.IRnpWuk4.js
index 31d97ccf5..14e381f72 100644
--- a/assets/ru_book_Chapter_6__Progressive_Web_Applications.md.rTLx9IV1.js
+++ b/assets/ru_book_Chapter_6__Progressive_Web_Applications.md.IRnpWuk4.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":1706078328000}'),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":1706078525000}'),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.rTLx9IV1.lean.js b/assets/ru_book_Chapter_6__Progressive_Web_Applications.md.IRnpWuk4.lean.js
similarity index 95%
rename from assets/ru_book_Chapter_6__Progressive_Web_Applications.md.rTLx9IV1.lean.js
rename to assets/ru_book_Chapter_6__Progressive_Web_Applications.md.IRnpWuk4.lean.js
index d73e067f2..4a28c0249 100644
--- a/assets/ru_book_Chapter_6__Progressive_Web_Applications.md.rTLx9IV1.lean.js
+++ b/assets/ru_book_Chapter_6__Progressive_Web_Applications.md.IRnpWuk4.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":1706078328000}'),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":1706078525000}'),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.NqxgxO8C.js b/assets/ru_book_Chapter_7__Data_Flow_Management.md.t9QBwtq4.js
similarity index 99%
rename from assets/ru_book_Chapter_7__Data_Flow_Management.md.NqxgxO8C.js
rename to assets/ru_book_Chapter_7__Data_Flow_Management.md.t9QBwtq4.js
index dab6a05c5..5e94291db 100644
--- a/assets/ru_book_Chapter_7__Data_Flow_Management.md.NqxgxO8C.js
+++ b/assets/ru_book_Chapter_7__Data_Flow_Management.md.t9QBwtq4.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":1706078328000}'),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":1706078525000}'),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.NqxgxO8C.lean.js b/assets/ru_book_Chapter_7__Data_Flow_Management.md.t9QBwtq4.lean.js
similarity index 94%
rename from assets/ru_book_Chapter_7__Data_Flow_Management.md.NqxgxO8C.lean.js
rename to assets/ru_book_Chapter_7__Data_Flow_Management.md.t9QBwtq4.lean.js
index 0e44ecfec..d63ab1202 100644
--- a/assets/ru_book_Chapter_7__Data_Flow_Management.md.NqxgxO8C.lean.js
+++ b/assets/ru_book_Chapter_7__Data_Flow_Management.md.t9QBwtq4.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":1706078328000}'),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":1706078525000}'),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.5HZSDSol.js b/assets/ru_book_Chapter_8__Multithreading_with_Web_Workers.md.gLdgyYsS.js
similarity index 99%
rename from assets/ru_book_Chapter_8__Multithreading_with_Web_Workers.md.5HZSDSol.js
rename to assets/ru_book_Chapter_8__Multithreading_with_Web_Workers.md.gLdgyYsS.js
index 927583b4d..b02c5bef2 100644
--- a/assets/ru_book_Chapter_8__Multithreading_with_Web_Workers.md.5HZSDSol.js
+++ b/assets/ru_book_Chapter_8__Multithreading_with_Web_Workers.md.gLdgyYsS.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":1706078328000}'),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":1706078525000}'),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.5HZSDSol.lean.js b/assets/ru_book_Chapter_8__Multithreading_with_Web_Workers.md.gLdgyYsS.lean.js
similarity index 95%
rename from assets/ru_book_Chapter_8__Multithreading_with_Web_Workers.md.5HZSDSol.lean.js
rename to assets/ru_book_Chapter_8__Multithreading_with_Web_Workers.md.gLdgyYsS.lean.js
index 496d2a627..17466562e 100644
--- a/assets/ru_book_Chapter_8__Multithreading_with_Web_Workers.md.5HZSDSol.lean.js
+++ b/assets/ru_book_Chapter_8__Multithreading_with_Web_Workers.md.gLdgyYsS.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":1706078328000}'),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":1706078525000}'),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.ezxke-aj.js b/assets/ru_book_Chapter_9__Testing_and_Source_Control.md.OsSNzo79.js
similarity index 99%
rename from assets/ru_book_Chapter_9__Testing_and_Source_Control.md.ezxke-aj.js
rename to assets/ru_book_Chapter_9__Testing_and_Source_Control.md.OsSNzo79.js
index 71f6e3d95..fd307a933 100644
--- a/assets/ru_book_Chapter_9__Testing_and_Source_Control.md.ezxke-aj.js
+++ b/assets/ru_book_Chapter_9__Testing_and_Source_Control.md.OsSNzo79.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":1706078328000}'),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":1706078525000}'),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.ezxke-aj.lean.js b/assets/ru_book_Chapter_9__Testing_and_Source_Control.md.OsSNzo79.lean.js
similarity index 95%
rename from assets/ru_book_Chapter_9__Testing_and_Source_Control.md.ezxke-aj.lean.js
rename to assets/ru_book_Chapter_9__Testing_and_Source_Control.md.OsSNzo79.lean.js
index 4a1f290d4..b980bf904 100644
--- a/assets/ru_book_Chapter_9__Testing_and_Source_Control.md.ezxke-aj.lean.js
+++ b/assets/ru_book_Chapter_9__Testing_and_Source_Control.md.OsSNzo79.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":1706078328000}'),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":1706078525000}'),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.9wOAO9Ea.js b/assets/ru_book_index.md.tHpVinFD.js
similarity index 99%
rename from assets/ru_book_index.md.9wOAO9Ea.js
rename to assets/ru_book_index.md.tHpVinFD.js
index eb5c8afa8..d013bc3be 100644
--- a/assets/ru_book_index.md.9wOAO9Ea.js
+++ b/assets/ru_book_index.md.tHpVinFD.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":1706078328000}'),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":1706078525000}'),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.9wOAO9Ea.lean.js b/assets/ru_book_index.md.tHpVinFD.lean.js similarity index 93% rename from assets/ru_book_index.md.9wOAO9Ea.lean.js rename to assets/ru_book_index.md.tHpVinFD.lean.js index 0c3cb14e4..71c92ff3f 100644 --- a/assets/ru_book_index.md.9wOAO9Ea.lean.js +++ b/assets/ru_book_index.md.tHpVinFD.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":1706078328000}'),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":1706078525000}'),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.5tjsY1GX.js b/assets/ru_book_summary.md.dxh3TYEF.js similarity index 99% rename from assets/ru_book_summary.md.5tjsY1GX.js rename to assets/ru_book_summary.md.dxh3TYEF.js index 7c55e3a9e..bd18007c2 100644 --- a/assets/ru_book_summary.md.5tjsY1GX.js +++ b/assets/ru_book_summary.md.dxh3TYEF.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":1706078328000}'),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":1706078525000}'),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.5tjsY1GX.lean.js b/assets/ru_book_summary.md.dxh3TYEF.lean.js similarity index 92% rename from assets/ru_book_summary.md.5tjsY1GX.lean.js rename to assets/ru_book_summary.md.dxh3TYEF.lean.js index b98701cf0..7aaca18a4 100644 --- a/assets/ru_book_summary.md.5tjsY1GX.lean.js +++ b/assets/ru_book_summary.md.dxh3TYEF.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":1706078328000}'),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":1706078525000}'),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.Eg-W4Xg-.js b/assets/ru_deployment_ci-cd.md.jjJyWpUE.js similarity index 96% rename from assets/ru_deployment_ci-cd.md.Eg-W4Xg-.js rename to assets/ru_deployment_ci-cd.md.jjJyWpUE.js index afa464716..2dad781c2 100644 --- a/assets/ru_deployment_ci-cd.md.Eg-W4Xg-.js +++ b/assets/ru_deployment_ci-cd.md.jjJyWpUE.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":1706078328000}'),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":1706078525000}'),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.Eg-W4Xg-.lean.js b/assets/ru_deployment_ci-cd.md.jjJyWpUE.lean.js similarity index 96% rename from assets/ru_deployment_ci-cd.md.Eg-W4Xg-.lean.js rename to assets/ru_deployment_ci-cd.md.jjJyWpUE.lean.js index afa464716..2dad781c2 100644 --- a/assets/ru_deployment_ci-cd.md.Eg-W4Xg-.lean.js +++ b/assets/ru_deployment_ci-cd.md.jjJyWpUE.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":1706078328000}'),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":1706078525000}'),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.N4Sq069g.js b/assets/ru_deployment_docker.md.9GgXzWXk.js similarity index 88% rename from assets/ru_deployment_docker.md.N4Sq069g.js rename to assets/ru_deployment_docker.md.9GgXzWXk.js index 535d34908..f7f5030c4 100644 --- a/assets/ru_deployment_docker.md.N4Sq069g.js +++ b/assets/ru_deployment_docker.md.9GgXzWXk.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":1706078328000}'),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":1706078525000}'),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.N4Sq069g.lean.js b/assets/ru_deployment_docker.md.9GgXzWXk.lean.js similarity index 88% rename from assets/ru_deployment_docker.md.N4Sq069g.lean.js rename to assets/ru_deployment_docker.md.9GgXzWXk.lean.js index 535d34908..f7f5030c4 100644 --- a/assets/ru_deployment_docker.md.N4Sq069g.lean.js +++ b/assets/ru_deployment_docker.md.9GgXzWXk.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":1706078328000}'),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":1706078525000}'),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.V6MHe8ya.js b/assets/ru_deployment_github-actions.md.zC76OwYl.js similarity index 99% rename from assets/ru_deployment_github-actions.md.V6MHe8ya.js rename to assets/ru_deployment_github-actions.md.zC76OwYl.js index 7ddeb2a26..2e5b5f136 100644 --- a/assets/ru_deployment_github-actions.md.V6MHe8ya.js +++ b/assets/ru_deployment_github-actions.md.zC76OwYl.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":1706078328000}'),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":1706078525000}'),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.V6MHe8ya.lean.js b/assets/ru_deployment_github-actions.md.zC76OwYl.lean.js
similarity index 86%
rename from assets/ru_deployment_github-actions.md.V6MHe8ya.lean.js
rename to assets/ru_deployment_github-actions.md.zC76OwYl.lean.js
index 8cd4508c5..f8059556d 100644
--- a/assets/ru_deployment_github-actions.md.V6MHe8ya.lean.js
+++ b/assets/ru_deployment_github-actions.md.zC76OwYl.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":1706078328000}'),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":1706078525000}'),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.qkLwLGsr.js b/assets/ru_deployment_hosting.md.HPp685Kt.js
similarity index 98%
rename from assets/ru_deployment_hosting.md.qkLwLGsr.js
rename to assets/ru_deployment_hosting.md.HPp685Kt.js
index 6cc2c98df..2b24ce4e0 100644
--- a/assets/ru_deployment_hosting.md.qkLwLGsr.js
+++ b/assets/ru_deployment_hosting.md.HPp685Kt.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":1706078328000}'),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":1706078525000}'),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.qkLwLGsr.lean.js b/assets/ru_deployment_hosting.md.HPp685Kt.lean.js similarity index 85% rename from assets/ru_deployment_hosting.md.qkLwLGsr.lean.js rename to assets/ru_deployment_hosting.md.HPp685Kt.lean.js index 8de218fba..7db372d34 100644 --- a/assets/ru_deployment_hosting.md.qkLwLGsr.lean.js +++ b/assets/ru_deployment_hosting.md.HPp685Kt.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":1706078328000}'),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":1706078525000}'),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.rDaQSda9.js b/assets/ru_development_architectural-patterns.md.OmUo0dUN.js similarity index 99% rename from assets/ru_development_architectural-patterns.md.rDaQSda9.js rename to assets/ru_development_architectural-patterns.md.OmUo0dUN.js index d6bf45c4d..e8ddc48cc 100644 --- a/assets/ru_development_architectural-patterns.md.rDaQSda9.js +++ b/assets/ru_development_architectural-patterns.md.OmUo0dUN.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/architectural-patterns.md","filePath":"ru/development/architectural-patterns.md","lastUpdated":1706078328000}'),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 g=JSON.parse('{"title":"Архитектурные решения","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/architectural-patterns.md","filePath":"ru/development/architectural-patterns.md","lastUpdated":1706078525000}'),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 />
diff --git a/assets/ru_development_architectural-patterns.md.rDaQSda9.lean.js b/assets/ru_development_architectural-patterns.md.OmUo0dUN.lean.js
similarity index 87%
rename from assets/ru_development_architectural-patterns.md.rDaQSda9.lean.js
rename to assets/ru_development_architectural-patterns.md.OmUo0dUN.lean.js
index 1755c3bc5..227a419ea 100644
--- a/assets/ru_development_architectural-patterns.md.rDaQSda9.lean.js
+++ b/assets/ru_development_architectural-patterns.md.OmUo0dUN.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/architectural-patterns.md","filePath":"ru/development/architectural-patterns.md","lastUpdated":1706078328000}'),t={name:"ru/development/architectural-patterns.md"},l=n("",5),p=[l];function e(h,k,E,r,d,c){return a(),i("div",null,p)}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":"Архитектурные решения","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/architectural-patterns.md","filePath":"ru/development/architectural-patterns.md","lastUpdated":1706078525000}'),t={name:"ru/development/architectural-patterns.md"},l=n("",5),p=[l];function e(h,k,E,r,d,c){return a(),i("div",null,p)}const y=s(t,[["render",e]]);export{g as __pageData,y as default};
diff --git a/assets/ru_development_assets.md.yL-vWlno.js b/assets/ru_development_assets.md.jrEfsFq4.js
similarity index 99%
rename from assets/ru_development_assets.md.yL-vWlno.js
rename to assets/ru_development_assets.md.jrEfsFq4.js
index 802bcebbf..c3979ba67 100644
--- a/assets/ru_development_assets.md.yL-vWlno.js
+++ b/assets/ru_development_assets.md.jrEfsFq4.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":1706078328000}'),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":1706078525000}'),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.yL-vWlno.lean.js b/assets/ru_development_assets.md.jrEfsFq4.lean.js
similarity index 86%
rename from assets/ru_development_assets.md.yL-vWlno.lean.js
rename to assets/ru_development_assets.md.jrEfsFq4.lean.js
index ded58416a..c1bdbae7a 100644
--- a/assets/ru_development_assets.md.yL-vWlno.lean.js
+++ b/assets/ru_development_assets.md.jrEfsFq4.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":1706078328000}'),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":1706078525000}'),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.cvkYE_H9.js b/assets/ru_development_building.md.4iOFmLAH.js
similarity index 99%
rename from assets/ru_development_building.md.cvkYE_H9.js
rename to assets/ru_development_building.md.4iOFmLAH.js
index 898172e45..5b332c12d 100644
--- a/assets/ru_development_building.md.cvkYE_H9.js
+++ b/assets/ru_development_building.md.4iOFmLAH.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":1706078328000}'),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":1706078525000}'),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.cvkYE_H9.lean.js b/assets/ru_development_building.md.4iOFmLAH.lean.js
similarity index 86%
rename from assets/ru_development_building.md.cvkYE_H9.lean.js
rename to assets/ru_development_building.md.4iOFmLAH.lean.js
index 72068b84c..d45676920 100644
--- a/assets/ru_development_building.md.cvkYE_H9.lean.js
+++ b/assets/ru_development_building.md.4iOFmLAH.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":1706078328000}'),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":1706078525000}'),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.5uTYnxR8.js b/assets/ru_development_ide.md.08rGQCOj.js
similarity index 99%
rename from assets/ru_development_ide.md.5uTYnxR8.js
rename to assets/ru_development_ide.md.08rGQCOj.js
index c044defac..2328112ce 100644
--- a/assets/ru_development_ide.md.5uTYnxR8.js
+++ b/assets/ru_development_ide.md.08rGQCOj.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":1706078328000}'),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":1706078525000}'),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.5uTYnxR8.lean.js b/assets/ru_development_ide.md.08rGQCOj.lean.js
similarity index 85%
rename from assets/ru_development_ide.md.5uTYnxR8.lean.js
rename to assets/ru_development_ide.md.08rGQCOj.lean.js
index 36e49c5d9..63842ea81 100644
--- a/assets/ru_development_ide.md.5uTYnxR8.lean.js
+++ b/assets/ru_development_ide.md.08rGQCOj.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":1706078328000}'),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":1706078525000}'),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.mjQ2Hssq.js b/assets/ru_development_libraries.md.b984kK8a.js
similarity index 96%
rename from assets/ru_development_libraries.md.mjQ2Hssq.js
rename to assets/ru_development_libraries.md.b984kK8a.js
index 7f43d84a1..e226908ff 100644
--- a/assets/ru_development_libraries.md.mjQ2Hssq.js
+++ b/assets/ru_development_libraries.md.b984kK8a.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":1706078328000}'),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":1706078525000}'),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.mjQ2Hssq.lean.js b/assets/ru_development_libraries.md.b984kK8a.lean.js similarity index 87% rename from assets/ru_development_libraries.md.mjQ2Hssq.lean.js rename to assets/ru_development_libraries.md.b984kK8a.lean.js index ee1437cb4..ce7dd9973 100644 --- a/assets/ru_development_libraries.md.mjQ2Hssq.lean.js +++ b/assets/ru_development_libraries.md.b984kK8a.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":1706078328000}'),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":1706078525000}'),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.AiBjC0Vc.js b/assets/ru_development_misc.md.y_3gmju1.js similarity index 99% rename from assets/ru_development_misc.md.AiBjC0Vc.js rename to assets/ru_development_misc.md.y_3gmju1.js index 4872a28d7..ef65a798b 100644 --- a/assets/ru_development_misc.md.AiBjC0Vc.js +++ b/assets/ru_development_misc.md.y_3gmju1.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":1706078328000}'),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":1706078525000}'),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.AiBjC0Vc.lean.js b/assets/ru_development_misc.md.y_3gmju1.lean.js
similarity index 86%
rename from assets/ru_development_misc.md.AiBjC0Vc.lean.js
rename to assets/ru_development_misc.md.y_3gmju1.lean.js
index c644df349..7f6aad066 100644
--- a/assets/ru_development_misc.md.AiBjC0Vc.lean.js
+++ b/assets/ru_development_misc.md.y_3gmju1.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":1706078328000}'),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":1706078525000}'),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.iUxqYZWB.js b/assets/ru_development_stores.md.gfBALweF.js
similarity index 99%
rename from assets/ru_development_stores.md.iUxqYZWB.js
rename to assets/ru_development_stores.md.gfBALweF.js
index 22f6db87e..4c1489979 100644
--- a/assets/ru_development_stores.md.iUxqYZWB.js
+++ b/assets/ru_development_stores.md.gfBALweF.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":1706078328000}'),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":1706078525000}'),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.iUxqYZWB.lean.js b/assets/ru_development_stores.md.gfBALweF.lean.js similarity index 85% rename from assets/ru_development_stores.md.iUxqYZWB.lean.js rename to assets/ru_development_stores.md.gfBALweF.lean.js index 2fb5dd255..79278a3ce 100644 --- a/assets/ru_development_stores.md.iUxqYZWB.lean.js +++ b/assets/ru_development_stores.md.gfBALweF.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":1706078328000}'),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":1706078525000}'),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.sTeKfDi9.js b/assets/ru_development_testing.md.Mn-z3nVI.js similarity index 98% rename from assets/ru_development_testing.md.sTeKfDi9.js rename to assets/ru_development_testing.md.Mn-z3nVI.js index 4b8248cc5..9d2796e13 100644 --- a/assets/ru_development_testing.md.sTeKfDi9.js +++ b/assets/ru_development_testing.md.Mn-z3nVI.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":1706078328000}'),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":1706078525000}'),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.sTeKfDi9.lean.js b/assets/ru_development_testing.md.Mn-z3nVI.lean.js similarity index 86% rename from assets/ru_development_testing.md.sTeKfDi9.lean.js rename to assets/ru_development_testing.md.Mn-z3nVI.lean.js index 971b31d07..21516a201 100644 --- a/assets/ru_development_testing.md.sTeKfDi9.lean.js +++ b/assets/ru_development_testing.md.Mn-z3nVI.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":1706078328000}'),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":1706078525000}'),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.gzLuJB2q.js b/assets/ru_frontend_about-frameworks.md.zd0Ct_kd.js similarity index 99% rename from assets/ru_frontend_about-frameworks.md.gzLuJB2q.js rename to assets/ru_frontend_about-frameworks.md.zd0Ct_kd.js index ff466024e..487470b58 100644 --- a/assets/ru_frontend_about-frameworks.md.gzLuJB2q.js +++ b/assets/ru_frontend_about-frameworks.md.zd0Ct_kd.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":1706078328000}'),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":1706078525000}'),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.gzLuJB2q.lean.js b/assets/ru_frontend_about-frameworks.md.zd0Ct_kd.lean.js
similarity index 87%
rename from assets/ru_frontend_about-frameworks.md.gzLuJB2q.lean.js
rename to assets/ru_frontend_about-frameworks.md.zd0Ct_kd.lean.js
index e14d5106f..dd4afcbae 100644
--- a/assets/ru_frontend_about-frameworks.md.gzLuJB2q.lean.js
+++ b/assets/ru_frontend_about-frameworks.md.zd0Ct_kd.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":1706078328000}'),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":1706078525000}'),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.aCOu-hPk.js b/assets/ru_frontend_architecture.md.4U7epikF.js
similarity index 98%
rename from assets/ru_frontend_architecture.md.aCOu-hPk.js
rename to assets/ru_frontend_architecture.md.4U7epikF.js
index a1d0e86ec..3dad5ec4b 100644
--- a/assets/ru_frontend_architecture.md.aCOu-hPk.js
+++ b/assets/ru_frontend_architecture.md.4U7epikF.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":1706078328000}'),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":1706078525000}'),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.aCOu-hPk.lean.js b/assets/ru_frontend_architecture.md.4U7epikF.lean.js similarity index 74% rename from assets/ru_frontend_architecture.md.aCOu-hPk.lean.js rename to assets/ru_frontend_architecture.md.4U7epikF.lean.js index 138cf4ceb..94c0cfcfd 100644 --- a/assets/ru_frontend_architecture.md.aCOu-hPk.lean.js +++ b/assets/ru_frontend_architecture.md.4U7epikF.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":1706078328000}'),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":1706078525000}'),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.lTko1BC4.js b/assets/ru_frontend_css-ui-libs.md.QgEj0EWR.js similarity index 98% rename from assets/ru_frontend_css-ui-libs.md.lTko1BC4.js rename to assets/ru_frontend_css-ui-libs.md.QgEj0EWR.js index 1bf9fce8e..71e315eac 100644 --- a/assets/ru_frontend_css-ui-libs.md.lTko1BC4.js +++ b/assets/ru_frontend_css-ui-libs.md.QgEj0EWR.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":1706078328000}'),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":1706078525000}'),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.lTko1BC4.lean.js b/assets/ru_frontend_css-ui-libs.md.QgEj0EWR.lean.js similarity index 86% rename from assets/ru_frontend_css-ui-libs.md.lTko1BC4.lean.js rename to assets/ru_frontend_css-ui-libs.md.QgEj0EWR.lean.js index 92ca9625f..79d5083c6 100644 --- a/assets/ru_frontend_css-ui-libs.md.lTko1BC4.lean.js +++ b/assets/ru_frontend_css-ui-libs.md.QgEj0EWR.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":1706078328000}'),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":1706078525000}'),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.bqcENrFT.js b/assets/ru_frontend_learning.md.xeHiWR_N.js similarity index 99% rename from assets/ru_frontend_learning.md.bqcENrFT.js rename to assets/ru_frontend_learning.md.xeHiWR_N.js index 7104eda28..5b1e92727 100644 --- a/assets/ru_frontend_learning.md.bqcENrFT.js +++ b/assets/ru_frontend_learning.md.xeHiWR_N.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":1706078328000}'),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":1706078525000}'),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.bqcENrFT.lean.js b/assets/ru_frontend_learning.md.xeHiWR_N.lean.js similarity index 85% rename from assets/ru_frontend_learning.md.bqcENrFT.lean.js rename to assets/ru_frontend_learning.md.xeHiWR_N.lean.js index c50706f4f..ddd49ca8f 100644 --- a/assets/ru_frontend_learning.md.bqcENrFT.lean.js +++ b/assets/ru_frontend_learning.md.xeHiWR_N.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":1706078328000}'),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":1706078525000}'),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.O9YQkFH5.js b/assets/ru_frontend_spa-pwa-ssr-ssg.md.qrRupqaE.js similarity index 99% rename from assets/ru_frontend_spa-pwa-ssr-ssg.md.O9YQkFH5.js rename to assets/ru_frontend_spa-pwa-ssr-ssg.md.qrRupqaE.js index 2f3c3151f..1bf7f5b68 100644 --- a/assets/ru_frontend_spa-pwa-ssr-ssg.md.O9YQkFH5.js +++ b/assets/ru_frontend_spa-pwa-ssr-ssg.md.qrRupqaE.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":1706078328000}'),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":1706078525000}'),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.O9YQkFH5.lean.js b/assets/ru_frontend_spa-pwa-ssr-ssg.md.qrRupqaE.lean.js similarity index 88% rename from assets/ru_frontend_spa-pwa-ssr-ssg.md.O9YQkFH5.lean.js rename to assets/ru_frontend_spa-pwa-ssr-ssg.md.qrRupqaE.lean.js index 270f3aedb..12e8f0e1f 100644 --- a/assets/ru_frontend_spa-pwa-ssr-ssg.md.O9YQkFH5.lean.js +++ b/assets/ru_frontend_spa-pwa-ssr-ssg.md.qrRupqaE.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":1706078328000}'),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":1706078525000}'),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.nu8yILrZ.js b/assets/ru_index.md.JQBbpC9N.js similarity index 96% rename from assets/ru_index.md.nu8yILrZ.js rename to assets/ru_index.md.JQBbpC9N.js index bc67de965..c5856c3d4 100644 --- a/assets/ru_index.md.nu8yILrZ.js +++ b/assets/ru_index.md.JQBbpC9N.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":1706078328000}'),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":1706078525000}'),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.nu8yILrZ.lean.js b/assets/ru_index.md.JQBbpC9N.lean.js similarity index 96% rename from assets/ru_index.md.nu8yILrZ.lean.js rename to assets/ru_index.md.JQBbpC9N.lean.js index bc67de965..c5856c3d4 100644 --- a/assets/ru_index.md.nu8yILrZ.lean.js +++ b/assets/ru_index.md.JQBbpC9N.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":1706078328000}'),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":1706078525000}'),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.DpB24XgT.js b/assets/ru_misc_CHANGELOG.md.84q4mHAH.js similarity index 98% rename from assets/ru_misc_CHANGELOG.md.DpB24XgT.js rename to assets/ru_misc_CHANGELOG.md.84q4mHAH.js index 93931317b..9fa374637 100644 --- a/assets/ru_misc_CHANGELOG.md.DpB24XgT.js +++ b/assets/ru_misc_CHANGELOG.md.84q4mHAH.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":1706078328000}'),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":1706078525000}'),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.DpB24XgT.lean.js b/assets/ru_misc_CHANGELOG.md.84q4mHAH.lean.js similarity index 85% rename from assets/ru_misc_CHANGELOG.md.DpB24XgT.lean.js rename to assets/ru_misc_CHANGELOG.md.84q4mHAH.lean.js index f6dafef81..b8ea2deee 100644 --- a/assets/ru_misc_CHANGELOG.md.DpB24XgT.lean.js +++ b/assets/ru_misc_CHANGELOG.md.84q4mHAH.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":1706078328000}'),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":1706078525000}'),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.wJ4fkOiO.js b/assets/ru_misc_cheat-sheets.md.qw_kA0id.js similarity index 97% rename from assets/ru_misc_cheat-sheets.md.wJ4fkOiO.js rename to assets/ru_misc_cheat-sheets.md.qw_kA0id.js index df4584f94..735b95686 100644 --- a/assets/ru_misc_cheat-sheets.md.wJ4fkOiO.js +++ b/assets/ru_misc_cheat-sheets.md.qw_kA0id.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":1706078328000}'),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":1706078525000}'),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.wJ4fkOiO.lean.js b/assets/ru_misc_cheat-sheets.md.qw_kA0id.lean.js similarity index 86% rename from assets/ru_misc_cheat-sheets.md.wJ4fkOiO.lean.js rename to assets/ru_misc_cheat-sheets.md.qw_kA0id.lean.js index 4effebfe0..971418ade 100644 --- a/assets/ru_misc_cheat-sheets.md.wJ4fkOiO.lean.js +++ b/assets/ru_misc_cheat-sheets.md.qw_kA0id.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":1706078328000}'),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":1706078525000}'),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.VBIIKc4G.lean.js b/assets/ru_misc_contribute.md.5Xh7n1AY.js similarity index 97% rename from assets/ru_misc_contribute.md.VBIIKc4G.lean.js rename to assets/ru_misc_contribute.md.5Xh7n1AY.js index 191a53dda..207a92406 100644 --- a/assets/ru_misc_contribute.md.VBIIKc4G.lean.js +++ b/assets/ru_misc_contribute.md.5Xh7n1AY.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":1706078328000}'),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":1706078525000}'),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.VBIIKc4G.js b/assets/ru_misc_contribute.md.5Xh7n1AY.lean.js similarity index 97% rename from assets/ru_misc_contribute.md.VBIIKc4G.js rename to assets/ru_misc_contribute.md.5Xh7n1AY.lean.js index 191a53dda..207a92406 100644 --- a/assets/ru_misc_contribute.md.VBIIKc4G.js +++ b/assets/ru_misc_contribute.md.5Xh7n1AY.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":1706078328000}'),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":1706078525000}'),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.5gNfTtOp.js b/assets/ru_misc_glossary.md.mZLtFLUl.js similarity index 96% rename from assets/ru_misc_glossary.md.5gNfTtOp.js rename to assets/ru_misc_glossary.md.mZLtFLUl.js index 11c59c528..988b4a8aa 100644 --- a/assets/ru_misc_glossary.md.5gNfTtOp.js +++ b/assets/ru_misc_glossary.md.mZLtFLUl.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":1706078328000}'),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":1706078525000}'),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.5gNfTtOp.lean.js b/assets/ru_misc_glossary.md.mZLtFLUl.lean.js similarity index 96% rename from assets/ru_misc_glossary.md.5gNfTtOp.lean.js rename to assets/ru_misc_glossary.md.mZLtFLUl.lean.js index 11c59c528..988b4a8aa 100644 --- a/assets/ru_misc_glossary.md.5gNfTtOp.lean.js +++ b/assets/ru_misc_glossary.md.mZLtFLUl.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":1706078328000}'),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":1706078525000}'),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.0iYinkcY.js b/assets/ru_misc_introduction.md.bd39KfVC.js similarity index 97% rename from assets/ru_misc_introduction.md.0iYinkcY.js rename to assets/ru_misc_introduction.md.bd39KfVC.js index e2ff43972..7e9d51aaa 100644 --- a/assets/ru_misc_introduction.md.0iYinkcY.js +++ b/assets/ru_misc_introduction.md.bd39KfVC.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":1706078328000}'),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":1706078525000}'),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.0iYinkcY.lean.js b/assets/ru_misc_introduction.md.bd39KfVC.lean.js similarity index 85% rename from assets/ru_misc_introduction.md.0iYinkcY.lean.js rename to assets/ru_misc_introduction.md.bd39KfVC.lean.js index 90d024e75..ec2768444 100644 --- a/assets/ru_misc_introduction.md.0iYinkcY.lean.js +++ b/assets/ru_misc_introduction.md.bd39KfVC.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":1706078328000}'),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":1706078525000}'),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.m7n6-Q5O.js b/assets/ru_vue-webapp_contribution.md.mw1epjfD.js similarity index 90% rename from assets/ru_vue-webapp_contribution.md.m7n6-Q5O.js rename to assets/ru_vue-webapp_contribution.md.mw1epjfD.js index da6386bf1..a9f3bebee 100644 --- a/assets/ru_vue-webapp_contribution.md.m7n6-Q5O.js +++ b/assets/ru_vue-webapp_contribution.md.mw1epjfD.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":1706078328000}'),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":1706078525000}'),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.m7n6-Q5O.lean.js b/assets/ru_vue-webapp_contribution.md.mw1epjfD.lean.js similarity index 90% rename from assets/ru_vue-webapp_contribution.md.m7n6-Q5O.lean.js rename to assets/ru_vue-webapp_contribution.md.mw1epjfD.lean.js index da6386bf1..a9f3bebee 100644 --- a/assets/ru_vue-webapp_contribution.md.m7n6-Q5O.lean.js +++ b/assets/ru_vue-webapp_contribution.md.mw1epjfD.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":1706078328000}'),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":1706078525000}'),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.EKkYbqfp.js b/assets/ru_vue-webapp_getting-started.md.EKkYbqfp.js new file mode 100644 index 000000000..7f3f29492 --- /dev/null +++ b/assets/ru_vue-webapp_getting-started.md.EKkYbqfp.js @@ -0,0 +1,39 @@ +import{_ as a,c as s,o as i,U as t,ad as e}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":1706078525000}'),n={name:"ru/vue-webapp/getting-started.md"},h=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),p=[h];function k(d,l,c,F,v,r){return i(),s("div",null,p)}const y=a(n,[["render",k],["__scopeId","data-v-4e4677c2"]]);export{E as __pageData,y as default}; diff --git a/assets/ru_vue-webapp_getting-started.md.Jj9pY3h2.lean.js b/assets/ru_vue-webapp_getting-started.md.EKkYbqfp.lean.js similarity index 52% rename from assets/ru_vue-webapp_getting-started.md.Jj9pY3h2.lean.js rename to assets/ru_vue-webapp_getting-started.md.EKkYbqfp.lean.js index 4259feb6d..4e8b35473 100644 --- a/assets/ru_vue-webapp_getting-started.md.Jj9pY3h2.lean.js +++ b/assets/ru_vue-webapp_getting-started.md.EKkYbqfp.lean.js @@ -1 +1 @@ -import{_ as a,c as s,o as i,U as t,ad as d}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/getting-started.md","filePath":"ru/vue-webapp/getting-started.md","lastUpdated":1706078328000}'),n={name:"ru/vue-webapp/getting-started.md"},h=t("",13),p=[h];function k(l,e,F,b,v,f){return i(),s("div",null,p)}const E=a(n,[["render",k],["__scopeId","data-v-b4ad1af8"]]);export{g as __pageData,E as default}; +import{_ as a,c as s,o as i,U as t,ad as e}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":1706078525000}'),n={name:"ru/vue-webapp/getting-started.md"},h=t("",13),p=[h];function k(d,l,c,F,v,r){return i(),s("div",null,p)}const y=a(n,[["render",k],["__scopeId","data-v-4e4677c2"]]);export{E as __pageData,y as default}; diff --git a/assets/ru_vue-webapp_getting-started.md.Jj9pY3h2.js b/assets/ru_vue-webapp_getting-started.md.Jj9pY3h2.js deleted file mode 100644 index 80e1ac5c1..000000000 --- a/assets/ru_vue-webapp_getting-started.md.Jj9pY3h2.js +++ /dev/null @@ -1,39 +0,0 @@ -import{_ as a,c as s,o as i,U as t,ad as d}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/getting-started.md","filePath":"ru/vue-webapp/getting-started.md","lastUpdated":1706078328000}'),n={name:"ru/vue-webapp/getting-started.md"},h=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),p=[h];function k(l,e,F,b,v,f){return i(),s("div",null,p)}const E=a(n,[["render",k],["__scopeId","data-v-b4ad1af8"]]);export{g as __pageData,E as default}; diff --git a/assets/ru_vue-webapp_guidelines.md.aLyNBxgC.js b/assets/ru_vue-webapp_guidelines.md.uEdVBabC.js similarity index 98% rename from assets/ru_vue-webapp_guidelines.md.aLyNBxgC.js rename to assets/ru_vue-webapp_guidelines.md.uEdVBabC.js index fcb79edc8..9da9509e6 100644 --- a/assets/ru_vue-webapp_guidelines.md.aLyNBxgC.js +++ b/assets/ru_vue-webapp_guidelines.md.uEdVBabC.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":1706078328000}'),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":1706078525000}'),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.aLyNBxgC.lean.js b/assets/ru_vue-webapp_guidelines.md.uEdVBabC.lean.js similarity index 90% rename from assets/ru_vue-webapp_guidelines.md.aLyNBxgC.lean.js rename to assets/ru_vue-webapp_guidelines.md.uEdVBabC.lean.js index 295d00be2..3cd0c1c03 100644 --- a/assets/ru_vue-webapp_guidelines.md.aLyNBxgC.lean.js +++ b/assets/ru_vue-webapp_guidelines.md.uEdVBabC.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":1706078328000}'),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":1706078525000}'),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.Ay8-MPii.js b/assets/ru_vue-webapp_index.md.Ay8-MPii.js new file mode 100644 index 000000000..05eb54ab2 --- /dev/null +++ b/assets/ru_vue-webapp_index.md.Ay8-MPii.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 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":1706078525000}'),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,F,r,b,v){return i(),s("div",null,p)}const c=a(n,[["render",d],["__scopeId","data-v-22aa6b84"]]);export{o as __pageData,c as default}; diff --git a/assets/ru_vue-webapp_index.md.CbsuI-Jq.lean.js b/assets/ru_vue-webapp_index.md.Ay8-MPii.lean.js similarity index 54% rename from assets/ru_vue-webapp_index.md.CbsuI-Jq.lean.js rename to assets/ru_vue-webapp_index.md.Ay8-MPii.lean.js index 77f1c8b40..79fba5870 100644 --- a/assets/ru_vue-webapp_index.md.CbsuI-Jq.lean.js +++ b/assets/ru_vue-webapp_index.md.Ay8-MPii.lean.js @@ -1 +1 @@ -import{_ as a,c as s,o as i,U as e,ae as t}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":1706078328000}'),d={name:"ru/vue-webapp/index.md"},n=e("",11),h=[n];function p(f,k,l,F,r,v){return i(),s("div",null,h)}const c=a(d,[["render",p],["__scopeId","data-v-f155ed4f"]]);export{o as __pageData,c as default}; +import{_ as a,c as s,o as i,U as t,ae as e}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":1706078525000}'),n={name:"ru/vue-webapp/index.md"},h=t("",11),p=[h];function d(k,l,F,r,b,v){return i(),s("div",null,p)}const c=a(n,[["render",d],["__scopeId","data-v-22aa6b84"]]);export{o as __pageData,c as default}; diff --git a/assets/ru_vue-webapp_index.md.CbsuI-Jq.js b/assets/ru_vue-webapp_index.md.CbsuI-Jq.js deleted file mode 100644 index 809d1d1f6..000000000 --- a/assets/ru_vue-webapp_index.md.CbsuI-Jq.js +++ /dev/null @@ -1,8 +0,0 @@ -import{_ as a,c as s,o as i,U as e,ae as t}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":1706078328000}'),d={name:"ru/vue-webapp/index.md"},n=e(`

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(f,k,l,F,r,v){return i(),s("div",null,h)}const c=a(d,[["render",p],["__scopeId","data-v-f155ed4f"]]);export{o as __pageData,c as default}; diff --git a/assets/ru_vue-webapp_objectives.md.1cNA6ey8.js b/assets/ru_vue-webapp_objectives.md.d5n6E18n.js similarity index 98% rename from assets/ru_vue-webapp_objectives.md.1cNA6ey8.js rename to assets/ru_vue-webapp_objectives.md.d5n6E18n.js index 5ce3a7c50..73e2598e0 100644 --- a/assets/ru_vue-webapp_objectives.md.1cNA6ey8.js +++ b/assets/ru_vue-webapp_objectives.md.d5n6E18n.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":1706078328000}'),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":1706078525000}'),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.1cNA6ey8.lean.js b/assets/ru_vue-webapp_objectives.md.d5n6E18n.lean.js similarity index 90% rename from assets/ru_vue-webapp_objectives.md.1cNA6ey8.lean.js rename to assets/ru_vue-webapp_objectives.md.d5n6E18n.lean.js index fbd8f10ee..73d55342e 100644 --- a/assets/ru_vue-webapp_objectives.md.1cNA6ey8.lean.js +++ b/assets/ru_vue-webapp_objectives.md.d5n6E18n.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":1706078328000}'),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":1706078525000}'),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.uysk3F5h.js b/assets/ru_vue-webapp_options_adaptability.md.cXCxcfSB.js similarity index 99% rename from assets/ru_vue-webapp_options_adaptability.md.uysk3F5h.js rename to assets/ru_vue-webapp_options_adaptability.md.cXCxcfSB.js index 265b23e2c..9866c6558 100644 --- a/assets/ru_vue-webapp_options_adaptability.md.uysk3F5h.js +++ b/assets/ru_vue-webapp_options_adaptability.md.cXCxcfSB.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":1706078328000}'),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":1706078525000}'),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.uysk3F5h.lean.js b/assets/ru_vue-webapp_options_adaptability.md.cXCxcfSB.lean.js
similarity index 90%
rename from assets/ru_vue-webapp_options_adaptability.md.uysk3F5h.lean.js
rename to assets/ru_vue-webapp_options_adaptability.md.cXCxcfSB.lean.js
index 0f7c89aa3..041b784be 100644
--- a/assets/ru_vue-webapp_options_adaptability.md.uysk3F5h.lean.js
+++ b/assets/ru_vue-webapp_options_adaptability.md.cXCxcfSB.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":1706078328000}'),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":1706078525000}'),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.GbPEOh6X.js b/assets/ru_vue-webapp_options_api.md.-gMdDXo6.js
similarity index 99%
rename from assets/ru_vue-webapp_options_api.md.GbPEOh6X.js
rename to assets/ru_vue-webapp_options_api.md.-gMdDXo6.js
index 8256b24ca..3f9ca0001 100644
--- a/assets/ru_vue-webapp_options_api.md.GbPEOh6X.js
+++ b/assets/ru_vue-webapp_options_api.md.-gMdDXo6.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":1706078328000}'),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":1706078525000}'),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.GbPEOh6X.lean.js b/assets/ru_vue-webapp_options_api.md.-gMdDXo6.lean.js
similarity index 90%
rename from assets/ru_vue-webapp_options_api.md.GbPEOh6X.lean.js
rename to assets/ru_vue-webapp_options_api.md.-gMdDXo6.lean.js
index cd76c5a7b..c443e4aba 100644
--- a/assets/ru_vue-webapp_options_api.md.GbPEOh6X.lean.js
+++ b/assets/ru_vue-webapp_options_api.md.-gMdDXo6.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":1706078328000}'),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":1706078525000}'),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.hw-dbEYd.js b/assets/ru_vue-webapp_options_baseIcon.md.88XRkfnT.js
similarity index 99%
rename from assets/ru_vue-webapp_options_baseIcon.md.hw-dbEYd.js
rename to assets/ru_vue-webapp_options_baseIcon.md.88XRkfnT.js
index a1c51e5f6..8fb866b2a 100644
--- a/assets/ru_vue-webapp_options_baseIcon.md.hw-dbEYd.js
+++ b/assets/ru_vue-webapp_options_baseIcon.md.88XRkfnT.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":1706078328000}'),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":1706078525000}'),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.hw-dbEYd.lean.js b/assets/ru_vue-webapp_options_baseIcon.md.88XRkfnT.lean.js
similarity index 90%
rename from assets/ru_vue-webapp_options_baseIcon.md.hw-dbEYd.lean.js
rename to assets/ru_vue-webapp_options_baseIcon.md.88XRkfnT.lean.js
index bd137f8cd..aa2965573 100644
--- a/assets/ru_vue-webapp_options_baseIcon.md.hw-dbEYd.lean.js
+++ b/assets/ru_vue-webapp_options_baseIcon.md.88XRkfnT.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":1706078328000}'),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":1706078525000}'),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.01X1PMHs.js b/assets/ru_vue-webapp_options_description.md.PffqCGTh.js
similarity index 98%
rename from assets/ru_vue-webapp_options_description.md.01X1PMHs.js
rename to assets/ru_vue-webapp_options_description.md.PffqCGTh.js
index b466fb09d..ecefce2b9 100644
--- a/assets/ru_vue-webapp_options_description.md.01X1PMHs.js
+++ b/assets/ru_vue-webapp_options_description.md.PffqCGTh.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":1706078328000}'),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":1706078525000}'),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.01X1PMHs.lean.js b/assets/ru_vue-webapp_options_description.md.PffqCGTh.lean.js similarity index 91% rename from assets/ru_vue-webapp_options_description.md.01X1PMHs.lean.js rename to assets/ru_vue-webapp_options_description.md.PffqCGTh.lean.js index 9f95c7b8b..fd6f65578 100644 --- a/assets/ru_vue-webapp_options_description.md.01X1PMHs.lean.js +++ b/assets/ru_vue-webapp_options_description.md.PffqCGTh.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":1706078328000}'),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":1706078525000}'),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.FotDmFru.js b/assets/ru_vue-webapp_options_drawer.md.F_KWl8tF.js similarity index 57% rename from assets/ru_vue-webapp_options_drawer.md.FotDmFru.js rename to assets/ru_vue-webapp_options_drawer.md.F_KWl8tF.js index e590c144d..b67d64836 100644 --- a/assets/ru_vue-webapp_options_drawer.md.FotDmFru.js +++ b/assets/ru_vue-webapp_options_drawer.md.F_KWl8tF.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":1706078328000}'),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 b(p,n,l,u,m,h){return t(),e("div",null,s)}const w=a(d,[["render",b],["__scopeId","data-v-254bab2c"]]);export{_ as __pageData,w as default}; +import{_ as a,c as e,o as t,U as r,af as o,ag as c}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":"ru/vue-webapp/options/drawer.md","filePath":"ru/vue-webapp/options/drawer.md","lastUpdated":1706078525000}'),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,m,h,v){return t(),e("div",null,s)}const b=a(d,[["render",p],["__scopeId","data-v-3ac00670"]]);export{w as __pageData,b as default}; diff --git a/assets/ru_vue-webapp_options_drawer.md.FotDmFru.lean.js b/assets/ru_vue-webapp_options_drawer.md.F_KWl8tF.lean.js similarity index 61% rename from assets/ru_vue-webapp_options_drawer.md.FotDmFru.lean.js rename to assets/ru_vue-webapp_options_drawer.md.F_KWl8tF.lean.js index 4b192ad25..709fca6c7 100644 --- a/assets/ru_vue-webapp_options_drawer.md.FotDmFru.lean.js +++ b/assets/ru_vue-webapp_options_drawer.md.F_KWl8tF.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":1706078328000}'),d={name:"ru/vue-webapp/options/drawer.md"},i=r("",9),s=[i];function b(p,n,l,u,m,h){return t(),e("div",null,s)}const w=a(d,[["render",b],["__scopeId","data-v-254bab2c"]]);export{_ as __pageData,w as default}; +import{_ as a,c as e,o as t,U as r,af as o,ag as c}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":"ru/vue-webapp/options/drawer.md","filePath":"ru/vue-webapp/options/drawer.md","lastUpdated":1706078525000}'),d={name:"ru/vue-webapp/options/drawer.md"},i=r("",9),s=[i];function p(n,l,u,m,h,v){return t(),e("div",null,s)}const b=a(d,[["render",p],["__scopeId","data-v-3ac00670"]]);export{w as __pageData,b as default}; diff --git a/assets/ru_vue-webapp_options_footer.md.9yyH4TTW.js b/assets/ru_vue-webapp_options_footer.md.9yyH4TTW.js new file mode 100644 index 000000000..6ee3edf57 --- /dev/null +++ b/assets/ru_vue-webapp_options_footer.md.9yyH4TTW.js @@ -0,0 +1 @@ +import{_ as a,c as e,o as t,U as o,ah as r,ai as i,aj as s,ak as n,al as d}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":1706078525000}'),p={name:"ru/vue-webapp/options/footer.md"},m=o('

Footers

На данный момент можно доступны следующие типы футеров:

SimpleFooter

image

RichFooter

image

MantineSimpleFooter

image

MantineRichFooter

image

DistributedFooter

image

',12),l=[m];function c(h,_,u,v,f,b){return t(),e("div",null,l)}const q=a(p,[["render",c],["__scopeId","data-v-274250e9"]]);export{F as __pageData,q as default}; diff --git a/assets/ru_vue-webapp_options_footer.md.jP49Vp0g.lean.js b/assets/ru_vue-webapp_options_footer.md.9yyH4TTW.lean.js similarity index 74% rename from assets/ru_vue-webapp_options_footer.md.jP49Vp0g.lean.js rename to assets/ru_vue-webapp_options_footer.md.9yyH4TTW.lean.js index 5e8dad6f8..4a80bd2d2 100644 --- a/assets/ru_vue-webapp_options_footer.md.jP49Vp0g.lean.js +++ b/assets/ru_vue-webapp_options_footer.md.9yyH4TTW.lean.js @@ -1 +1 @@ -import{_ as a,c as e,o as t,U as o,ah as r,ai as i,aj as s,ak as n,al as d}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":1706078328000}'),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-1315469f"]]);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 s,ak as n,al as d}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":1706078525000}'),p={name:"ru/vue-webapp/options/footer.md"},m=o("",12),l=[m];function c(h,_,u,v,f,b){return t(),e("div",null,l)}const q=a(p,[["render",c],["__scopeId","data-v-274250e9"]]);export{F as __pageData,q as default}; diff --git a/assets/ru_vue-webapp_options_footer.md.jP49Vp0g.js b/assets/ru_vue-webapp_options_footer.md.jP49Vp0g.js deleted file mode 100644 index 9035c0864..000000000 --- a/assets/ru_vue-webapp_options_footer.md.jP49Vp0g.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 s,ak as n,al as d}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":1706078328000}'),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-1315469f"]]);export{F as __pageData,q as default}; diff --git a/assets/ru_vue-webapp_options_ga-gp.md.vfT933E-.js b/assets/ru_vue-webapp_options_ga-gp.md.2tJ8ofON.js similarity index 98% rename from assets/ru_vue-webapp_options_ga-gp.md.vfT933E-.js rename to assets/ru_vue-webapp_options_ga-gp.md.2tJ8ofON.js index 190893f0f..e8ef013e5 100644 --- a/assets/ru_vue-webapp_options_ga-gp.md.vfT933E-.js +++ b/assets/ru_vue-webapp_options_ga-gp.md.2tJ8ofON.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":1706078328000}'),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":1706078525000}'),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.vfT933E-.lean.js b/assets/ru_vue-webapp_options_ga-gp.md.2tJ8ofON.lean.js similarity index 91% rename from assets/ru_vue-webapp_options_ga-gp.md.vfT933E-.lean.js rename to assets/ru_vue-webapp_options_ga-gp.md.2tJ8ofON.lean.js index 479e9ab2b..f65c59fa1 100644 --- a/assets/ru_vue-webapp_options_ga-gp.md.vfT933E-.lean.js +++ b/assets/ru_vue-webapp_options_ga-gp.md.2tJ8ofON.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":1706078328000}'),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":1706078525000}'),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.2ittPdeF.js b/assets/ru_vue-webapp_options_google-analytics.md.lb_kYHQL.js similarity index 98% rename from assets/ru_vue-webapp_options_google-analytics.md.2ittPdeF.js rename to assets/ru_vue-webapp_options_google-analytics.md.lb_kYHQL.js index bc680b1a4..98c51749d 100644 --- a/assets/ru_vue-webapp_options_google-analytics.md.2ittPdeF.js +++ b/assets/ru_vue-webapp_options_google-analytics.md.lb_kYHQL.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":1706078328000}'),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":1706078525000}'),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.2ittPdeF.lean.js b/assets/ru_vue-webapp_options_google-analytics.md.lb_kYHQL.lean.js
similarity index 91%
rename from assets/ru_vue-webapp_options_google-analytics.md.2ittPdeF.lean.js
rename to assets/ru_vue-webapp_options_google-analytics.md.lb_kYHQL.lean.js
index 710498ce5..089025730 100644
--- a/assets/ru_vue-webapp_options_google-analytics.md.2ittPdeF.lean.js
+++ b/assets/ru_vue-webapp_options_google-analytics.md.lb_kYHQL.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":1706078328000}'),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":1706078525000}'),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.2HB-og2e.js b/assets/ru_vue-webapp_options_header.md.2HB-og2e.js
new file mode 100644
index 000000000..9e7328d08
--- /dev/null
+++ b/assets/ru_vue-webapp_options_header.md.2HB-og2e.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 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":1706078525000}'),b={name:"ru/vue-webapp/options/header.md"},p=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),l=[p];function r(k,E,v,o,g,c){return i(),s("div",null,l)}const _=a(b,[["render",r],["__scopeId","data-v-a4b5ab52"]]);export{y as __pageData,_ as default}; diff --git a/assets/ru_vue-webapp_options_header.md.eNC4q0vv.lean.js b/assets/ru_vue-webapp_options_header.md.2HB-og2e.lean.js similarity index 51% rename from assets/ru_vue-webapp_options_header.md.eNC4q0vv.lean.js rename to assets/ru_vue-webapp_options_header.md.2HB-og2e.lean.js index a897a24bf..978168e22 100644 --- a/assets/ru_vue-webapp_options_header.md.eNC4q0vv.lean.js +++ b/assets/ru_vue-webapp_options_header.md.2HB-og2e.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 m=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":1706078328000}'),b={name:"ru/vue-webapp/options/header.md"},p=i("",15),l=[p];function c(r,k,E,f,v,o){return s(),e("div",null,l)}const y=a(b,[["render",c],["__scopeId","data-v-2bbce79f"]]);export{m as __pageData,y 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 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":1706078525000}'),b={name:"ru/vue-webapp/options/header.md"},p=t("",15),l=[p];function r(k,E,v,o,g,c){return i(),s("div",null,l)}const _=a(b,[["render",r],["__scopeId","data-v-a4b5ab52"]]);export{y as __pageData,_ as default}; diff --git a/assets/ru_vue-webapp_options_header.md.eNC4q0vv.js b/assets/ru_vue-webapp_options_header.md.eNC4q0vv.js deleted file mode 100644 index a89427a79..000000000 --- a/assets/ru_vue-webapp_options_header.md.eNC4q0vv.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 m=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":1706078328000}'),b={name:"ru/vue-webapp/options/header.md"},p=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),l=[p];function c(r,k,E,f,v,o){return s(),e("div",null,l)}const y=a(b,[["render",c],["__scopeId","data-v-2bbce79f"]]);export{m as __pageData,y as default}; diff --git a/assets/ru_vue-webapp_options_i18n.md.Tt2hMigb.js b/assets/ru_vue-webapp_options_i18n.md.j3Wknc9u.js similarity index 99% rename from assets/ru_vue-webapp_options_i18n.md.Tt2hMigb.js rename to assets/ru_vue-webapp_options_i18n.md.j3Wknc9u.js index 6fa91501e..ca46cb4c5 100644 --- a/assets/ru_vue-webapp_options_i18n.md.Tt2hMigb.js +++ b/assets/ru_vue-webapp_options_i18n.md.j3Wknc9u.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":1706078328000}'),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":1706078525000}'),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.Tt2hMigb.lean.js b/assets/ru_vue-webapp_options_i18n.md.j3Wknc9u.lean.js
similarity index 90%
rename from assets/ru_vue-webapp_options_i18n.md.Tt2hMigb.lean.js
rename to assets/ru_vue-webapp_options_i18n.md.j3Wknc9u.lean.js
index 425d3a95c..94ea7adac 100644
--- a/assets/ru_vue-webapp_options_i18n.md.Tt2hMigb.lean.js
+++ b/assets/ru_vue-webapp_options_i18n.md.j3Wknc9u.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":1706078328000}'),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":1706078525000}'),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.lla8YEO5.js b/assets/ru_vue-webapp_options_index.md.Jqn4YIvJ.js
similarity index 98%
rename from assets/ru_vue-webapp_options_index.md.lla8YEO5.js
rename to assets/ru_vue-webapp_options_index.md.Jqn4YIvJ.js
index 83f1d08ce..08919379b 100644
--- a/assets/ru_vue-webapp_options_index.md.lla8YEO5.js
+++ b/assets/ru_vue-webapp_options_index.md.Jqn4YIvJ.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":1706078328000}'),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":1706078525000}'),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.lla8YEO5.lean.js b/assets/ru_vue-webapp_options_index.md.Jqn4YIvJ.lean.js similarity index 91% rename from assets/ru_vue-webapp_options_index.md.lla8YEO5.lean.js rename to assets/ru_vue-webapp_options_index.md.Jqn4YIvJ.lean.js index bd1f5bd94..3678283bc 100644 --- a/assets/ru_vue-webapp_options_index.md.lla8YEO5.lean.js +++ b/assets/ru_vue-webapp_options_index.md.Jqn4YIvJ.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":1706078328000}'),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":1706078525000}'),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.98KHycMQ.js b/assets/ru_vue-webapp_options_layout-main.md.Q1uonk7h.js similarity index 96% rename from assets/ru_vue-webapp_options_layout-main.md.98KHycMQ.js rename to assets/ru_vue-webapp_options_layout-main.md.Q1uonk7h.js index b0adf8a01..94c25738f 100644 --- a/assets/ru_vue-webapp_options_layout-main.md.98KHycMQ.js +++ b/assets/ru_vue-webapp_options_layout-main.md.Q1uonk7h.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":1706078328000}'),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":1706078525000}'),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.98KHycMQ.lean.js b/assets/ru_vue-webapp_options_layout-main.md.Q1uonk7h.lean.js similarity index 90% rename from assets/ru_vue-webapp_options_layout-main.md.98KHycMQ.lean.js rename to assets/ru_vue-webapp_options_layout-main.md.Q1uonk7h.lean.js index f979cdcd4..21d54e4e4 100644 --- a/assets/ru_vue-webapp_options_layout-main.md.98KHycMQ.lean.js +++ b/assets/ru_vue-webapp_options_layout-main.md.Q1uonk7h.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":1706078328000}'),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":1706078525000}'),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.iZLeHkJ4.js b/assets/ru_vue-webapp_options_layout-one-column.md.eAbRZJg1.js similarity index 95% rename from assets/ru_vue-webapp_options_layout-one-column.md.iZLeHkJ4.js rename to assets/ru_vue-webapp_options_layout-one-column.md.eAbRZJg1.js index 94b901740..3fcb03bc1 100644 --- a/assets/ru_vue-webapp_options_layout-one-column.md.iZLeHkJ4.js +++ b/assets/ru_vue-webapp_options_layout-one-column.md.eAbRZJg1.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":1706078328000}'),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":1706078525000}'),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.iZLeHkJ4.lean.js b/assets/ru_vue-webapp_options_layout-one-column.md.eAbRZJg1.lean.js similarity index 91% rename from assets/ru_vue-webapp_options_layout-one-column.md.iZLeHkJ4.lean.js rename to assets/ru_vue-webapp_options_layout-one-column.md.eAbRZJg1.lean.js index 76dcdac8c..fcf654cc5 100644 --- a/assets/ru_vue-webapp_options_layout-one-column.md.iZLeHkJ4.lean.js +++ b/assets/ru_vue-webapp_options_layout-one-column.md.eAbRZJg1.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":1706078328000}'),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":1706078525000}'),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.7sPUXTOj.js b/assets/ru_vue-webapp_options_navbar.md.7sPUXTOj.js new file mode 100644 index 000000000..4013c19d0 --- /dev/null +++ b/assets/ru_vue-webapp_options_navbar.md.7sPUXTOj.js @@ -0,0 +1 @@ +import{_ as a,c as e,o as t,U as r,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":"ru/vue-webapp/options/navbar.md","filePath":"ru/vue-webapp/options/navbar.md","lastUpdated":1706078525000}'),i={name:"ru/vue-webapp/options/navbar.md"},c=r('

Navbar

Navbar находится внутри NavigationDrawer

На данный момент можно выбрать из двух видов:

SimpleNavbar

image

MantineSimpleNavbar

image

',7),p=[c];function d(s,v,m,l,_,b){return t(),e("div",null,p)}const g=a(i,[["render",d],["__scopeId","data-v-177592ac"]]);export{u as __pageData,g as default}; diff --git a/assets/ru_vue-webapp_options_navbar.md.ZApgZ9iW.lean.js b/assets/ru_vue-webapp_options_navbar.md.7sPUXTOj.lean.js similarity index 64% rename from assets/ru_vue-webapp_options_navbar.md.ZApgZ9iW.lean.js rename to assets/ru_vue-webapp_options_navbar.md.7sPUXTOj.lean.js index 117bc94bd..b5e392a66 100644 --- a/assets/ru_vue-webapp_options_navbar.md.ZApgZ9iW.lean.js +++ b/assets/ru_vue-webapp_options_navbar.md.7sPUXTOj.lean.js @@ -1 +1 @@ -import{_ as a,c as e,o as t,U as r,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":"ru/vue-webapp/options/navbar.md","filePath":"ru/vue-webapp/options/navbar.md","lastUpdated":1706078328000}'),i={name:"ru/vue-webapp/options/navbar.md"},p=r("",7),d=[p];function s(v,m,c,l,_,b){return t(),e("div",null,d)}const g=a(i,[["render",s],["__scopeId","data-v-3e002724"]]);export{u as __pageData,g as default}; +import{_ as a,c as e,o as t,U as r,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":"ru/vue-webapp/options/navbar.md","filePath":"ru/vue-webapp/options/navbar.md","lastUpdated":1706078525000}'),i={name:"ru/vue-webapp/options/navbar.md"},c=r("",7),p=[c];function d(s,v,m,l,_,b){return t(),e("div",null,p)}const g=a(i,[["render",d],["__scopeId","data-v-177592ac"]]);export{u as __pageData,g as default}; diff --git a/assets/ru_vue-webapp_options_navbar.md.ZApgZ9iW.js b/assets/ru_vue-webapp_options_navbar.md.ZApgZ9iW.js deleted file mode 100644 index 4d9554ab1..000000000 --- a/assets/ru_vue-webapp_options_navbar.md.ZApgZ9iW.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as e,o as t,U as r,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":"ru/vue-webapp/options/navbar.md","filePath":"ru/vue-webapp/options/navbar.md","lastUpdated":1706078328000}'),i={name:"ru/vue-webapp/options/navbar.md"},p=r('

Navbar

Navbar находится внутри NavigationDrawer

На данный момент можно выбрать из двух видов:

SimpleNavbar

image

MantineSimpleNavbar

image

',7),d=[p];function s(v,m,c,l,_,b){return t(),e("div",null,d)}const g=a(i,[["render",s],["__scopeId","data-v-3e002724"]]);export{u as __pageData,g as default}; diff --git a/assets/ru_vue-webapp_options_open-graph.md.mPXdTrvL.js b/assets/ru_vue-webapp_options_open-graph.md.ChdROrK1.js similarity index 99% rename from assets/ru_vue-webapp_options_open-graph.md.mPXdTrvL.js rename to assets/ru_vue-webapp_options_open-graph.md.ChdROrK1.js index 3b574c3f2..9a6453f34 100644 --- a/assets/ru_vue-webapp_options_open-graph.md.mPXdTrvL.js +++ b/assets/ru_vue-webapp_options_open-graph.md.ChdROrK1.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":1706078328000}'),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":1706078525000}'),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.mPXdTrvL.lean.js b/assets/ru_vue-webapp_options_open-graph.md.ChdROrK1.lean.js
similarity index 90%
rename from assets/ru_vue-webapp_options_open-graph.md.mPXdTrvL.lean.js
rename to assets/ru_vue-webapp_options_open-graph.md.ChdROrK1.lean.js
index 48eaa11b4..e44474e81 100644
--- a/assets/ru_vue-webapp_options_open-graph.md.mPXdTrvL.lean.js
+++ b/assets/ru_vue-webapp_options_open-graph.md.ChdROrK1.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":1706078328000}'),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":1706078525000}'),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.jkJVzZcJ.js b/assets/ru_vue-webapp_options_pwa.md.kIMgoRyV.js
similarity index 99%
rename from assets/ru_vue-webapp_options_pwa.md.jkJVzZcJ.js
rename to assets/ru_vue-webapp_options_pwa.md.kIMgoRyV.js
index 6a18a98eb..76f8c7c0a 100644
--- a/assets/ru_vue-webapp_options_pwa.md.jkJVzZcJ.js
+++ b/assets/ru_vue-webapp_options_pwa.md.kIMgoRyV.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":1706078328000}'),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":1706078525000}'),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.jkJVzZcJ.lean.js b/assets/ru_vue-webapp_options_pwa.md.kIMgoRyV.lean.js
similarity index 90%
rename from assets/ru_vue-webapp_options_pwa.md.jkJVzZcJ.lean.js
rename to assets/ru_vue-webapp_options_pwa.md.kIMgoRyV.lean.js
index ce30fb152..beb7b1bd7 100644
--- a/assets/ru_vue-webapp_options_pwa.md.jkJVzZcJ.lean.js
+++ b/assets/ru_vue-webapp_options_pwa.md.kIMgoRyV.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":1706078328000}'),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":1706078525000}'),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.qgSCLMFv.js b/assets/ru_vue-webapp_options_splash-screen.md.PnX7oyhc.js
similarity index 54%
rename from assets/ru_vue-webapp_options_splash-screen.md.qgSCLMFv.js
rename to assets/ru_vue-webapp_options_splash-screen.md.PnX7oyhc.js
index 57fe8c2b6..28c369783 100644
--- a/assets/ru_vue-webapp_options_splash-screen.md.qgSCLMFv.js
+++ b/assets/ru_vue-webapp_options_splash-screen.md.PnX7oyhc.js
@@ -1 +1 @@
-import{_ as e,c as a,o as t,U as s,au as o}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":"ru/vue-webapp/options/splash-screen.md","filePath":"ru/vue-webapp/options/splash-screen.md","lastUpdated":1706078328000}'),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 v=e(p,[["render",c],["__scopeId","data-v-899ef416"]]);export{u as __pageData,v as default}; +import{_ as e,c as a,o as t,U as s,au as o}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":"ru/vue-webapp/options/splash-screen.md","filePath":"ru/vue-webapp/options/splash-screen.md","lastUpdated":1706078525000}'),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,f,_,i,l,m){return t(),a("div",null,d)}const v=e(p,[["render",c],["__scopeId","data-v-99f45ef4"]]);export{u as __pageData,v as default}; diff --git a/assets/ru_vue-webapp_options_splash-screen.md.qgSCLMFv.lean.js b/assets/ru_vue-webapp_options_splash-screen.md.PnX7oyhc.lean.js similarity index 74% rename from assets/ru_vue-webapp_options_splash-screen.md.qgSCLMFv.lean.js rename to assets/ru_vue-webapp_options_splash-screen.md.PnX7oyhc.lean.js index 86d28d93a..ee06d91f5 100644 --- a/assets/ru_vue-webapp_options_splash-screen.md.qgSCLMFv.lean.js +++ b/assets/ru_vue-webapp_options_splash-screen.md.PnX7oyhc.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,U as s,au as o}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":"ru/vue-webapp/options/splash-screen.md","filePath":"ru/vue-webapp/options/splash-screen.md","lastUpdated":1706078328000}'),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 v=e(p,[["render",c],["__scopeId","data-v-899ef416"]]);export{u as __pageData,v as default}; +import{_ as e,c as a,o as t,U as s,au as o}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":"ru/vue-webapp/options/splash-screen.md","filePath":"ru/vue-webapp/options/splash-screen.md","lastUpdated":1706078525000}'),p={name:"ru/vue-webapp/options/splash-screen.md"},n=s("",5),d=[n];function c(r,f,_,i,l,m){return t(),a("div",null,d)}const v=e(p,[["render",c],["__scopeId","data-v-99f45ef4"]]);export{u as __pageData,v as default}; diff --git a/assets/ru_vue-webapp_options_themes.md.PqKL65sx.js b/assets/ru_vue-webapp_options_themes.md.aTylonb2.js similarity index 99% rename from assets/ru_vue-webapp_options_themes.md.PqKL65sx.js rename to assets/ru_vue-webapp_options_themes.md.aTylonb2.js index acccfa285..2aa528f77 100644 --- a/assets/ru_vue-webapp_options_themes.md.PqKL65sx.js +++ b/assets/ru_vue-webapp_options_themes.md.aTylonb2.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":1706078328000}'),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":1706078525000}'),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.PqKL65sx.lean.js b/assets/ru_vue-webapp_options_themes.md.aTylonb2.lean.js
similarity index 90%
rename from assets/ru_vue-webapp_options_themes.md.PqKL65sx.lean.js
rename to assets/ru_vue-webapp_options_themes.md.aTylonb2.lean.js
index 48b6ebe5a..b7c5cec32 100644
--- a/assets/ru_vue-webapp_options_themes.md.PqKL65sx.lean.js
+++ b/assets/ru_vue-webapp_options_themes.md.aTylonb2.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":1706078328000}'),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":1706078525000}'),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.Hmof2b4Z.css b/assets/style.lMDigkt4.css
similarity index 99%
rename from assets/style.Hmof2b4Z.css
rename to assets/style.lMDigkt4.css
index de58a621b..bdf19c53a 100644
--- a/assets/style.Hmof2b4Z.css
+++ b/assets/style.lMDigkt4.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-536e3cf9],img[data-v-17cf1a47],img[data-v-d7185799],img[data-v-04dd6ba4],img[data-v-e8ef1e68],img[data-v-1816abc9],img[data-v-39f7573f]{border:1px solid #ddd}.post[data-v-7c2e6f56]{border-bottom:1px solid var(--vp-c-border);margin:1rem 0 2rem}.post .title[data-v-7c2e6f56]{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-7c2e6f56]{text-decoration:none;color:var(--vp-c-text-2);transition:color .3s easy-out}.post .title a[data-v-7c2e6f56]:hover{color:var(--vp-c-text-1)}.post .content[data-v-7c2e6f56]{display:flex}.post .content .image[data-v-7c2e6f56]{flex:1 1 30%;margin:0 1rem 1rem 0}.post .content .desc[data-v-7c2e6f56]{flex:1 1 70%}@media (max-width: 768px){.post .content[data-v-7c2e6f56]{flex-direction:column}}.post .footer[data-v-7c2e6f56]{display:flex;justify-content:space-between;padding:2rem 0 .5rem;color:var(--vp-c-text-3)}.post .footer a[data-v-7c2e6f56]{color:var(--vp-c-text-3)}img[data-v-f272f964],img[data-v-c33222a2]{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-b4ad1af8],img[data-v-f155ed4f],img[data-v-254bab2c],img[data-v-1315469f],img[data-v-2bbce79f],img[data-v-3e002724],img[data-v-899ef416]{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-ba9538db],img[data-v-8d45d48b],img[data-v-fb4ceaa1],img[data-v-64359d0b],img[data-v-d75e1772],img[data-v-9ddd46cc],img[data-v-ec06cc3a]{border:1px solid #ddd}.post[data-v-40fc89de]{border-bottom:1px solid var(--vp-c-border);margin:1rem 0 2rem}.post .title[data-v-40fc89de]{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-40fc89de]{text-decoration:none;color:var(--vp-c-text-2);transition:color .3s easy-out}.post .title a[data-v-40fc89de]:hover{color:var(--vp-c-text-1)}.post .content[data-v-40fc89de]{display:flex}.post .content .image[data-v-40fc89de]{flex:1 1 30%;margin:0 1rem 1rem 0}.post .content .desc[data-v-40fc89de]{flex:1 1 70%}@media (max-width: 768px){.post .content[data-v-40fc89de]{flex-direction:column}}.post .footer[data-v-40fc89de]{display:flex;justify-content:space-between;padding:2rem 0 .5rem;color:var(--vp-c-text-3)}.post .footer a[data-v-40fc89de]{color:var(--vp-c-text-3)}img[data-v-ba67b7f9],img[data-v-5496c0af]{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-4e4677c2],img[data-v-22aa6b84],img[data-v-3ac00670],img[data-v-274250e9],img[data-v-a4b5ab52],img[data-v-177592ac],img[data-v-99f45ef4]{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 dd848b80f..b2a0da5b5 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 e5c0c6df7..93878f85b 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 39ba497b5..49f0a2c14 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 ecab5dd0e..e97886c18 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 88eabf261..41ce9082a 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 b0c595e9c..fc5262d36 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 a1938cd0b..09771a1ac 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 601ceaf0d..e13ec8e1b 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 a65e17c5e..4a57007c2 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 0729b30a4..f68da3d4c 100644 --- a/en/development/architectural-patterns.html +++ b/en/development/architectural-patterns.html @@ -6,13 +6,13 @@ Architectural patterns | Vue FAQ - + - + - - + + @@ -80,8 +80,8 @@ meta: { requiresAuth: true, backRoute: "/" }, } ] -};
- +};
+ \ No newline at end of file diff --git a/en/development/assets.html b/en/development/assets.html index 7263fdc4d..2b4221984 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 d6de3fb9e..fda669d91 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 e14949acf..57e3f11b2 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 22a300bf9..4ad144048 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 7a6a796a5..6221cd115 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 29bdab719..b5c511446 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 1033c825a..191453d60 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 d1bd603e9..ea3910221 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 8baba83f3..179b9ef53 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 fefb21f95..269450179 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 c0e013721..184fa11a9 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 08494fea8..30988c48f 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 8eac0e494..a3f43d2f0 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 6e7cf222c..0eced43ef 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 12f56f234..dc2378d3a 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 f0e91763e..a0c95ffa5 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 23e31c93d..eef5b3925 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 18b10e737..0b57df0f1 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 1556c76e2..65a3e3e60 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 2117ee49f..5b7b7c906 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 a34bb2edb..bc5b008e7 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 9e242391d..3eb25113d 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 717830830..b901c0a83 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 a3719043b..25ca09151 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 b63a25cae..86e83ddd5 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 262a57ffd..444f30cec 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 a06791725..a8b7ffdd7 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 ec0855347..d44e8940d 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 51f0b6961..612dcfb23 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 4cd623ca5..f4d077189 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 be8870779..5442289e5 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 03cc2d1bf..0620f2454 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 8193f9604..eedac36ce 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 448039ca0..c1951816d 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 fbaabda1b..f3589d26d 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 db511dafc..e8924f07d 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 516f8b51f..571d75442 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 91222661d..0b423af27 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 e56b48994..4b1fca811 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 5bd27cc1a..efa20df09 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 aa27418bc..48dcf83e8 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 550d2b763..248ebb5b1 100644 --- a/hashmap.json +++ b/hashmap.json @@ -1 +1 @@ -{"en_vue-webapp_options_google-analytics.md":"ek0a1NvD","en_deployment_docker.md":"d3SjcHSs","ru_arty-crafty_analysis_research.md":"ouiP0KR_","en_misc_cheat-sheets.md":"jFn1NHma","en_vue-webapp_options_description.md":"DfBd-LCi","en_misc_contribute.md":"NW5Ys4fU","en_frontend_about-frameworks.md":"fGpNsaJv","en_misc_glossary.md":"REDREdzT","ru_book_appendix__migrating_from_vue_2.md":"T2WlOnoi","en_vue-webapp_options_layout-one-column.md":"uMlQe1za","en_vue-webapp_options_ga-gp.md":"_dHTUGs7","en_vue-webapp_options_footer.md":"IvJafQS2","en_vue-webapp_options_open-graph.md":"VJxbg_NW","en_vue-webapp_options_navbar.md":"6zdjC6CZ","en_vue-webapp_options_pwa.md":"AFwSutlq","index.md":"t66lxH38","en_vue-webapp_options_themes.md":"G3jKyM1z","en_vue-webapp_options_splash-screen.md":"M3pCGpim","ru_articles_index.md":"PLOQy8xx","ru_arty-crafty_analysis_architecture-and-design.md":"xnJCArnJ","en_vue-webapp_options_index.md":"BXnQ7g6P","en_vue-webapp_options_layout-main.md":"Kbs0wC6o","en_backend_protocols.md":"TeXddRl-","ru_book_chapter_1__the_vue_3_framework.md":"FPOT0e1D","ru_book_chapter_2__software_design_principles_and_patterns.md":"xLNtjfDe","ru_vue-webapp_contribution.md":"m7n6-Q5O","en_deployment_hosting.md":"BjbmvaRj","ru_arty-crafty_backend_db-data-model.md":"lUoLunaj","en_backend_cors.md":"ksIYzqNo","en_vue-webapp_objectives.md":"mrFAMs2n","ru_development_stores.md":"iUxqYZWB","en_vue-webapp_options_baseicon.md":"LVLyYgz6","ru_arty-crafty_backend_hoppscotch.md":"bOqtfBwr","ru_development_misc.md":"AiBjC0Vc","ru_vue-webapp_options_i18n.md":"Tt2hMigb","ru_development_libraries.md":"mjQ2Hssq","ru_vue-webapp_options_footer.md":"jP49Vp0g","ru_vue-webapp_options_ga-gp.md":"vfT933E-","ru_vue-webapp_options_google-analytics.md":"2ittPdeF","en_deployment_ci-cd.md":"kJ3yNfg2","ru_deployment_hosting.md":"qkLwLGsr","en_development_building.md":"d3DijPJt","ru_development_assets.md":"yL-vWlno","en_development_architectural-patterns.md":"fjOcPVii","ru_development_building.md":"cvkYE_H9","ru_book_chapter_10__deploying_your_application.md":"quHj4Tvl","ru_backend_backend.md":"ecvqfmDv","en_vue-webapp_options_api.md":"Tthg1NPO","ru_vue-webapp_options_baseicon.md":"hw-dbEYd","en_backend_backend.md":"oFbiOTdF","ru_vue-webapp_options_drawer.md":"FotDmFru","ru_development_testing.md":"sTeKfDi9","en_development_stores.md":"v2mpDEqV","ru_arty-crafty_introduction_goals.md":"9Hc3AsGU","ru_arty-crafty_showcase_favourites.md":"E-9LKXN1","ru_backend_auth.md":"dhIjGStg","ru_frontend_architecture.md":"aCOu-hPk","ru_vue-webapp_guidelines.md":"aLyNBxgC","ru_arty-crafty_analysis_data-model.md":"cZPzgAu5","ru_arty-crafty_backend_supabase-api.md":"qSRdOuNP","ru_vue-webapp_objectives.md":"1cNA6ey8","en_development_misc.md":"ci4G-_Af","ru_book_chapter_4__user_interface_composition_with_components.md":"3mr0vS25","ru_arty-crafty_showcase_customization.md":"U-kUafIC","ru_index.md":"nu8yILrZ","en_frontend_learning.md":"iBgul5M4","en_deployment_github-actions.md":"QJWxCvzn","ru_deployment_ci-cd.md":"Eg-W4Xg-","ru_development_architectural-patterns.md":"rDaQSda9","ru_arty-crafty_introduction_repository.md":"oUCpa4H0","ru_vue-webapp_index.md":"CbsuI-Jq","ru_vue-webapp_options_description.md":"01X1PMHs","ru_deployment_docker.md":"N4Sq069g","ru_arty-crafty_analysis_ui-design.md":"pN4gTeIJ","ru_arty-crafty_showcase_project-setup.md":"xtexHM57","ru_frontend_css-ui-libs.md":"lTko1BC4","ru_vue-webapp_options_index.md":"lla8YEO5","en_vue-webapp_contribution.md":"E_6ZArOb","ru_arty-crafty_analysis_tech-stack.md":"uCjnFy4s","ru_vue-webapp_options_adaptability.md":"uysk3F5h","ru_vue-webapp_options_layout-main.md":"98KHycMQ","en_vue-webapp_options_adaptability.md":"5TbPL-AH","en_development_testing.md":"PBu_-M1r","en_misc_changelog.md":"bGOHABNi","en_frontend_architecture.md":"i8ecT60o","en_vue-webapp_options_drawer.md":"gVz4E2za","ru_misc_contribute.md":"VBIIKc4G","ru_book_summary.md":"5tjsY1GX","en_vue-webapp_options_i18n.md":"Bza7PTBY","ru_vue-webapp_options_pwa.md":"jkJVzZcJ","ru_vue-webapp_options_themes.md":"PqKL65sx","ru_vue-webapp_options_header.md":"eNC4q0vv","en_vue-webapp_getting-started.md":"o2wpVpAd","en_vue-webapp_guidelines.md":"A-w_L8Cf","ru_arty-crafty_showcase_product-category.md":"Vv2kiAPO","en_index.md":"2gs5RwXl","ru_vue-webapp_options_navbar.md":"ZApgZ9iW","ru_arty-crafty_analysis_ui-layout.md":"edIBThWB","ru_arty-crafty_introduction_development-stages.md":"wNQgsr61","en_frontend_spa-pwa-ssr-ssg.md":"sXWCbBjq","ru_vue-webapp_options_splash-screen.md":"qgSCLMFv","en_vue-webapp_index.md":"mvJfEFBe","ru_arty-crafty_backend_supabase.md":"i95ffB3y","ru_vue-webapp_getting-started.md":"Jj9pY3h2","en_misc_introduction.md":"gK6keJLl","en_development_assets.md":"78aSzn81","en_frontend_css-ui-libs.md":"YrlLekij","en_backend_api.md":"fOTmtTnZ","ru_backend_protocols.md":"yBqCcP0e","ru_misc_changelog.md":"DpB24XgT","ru_vue-webapp_options_layout-one-column.md":"iZLeHkJ4","ru_book_chapter_3__setting_up_a_working_project.md":"Bx3HYAGu","ru_book_index.md":"9wOAO9Ea","ru_arty-crafty_index.md":"poLetM_l","ru_backend_cors.md":"qr-BBstv","ru_arty-crafty_showcase_codeium.md":"dss6giiD","ru_vue-webapp_options_open-graph.md":"mPXdTrvL","ru_frontend_spa-pwa-ssr-ssg.md":"O9YQkFH5","ru_arty-crafty_analysis_business-analysis.md":"HGrhbiRC","ru_misc_introduction.md":"0iYinkcY","en_development_libraries.md":"_3p5VPdU","en_backend_auth.md":"VCwAetUT","ru_deployment_github-actions.md":"V6MHe8ya","ru_misc_cheat-sheets.md":"wJ4fkOiO","ru_misc_glossary.md":"5gNfTtOp","ru_vue-webapp_options_api.md":"GbPEOh6X","ru_frontend_learning.md":"bqcENrFT","ru_frontend_about-frameworks.md":"gzLuJB2q","ru_book_chapter_6__progressive_web_applications.md":"rTLx9IV1","en_development_ide.md":"Wi1UfkMA","ru_arty-crafty_backend_baas-choosing.md":"WTuYOjgB","ru_book_chapter_5__single-page_applications.md":"aDPn9mj8","ru_backend_api.md":"aOyJvsBW","en_vue-webapp_options_header.md":"Exe2yMU1","ru_book_chapter_11__bonus_chapter_-_ux_patterns.md":"ac6MOo8b","ru_book_chapter_8__multithreading_with_web_workers.md":"5HZSDSol","ru_book_chapter_9__testing_and_source_control.md":"ezxke-aj","ru_book_chapter_7__data_flow_management.md":"NqxgxO8C","ru_development_ide.md":"5uTYnxR8"} +{"en_vue-webapp_index.md":"F9Vxz5_Y","en_misc_cheat-sheets.md":"UC8Bg9PY","en_vue-webapp_options_open-graph.md":"1cA3KPiv","en_vue-webapp_options_header.md":"WcfCmhgT","en_vue-webapp_options_i18n.md":"rT4Hx32t","en_vue-webapp_options_layout-main.md":"vsDWh0rA","ru_arty-crafty_introduction_goals.md":"qisZy36U","ru_arty-crafty_introduction_repository.md":"aNI639d7","ru_arty-crafty_showcase_codeium.md":"lfBhaW0U","en_vue-webapp_guidelines.md":"BTO4w0wx","ru_arty-crafty_introduction_development-stages.md":"ntdUZyjD","en_vue-webapp_options_adaptability.md":"hT3eE2co","en_vue-webapp_options_navbar.md":"HmWLL8MS","ru_arty-crafty_showcase_customization.md":"THGYI84f","ru_backend_auth.md":"tfvWBsS9","ru_arty-crafty_showcase_product-category.md":"0PK5e7Ji","en_vue-webapp_contribution.md":"9CmrCSUD","en_development_ide.md":"g5mGMNm9","en_backend_auth.md":"VUJXworq","index.md":"z5bTLNnp","ru_arty-crafty_analysis_research.md":"0Vj2L4jI","en_frontend_architecture.md":"69bxDI3Z","ru_arty-crafty_analysis_tech-stack.md":"YA4k4VO6","en_frontend_css-ui-libs.md":"xej_txAG","en_vue-webapp_options_footer.md":"QUXIPfsC","en_vue-webapp_options_api.md":"WQnDXHgw","ru_arty-crafty_analysis_ui-design.md":"HFRXemhN","en_frontend_about-frameworks.md":"gkfAEBzW","en_index.md":"O4v7EP7k","en_misc_contribute.md":"-WzmVyTJ","ru_arty-crafty_backend_baas-choosing.md":"e-VfsTdu","ru_arty-crafty_backend_hoppscotch.md":"qLzyLp5M","en_frontend_spa-pwa-ssr-ssg.md":"DqW-O9WS","en_backend_api.md":"C8jG14qD","ru_backend_protocols.md":"SaCfczhK","ru_arty-crafty_backend_db-data-model.md":"Cg1X41I7","en_development_libraries.md":"djdvKxjo","ru_arty-crafty_index.md":"-Ix5pgur","en_development_misc.md":"0LsDPnY5","ru_arty-crafty_backend_supabase.md":"e48nvkaf","en_deployment_ci-cd.md":"z8agpEui","en_vue-webapp_options_description.md":"EuGxJ0Zj","en_vue-webapp_options_splash-screen.md":"C3kI2LC8","en_vue-webapp_options_index.md":"3L11TA9h","ru_book_chapter_6__progressive_web_applications.md":"IRnpWuk4","en_development_building.md":"zVYdFGlE","ru_backend_backend.md":"oIhArsbT","en_misc_changelog.md":"I8AFHh2F","ru_arty-crafty_analysis_ui-layout.md":"oTh_5u9W","ru_backend_cors.md":"pv8nZLQz","en_vue-webapp_options_pwa.md":"MLFoO88Y","en_vue-webapp_getting-started.md":"IbWDibZS","en_deployment_hosting.md":"Kuz3iEbk","en_deployment_docker.md":"9Qo7IdAe","en_vue-webapp_options_baseicon.md":"BO4aY1SI","ru_articles_index.md":"-CrIAaFR","en_vue-webapp_options_ga-gp.md":"aIon36tt","ru_arty-crafty_showcase_favourites.md":"xJvPnA3z","en_development_testing.md":"KkwNShRA","ru_book_chapter_5__single-page_applications.md":"5ILwH92x","en_vue-webapp_options_google-analytics.md":"T03LpbGA","en_backend_cors.md":"fKg28v57","en_development_architectural-patterns.md":"fiE-BAVD","ru_book_chapter_1__the_vue_3_framework.md":"WiSUY9VU","ru_deployment_ci-cd.md":"jjJyWpUE","en_vue-webapp_options_themes.md":"KxFEOIr3","en_backend_backend.md":"TA1D0dzM","ru_vue-webapp_guidelines.md":"uEdVBabC","en_frontend_learning.md":"t4V0phF7","ru_deployment_hosting.md":"HPp685Kt","ru_book_chapter_2__software_design_principles_and_patterns.md":"tuf2sQ7N","ru_vue-webapp_index.md":"Ay8-MPii","ru_book_appendix__migrating_from_vue_2.md":"HRQ8RZbn","ru_book_chapter_3__setting_up_a_working_project.md":"XNVRrbK-","en_development_stores.md":"Z0qhdX9O","ru_book_chapter_9__testing_and_source_control.md":"OsSNzo79","en_deployment_github-actions.md":"bHq4YEkP","ru_deployment_docker.md":"9GgXzWXk","ru_arty-crafty_analysis_business-analysis.md":"du7KU9Bk","ru_development_misc.md":"y_3gmju1","ru_development_stores.md":"gfBALweF","ru_development_testing.md":"Mn-z3nVI","ru_frontend_about-frameworks.md":"zd0Ct_kd","ru_frontend_architecture.md":"4U7epikF","ru_frontend_css-ui-libs.md":"QgEj0EWR","ru_misc_cheat-sheets.md":"qw_kA0id","ru_index.md":"JQBbpC9N","ru_misc_changelog.md":"84q4mHAH","ru_arty-crafty_analysis_architecture-and-design.md":"QOQ_N_y5","ru_frontend_learning.md":"xeHiWR_N","ru_frontend_spa-pwa-ssr-ssg.md":"qrRupqaE","ru_misc_contribute.md":"5Xh7n1AY","ru_misc_introduction.md":"bd39KfVC","en_vue-webapp_options_drawer.md":"9T--jZaf","ru_misc_glossary.md":"mZLtFLUl","ru_vue-webapp_contribution.md":"mw1epjfD","en_vue-webapp_options_layout-one-column.md":"xrNPjI-c","ru_arty-crafty_showcase_project-setup.md":"ddO3qUl_","ru_vue-webapp_getting-started.md":"EKkYbqfp","ru_vue-webapp_objectives.md":"d5n6E18n","ru_vue-webapp_options_adaptability.md":"cXCxcfSB","ru_vue-webapp_options_baseicon.md":"88XRkfnT","ru_vue-webapp_options_description.md":"PffqCGTh","ru_vue-webapp_options_drawer.md":"F_KWl8tF","ru_book_chapter_4__user_interface_composition_with_components.md":"KkS6afCk","ru_vue-webapp_options_footer.md":"9yyH4TTW","en_backend_protocols.md":"znkJxW5g","ru_vue-webapp_options_ga-gp.md":"2tJ8ofON","ru_vue-webapp_options_google-analytics.md":"lb_kYHQL","ru_vue-webapp_options_header.md":"2HB-og2e","ru_vue-webapp_options_i18n.md":"j3Wknc9u","ru_vue-webapp_options_index.md":"Jqn4YIvJ","ru_vue-webapp_options_layout-one-column.md":"eAbRZJg1","ru_vue-webapp_options_navbar.md":"7sPUXTOj","ru_vue-webapp_options_open-graph.md":"ChdROrK1","ru_vue-webapp_options_pwa.md":"kIMgoRyV","ru_vue-webapp_options_splash-screen.md":"PnX7oyhc","ru_vue-webapp_options_themes.md":"aTylonb2","ru_book_chapter_11__bonus_chapter_-_ux_patterns.md":"jeaX63My","ru_backend_api.md":"9OxIP-t-","ru_arty-crafty_backend_supabase-api.md":"REoxAKZv","ru_vue-webapp_options_api.md":"-gMdDXo6","ru_book_index.md":"tHpVinFD","ru_development_libraries.md":"b984kK8a","ru_development_building.md":"4iOFmLAH","en_misc_glossary.md":"Jhk0ly_l","ru_development_assets.md":"jrEfsFq4","ru_arty-crafty_analysis_data-model.md":"GePqZknl","ru_deployment_github-actions.md":"zC76OwYl","ru_book_chapter_10__deploying_your_application.md":"cNFuqagN","ru_book_chapter_7__data_flow_management.md":"t9QBwtq4","ru_development_ide.md":"08rGQCOj","en_development_assets.md":"MXSFxr7Y","en_vue-webapp_objectives.md":"zOqBl503","ru_development_architectural-patterns.md":"OmUo0dUN","ru_vue-webapp_options_layout-main.md":"Q1uonk7h","en_misc_introduction.md":"y6kYpZwE","ru_book_summary.md":"dxh3TYEF","ru_book_chapter_8__multithreading_with_web_workers.md":"gLdgyYsS"} diff --git a/index.html b/index.html index c7f638b65..9ed78c190 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 63a31aa5b..1ee010213 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 bf2f81359..6d1c33124 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 e6c2ebdc2..c99cdab65 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 1e9495576..cd9e98b6a 100644 --- a/ru/arty-crafty/analysis/data-model.html +++ b/ru/arty-crafty/analysis/data-model.html @@ -6,13 +6,13 @@ Модель данных | Vue FAQ - + - + - - + + @@ -34,7 +34,7 @@ -
Skip to content

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

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

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

Чтобы определить, какие свойства будут у категории или товара, можно воспользоваться здравым смыслом, а так же посмотреть реализацию данных сущностей в других 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
{
+    
Skip to content

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

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

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

Чтобы определить, какие свойства будут у категории или товара, можно воспользоваться здравым смыслом, а так же посмотреть реализацию данных сущностей в других 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",
@@ -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 b6f58454b..81f4eaf10 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 74235fc70..84c7e680e 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 ca368f0e5..15dd4bc6b 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 297a66ee2..2336e66c0 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 551fc8220..d3585f8ac 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 b7a46f0df..bca9d3667 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

Модель данных в базе данных

Сущности

На данный момент у нас есть сущности product и category. Отношение между ними - many-to-many. Один продукт может находиться в нескольких категориях (с учетом того, что конкретный магазин маркетплейса тоже можно рассматривать как категорию).

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

image

Данные

Исторически название полей в реляционных базах данных должно быть snake_case, но современные БД хорошо различают регистр, и поэтому удобно именовать поля так же, как они будут в JavaScript на фронтенде - тогда можно избежать преобразования имен туда-обратно, что зачастую может вылиться в очень немаленький бойлерплейт на бэкенде.

Category table

image

Product table

image

Category-product join table

image

В классических реляционных базах данных все данные находились в таблицах, большинство полей (колонок таблиц) было либо числом, либо строкой, либо timestamp. Соответственно, для firstName пользователя было своё поле, для lastName - своё. В итоге у Magento, например, свыше 200 таблиц в минимальной версии, и у некоторых таблиц могут быть десятки полей.

JSON поля сильно упрощают работу с данными и таблицами. В нашем случае у product есть два json поля - desc и data. В первом будут храниться данные, которые надо передать на фронтенд при запросе категории товаров (краткая информация по товарам), в data - уже полное описание товара для показа на странице товара, включая, например, отзывы пользователей. data будет намного больше по объему, чем desc. Это позволит делать запросы на бэкенд эффективно.

Поиск по json полям

Одно из преимуществ реляционных баз данных - индексация полей и быстрый поиск по ним даже с десятками миллионов записей в таблице.

У нас есть форма поиска на сайте, мы захотим искать по полному описанию товара, который находится в data поле таблицы product. Это тоже возможно, потому что MySQL, например, по каждому параметру внутри json поля, по которому должен быть поиск, создает дополнительное виртуальное поле в этой таблице, и индексирует его для оптимизации поиска или join-ов. Postgres наверняка делает примерно то же самое.

- +
Skip to content

Модель данных в базе данных

Сущности

На данный момент у нас есть сущности product и category. Отношение между ними - many-to-many. Один продукт может находиться в нескольких категориях (с учетом того, что конкретный магазин маркетплейса тоже можно рассматривать как категорию).

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

image

Данные

Исторически название полей в реляционных базах данных должно быть snake_case, но современные БД хорошо различают регистр, и поэтому удобно именовать поля так же, как они будут в JavaScript на фронтенде - тогда можно избежать преобразования имен туда-обратно, что зачастую может вылиться в очень немаленький бойлерплейт на бэкенде.

Category table

image

Product table

image

Category-product join table

image

В классических реляционных базах данных все данные находились в таблицах, большинство полей (колонок таблиц) было либо числом, либо строкой, либо timestamp. Соответственно, для firstName пользователя было своё поле, для lastName - своё. В итоге у Magento, например, свыше 200 таблиц в минимальной версии, и у некоторых таблиц могут быть десятки полей.

JSON поля сильно упрощают работу с данными и таблицами. В нашем случае у product есть два json поля - desc и data. В первом будут храниться данные, которые надо передать на фронтенд при запросе категории товаров (краткая информация по товарам), в data - уже полное описание товара для показа на странице товара, включая, например, отзывы пользователей. data будет намного больше по объему, чем desc. Это позволит делать запросы на бэкенд эффективно.

Поиск по json полям

Одно из преимуществ реляционных баз данных - индексация полей и быстрый поиск по ним даже с десятками миллионов записей в таблице.

У нас есть форма поиска на сайте, мы захотим искать по полному описанию товара, который находится в data поле таблицы product. Это тоже возможно, потому что MySQL, например, по каждому параметру внутри json поля, по которому должен быть поиск, создает дополнительное виртуальное поле в этой таблице, и индексирует его для оптимизации поиска или join-ов. Postgres наверняка делает примерно то же самое.

+ \ No newline at end of file diff --git a/ru/arty-crafty/backend/hoppscotch.html b/ru/arty-crafty/backend/hoppscotch.html index 3d377e7ca..5490ab286 100644 --- a/ru/arty-crafty/backend/hoppscotch.html +++ b/ru/arty-crafty/backend/hoppscotch.html @@ -6,13 +6,13 @@ Hoppscotch | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

Hoppscotch

Работа с API

Для работы и тестирования API обычно используется инструмент типа Postman, умеющий делать REST запросы и всё остальное, с ним связанное. Однако, как это часто бывает с монополистом, Postman сильно отяжелел за последние годы и работать с ним не очень комфортно.

Одной из удобных альтернатив является Hopscotch, в девичестве - Postwoman. Он работает из браузера или как PWA приложение, имеет весь необходимый нам функционал и написан на Vue.

image

- +
Skip to content

Hoppscotch

Работа с API

Для работы и тестирования API обычно используется инструмент типа Postman, умеющий делать REST запросы и всё остальное, с ним связанное. Однако, как это часто бывает с монополистом, Postman сильно отяжелел за последние годы и работать с ним не очень комфортно.

Одной из удобных альтернатив является Hopscotch, в девичестве - Postwoman. Он работает из браузера или как PWA приложение, имеет весь необходимый нам функционал и написан на Vue.

image

+ \ 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 16e8b9882..9d8dc8fb0 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 - + - + - - + + @@ -34,7 +34,7 @@ -
Skip to content

Supabase REST API

Supabase SDK

Supabase автоматически генерит эндпойнты для доступа к нашим таблицам. Обращаться к ним можно либо через Supabase SDK.

Установка:

sh
 pnpm add @supabase/supabase-js

Использование:

js
import { createClient } from "@supabase/supabase-js";
+    
Skip to content

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");
@@ -66,8 +66,8 @@
 
 curl -X DELETE 'https://client_id.supabase.co/rest/v1/product?some_column=eq.someValue' \
 -H "apikey: SUPABASE_CLIENT_ANON_KEY" \
--H "Authorization: Bearer SUPABASE_CLIENT_ANON_KEY"

Мы будем использовать второй способ, - опять же, чтобы не внедрять необязательные зависимости. Плюс, дебажить явные HTTP запросы намного проще.

- +-H "Authorization: Bearer SUPABASE_CLIENT_ANON_KEY"

Мы будем использовать второй способ, - опять же, чтобы не внедрять необязательные зависимости. Плюс, дебажить явные HTTP запросы намного проще.

+ \ No newline at end of file diff --git a/ru/arty-crafty/backend/supabase.html b/ru/arty-crafty/backend/supabase.html index 8dbcfd8dc..1ff58218e 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 4d8bbcad6..ca1dfc6a7 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 ea0e014e3..b1e6d5077 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 dbeed175d..0971ae1f5 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 bda46b711..c3ab433ad 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/codeium.html b/ru/arty-crafty/showcase/codeium.html index fe2caeba8..451c1750d 100644 --- a/ru/arty-crafty/showcase/codeium.html +++ b/ru/arty-crafty/showcase/codeium.html @@ -6,13 +6,13 @@ Codeium | Vue FAQ - + - + - - + + @@ -34,15 +34,15 @@ -
Skip to content

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
/**
+    
Skip to content

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.
  */
 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.

Вывод

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.

Вывод

Codeium - не панацея, если не умеешь программировать, но экономит много времени, если что-то умеешь.

+ \ No newline at end of file diff --git a/ru/arty-crafty/showcase/customization.html b/ru/arty-crafty/showcase/customization.html index dbf54556a..be5587493 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 0e32589bc..ccdb4eefe 100644 --- a/ru/arty-crafty/showcase/favourites.html +++ b/ru/arty-crafty/showcase/favourites.html @@ -6,13 +6,13 @@ Избранное | Vue FAQ - + - + - - + + @@ -34,7 +34,7 @@ -
Skip to content

Избранное

Иконка на карточке товара

При работе в карточками товара у нас появилась необходимость в "Избранном". На каждой карточке есть иконка "сердечка", которая при клике загорается или гаснет, - товар кладется в "Избранное" или убирается оттуда. Кроме того, есть отдельная страница "Избранное", показывающая все товары из него в том же виде, что и любая категория. А так же в главном AppHeader у нас есть иконка/ссылка "Избранное" с бэджиком, показывающим число товаров в нём.

Это первый случай, когда в приложении нужно использовать то, что на фронтенде гордо называется state, для своей работы требующий отдельный state manager. Благо, Vue 3 Composition API низвело этого царька до рядового члена команды, и с ним теперь можно работать как с обычной переменной, только реактивной.

Композабл useFavourites

В композабле useFavourites для вышеуказанных задач нужны три функции: toggleFavourite, listFavourites, isInFavourites (чтобы подсвечивать иконку "сердечка").

Сам код
js
// src/producs/composables/useFavourites.ts
+    
Skip to content

Избранное

Иконка на карточке товара

При работе в карточками товара у нас появилась необходимость в "Избранном". На каждой карточке есть иконка "сердечка", которая при клике загорается или гаснет, - товар кладется в "Избранное" или убирается оттуда. Кроме того, есть отдельная страница "Избранное", показывающая все товары из него в том же виде, что и любая категория. А так же в главном 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());
@@ -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 4209cda38..891da34fa 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 4ac8134d5..0a1e3d5cc 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 9c77608a9..3b39777dd 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 05354e897..c65c415a2 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 c4d70bd26..f85f935a9 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 a3258d7d1..67a2d18a3 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 a19b08c83..e6cbb8904 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 8c39710be..9bd4c3b32 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 a19e0b2fd..943734240 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 e9902cb51..688b64995 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 f33f74bae..2f5cbb725 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 aab92d0ab..e99d49cbe 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 5d02373d5..b34099d83 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 56d10c580..096fc3275 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 82c8fd620..2eb064578 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 393f22d18..3d3546c19 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 36081bc53..99db5aee5 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 1a118e900..e42b86552 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 69dc407a6..e4ec71c8b 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 8a813cd00..86da5078f 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 379206f79..013b9bef9 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 affde813f..cfcdedc3e 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 76ce1b47e..15e96b46d 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 48b1c729e..44bccd004 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 19a44ef4a..02134e582 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 815652325..3daeaa306 100644 --- a/ru/development/architectural-patterns.html +++ b/ru/development/architectural-patterns.html @@ -6,13 +6,13 @@ Архитектурные решения | Vue FAQ - + - + - - + + @@ -80,8 +80,8 @@ meta: { requiresAuth: true, backRoute: "/" }, } ] -}; - +}; + \ No newline at end of file diff --git a/ru/development/assets.html b/ru/development/assets.html index e4db9f453..589c5ff53 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 476cb44e5..52f28fdc8 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 b590e69f8..1dfc5df23 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 bc23a7a24..f3a25fd12 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 55bde5642..f88ec6af9 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 00268a474..2839d6ea7 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 e0e10f289..acbd8e740 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 550ddd463..04b80a2a6 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 13622469e..dd3192322 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 581fe0632..b1b567872 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 46cd5d709..9efdb0629 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 1eadfc0ce..29e8e1988 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 e11533dd6..2439ef910 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 db6a1cc29..4f2d9f6e1 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 59fa0f621..a912fcce4 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 97645bb70..e55b62d6b 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 0d0ef2d8b..85c46c327 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 4b6233b17..bf39723c1 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 927f39637..35e8d0ad8 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 59e3e1b00..dbd1f8a5f 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 aeb66b278..7109a9c14 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 a7c7c8dc5..1b331e64b 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 5eecdd630..3304f0062 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 62ea2f0e5..9aa5f83c5 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 2e6908103..4305297bc 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 1bfb90ef8..f2ee52e86 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 7b6e2127e..a2d5357f7 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 ddc1552f2..bbda10d76 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 1412d8ea2..04fe5184d 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 98c68c74e..0c49ff495 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 4c767d16a..acf89fc64 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 2486fb846..cbeb28848 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 cba8d9f2d..8eca90af9 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 c3cc10c26..1810a3b4c 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 ef1918430..c3c3a8268 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 bbc0a9841..b47aeb72a 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 6265d0b49..521b258ec 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 fccd19c96..088269878 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 91d118bfa..1d4071cd5 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 63b30a9f8..40d1748a1 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 662263ed2..5657c23f4 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