PageSourceSearch

https://roaringapps.com/account

html roaringapps.com collected 2026-09-24 09:33:49 UTC 28,198 bytes, 590 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en" ng-app="RoaringApps">
3  <head>
4    <meta charset="utf-8">
5    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
6    <meta name="viewport" content="width=device-width, initial-scale=1">
7    <meta name="description" content="Crowd-sourced application compatibility for macOS, iOS and Windows.">
8    <meta name="keywords" content="mac,macos,mac os x,mojave,catalina,big sur,monterey,apple silicon,arm macs,m1 macs,catalyst apps,32-bit apps,app,application,application compatibility,apple,roaringapps,mac app store,table,windows,ios,ios 14,ios 15">
9    
10    <title>
11      Account — RoaringApps
12    </title>
13    
14    
15    
16    
17    <!-- Stylesheets -->
18    <link rel="stylesheet" href="/assets/css/site-2131.css">
19    
20    <!-- Webfonts -->
21    <link href='https://fonts.googleapis.com/css?family=Lato:100,400,700,100italic,400italic,700italic|Rancho|Merriweather+Sans:400,300,300italic,400italic,700,700italic|Cookie' rel='stylesheet' type='text/css'>
22    
23    <!--[if lt IE 9]>
24      
24<script src="/assets/js/ie8-responsive-file-warning.js"></script>
24
25    <![endif]-->
26    
27    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
28    <!--[if lt IE 9]>
29      
29<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
29
30      
30<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
30
31    <![endif]-->
32    
33    <!-- Favicons -->
34    <link rel="shortcut icon" href="/assets/ico/favicon.png">
35    <link rel="shortcut icon" href="/favicon.ico">
36    
37    <!-- Angular $location.html5Mode = true requires this -->
38    <base href="/">
vendor: 75 bytes, lines 38-40
38
39    
40      <script async src="https://www.googletagmanager.com/gtag/js?id=
40G-3G6DX7LY1W
vendor: 18 bytes, lines 40-41
40"></script>
41      
41<script>
42        
vendor: 158 bytes, lines 42-46
42window.dataLayer = window.dataLayer || [];
43        function gtag(){dataLayer.push(arguments);}
44        gtag('js', new Date());
45      
46        gtag('config', '
46G-3G6DX7LY1W
vendor: 10 bytes, lines 46-47
46');
47      
47</script>
47
48      
48<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
48
49      
49<script type="text/javascript">
50      (adsbygoogle = window.adsbygoogle || []).push({
51      google_ad_client: "ca-pub-4932023458712014",
52      enable_page_level_ads: true
53      });
54      </script>
54
55    
55<script src="/assets/js/vendor/modernizr.js" data-cfasync='true'></script>
55
56    
57    <!-- First input delay polyfill - used by Firebase Performance Monitoring.
58    Ref: https://firebase.google.com/docs/perf-mon/get-started-web
59    Ref2: https://github.com/GoogleChromeLabs/first-input-delay
60    -->
61    
61<script type="text/javascript">
62    !function(n,e){var t,o,i,c=[],f={passive:!0,capture:!0},r=new Date,a="pointerup",u="pointercancel";function p(n,c){t||(t=c,o=n,i=new Date,w(e),s())}function s(){o>=0&&o<i-r&&(c.forEach(function(n){n(o,t)}),c=[])}function l(t){if(t.cancelable){var o=(t.timeStamp>1e12?new Date:performance.now())-t.timeStamp;"pointerdown"==t.type?function(t,o){function i(){p(t,o),r()}function c(){r()}function r(){e(a,i,f),e(u,c,f)}n(a,i,f),n(u,c,f)}(o,t):p(o,t)}}function w(n){["click","mousedown","keydown","touchstart","pointerdown"].forEach(function(e){n(e,l,f)})}w(n),self.perfMetrics=self.perfMetrics||{},self.perfMetrics.onFirstInputDelay=function(n){c.push(n),s()}}(addEventListener,removeEventListener);
63    </script>
63
64    
65    <!-- Sentry.io error monitoring -->
66    
66<script src="https://js.sentry-cdn.com/9bccfd17b53521da4d6c21b201931d8c.min.js" crossorigin="anonymous"></script>
66
67    
68      
68<script>
69        window.ENVIRONMENT = 'production';
70      </script>
70
71  </head>
72  <body class="{{bodyClass}}" ng-cloak>
73    <a class="sr-only" href="#content">Skip to main content</a>
74
75    <div class="wrapper">
76
77        <!-- Navigation component -->
78        <header class="navbar   navbar-fixed-top " role="banner" ng-controller="HeaderCtrl">
79          <div class="container">
80            
81            <div class="navbar-header">
82              <button class="navbar-toggle collapsed" type="button" data-toggle="collapse" data-target=".bs-navbar-collapse">
83                <span class="sr-only">Toggle navigation</span>
84                <svg class="icon">
85              <use xlink:href="/assets/svg/icons.svg#shape-chevron-down" />
86            </svg>
87              </button>
88              <a href="/" class="navbar-brand">RoaringApps</a>
89            </div>
90            
91            <nav class="collapse navbar-collapse bs-navbar-collapse" role="navigation">
92              <ul class="nav navbar-nav navbar-centre">
93                <li> <a href="/apps">Apps</a> </li>
94                
95            <li class="dropdown main-dropdown">
96              <a href="#" class="dropdown-toggle" data-toggle="dropdown">Collections</a>
97              <ul class="dropdown-menu" role="menu">
98                <li><a href="/collections/list-of-apple-silicon-native-apps">Apps ready for Apple Silicon</a></li>
99                <li><a href="/collections/list-of-native-windows-arm-apps">Apps native on Windows ARM</a></li>
100                <li><a href="/collections/list-of-32-bit-macos-apps">macOS 32-bit apps</a></li>
101                <li><a href="/collections/discontinued-macos-ios-apps">Discontinued apps</a></li>
102                <li><a href="/app-collection/ios-carplay-apps">iOS CarPlay apps</a></li>
103                <li><a href="/app-collections">More collections...</a></li>
104              </ul>
105            </li>
106            
107                <li> <a href="/mac-app">Download</a> </li>
108                
109                <li> <a href="/about" class="hidden-sm">About</a> </li>
110                <li> <a href="/app/+">Add App</a> </li>
111              </ul>
112              <ul class="nav navbar-nav navbar-right">
113                <li> <a href="#" data-toggle="modal" data-target="#modal-search" class="with-icon">
114                  <span class="sr-only">Search applications</span>
115                  <svg class="icon fav-icon-outline">
116                <use xlink:href="/assets/svg/icons.svg#shape-magnifying-glass" />
117              </svg>
118                </a> </li>
119                <li class="hidden-sm"> <a href="#" data-toggle="modal" data-target="#modal-feedback">Feedback</a> </li>
120                
121                <li class="dropdown account-dropdown" ng-if="user">
122                  <a href="#" class="dropdown-toggle" data-toggle="dropdown">{{user.username}}</a>
123                  <ul class="dropdown-menu pull-right" role="menu">
124                    <li><a href="/account">Account</a></li>
125                    <li><a href="/account/watching">Notifications</a></li>
126                
127                <li ng-if="user.role == 'admin'" class="divider"></li>
128                <li ng-if="user.role == 'admin'"><a href="/admin/dashboard">Admin dashboard</a></li>
129                <li ng-if="user.role == 'admin'"><a href="/admin/mac-app-stats">Mac app stats</a></li>
130                <li ng-if="user.role == 'admin'"><a href="/admin/comments">Comments review</a></li>
131                <li ng-if="user.role == 'admin'"><a href="/admin/screenshots">Screenshot review</a></li>
132                <li ng-if="user.role == 'admin'"><a href="/admin/tags">Tag manager</a></li>
133                <li ng-if="user.role == 'admin'"><a href="/admin/itunes-importer">iTunes Importer</a></li>
134                <li ng-if="user.role == 'admin'" class="divider"></li>
135                
136                    <li><a href="{{getLogoutUrl()}}" ng-click="logout($event)">Log out</a></li>
137                  </ul>
138                </li>
139                
140                <li ng-if="!user"> <a href="{{getRegisterUrl()}}" class="account-register">Register</a> </li>
141                <li ng-if="!user"> <a href="{{getLoginUrl()}}" class="account-signin">Sign in</a> </li>
142              </ul>
143            </nav>
144            
145          </div>
146        </header>
147        <section id="main" ng-controller="AccountPageCtrl" ng-class="{'overlay-in': state.overlayIn }">
148
149        
150
151<div class="ng-wrapper" ng-cloak>
152	
153	<div class="container">
154		<div class="row	">
155			<div class="col-xs-12">
156				
157				<ol class="breadcrumb">
158					<li><a href="/">Home</a></li>
159					<li><a href="/account">Account</a></li>
160				</ol>
161				
162				<div class="page-header underline transparent tab-bar">
163					<h1>Preferences</h1>
164					<a href="/account/watching">Notifications</a>
165					<a href="/account/favourites">Favourites</a>
166					<a href="/account/installed">Installed Apps</a>
167				</div>
168			</div>
169			
170		</div>
171		
172		<div class="row">
173			<div class="col-xs-12" class="text-centre" ng-if="user">
174				<a href="/account/favourites" class="btn">Favourites</a>
175				<a href="/apps?installed" class="btn">Installed applications</a>
176				<a href="/account/watching" class="btn">App notifications</a>
177				<!--<button class="btn">My status reports</button>-->
178			</div>
179		</div>
180		
181		<hr class="invisible" />
182		
183		<div class="row">
184			<div class="col-xs-12 col-sm-6 col-md-4" ng-if="user">
185				<div class="border-box">
186					<h3>Account details</h3>
187					<div class="form-group">
188						<label>Username</label>
189						<input type="text" name="username" ng-model="user.username" disabled />
190					</div>
191					<div class="form-group">
192						<label>Email</label>
193						<input type="email" name="email" ng-model="user.email" disabled />
194					</div>
195				</div>
196				
197				<div class="border-box">
198					<h3>Change email</h3>
199					<form>
200						<div class="form-group">
201							<label for="acc-change-email-new-email">New email</label>
202							<input type="email" id="acc-change-email-new-email" ng-model="form.changeEmail.newEmail" required />
203						</div>
204						<div class="form-group">
205							<label for="acc-change-email-password">Password</label>
206							<input type="password" id="acc-change-email-password" ng-model="form.changeEmail.password" required />
207						</div>
208						
209						<div class="form-group">
210							<button class="btn btn-outline" ng-click="changeEmail()" ng-hide="form.changeEmail.waiting">Change email</button>
211							<div class="btn btn-outline modal-button-loader" ng-show="form.changeEmail.waiting">
212								<div class="spinner spinner-three-dots faster">
213									<div class="bounce1"></div>
214									<div class="bounce2"></div>
215									<div class="bounce3"></div>
216								</div>
217							</div>
218						</div>
219						<div class="form-group">
220							<p class="msg error" ng-if="form.changeEmail.errorMsg">{{form.changeEmail.errorMsg}}</p>
221							<p class="msg success" ng-if="form.changeEmail.successMsg">{{form.changeEmail.successMsg}}</p>
222						</div>
223					</form>
224				</div>
225				
226				<div class="border-box">
227					<h3>Change password</h3>
228					<form>
229						<div class="form-group">
230							<label for="acc-current-password">Current password</label>
231							<input type="password" id="acc-current-password" ng-model="form.password.current" />
232						</div>
233						<div class="form-group">
234							<label for="acc-new-password">New password</label>
235							<input type="password" id="acc-new-password" ng-model="form.password.new" />
236						</div>
237						<div class="form-group">
238							<button class="btn btn-outline" ng-click="changePassword()" ng-hide="form.password.waiting">Change password</button>
239							<div class="btn btn-outline modal-button-loader" ng-show="form.password.waiting">
240								<div class="spinner spinner-three-dots faster">
241									<div class="bounce1"></div>
242									<div class="bounce2"></div>
243									<div class="bounce3"></div>
244								</div>
245							</div>
246						</div>
247						<div class="form-group">
248							<p class="msg error" ng-if="form.password.errorMsg">{{form.password.errorMsg}}</p>
249							<p class="msg success" ng-if="form.password.successMsg">{{form.password.successMsg}}</p>
250						</div>
251					</form>
252				</div>
253				
254				
255			</div>
256			
257			<div class="col-xs-12 col-sm-6 col-md-4">
258				<div class="border-box">
259					<h3>Site preferences</h3>
260					<form>
261						<div class="form-group">
262							<label for="account-select-appstore-currency">App Store Currency</label>
263							<select class="form-select" name="account-select-appstore-currency" id="account-select-appstore-currency" ng-model="user.preferences.appstore_currency" ng-options="c.code as (c.code + ' – ' + c.name) for c in APPSTORE_CURRENCY_CODES">
264							</select>
265						</div>
266						<div class="form-group">
267							<label for="account-apps-table-rows">Apps per page on compatibility table</label>
268							<select class="form-select" name="account-apps-table-rows" id="account-apps-table-rows" ng-model="user.preferences.table_rows" ng-options="n for n in [10,25,50,100]">
269							</select>
270						</div>
271						<div class="form-group">
272							<label for="account-table-default-filter">Default filter on compatibility table</label>
273							<select class="form-select" name="account-table-default-filter" id="account-table-default-filter" ng-model="user.preferences.table_default_filter" ng-options="n.name as n.title for n in [{name:'all', title:'All apps'}, {name:'installed', title:'Installed'}, {name:'favourites',title: 'Favourites'}]">
274							</select>
275						</div>
276
277						<div class="form-group">
278							<button class="btn btn-outline" ng-click="savePreferences()">Save</button>
279						</div>
280						<div class="form-group">
281							<p class="msg error" ng-if="form.preferences.errorMsg">{{form.preferences.errorMsg}}</p>
282							<p class="msg success" ng-if="form.preferences.successMsg">{{form.preferences.successMsg}}</p>
283						</div>
284						
285					</form>
286				</div>
287			</div>
288			
289			<div class="col-xs-12 col-sm-6 col-md-4">
290				<div class="border-box">
291					<h3>Reset</h3>
292					<p><button class="btn btn-outline btn-danger" ng-click="clearCache()">Clear cache</button></p>
293					<p class="control-hint">RoaringApps keeps a copy of application and developer data on your computer to make the site quicker and to reduce the amount of bandwidth used over time.</p>
294					<p class="control-hint">Unfortunately sometimes this local cache can become corrupted. If the site isn't working properly, or if you think the data shown is not up to date, you can clear the cache and start again from scratch.</p>
295					<div class="form-group"><p class="msg success" ng-if="state.clearCacheComplete">The cache has been cleared.</p></div>
296				</div>
297			</div>
298			
299		</div> <!-- /.row -->
300	</div> <!-- /.container -->
301	
302	
303	
304</div>
305
306      </section>
307
308        <!-- Footer -->
309        <footer role="contentinfo">
310        	<div class="container">
311        		
312        		<div class="row">
313        			<div class="col-md-6">
314        				<p><i>⚒</i> by Bryce Cameron since 10.7. 
315        					
316        				<!-- <a class="bmc-button" target="_blank" href="https://www.buymeacoffee.com/roaringapps?ref=rawf" style="align-items: center;"><span>Buy me a coffee</span><img src="https://cdn.buymeacoffee.com/buttons/bmc-new-btn-logo.svg" alt="Buy me a coffee"></a> -->
317        				
318        				<a class="bmc-button" target="_blank" href="https://www.buymeacoffee.com/roaringapps">
319        					<img src="https://cdn.buymeacoffee.com/widget/assets/coffee%20cup.svg" alt="Support RoaringApps">
320        					<span>Buy me a coffee</span>
321        				</a>								
322        				</p>
323        			</div>
324        			<div class="col-md-6">
325        				<p class="pull-right"><a href="/">Home</a> &middot; <a href="/about">About</a> &middot; <a href="/newsletter/join">Newsletter</a> &middot; <a href="/help/contribute-to-roaringapps">Contribute</a> &middot; <a href="/contact">Contact</a> &middot; <a href="/account">Account</a> &middot; <a href="/legal">Legal</a></p>
326        			</div>
327        		</div> <!-- /.row -->
328        		
329        	</div>
330        </footer>
331        
332        <!-- 
332<script data-name="BMC-Widget" data-cfasync="false" src="https://cdnjs.buymeacoffee.com/1.0.0/widget.prod.min.js" data-id="roaringapps" data-description="Support me on Buy me a coffee!" data-message="" data-color="#FF5F5F" data-position="Right" data-x_margin="18" data-y_margin="18"></script>
332 -->
333    </div>
334
335    <!-- Modals -->
336    <section class="the-modals" ng-controller="ModalCtrl">
337    <!-- Sign In -->
338    <div class="modal fade narrow" id="modal-signin" tabindex="-1" role="dialog" aria-labelledby="modal-label-signin" aria-hidden="true">
339      <div class="modal-dialog">
340      	<p class="modal-outside-meta modal-msg" ng-if="signinModalMsg">{{signinModalMsg}}</p>
341        <div class="modal-content">
342          <div class="modal-body">
343          	
344          	<form id="form-signin" ng-submit="login.submit()">
345    	      	<div class="gravatar"></div>
346    	      	
347    	      	<input type="email" name="signin-email" ng-model="form.login.email" placeholder="Email address" />
348    	      	<input type="password" name="signin-password" ng-model="form.login.password" placeholder="Password" />
349    	      	
350    	      	<button class="btn btn-action" action="submit" name="signin-submit" ng-hide="login.submitting"><span>Sign in</span></button>
351    	      	<div class="btn btn-action modal-button-loader" ng-show="login.submitting">
352    	      		<div class="spinner spinner-three-dots faster">
353    	      			<div class="bounce1"></div>
354    	      			<div class="bounce2"></div>
355    	      			<div class="bounce3"></div>
356    	      		</div>
357    	      	</div>
358    	    </form>
359          </div>
360        </div> <!-- /.modal-content -->
361        <p class="modal-outside-meta"><a href="/account/forgot">Forgot?</a> <a class="pull-right" ng-href="{{getRegisterUrl()}}"><strong>Create an account</strong></a></p>
362      </div>
363    </div>
364    
365    <!-- Register / Create account -->
366    <div class="modal fade narrow" id="modal-register" tabindex="-1" role="dialog" aria-labelledby="modal-label-register" aria-hidden="true">
367      <div class="modal-dialog">
368        <div class="modal-content">
369          <div class="modal-body">
370          	
371          	<form id="form-register" ng-submit="register.submit()">
372    	      	<div class="gravatar"></div>
373    	      	
374    	      	<input type="email" name="register-email" ng-model="form.register.email" placeholder="Email address" />
375    	      	<input type="text" name="register-username" ng-model="form.register.username" placeholder="Username" />
376    	      	<input type="password" name="register-password" ng-model="form.register.password" placeholder="Password" />
377    	      	
378    	      	<button class="btn btn-action" action="submit" name="register-submit" ng-hide="register.submitting"><span>Create account</span></button>
379    	      	<div class="btn btn-action modal-button-loader" ng-show="register.submitting">
380          			<div class="spinner spinner-three-dots faster">
381          				<div class="bounce1"></div>
382          				<div class="bounce2"></div>
383          				<div class="bounce3"></div>
384          			</div>
385          		</div>
386    	    </form>
387          </div>
388        </div> <!-- /.modal-content -->
389         <p class="modal-outside-meta">{{register.errors.join(' ')}}</p>
390      </div>
391    </div>
392    
393    <!-- Search -->
394    <div class="modal fade search-modal" id="modal-search" tabindex="-1" role="dialog" aria-labelledby="modal-label-search" aria-hidden="true">
395      <div class="modal-dialog">
396        <div class="modal-content">
397          <div class="modal-body">
398          	
399          	<form id="form-search">	      	
400    	      	<input type="search" id="search-input" name="search" ng-model="form.search.query" placeholder="Search applications" autocomplete="off" />
401    	      	<span class="search-result-count" ng-show="search.results.length > 0">{{search.results.length}} apps</span>
402    	    </form>
403    	    
404    	    <p class="search-msg" ng-show="search.searching">Searching...</p>
405    	    <p class="search-msg" ng-show="search.empty">No results</p>
406    	    
407    	    <ul class="search-results">
408    	    	<li class="result" ng-repeat="app in search.results | orderBy:'-_searchRank'">
409    	    		<a href="/app/{{app.slug}}">
410    	    			<img ng-src="{{app.icon}}" alt="{{app.icon ? app.name + ' icon' : 'No icon'}}" class="{{app.icon ? 'search-result-has-icon' : 'search-result-no-icon'}}" onerror="this.style.display='none'" />
411    	    			<strong>{{app.name}}</strong>
412    	    			<span class="dev">{{app.developer}}</span>
413    	    		</a>
414    	    	</li>
415    	    </ul>
416    	    
417          </div>
418        </div> <!-- /.modal-content -->
419         <p class="modal-outside-meta">{{register.errors.join(' ')}}</p>
420      </div>
421    </div>
422    
423    <!-- Moderate -->
424    <div class="modal fade" id="modal-moderate" tabindex="-1" role="dialog" aria-labelledby="modal-label-moderate" aria-hidden="true">
425      <div class="modal-dialog">
426        <div class="modal-content">
427          <div class="modal-header">
428          	<h4>Moderator control panel</h4>
429          </div>
430          <div class="modal-body">
431          	
432          	<form id="form-moderate">
433          		<div class="row">
434          			<div class="col-xs-12 col-sm-6">
435          				<div class="form-group">
436      						<label for="moderate-app-name">Application</label>
437      						<input type="text" name="moderate-app-name" id="moderate-app-name" ng-model="selectedApp.name" disabled />
438      					</div>
439          			</div>	
440          			<div class="col-xs-12 col-sm-6">
441      					<div class="form-group">
442    						<label for="moderate-app-slug">Slug</label>
443    						<input type="text" name="moderate-app-slug" id="moderate-app-slug" ng-model="selectedApp.slug" disabled />
444    					</div>
445      				</div>
446      				<div class="col-xs-12 col-sm-6">
447    					<div class="form-group">
448    						<label for="moderate-app-developer">Developer</label>
449    						<input type="text" name="moderate-app-developer" id="moderate-app-developer" ng-model="selectedApp.developer" disabled />
450    					</div>
451    				</div>	
452    				<div class="col-xs-12 col-sm-6">
453    					<div class="form-group">
454    						<label for="moderate-app-url">URL</label>
455    						<input type="text" name="moderate-app-url" id="moderate-app-url" ng-model="selectedApp.url" disabled />
456    					</div>
457    				</div>	   
458      			</div>   	
459      			
460      			<div class="form-group">
461    				<p ng-if="!selectedApp.statuses">This application has no status reports.</p>
462    			</div>
463    	      	
464    	      	
465          		
466      			
467      			<div class="form-group">
468      				<button class="btn btn-outline btn-danger" ng-click="moderate.delete(selectedApp.slug)">Delete app</button>
469      				<button class="btn btn-outline" ng-click="moderate.merge.chooseTo(selectedApp.slug)">Merge with...</button>
470    					<button class="btn btn-outline" ng-click="moderate.appCollection.add(selectedApp.slug)">Add to collection...</button>
471      				<button class="btn btn-outline">Update</button>
472      			</div>
473    	    </form>
474    	    
475    	    
476          </div>
477        </div> <!-- /.modal-content -->
478         <p class="modal-outside-meta">For use only by approved RoaringApps moderators.</p>
479      </div>
480    </div>
481    
482    <!-- Feedback -->
483    <div class="modal fade" id="modal-feedback" tabindex="-1" role="dialog" aria-labelledby="modal-label-feedback" aria-hidden="true">
484      <div class="modal-dialog">
485        <div class="modal-content">
486          <div class="modal-header">
487          	<h4>Submit Feedback</h4>
488          </div>
489          <div class="modal-body">
490          	<p>I develop RoaringApps in my (rather limited) spare time, so sometimes I miss bugs here and there. If you notice something not quite working properly, or have an idea for the site, I'd love to hear from you.</p>
491          	<form id="form-feedback" name="feedbackForm" ng-submit="feedback.submit(feedbackForm.$valid)" novalidate>	    <!-- novalidate disables HTML5 validation, so we can use the angular val
491idation -->   	
492    	      	<div class="row">
493    		      	<div class="col-xs-12 col-sm-6">
494    			      	<div class="form-group">
495    			      		<label for="feedback-name">Name</label>
496    			      		<input type="text" name="feedback-name" id="feedback-name" ng-model="form.feedback.name" required />
497    			      	</div>
498    		      	</div>
499    		      	<div class="col-xs-12 col-sm-6">
500    			      	<div class="form-group">
501    		      			<label for="feedback-email">Email (optional)</label>
502    		      			<input type="email" name="feedback-email" id="feedback-email" ng-model="form.feedback.email" />
503    		      		</div>
504    		      	</div>
505    		      </div>
506    			<div class="form-group" style="position: absolute; left: -5000px;" aria-hidden="true">
507    				  <label for="feedback-website">Website</label>
508    				  <input type="text" name="feedback-website" id="feedback-website" ng-model="form.feedback.website" tabindex="-1" autocomplete="off" />
509    			</div>
510          		<div class="form-group">
511          			<label for="feedback-comment">Comment</label>
512          			<textarea id="feedback-comment" ng-model="form.feedback.comment" required></textarea>
513          		</div>
514          		<div class="form-group form-action-area">
515          			<input type="submit" value="Send feedback" class="btn btn-outline" ng-disabled="feedbackForm.$invalid" />
516          		</div>
517          		<div class="form-group">
518          			<p class="msg error" ng-if="feedback.errorMsg">{{feedback.errorMsg}}</p>
519          			<p class="msg success" ng-if="feedback.successMsg">{{feedback.successMsg}}</p>
520          		</div>
521    	    </form>
522    	    
523    	    
524          </div>
525        </div> <!-- /.modal-content -->
526      </div>
527    </div>
528    
529    <!-- Report comment -->
530    <div class="modal fade" id="modal-report-comment" tabindex="-1" role="dialog" aria-labelledby="modal-label-report-comment" aria-hidden="true">
531      <div class="modal-dialog">
532        <div class="modal-content">
533          <div class="modal-header">
534          	<h4>Report comment</h4>
535          </div>
536          <div class="modal-body">
537          	<p>Report this comment to help the moderators identify items that require attention.</p>
538          	<form id="form-report-comment" name="reportCommentForm" ng-submit="reportComment.submit(reportCommentForm.$valid)" novalidate>	    
539    					<!-- novalidate disables HTML5 validation, so we can use the angular validation -->   	
540    	      	<div class="row">
541    		      	<div class="col-xs-12">
542    			      	<div class="form-group">
543    			      		<label for="report-comment-reason">Reason</label>
544    								<select name="report-comment-reason" id="report-comment-reason" ng-model="form.reportComment.reason" required>
545    									<option>Invalid advice</option>
546    									<option>Illegal/inappropriate</option>
547    									<option>Off-topic</option>
548    									<option>Personal attack</option>
549    									<option>Spam</option>
550    									<option>Other</option>
551    								</select>
552    			      	</div>
553    		      	</div>
554    		      	<div class="col-xs-12">
555    			      	<div class="form-group">
556    			      		<label for="report-comment-description">Description (optional)</label>
557    			      		<textarea id="report-comment-description" ng-model="form.reportComment.description"></textarea>
558    			      	</div>
559    		      </div>
560          		
561    					<div class="col-xs-12">
562    	      		<div class="form-group form-action-area">
563    	      			<input type="submit" value="Submit report" class="btn btn-outline" ng-disabled="reportCommentForm.$invalid" />
564    	      		</div>
565    	      		<div class="form-group">
566    	      			<p class="msg error" ng-if="reportComment.errorMsg">{{reportComment.errorMsg}}</p>
567    	      			<p class="msg success" ng-if="reportComment.successMsg">{{reportComment.successMsg}}</p>
568    	      		</div>
569    					</div>
570    				</div> <!-- /.row -->
571    				
572    	    </form>
573    	    
574    	    
575          </div>
576        </div> <!-- /.modal-content -->
577      </div>
578    </div> <!-- /.modal (report comment) -->
579    				
580    
581    </section>
582    <!-- JS and analytics only. -->
583    
584    	
584<script src="/assets/js/production-2131.js"></script>
584
585    
586      
586<script>
587    	if(typeof lucide !== undefined) lucide.createIcons();
588      </script>
588  
588<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"cf8706b74b324e67b083263fb22c492a","r":1,"spa":2}' crossorigin="anonymous"></script>
588
589</body>
590</html>

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.