PageSourceSearch

https://nianticspatial.com/assets/DPiYQF2U.min.js

js nianticspatial.com collected 2026-10-09 22:39:06 UTC 30,663 bytes, 276 lines download raw bytes

1var e=[{id:`free`,mo:0,yr:0,cr:2e4,topup:0,spl:0,seats:5},{id:`plus`,mo:20,yr:200,cr:4e4,topup:1,spl:5,seats:10},{id:`pro`,mo:50,yr:500,cr:105e3,topup:1,spl:10,seats:25}],t={gov:`Enterprise is also available for public sector and defense with on-prem deployment, offline localization, and custom SLAs.`,tech:``,ind:`Industrial and manufacturing environments benefit from Pro priority processing and 360 degree support for facility mapping and inspection workflows.`,retail:`Retail teams use Scaniverse for store layout capture, virtual try-on environments, and embeddable 3D product displays.`,fin:``,health:`Healthcare and life sciences teams use Scaniverse for facility documentation and research-grade 3D capture.`,edu:`Free is a good starting point; Plus or Pro supports lab-scale or multi-researcher deployments.`,ent2:`Entertainment workflows often require high-quality 360 degree splats — HD Mode is available on Plus and Pro.`,re:`Real estate and construction teams benefit from watermark-free exports, embeddable viewers, and priority processing for large sites.`,oil:`Energy and utilities environments often involve large complex sites — Pro priority processing and 360 degree support are well suited.`,trans:`Transportation and logistics teams use Scaniverse for depot mapping, route documentation, and autonomous platform localization.`,hosp:`Hospitality teams use Scaniverse for immersive property tours, venue scanning, and embeddable 3D experiences.`,other:``},n=`You own the assets you generate and can use them freely for your own projects. Resale rights depend on your plan: Free and Plus plans do not include commercial resale rights. Pro and Enterprise plans include commercial resale rights.`,r=30,i=120,a=1800,o=2e3,s=2100,c=2400,l=60/45*9.29,u=250,d=`—`,f=class extends HTMLElement{plans=e;customPlanUrl=`https://www.nianticspatial.com/capture/contact-sales`;contactSalesUrl=`https://www.nianticspatial.com/capture/contact-sales`;freeSignupUrl=`https://scaniverse.nianticspatial.com/signup`;plusMonthlyUrl=`https://scaniverse.nianticspatial.com/signup?plan=plus_monthly`;plusAnnualUrl=`https://scaniverse.nianticspatial.com/signup?plan=plus_yearly`;proMonthlyUrl=`https://scaniverse.nianticspatial.com/signup?plan=pro_monthly`;proAnnualUrl=`https://scaniverse.nianticspatial.com/signup?plan=pro_yearly`;annual=!1;expanded=!1;S={};connectedCallback(){this.injectStyles(),this.customPlanUrl=this.dataset.customPlanUrl||this.customPlanUrl,this.contactSalesUrl=this.dataset.contactSalesUrl||this.contactSalesUrl,this.freeSignupUrl=this.dataset.freeSignupUrl||this.freeSignupUrl,this.plusMonthlyUrl=this.dataset.plusMonthlyUrl||this.plusMonthlyUrl,this.plusAnnualUrl=this.dataset.plusAnnualUrl||this.plusAnnualUrl,this.proMonthlyUrl=this.dataset.proMonthlyUrl||this.proMonthlyUrl,this.proAnnualUrl=this.dataset.proAnnualUrl||this.proAnnualUrl,this.querySelectorAll(`[data-g]`).forEach(e=>{e.addEventListener(`click`,()=>this.onPick(e))}),this.slot(`ind-select`)?.addEventListener(`change`,()=>this.onPickInd()),this.slot(`collapse-hdr`)?.addEventListener(`click`,()=>this.onToggleUsage()),this.slot(`mob`)?.addEventListener(`input`,()=>this.onSliders()),this.slot(`s360`)?.addEventListener(`input`,()=>this.onSliders()),this.slot(`btn-mo`)?.addEventListener(`click`,()=>this.onSetBilling(!1)),this.slot(`btn-yr`)?.addEventListener(`click`,()=>this.onSetBilling(!0))}injectStyles(){if(document.getElementById(`root-plan-calculator-styles`))return;let e=document.createElement(`style`);e.id=`root-plan-calculator-styles`,e.textContent=`
2  .sv-calc {
3    --br: #678BC7;
4    --brd: #5577b3;
5    color: #111;
6  }
7  .sv-calc *, .sv-calc *::before, .sv-calc *::after {
8    box-sizing: border-box;
9    margin: 0;
10    padding: 0;
11  }
12  .sv-calc .wrap {
13    max-width: 880px;
14    margin: 0 auto;
15    padding: 0 1.5rem;
16  }
17  .sv-calc .card {
18    background: #fff;
19    border-radius: 12px;
20    border: 1px solid #e8e8e8;
21    padding: 1.5rem;
22    margin-bottom: 1rem;
23  }
24  .sv-calc .card h2 {
25    font-size: .8rem;
26    font-weight: 600;
27    text-transform: uppercase;
28    letter-spacing: .06em;
29    color: #888;
30    margin-bottom: 1.1rem;
31  }
32  .sv-calc .field { margin-bottom: 1.1rem; }
33  .sv-calc .field:last-child { margin-bottom: 0; }
34  .sv-calc .field label {
35    display: flex;
36    justify-content: space-between;
37    align-items: center;
38    font-size: .875rem;
39    font-weight: 500;
40    color: #333;
41    margin-bottom: .5rem;
42  }
43  .sv-calc .field label span { font-weight: 400; color: var(--br); font-size: .85rem; }
44  .sv-calc input[type=range] {
45    -webkit-appearance: none;
46    width: 100%;
47    height: 4px;
48    border-radius: 4px;
49    background: #e0e0e0;
50    outline: none;
51  }
52  .sv-calc input[type=range]::-webkit-slider-thumb {
53    -webkit-appearance: none;
54    width: 18px;
55    height: 18px;
56    border-radius: 50%;
57    background: var(--br);
58    cursor: pointer;
59    border: 2px solid #fff;
60    box-shadow: 0 1px 4px rgba(0,0,0,.18);
61  }
62  .sv-calc input[type=range]::-moz-range-thumb {
63    width: 18px;
64    height: 18px;
65    border-radius: 50%;
66    background: var(--br);
67    cursor: pointer;
68    border: 2px solid #fff;
69  }
70  .sv-calc .q-block { margin-bottom: 1.25rem; }
71  .sv-calc .q-block:last-child { margin-bottom: 0; }
72  .sv-calc .q-label { font-size: .875rem; font-weight: 500; color: #333; margin-bottom: .6rem; }
73  .sv-calc .q-opts { display: flex; flex-wrap: wrap; gap: .5rem; }
74  .sv-calc .q-opt {
75    font-size: .82rem;
76    padding: 6px 14px;
77    border-radius: 8px;
78    border: 1.5px solid #ddd;
79    background: #fff;
80    color: #555;
81    cursor: pointer;
82    font-family: inherit;
83    transition: border-color .15s, color .15s, background .15s;
84  }
85  .sv-calc .q-opt:hover { border-color: var(--br); color: var(--br); }
86  .sv-calc .q-opt.sel { border-color: var(--br); background: #eef3fb; color: var(--br); font-weight: 500; }
87  .sv-calc .ind-select {
88    width: 100%;
89    padding: 8px 12px;
90    font-size: .85rem;
91    font-family: inherit;
92    border: 1.5px solid #ddd;
93    border-radius: 8px;
94    background: #fff;
95    color: #555;
96    cursor: pointer;
97    outline: none;
98  }
99  .sv-calc .ind-select:focus { border-color: var(--br); }
100  .sv-calc .billing-row {
101    display: flex;
102    align-items: center;
103    justify-content: center;
104    gap: .5rem;
105    margin-bottom: 1rem;
106  }
107  .sv-calc .billing-row .lbl { font-size: .85rem; color: #555; }
108  .sv-calc .pill { display: inline-flex; background: #ebebeb; border-radius: 999px; padding: 3px; gap: 2px; }
109  .sv-calc .pill-btn {
110    display: inline-flex;
111    align-items: center;
112    gap: 6px;
113    font-size: .82rem;
114    font-weight: 500;
115    padding: 5px 16px;
116    border-radius: 999px;
117    border: none;
118    cursor: pointer;
119    font-family: inherit;
120    background: transparent;
121    color: #888;
122  }
123  .sv-calc .pill-btn.on { background: #fff; color: #111; box-shadow: 0 1px 3px rgba(0,0,0,.1); }
124  .sv-calc .pill-savings {
125    background: #dcf5e0;
126    color: #2d7a3a;
127    font-size: 11px;
128    font-weight: 500;
129    padding: 2px 7px;
130    border-radius: 999px;
131    line-height: 1;
132  }
133  .sv-calc .collapse-hdr {
134    display: flex;
135    align-items: center;
136    justify-content: space-between;
137    cursor: pointer;
138    user-select: none;
139  }
140  .sv-calc .collapse-hdr strong { font-size: .9rem; color: #333; }
141  .sv-calc .collapse-hdr small { display: block; font-size: .78rem; color: #888; margin-top: 2px; }
142  .sv-calc .chevron { font-size: 1rem; color: #aaa; transition: transform .2s; }
143  .sv-calc .chevron.open { transform: rotate(180deg); }
144  .sv-calc .collapse-body { overflow: hidden; max-height: 0; transition: max-height .3s ease; }
145  .sv-calc .collapse-body.open { max-height: 700px; padding-bottom: 6px; }
146  .sv-calc .divider { border: none; border-top: 1px solid #f0f0f0; margin: 1.1rem 0; }
147  .sv-calc .result {
148    background: #fff;
149    border-radius: 12px;
150    border: 2px solid var(--br);
151    padding: 1.5rem;
152  }
153  .sv-calc .result.hidden { display: none; }
154  .sv-calc .res-hdr { display: flex; align-items: flex-start; justify-content: space-between; margin-bottom: .75rem; }
155  .sv-calc .res-name { font-size: 1.25rem; font-weight: 700; }
156  .sv-calc .badge {
157    display: inline-block;
158    background: var(--br);
159    color: #fff;
160    font-size: .72rem;
161    font-weight: 600;
162    padding: 3px 10px;
163    border-radius: 20px;
164    text-transform: uppercase;
165    letter-spacing: .04em;
166    margin-top: 4px;
167  }
168  .sv-calc .res-price { text-align: right; }
169  .sv-calc .res-price .amt { font-size: 1.5rem; font-weight: 700; }
170  .sv-calc .res-price .amt small, .sv-calc .crd-price small { font-size: .78rem; font-weight: 500; color: #666; }
171  .sv-calc .res-price .est { font-size: .78rem; font-weight: 600; color: var(--br); margin-top: 2px; }
172  .sv-calc .res-price .savings-inline { color: #2d7a3a; font-weight: 600; }
173  .sv-calc .promo-banner {
174    background: #f0faf4;
175    border: 1px solid #b6e2c6;
176    color: #1a7a3a;
177    border-radius: 8px;
178    padding: .65rem 1rem;
179    margin-bottom: 1rem;
180    font-size: .83rem;
181  }
182  .sv-calc .res-reason {
183    font-size: .75rem;
184    color: #555;
185    line-height: 1.6;
186    margin-bottom: 1.5rem;
187    border-top: 1px solid #f0f0f0;
188    padding-top: .9rem;
189  }
190  .sv-calc .crd-grid { display: grid; grid-template-columns: 1fr 1fr; gap: .75rem; margin-bottom: 1rem; align-items: stretch; }
191  .sv-calc .crd {
192    border-radius: 8px;
193    border: 1.5px solid #e8e8e8;
194    padding: .9rem 1rem 5rem;
195    font-size: .82rem;
196    position: relative;
197    height: 100%;
198  }
199  .sv-calc .crd.rec { border-color: var(--br); background: #f5f8fd; padding-bottom: 9rem; }
200  .sv-calc .crd-badge {
201    position: absolute;
202    top: 0;
203    right: 0;
204    background: #2d7a3a;
205    color: #fff;
206    font-size: .68rem;
207    font-weight: 700;
208    padding: 4px 10px;
209    border-radius: 0 7px 0 7px;
210    letter-spacing: .03em;
211    text-align: center;
212    line-height: 1.4;
213  }
214  .sv-calc .crd-name { font-weight: 700; font-size: .95rem; margin-bottom: .15rem; }
215  .sv-calc .crd-header { padding-bottom: .4rem; }
216  .sv-calc .crd-header.with-extra { padding-bottom: 0; }
217  .sv-calc .crd-price { font-size: 1.1rem; font-weight: 700; margin-bottom: .6rem; }
218  .sv-calc .crd-subprice { font-size: .78rem; font-weight: 500; color: #555; margin-top: -.4rem; margin-bottom: .6rem; }
219  .sv-calc .crd-topup-line { font-size: .72rem; font-weight: 600; color: var(--br); margin-top: -.4rem; margin-bottom: .5rem; line-height: 1.4; min-height: 1rem; }
220  .sv-calc .crd-compare { font-size: .72rem; font-weight: 600; margin-top: -.4rem; margin-bottom: .5rem; line-height: 1.4; min-height: 1rem; }
221  .sv-calc .crd-tagline { font-size: .72rem; font-style: italic; color: #666; line-height: 1.4; text-align: center; margin-top: .5rem; }
222  .sv-calc .crd-strike { color: #999; text-decoration: line-through; }
223  .sv-calc .crd-savings { color: #2d7a3a; font-weight: 700; }
224  .sv-calc .crd-row { display: flex; justify-content: space-between; color: #555; margin-bottom: .25rem; font-size: .79rem; gap: .5rem; }
225  .sv-calc .crd-row span:first-child { flex-shrink: 0; }
226  .sv-calc .crd-row span:last-child { font-weight: 500; color: #333; text-align: right; }
227  .sv-calc .crd-row.hi span { color: var(--br); font-weight: 600; }
228  .sv-calc .crd-or { font-size: .72rem; color: #aaa; font-style: italic; margin: .1rem 0 .2rem; letter-spacing: .03em; }
229  .sv-calc .crd-sep { border: none; border-top: 1px solid #e8e8e8; margin: .4rem 0; }
230  .sv-calc .crd-footer { position: absolute; left: 1rem; right: 1rem; bottom: .9rem; }
231  .sv-calc .crd-promo { background: #f0faf4; border: 1px solid #b6e2c6; border-radius: 6px; padding: .45rem .65rem; font-size: .75rem; color: #1a7a3a; margin: 0 0 .5rem; }
232  .sv-calc .crd-cta {
233    display: flex;
234    align-items: center;
235    justify-content: center;
236    text-align: center;
237    border-radius: 7px;
238    padding: .6rem .5rem;
239    font-size: .82rem;
240    font-weight: 600;
241    text-decoration: none;
242    cursor: pointer;
243    background: #f0f0f0;
244    color: #555;
245    min-height: 2.4rem;
246    line-height: 1;
247  }
248  .sv-calc .crd-cta.primary { background: var(--br); color: #fff; }
249  .sv-calc .ent-note { font-size: .78rem; color: #888; margin-top: .5rem; line-height: 1.5; }
250  .sv-calc .alt { font-size: .8rem; color: #888; margin-top: .75rem; }
251  .sv-calc .alt a { color: var(--br); text-decoration: none; cursor: pointer; font-weight: 500; }
252  .sv-calc .pending { text-align: center; color: #aaa; font-size: .82rem; padding: 1rem 0; }
253  .sv-calc a.cta {
254    display: inline-block;
255    background: var(--br);
256    color: #fff;
257    border-radius: 8px;
258    padding: .6rem 1.2rem;
259    font-size: .85rem;
260    font-weight: 600;
261    cursor: pointer;
262    text-decoration: none;
263  }
264  .sv-calc a.cta:hover { background: var(--brd); }
265  .sv-calc .cr-box { background: #f7f8fa; border-radius: 10px; padding: 1rem; margin-bottom: 1rem; }
266  .sv-calc .cr-grid { display: grid; grid-template-columns: 1fr auto auto; gap: 0 1.25rem; font-size: .82rem; }
267  .sv-calc .cr-hd { color: #888; font-size: .72rem; font-weight: 600; text-transform: uppercase; letter-spacing: .05em; padding-bottom: 8px; border-bottom: 1px solid #e0e0e0; }
268  .sv-calc .cr-hd-r { text-align: right; }
269  .sv-calc .cr-cell { padding: 6px 0 2px; color: #111; white-space: nowrap; }
270  .sv-calc .cr-cell-r { text-align: right; }
271  .sv-calc .cr-area { color: #888; }
272  .sv-calc .cr-val { font-weight: 600; color: #678BC7; }
273  .sv-calc .cr-total { grid-column: 1 / 3; font-weight: 600; color: #111; border-top: 1px solid #e0e0e0; padding-top: 8px; margin-top: 4px; }
274  .sv-calc .cr-total-val { font-weight: 700; color: #678BC7; border-top: 1px solid #e0e0e0; padding-top: 8px; margin-top: 4px; text-align: right; white-space: nowrap; }
275  .sv-calc .cr-note { margin-top: 10px; padding-top: 10px; border-top: 1px solid #e0e0e0; font-size: .72rem; color: #888; line-height: 1.7; }
276`,document.head.appendChild(e)}slot(e){return this.querySelector(`[data-slot="${e}"]`)}rangeVal(e){return parseInt(this.slot(e)?.value||`0`)||0}onPick(e){let t=e.dataset.g;this.querySelectorAll(`[data-g="${t}
276"]`).forEach(e=>e.classList.remove(`sel`)),e.classList.add(`sel`),this.S[t]=e.dataset.v,this.go()}onPickInd(){this.S.ind=this.slot(`ind-select`)?.value||``,this.go()}onSliders(){let e=this.rangeVal(`mob`),t=this.rangeVal(`s360`),n=this.slot(`v-mob`),r=this.slot(`v-s360`);n&&(n.textContent=this.fmtArea(e)),r&&(r.textContent=this.fmtArea(t)),this.go()}onToggleUsage(){this.expanded=!this.expanded,this.slot(`ubody`)?.classList.toggle(`open`,this.expanded),this.slot(`chev`)?.classList.toggle(`open`,this.expanded),this.go()}onSetBilling(e){this.annual=e,this.slot(`btn-mo`)?.classList.toggle(`on`,!e),this.slot(`btn-yr`)?.classList.toggle(`on`,e),this.go()}numFmt(e){return Number(e).toLocaleString()}mny(e){return`$`+Math.round(e).toLocaleString()}toSqft(e){return Math.round(e*10.764)}fmtArea(e){return this.numFmt(e)+` sqm (`+this.numFmt(this.toSqft(e))+` sqft)`}pmoPlan(e){return this.annual?Math.round(e.yr/12):e.mo}cap(e){return e.charAt(0).toUpperCase()+e.slice(1)}signupUrl(e){return e===`plus`?this.annual?this.plusAnnualUrl:this.plusMonthlyUrl:e===`pro`?this.annual?this.proAnnualUrl:this.proMonthlyUrl:`#`}rateFor(e){return e===`custom`?c:e===`pro`?s:e===`free`?a:o}topupCostFor(e,t){return e<=0?0:Math.max(5,Math.round(e/this.rateFor(t)))}getCredits(){let e=this.rangeVal(`mob`),t=this.rangeVal(`s360`),n=e/l*60*r,a=t/u*60*i;return{mCr:n,sCr:a,tot:n+a}}buildContactUrl(e,t,n){let r={free:`5`,plus:`6-10`,pro:`11-25`,ent:`26+`},i={tech:`Technology`,ind:`Industrial and Manufacturing`,retail:`Retail and eCommerce`,fin:`Financial Services`,health:`Healthcare and Life Sciences`,edu:`Education`,ent2:`Media, Entertainment and Sports`,re:`Construction and Real Estate`,oil:`Energy and Utilities`,trans:`Transportation and Logistics`,hosp:`Hospitality and Travel`,other:`Other`};try{let a=new URL(e);this.S.team&&a.searchParams.set(`calc_seats`,r[this.S.team]??this.S.team),this.S.ind&&a.searchParams.set(`form__industry`,i[this.S.ind]??this.S.ind),this.S.resell&&a.searchParams.set(`calc_commercial`,this.S.resell===`y`?`Yes`:`No`);let o=this.expanded?this.rangeVal(`mob`):0,s=this.expanded?this.rangeVal(`s360`):0;if(o>0&&a.searchParams.set(`calc_mobile_sqm_monthly`,String(o)),s>0&&a.searchParams.set(`calc_360_sqm_monthly`,String(s)),o>0&&a.searchParams.set(`calc_mobile_min_monthly`,String(Math.round(o/l))),s>0&&a.searchParams.set(`calc_360_min_monthly`,String(Math.round(s/u))),a.searchParams.set(`calc_billing`,this.annual?`Annual`:`Monthly`),t&&a.searchParams.set(`calc_plan`,t.charAt(0).toUpperCase()+t.slice(1)),n)for(let[e,t]of Object.entries(n))a.searchParams.set(e,t);return a.toString()}catch{return e}}cRow(e,t,n=!1){return`<div class="crd-row${n?` hi`:``}"><span>${e}</span><span>${t}</span></div>`}buildCard(e){let t=e.extraCr>0,n=this.topupCostFor(e.extraCr,e.pid),r=(e.mobUsed||e.s360Used)&&e.mobCr+e.s360Cr>0,i=r?e.mobCr/(e.mobCr+e.s360Cr):0,a=r?e.s360Cr/(e.mobCr+e.s360Cr):0,o=`<div class="crd${e.rec?` rec`:``}">`+(e.badge?`<div class="crd-badge">${e.badge}</div>`:``)+`<div class="crd-name">${e.name}${e.rec?` &#10003;`:``}</div><div class="crd-header${t?` with-extra`:``}">`;if(this.annual&&e.planMo>0){let t=e.pid===`plus`?`$200/yr`:e.pid===`pro`?`$500/yr`:this.mny(e.planMo*12)+`/yr`;o+=`<div class="crd-price">${this.mny(e.planMo)}<small>/mo, billed annually</small></div><div class="crd-subprice">${t}</div>`}else o+=`<div class="crd-price">${this.mny(e.planMo)}<small> ${e.sub}</small></div>`;t&&(o+=`<div class="crd-topup-line">+ top-ups (billed as purchased)</div>`),o+=`</div>`,o+=this.cRow(`Total/mo`,this.mny(e.totalMo),!0)+this.cRow(`Plan/mo`,this.mny(e.planMo))+this.cRow(`Top-up credits/mo`,t?this.mny(n):d),o+=`<hr class="crd-sep">`,o+=this.cRow(`Monthly credits`,this.numFmt(Math.round(e.inclCr))),r?(e.mobUsed&&(o+=this.cRow(`Mobile capture processing`,Math.floor(e.inclCr*i/1800)+` min`)),e.mobUsed&&e.s360Used&&(o+=`<div class="crd-or">and</div>`),e.s360Used&&(o+=e.spl>0?this.cRow(`360&#176; capture processing`,Math.floor(e.inclCr*a/7200)+` min`):this.cRow(`360&#176; capture processing`,`Not supported`))):o+=this.cRow(`Mobile capture processing`,`Up to `+Math.floor(e.inclCr/1800)+` min`)+`<div class="crd-or">or</div>`+this.cRow(`360&#176; capture processing`,e.spl>0?`Up to `+Math.floor(e.inclCr/7200)+` min`:`Not supported`),o+=`<hr class="crd-sep">`,t?(o+=this.cRow(`Monthly top-up credits`,this.numFmt(Math.round(e.extraCr))),e.mobUsed&&(o+=this.cRow(`Mobile capture processing`,Math.floor(e.extraCr*i/1800)+` min`)),e.mobUsed&&e.s360Used&&(o+=`<div class="crd-or">and</div>`),e.s360Used&&(o+=this.cRow(`360&#176; capture processing`,Math.floor(e.extraCr/7200)+` min`))):(o+=this.cRow(`Monthly top-up credits`,d),(e.mobUsed||!r)&&(o+=this.cRow(`Mobile capture processing`,d)),e.mobUsed&&e.s360Used&&(o+=`<div class="crd-or">and</div>`),(e.s360Used||!r)&&(o+=this.cRow(`360&#176; capture processing`,d))),o+=`<hr class="crd-sep">`+this.cRow(`Max seats`,String(e.seats));let s=``;e.pid===`free`?s=`Additional on-demand top-ups available at 1,800 credits/$1.`:e.pid===`plus`?s=`On-demand top-ups above priced at 2,000 credits/$1.`:e.pid===`pro`&&(s=`On-demand top-ups above priced at 2,100 credits/$1.`);let c=e.href||`#`;return o+=`<div class="crd-footer"><a href="${c}"${c===`#`?``:` target="_blank"`} class="crd-cta${e.rec?` primary`:``}">${e.ctaText}</a>`+(s?`<div class="crd-tagline">${s}</div>`:``)+`</div></div>`,o}buildCustomCard(e,t,n,r,i,a,o,s,c,l,u){let f=e*.9,p=this.S.team===`ent`?`26+`:`25`,m=r?e*.75:e,h=u?Math.max(0,u-m):0,g=h>0?`BEST VALUE<br><span style="font-size:.62rem;font-weight:500;opacity:.9;">Save ${this.mny(h)}/mo</span>`:`BEST VALUE`,_=(o||s)&&c+l>0,v=_?c/(c+l):0,y=_?l/(c+l):0,b=`<div class="crd rec"><div class="crd-badge">${g}</div><div class="crd-name">Custom Plan &#10003;</div><div class="crd-header${u?` with-extra`:``}">`;b+=r?`<div class="crd-price">${this.mny(e*.75)}<small>/mo, billed annually</small></div><div class="crd-subprice">${this.mny(e*.75*12)}/yr</div>`:`<div class="crd-price">${this.mny(e)}<small> flat rate/mo</small></div>`,u&&h>0&&(b+=`<div class="crd-compare"><span class="crd-strike">${this.mny(u)}/mo on Pro</span> &mdash; <span class="crd-savings">Save ${this.mny(h)}/mo</span></div>`),b+=`</div>`,b+=this.cRow(`Total/mo`,this.mny(r?e*.75:e),!0)+this.cRow(`Plan/mo`,d)+this.cRow(`Top-up credits/mo`,d),b+=`<hr class="crd-sep">`+this.cRow(`Monthly credits`,this.numFmt(Math.round(t))),_?(o&&(b+=this.cRow(`Mobile capture processing`,Math.floor(t*v/1800)+` min`)),o&&s&&(b+=`<div class="crd-or">and</div>`),s&&(b+=this.cRow(`360&#176; capture processing`,Math.floor(t*y/7200)+` min`))):b+=this.cRow(`Mobile capture processing`,`Up to `+Math.floor(t/1800)+` min`)+`<div class="crd-or">or</div>`+this.cRow(`360&#176; capture processing`,`Up to `+Math.floor(t/7200)+` min`),b+=`<hr class="crd-sep">`+this.cRow(`Monthly top-up credits`,d),(o||!_)&&(b+=this.cRow(`Mobile capture processing`,d)),o&&s&&(b+=`<div class="crd-or">and</div>`),(s||!_)&&(b+=this.cRow(`360&#176; capture processing`,d)),b+=`<hr class="crd-sep">`+this.cRow(`Max seats`,p),b+=`<div class="crd-promo">Buy today: <strong>${this.mny(r?a:f)}${r?`/yr`:`/mo`}</strong> &mdash; ${r?`25% annual discount + 10% off first 3 months`:`10% off your first 3 months (3-month minimum)`}</div>`;let x=r?e*.75:e,S=this.buildContactUrl(this.customPlanUrl,`custom`,{calc_total_credits:String(Math.round(t)),c
276alc_total_price_monthly:String(Math.round(x))});return b+=`<div class="crd-footer"><a href="${S}" target="_blank" class="crd-cta primary">Select Custom Plan</a><div class="crd-tagline">Additional on-demand top-ups available at 2,300 credits/\$1.</div></div></div>`,b}buildEntCard(e,t,n){let r=e||t,i=`<div class="crd rec"><div class="crd-name">Enterprise &#10003;</div><div class="crd-header${n?` with-extra`:``}"><div class="crd-price">Custom</div>`+(this.annual||n?`<div class="crd-subprice">Contact sales for pricing</div>`:``)+`</div>`;return i+=this.cRow(`Total/mo`,`Custom`,!0)+this.cRow(`Plan/mo`,`Custom`)+this.cRow(`Top-up credits/mo`,`Custom`),i+=`<hr class="crd-sep">`+this.cRow(`Monthly credits`,`Custom`),(e||!r)&&(i+=this.cRow(`Mobile capture processing`,`Custom`)),e&&t?i+=`<div class="crd-or">and</div>`:r||(i+=`<div class="crd-or">or</div>`),(t||!r)&&(i+=this.cRow(`360&#176; capture processing`,`Custom`)),i+=`<hr class="crd-sep">`+this.cRow(`Monthly top-up credits`,`Custom`),(e||!r)&&(i+=this.cRow(`Mobile capture processing`,`Custom`)),e&&t&&(i+=`<div class="crd-or">and</div>`),(t||!r)&&(i+=this.cRow(`360&#176; capture processing`,`Custom`)),i+=`<hr class="crd-sep">`+this.cRow(`Max seats`,`Custom`),i+=`<div class="crd-footer"><a href="${this.contactSalesUrl}" target="_blank" class="crd-cta primary">Contact Sales</a></div></div>`,i}entCards(e){let t=this.annual?42:50;return`<div class="res-hdr"><div><div class="res-name">Enterprise</div><span class="badge">Recommended</span></div><div class="res-price"><div class="amt">Custom</div></div></div><div class="res-reason">${e}</div><div style="margin-top:1rem;" class="crd-grid">`+this.buildCard({name:`Start with Pro`,rec:!1,badge:``,planMo:t,sub:`per month`,extraCr:0,pid:`pro`,totalMo:t,inclCr:105e3,spl:10,seats:25,mobUsed:!1,s360Used:!1,mobCr:0,s360Cr:0,href:this.signupUrl(`pro`),ctaText:`Select Pro Plan`})+this.buildEntCard(!1,!1,!1)+`</div><p class="ent-note">When you click Select Pro Plan, we will also notify our sales team so they can reach out about an Enterprise plan.</p>`}go(){let r=this.slot(`pending`),i=this.slot(`result`);if(!i)return;if(!this.S.team){r&&(r.style.display=`block`),i.classList.add(`hidden`);let e=this.slot(`billing-row`);e&&(e.style.display=`none`);return}r&&(r.style.display=`none`);let a=this.slot(`billing-row`);a&&(a.style.display=`flex`),i.classList.remove(`hidden`);let o=this.expanded?this.getCredits():{mCr:0,sCr:0,tot:0},s=o.tot,d=this.expanded?this.rangeVal(`mob`):0,f=this.expanded?this.rangeVal(`s360`):0,p=f/u,m=d>0,h=f>0,g=this.expanded&&s>0;if(this.S.team===`ent`){if(!g){i.innerHTML=this.entCards(`With 26 or more users, your team exceeds our self-serve plan capacity. You can start on Pro now while we set up your Enterprise plan.`);return}let e=s/c,t=e*.75,n=t*12,r=n*.9,a=this.annual?this.mny(t)+`<small>/mo, billed annually</small>`:this.mny(e)+`<small>/mo</small>`,l=this.annual?`<div class="est">${this.mny(n)}/yr</div>`:``,u=this.annual?`<div class="promo-banner">Buy today: <strong>${this.mny(r)}/yr</strong> &mdash; 25% annual discount + 10% off first 3 months</div>`:`<div class="promo-banner">Buy today: <strong>${this.mny(e*.9)}/mo</strong> &mdash; 10% off your first 3 months (3-month minimum)</div>`;i.innerHTML=`<div class="res-hdr"><div><div class="res-name">Custom Plan</div><span class="badge">Recommended</span></div><div class="res-price"><div class="amt">${a}</div>${l}</div></div>`+u+`<div class="res-reason">Based on your usage, a Custom Plan is your best starting point. For teams of 26 or more, Enterprise is also available with custom seat counts, SLAs, and volume pricing.</div><div style="margin-top:1rem;" class="crd-grid">`+this.buildCustomCard(e,s,0,this.annual,n,r,m,h,o.mCr,o.sCr,0)+this.buildEntCard(m,h,!1)+`</div><p class="ent-note">Select Custom Plan to get started, or contact sales to discuss an Enterprise plan tailored to your team.</p>`;return}let _=this.annual?42:50,v=this.expanded?Math.max(0,s-105e3):0,y=_+this.topupCostFor(v,`pro`),b=y*12,x=this.expanded?Math.max(0,s-4e4):0,S=this.expanded?Math.max(0,s-105e3):0,C=this.annual?17:20,w=this.annual?42:50,T=C+this.topupCostFor(x,`plus`),E=w+this.topupCostFor(S,`pro`),D=y>=200&&b<1e4,O=(s>0?s/c:0)*.75,k=O*12,A=k*.9;if(this.expanded&&b>=1e4){i.innerHTML=this.entCards(`Your estimated annual usage exceeds $10,000. Contact sales for an Enterprise plan built around your scale.`);return}let j=[`free`,`plus`,`pro`],M=this.S.team||`free`;if(f>0&&j.indexOf(`plus`)>j.indexOf(M)&&(M=`plus`),this.S.resell===`y`&&j.indexOf(`pro`)>j.indexOf(M)&&(M=`pro`),this.expanded){for(let e=0;e<this.plans.length;e++){let t=this.plans[e];if((p===0||t.spl>0&&p<=t.spl)&&(t.cr>=s||t.topup)){j.indexOf(t.id)>j.indexOf(M)&&(M=t.id);break}}if(M===`plus`){let e=Math.max(0,s-4e4);20+this.topupCostFor(e,`plus`)>=50&&(M=`pro`)}}let N=this.plans.find(e=>e.id===M)??null;N||=this.plans[2]??null;let P=0;this.expanded&&N?.topup&&s>N.cr&&(P=this.topupCostFor(s-N.cr,N.id));let F=this.plans.find(e=>e.id===`plus`)??e[1],I=this.plans.find(e=>e.id===`pro`)??e[2],L=``,R=!1;if(D){R=!0;let e=s/c;L=`<div style="margin-top:1rem;" class="crd-grid">`+this.buildCard({name:`Pro`,rec:!1,badge:``,planMo:w,sub:`per month`,extraCr:S,pid:`pro`,totalMo:E,inclCr:I.cr,spl:I.spl,seats:I.seats,mobUsed:m,s360Used:h,mobCr:o.mCr,s360Cr:o.sCr,href:this.signupUrl(`pro`),ctaText:`Select Pro Plan`})+this.buildCustomCard(e,s,E-e,this.annual,k,A,m,h,o.mCr,o.sCr,E)+`</div>`}else(M===`plus`||M===`pro`)&&(L=`<div style="margin-top:1rem;" class="crd-grid">`+this.buildCard({name:`Plus`,rec:M===`plus`,badge:``,planMo:C,sub:`per month`,extraCr:x,pid:`plus`,totalMo:T,inclCr:F.cr,spl:F.spl,seats:F.seats,mobUsed:m,s360Used:h,mobCr:o.mCr,s360Cr:o.sCr,href:this.signupUrl(`plus`),ctaText:`Select Plus Plan`})+this.buildCard({name:`Pro`,rec:M===`pro`,badge:``,planMo:w,sub:`per month`,extraCr:S,pid:`pro`,totalMo:E,inclCr:I.cr,spl:I.spl,seats:I.seats,mobUsed:m,s360Used:h,mobCr:o.mCr,s360Cr:o.sCr,href:this.signupUrl(`pro`),ctaText:`Select Pro Plan`})+`</div>`);let z=N?this.pmoPlan(N):0,B=z+P,V=R&&s>0?s/c:0,H=R?`Custom Plan`:this.cap(M),U,W=``;if(R){U=this.annual?this.mny(O)+`<small>/mo, billed annually</small>`:this.mny(V)+`<small>/mo</small>`;let e=y-(this.annual?O:V),t=e>0?` &bull;
276 <span class="savings-inline">Save ${this.mny(this.annual?e*12:e)}${this.annual?`/yr`:`/mo`} vs. Pro + top-ups</span>`:``;W=this.annual?`<div class="est">${this.mny(k)}/yr${t}</div>`:e>0?`<div class="est">${t.replace(/^ &bull; /,``)}</div>`:``}else if(!N||N.mo===0)U=`Free`;else if(this.annual){let e=M===`plus`?200:M===`pro`?500:z*12,t=z+P,n=t*12;U=this.mny(t)+`<small>/mo, billed annually</small>`,W=P>0?`<div class="est">${this.mny(n)}/yr (${this.mny(z)}/mo plan + ${this.mny(P)}/mo top-ups)</div>`:`<div class="est">${this.mny(e)}/yr</div>`}else P>0?(U=this.mny(B)+`<small>/mo</small>`,W=`<div class="est">${this.mny(z)}/mo plan + ${this.mny(P)}/mo top-ups</div>`):U=this.mny(N.mo)+`<small>/mo</small>`;let G=``;R&&s>0&&(G=this.annual?`<div class="promo-banner">Buy today: <strong>${this.mny(A)}/yr</strong> &mdash; 25% annual discount + 10% off first 3 months</div>`:`<div class="promo-banner">Buy today: <strong>${this.mny(V*.9)}/mo</strong> &mdash; 10% off your first 3 months (3-month minimum)</div>`);let K=``,q=this.S.ind&&t[this.S.ind]?t[this.S.ind]:``;this.S.resell===`y`&&(K+=n),q&&(K+=(K?`<br><br>`:``)+q);let J=``;if(this.expanded&&s>0){let e=Math.round(o.mCr/1800*l),t=Math.round(o.sCr/7200*u),n=o.sCr>0;J=`<div class="cr-box"><div class="cr-grid"><div class="cr-hd">Capture type</div><div class="cr-hd cr-hd-r">Area</div><div class="cr-hd cr-hd-r">Credits</div><div class="cr-cell">Mobile scan</div><div class="cr-cell cr-cell-r cr-area">${this.fmtArea(e)}</div><div class="cr-cell cr-cell-r cr-val">${this.numFmt(Math.round(o.mCr))}</div>`+(n?`<div class="cr-cell">360&#176; capture</div><div class="cr-cell cr-cell-r cr-area">${this.fmtArea(t)}</div><div class="cr-cell cr-cell-r cr-val">${this.numFmt(Math.round(o.sCr))}</div>`:``)+`<div class="cr-total">Total credits needed</div><div class="cr-total-val">${this.numFmt(Math.round(o.tot))}</div></div><div class="cr-note">Mobile: ${Math.round(250/l)} min per 250 sqm (${this.numFmt(this.toSqft(250))} sqft) &bull; 1,800 credits/min`+(n?`<br>360&#176;: 1 min per 250 sqm (${this.numFmt(this.toSqft(250))} sqft) &bull; 7,200 credits/min`:``)+`</div></div>`}let Y=M===`free`?`<div class="alt">Expecting higher volume? <a data-nudge-plus href="#">See Plus &rarr;</a></div>`:`<div class="alt">Need enterprise features or larger scale? <a href="${this.contactSalesUrl}" target="_blank">Contact Sales &rarr;</a></div>`;i.innerHTML=`<div class="res-hdr"><div><div class="res-name">${H}</div><span class="badge">Recommended</span></div><div class="res-price"><div class="amt">${U}</div>${W}</div></div>`+G+(K?`<div class="res-reason">${K}</div>`:``)+J+L+(N&&N.mo===0?`<div style="margin-top:.75rem"><a href="${this.freeSignupUrl}" target="_blank" class="cta">Get Started for Free</a></div>`:``)+Y,i.querySelector(`[data-nudge-plus]`)?.addEventListener(`click`,e=>{e.preventDefault(),this.S.team=`plus`,this.go()})}};customElements.get(`root-plan-calculator`)||customElements.define(`root-plan-calculator`,f);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.