├── .gitignore
├── LICENSE
├── README.md
├── applet
├── loginScripts.js
├── loginStyles.css
├── logos
│ ├── launcher-icon1024.webp
│ ├── launcher-icon128.png
│ ├── launcher-icon128.webp
│ ├── launcher-icon144.png
│ ├── launcher-icon144.webp
│ ├── launcher-icon168.png
│ ├── launcher-icon168.webp
│ ├── launcher-icon192.webp
│ ├── launcher-icon256_ios.webp
│ ├── launcher-icon48.png
│ ├── launcher-icon512.png
│ ├── launcher-icon512.webp
│ ├── launcher-icon512_maskable.webp
│ ├── launcher-icon72.png
│ ├── launcher-icon96.png
│ ├── overlay96.png
│ └── overlay96.webp
└── manifest.json
├── clappr
├── LICENSE.txt
└── clappr.min.js
├── livestream.htm
├── login.htm
├── sounds
├── airhorn.mp3
├── alarm-frenzy.mp3
├── alarm.mp3
├── alarming.mp3
├── alien-message.mp3
├── alien-tune.mp3
├── are-you-kidding.mp3
├── attention-required.mp3
├── blocker.mp3
├── decay.mp3
├── demonstrative.mp3
├── determined.mp3
├── doorbell.mp3
├── enough-with-the-talking.mp3
├── gentle-alarm.mp3
├── gesture.mp3
├── good-morning.mp3
├── goodbye.mp3
├── hail.mp3
├── hell-yeah.mp3
├── high-pitch.mp3
├── i-demand-attention.mp3
├── i-saw-you.mp3
├── job-done.mp3
├── just-like-magic.mp3
├── long-chime-sound.mp3
├── may-i-have-your-attention.mp3
├── munchausen.mp3
├── news-bringer.mp3
├── no-way.mp3
├── not-kiddin.mp3
├── oh-really.mp3
├── on-serious-matters.mp3
├── paranoid.mp3
├── pizzicato.mp3
├── police.mp3
├── pop.mp3
├── professionals.mp3
├── quiet-knock.mp3
├── robot-walking.mp3
├── served.mp3
├── sorted.mp3
├── springy.mp3
├── surprise-on-a-spring.mp3
├── system-fault.mp3
├── the-squeaky-wheel-gets-the-grease.mp3
├── this-is-it.mp3
├── warning.mp3
├── what.mp3
├── wiggle.mp3
├── will-you.mp3
└── you-wouldnt-believe.mp3
├── timeout.htm
├── ui3.htm
├── ui3
├── LoadingImage.png
├── ajax-loader-big.gif
├── css-vars-ponyfill.min.js
├── flag24.png
├── help
│ ├── css
│ │ ├── bootstrap.min.css
│ │ └── help.css
│ ├── help.html
│ ├── img
│ │ ├── CameraContextMenu.png
│ │ ├── ClipContextMenu.png
│ │ ├── ConvertExport.png
│ │ ├── ConvertExportIcon.png
│ │ ├── ExportList.png
│ │ ├── ExportRange.png
│ │ ├── ExportStatus.png
│ │ ├── MainMenuIcon.png
│ │ ├── MqttSample.png
│ │ ├── ProfileEditor.png
│ │ ├── RecordingFilters.png
│ │ ├── ServerSideStreamingProfile.png
│ │ └── StatsForNerds.png
│ └── js
│ │ ├── bootstrap.min.js
│ │ ├── help.js
│ │ ├── jquery-1.12.4.min.js
│ │ └── jquery.stickytabs.js
├── horror.png
├── icons-src
│ ├── Flag.xcf
│ ├── RedDot5px.png
│ ├── Ripple.svg
│ ├── Rolling.svg
│ ├── Trigger.xcf
│ ├── Trigger2.xcf
│ ├── Trigger24.png
│ ├── Trigger_8color.png
│ ├── alert.svg
│ ├── alert1.png
│ ├── alert1.svg
│ ├── alert1_20px.png
│ ├── auto_maximize.svg
│ ├── chrome.svg
│ ├── clipicons.png
│ ├── closeBtn.svg
│ ├── contrast.svg
│ ├── design-icons.svg
│ ├── edge.svg
│ ├── ellipsis.svg
│ ├── firefox.svg
│ ├── flag24.png
│ ├── flag24_1.png
│ ├── flag24_2.png
│ ├── flag24_3.png
│ ├── gamepad_public_domain.svg
│ ├── horror.png
│ ├── launcher-icon192_ios_lossless.webp
│ ├── launcher-icon256_ios_sharpened_lossless.webp
│ ├── logo_icon_ios.png
│ ├── logo_icon_ios_visualcenter.png
│ ├── logosrc.png
│ ├── logosrc_ai.png
│ ├── material.io
│ │ ├── LICENSE.txt
│ │ ├── apps_black_24dp.svg
│ │ ├── baseline-access_time-24px.svg
│ │ ├── baseline-branding_watermark-24px.svg
│ │ ├── baseline-edit-24px.svg
│ │ ├── baseline-movie_filter-24px.svg
│ │ ├── bolt_black_24dp.svg
│ │ ├── close_fullscreen-24px.svg
│ │ ├── crop-black-24dp.svg
│ │ ├── directions_car_black_24dp.svg
│ │ ├── download_black_24dp.svg
│ │ ├── folder-24px.svg
│ │ ├── folder_special-24px.svg
│ │ ├── hide_image_black_24dp.svg
│ │ ├── home_black_24dp.svg
│ │ ├── ic_brightness_low_black_24px.svg
│ │ ├── ic_check_box_black_24px.svg
│ │ ├── ic_check_box_outline_blank_black_24px.svg
│ │ ├── ic_cloud_upload_black_24px.svg
│ │ ├── ic_content_copy_black_24px.svg
│ │ ├── ic_delete_black_48px.svg
│ │ ├── ic_directions_run_black_24px.svg
│ │ ├── ic_filter_frames_black_24px.svg
│ │ ├── ic_fullscreen_black_48px.svg
│ │ ├── ic_fullscreen_exit_black_48px.svg
│ │ ├── ic_help_black_24px.svg
│ │ ├── ic_lightbulb_outline_black_24px.svg
│ │ ├── ic_lock_black_24px.svg
│ │ ├── ic_movie_black_48px.svg
│ │ ├── ic_perm_device_information_black_24px.svg
│ │ ├── ic_photo_size_select_large_black_24px.svg
│ │ ├── ic_refresh_black_48px.svg
│ │ ├── ic_replay_black_24px.svg
│ │ ├── ic_tab_black_48px.svg
│ │ ├── ic_view_quilt_black_24px.svg
│ │ ├── ic_volume_down_black_24px.svg
│ │ ├── ic_volume_mute_black_24px.svg
│ │ ├── ic_volume_off_black_24px.svg
│ │ ├── ic_volume_up_black_24px.svg
│ │ ├── ic_warning_black_24px.svg
│ │ ├── indeterminate_check_box-24px.svg
│ │ ├── launch-24px.svg
│ │ ├── man_black_24dp.svg
│ │ ├── open_in_full-24px.svg
│ │ ├── pending_black_24dp.svg
│ │ ├── picture_in_picture_alt_black_24dp.svg
│ │ ├── search_black_24dp.svg
│ │ ├── sports_esports_24dp.svg
│ │ ├── star_rate-24px.svg
│ │ ├── storage-24px.svg
│ │ ├── update.svg
│ │ ├── videocam_black_24dp.svg
│ │ ├── view_sidebar.svg
│ │ ├── zoom_in_black_24dp.svg
│ │ └── zoom_out_black_24dp.svg
│ ├── person24.png
│ ├── pets.svg
│ ├── sentry_human.svg
│ ├── sentry_human_src.svg
│ ├── sentry_logo.svg
│ ├── sentry_logo_src.svg
│ ├── shield.svg
│ ├── sidebar_hidden.svg
│ ├── sidebar_hidden2.svg
│ ├── trigger@2x.png
│ ├── ui3gamepad.svg
│ ├── ui3gamepad_optimized.svg
│ ├── vehicle24.png
│ ├── wildlife.svg
│ └── wildlife24.png
├── icons.svg
├── libs-src
│ ├── AVI.js
│ ├── Css Z-index Planner.txt
│ ├── Dialog.css
│ ├── Dialog.js
│ ├── HistoryButtonOverride.js
│ ├── NoSleep.js
│ ├── NoSleep.min.js
│ ├── Queue.src.js
│ ├── WebGLCanvas.js
│ ├── about-libs-src.txt
│ ├── base64Array.js
│ ├── basic-event-timer.js
│ ├── client-zip@2.3.1.js
│ ├── clipboard.js
│ ├── datepicker.css
│ ├── hammer.min.js
│ ├── jmuxer.js
│ ├── jquery-1.12.4.js
│ ├── jquery-1.12.4.min.js
│ ├── jquery.cookie.js
│ ├── jquery.customscroll.js
│ ├── jquery.longpress.js
│ ├── jquery.ui2modal.js
│ ├── jsonview
│ │ ├── MIT_LICENSE.txt
│ │ ├── change_notice.txt
│ │ ├── jsonview.js
│ │ ├── jsonview.min.css
│ │ └── jsonview.min.js
│ ├── lightbox.js
│ ├── lightbox.min.js
│ ├── loginScriptsSrc.js
│ ├── md5.js
│ ├── nosleep.js.7z
│ ├── openh264_decoder.js
│ ├── paho-mqtt-min.js
│ ├── paho-mqtt.js
│ ├── point-in-polygon.js
│ ├── promise.polyfill.min.js
│ ├── seeded-random.js
│ ├── simple-scrollbar.css
│ ├── simple-scrollbar.min.js
│ ├── slider-checkbox.css
│ ├── toastr.min.css
│ ├── toastr.min.js
│ ├── url-search-params.polyfill.js
│ ├── vue.js
│ ├── vue.min.js
│ ├── wdContextMenu
│ │ ├── change_notice.txt
│ │ ├── contextmenu.css
│ │ ├── jquery.contextmenu.js
│ │ ├── lgpl.html
│ │ ├── m_arrow.gif
│ │ ├── m_item.gif
│ │ ├── m_splitLine.gif
│ │ ├── menu_bg.gif
│ │ └── readme
│ └── zebra_datepicker
│ │ ├── change_notice.txt
│ │ ├── default.css
│ │ ├── license.txt
│ │ ├── zebra_datepicker.js
│ │ └── zebra_datepicker.src.js
├── libs-ui3.css
├── libs-ui3.js
├── licenses.txt
├── noimage.png
├── openh264_decoder.js
├── pnacl
│ ├── pnacl_player.nmf
│ └── pnacl_player.pexe
├── reset.htm
├── storageinfo-libs.js
├── storageinfo.htm
├── svgtest.htm
├── trigger24.png
├── ui3.css
└── ui3.js
└── ui3serviceworker.js
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 |
4 | # User-specific files
5 | *.suo
6 | *.user
7 | *.userosscache
8 | *.sln.docstates
9 | /ui3.sln
10 | ui3-local-overrides.js
11 | ui3-local-overrides.css
12 |
13 | # User-specific files (MonoDevelop/Xamarin Studio)
14 | *.userprefs
15 |
16 | # Build results
17 | [Dd]ebug/
18 | [Dd]ebugPublic/
19 | [Rr]elease/
20 | [Rr]eleases/
21 | x64/
22 | x86/
23 | bld/
24 | [Bb]in/
25 | [Oo]bj/
26 | [Ll]og/
27 |
28 | # Visual Studio 2015 cache/options directory
29 | .vs/
30 | # Uncomment if you have tasks that create the project's static files in wwwroot
31 | #wwwroot/
32 |
33 | # MSTest test Results
34 | [Tt]est[Rr]esult*/
35 | [Bb]uild[Ll]og.*
36 |
37 | # NUNIT
38 | *.VisualState.xml
39 | TestResult.xml
40 |
41 | # Build Results of an ATL Project
42 | [Dd]ebugPS/
43 | [Rr]eleasePS/
44 | dlldata.c
45 |
46 | # DNX
47 | project.lock.json
48 | artifacts/
49 |
50 | *_i.c
51 | *_p.c
52 | *_i.h
53 | *.ilk
54 | *.meta
55 | *.obj
56 | *.pch
57 | *.pdb
58 | *.pgc
59 | *.pgd
60 | *.rsp
61 | *.sbr
62 | *.tlb
63 | *.tli
64 | *.tlh
65 | *.tmp
66 | *.tmp_proj
67 | *.log
68 | *.vspscc
69 | *.vssscc
70 | .builds
71 | *.pidb
72 | *.svclog
73 | *.scc
74 |
75 | # Chutzpah Test files
76 | _Chutzpah*
77 |
78 | # Visual C++ cache files
79 | ipch/
80 | *.aps
81 | *.ncb
82 | *.opendb
83 | *.opensdf
84 | *.sdf
85 | *.cachefile
86 | *.VC.db
87 | *.VC.VC.opendb
88 |
89 | # Visual Studio profiler
90 | *.psess
91 | *.vsp
92 | *.vspx
93 | *.sap
94 |
95 | # TFS 2012 Local Workspace
96 | $tf/
97 |
98 | # Guidance Automation Toolkit
99 | *.gpState
100 |
101 | # ReSharper is a .NET coding add-in
102 | _ReSharper*/
103 | *.[Rr]e[Ss]harper
104 | *.DotSettings.user
105 |
106 | # JustCode is a .NET coding add-in
107 | .JustCode
108 |
109 | # TeamCity is a build add-in
110 | _TeamCity*
111 |
112 | # DotCover is a Code Coverage Tool
113 | *.dotCover
114 |
115 | # NCrunch
116 | _NCrunch_*
117 | .*crunch*.local.xml
118 | nCrunchTemp_*
119 |
120 | # MightyMoose
121 | *.mm.*
122 | AutoTest.Net/
123 |
124 | # Web workbench (sass)
125 | .sass-cache/
126 |
127 | # Installshield output folder
128 | [Ee]xpress/
129 |
130 | # DocProject is a documentation generator add-in
131 | DocProject/buildhelp/
132 | DocProject/Help/*.HxT
133 | DocProject/Help/*.HxC
134 | DocProject/Help/*.hhc
135 | DocProject/Help/*.hhk
136 | DocProject/Help/*.hhp
137 | DocProject/Help/Html2
138 | DocProject/Help/html
139 |
140 | # Click-Once directory
141 | publish/
142 |
143 | # Publish Web Output
144 | *.[Pp]ublish.xml
145 | *.azurePubxml
146 | # TODO: Comment the next line if you want to checkin your web deploy settings
147 | # but database connection strings (with potential passwords) will be unencrypted
148 | *.pubxml
149 | *.publishproj
150 |
151 | # Microsoft Azure Web App publish settings. Comment the next line if you want to
152 | # checkin your Azure Web App publish settings, but sensitive information contained
153 | # in these scripts will be unencrypted
154 | PublishScripts/
155 |
156 | # NuGet Packages
157 | *.nupkg
158 | # The packages folder can be ignored because of Package Restore
159 | **/packages/*
160 | # except build/, which is used as an MSBuild target.
161 | !**/packages/build/
162 | # Uncomment if necessary however generally it will be regenerated when needed
163 | #!**/packages/repositories.config
164 | # NuGet v3's project.json files produces more ignoreable files
165 | *.nuget.props
166 | *.nuget.targets
167 |
168 | # Microsoft Azure Build Output
169 | csx/
170 | *.build.csdef
171 |
172 | # Microsoft Azure Emulator
173 | ecf/
174 | rcf/
175 |
176 | # Windows Store app package directories and files
177 | AppPackages/
178 | BundleArtifacts/
179 | Package.StoreAssociation.xml
180 | _pkginfo.txt
181 |
182 | # Visual Studio cache files
183 | # files ending in .cache can be ignored
184 | *.[Cc]ache
185 | # but keep track of directories ending in .cache
186 | !*.[Cc]ache/
187 |
188 | # Others
189 | ClientBin/
190 | ~$*
191 | *~
192 | *.dbmdl
193 | *.dbproj.schemaview
194 | *.pfx
195 | *.publishsettings
196 | node_modules/
197 | orleans.codegen.cs
198 |
199 | # Since there are multiple workflows, uncomment next line to ignore bower_components
200 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
201 | #bower_components/
202 |
203 | # RIA/Silverlight projects
204 | Generated_Code/
205 |
206 | # Backup & report files from converting an old project file
207 | # to a newer Visual Studio version. Backup files are not needed,
208 | # because we have git ;-)
209 | _UpgradeReport_Files/
210 | Backup*/
211 | UpgradeLog*.XML
212 | UpgradeLog*.htm
213 |
214 | # SQL Server files
215 | *.mdf
216 | *.ldf
217 |
218 | # Business Intelligence projects
219 | *.rdl.data
220 | *.bim.layout
221 | *.bim_*.settings
222 |
223 | # Microsoft Fakes
224 | FakesAssemblies/
225 |
226 | # GhostDoc plugin setting file
227 | *.GhostDoc.xml
228 |
229 | # Node.js Tools for Visual Studio
230 | .ntvs_analysis.dat
231 |
232 | # Visual Studio 6 build log
233 | *.plg
234 |
235 | # Visual Studio 6 workspace options file
236 | *.opt
237 |
238 | # Visual Studio LightSwitch build output
239 | **/*.HTMLClient/GeneratedArtifacts
240 | **/*.DesktopClient/GeneratedArtifacts
241 | **/*.DesktopClient/ModelManifest.xml
242 | **/*.Server/GeneratedArtifacts
243 | **/*.Server/ModelManifest.xml
244 | _Pvt_Extensions
245 |
246 | # Paket dependency manager
247 | .paket/paket.exe
248 | paket-files/
249 |
250 | # FAKE - F# Make
251 | .fake/
252 |
253 | # JetBrains Rider
254 | .idea/
255 | *.sln.iml
256 |
257 | # Manual Additions
258 | Thumbs.db
259 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # UI3
2 | UI3 is a powerful, modern HTML5 web interface for Blue Iris. Since April 20, 2018, UI3 is Blue Iris's default web interface for non-IE browsers and is included with Blue Iris versions 4.7.3 and newer.
3 |
4 | 
5 |
6 | ## Discuss on ipcamtalk
7 |
8 | UI3 has a dedicated thread on the **ipcamtalk** forum, here:
9 |
10 | https://ipcamtalk.com/threads/blue-iris-ui3.23528/
11 |
12 | ## Manual installation
13 |
14 | Be aware that most UI3 releases are developed against the **latest Blue Iris version** at the time of UI3 release. Compatibility with older Blue Iris versions is not maintained, so any time you update UI3 without being on the latest version of Blue Iris, you risk encountering broken features and other bugs.
15 |
16 | If you wish to manually install a UI3 update, you can get it from the releases tab: https://github.com/bp2008/ui3/releases
17 |
18 | To install, just extract everything to Blue Iris's `www` directory and overwrite all files. The default path to this folder is `C:\Program Files\Blue Iris 5\www`.
19 |
20 | ### Blue Iris 4.x Users
21 |
22 | The last Blue Iris 4 release (4.8.6.3) shipped with [UI3-70](https://github.com/bp2008/ui3/releases/tag/70), but you can update to [UI3-77](https://github.com/bp2008/ui3/releases/tag/77) for a few improvements. Things will begin breaking if you update beyond UI3-77 on a Blue Iris 4.x installation.
23 |
--------------------------------------------------------------------------------
/applet/logos/launcher-icon1024.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/launcher-icon1024.webp
--------------------------------------------------------------------------------
/applet/logos/launcher-icon128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/launcher-icon128.png
--------------------------------------------------------------------------------
/applet/logos/launcher-icon128.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/launcher-icon128.webp
--------------------------------------------------------------------------------
/applet/logos/launcher-icon144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/launcher-icon144.png
--------------------------------------------------------------------------------
/applet/logos/launcher-icon144.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/launcher-icon144.webp
--------------------------------------------------------------------------------
/applet/logos/launcher-icon168.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/launcher-icon168.png
--------------------------------------------------------------------------------
/applet/logos/launcher-icon168.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/launcher-icon168.webp
--------------------------------------------------------------------------------
/applet/logos/launcher-icon192.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/launcher-icon192.webp
--------------------------------------------------------------------------------
/applet/logos/launcher-icon256_ios.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/launcher-icon256_ios.webp
--------------------------------------------------------------------------------
/applet/logos/launcher-icon48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/launcher-icon48.png
--------------------------------------------------------------------------------
/applet/logos/launcher-icon512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/launcher-icon512.png
--------------------------------------------------------------------------------
/applet/logos/launcher-icon512.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/launcher-icon512.webp
--------------------------------------------------------------------------------
/applet/logos/launcher-icon512_maskable.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/launcher-icon512_maskable.webp
--------------------------------------------------------------------------------
/applet/logos/launcher-icon72.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/launcher-icon72.png
--------------------------------------------------------------------------------
/applet/logos/launcher-icon96.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/launcher-icon96.png
--------------------------------------------------------------------------------
/applet/logos/overlay96.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/overlay96.png
--------------------------------------------------------------------------------
/applet/logos/overlay96.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/overlay96.webp
--------------------------------------------------------------------------------
/applet/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "%%UI3_PWA_NAME%%",
3 | "name": "%%UI3_PWA_NAME%%",
4 | "icons": [
5 | {
6 | "src": "logos/launcher-icon1024.webp",
7 | "sizes": "1024x1024",
8 | "type": "image/webp"
9 | },
10 | {
11 | "src": "logos/launcher-icon128.webp",
12 | "sizes": "128x128",
13 | "type": "image/webp"
14 | },
15 | {
16 | "src": "logos/launcher-icon144.webp",
17 | "sizes": "144x144",
18 | "type": "image/webp"
19 | },
20 | {
21 | "src": "logos/launcher-icon168.webp",
22 | "sizes": "168x168",
23 | "type": "image/webp"
24 | },
25 | {
26 | "src": "logos/launcher-icon192.webp",
27 | "sizes": "192x192",
28 | "type": "image/webp"
29 | },
30 | {
31 | "src": "logos/launcher-icon512.webp",
32 | "sizes": "512x512",
33 | "type": "image/webp"
34 | },
35 | {
36 | "src": "logos/launcher-icon512_maskable.webp",
37 | "sizes": "512x512",
38 | "type": "image/webp",
39 | "purpose": "maskable"
40 | },
41 | {
42 | "src": "logos/launcher-icon512.png",
43 | "sizes": "512x512",
44 | "type": "image/png"
45 | },
46 | {
47 | "src": "logos/launcher-icon48.png",
48 | "sizes": "48x48",
49 | "type": "image/png"
50 | },
51 | {
52 | "src": "logos/launcher-icon72.png",
53 | "sizes": "72x72",
54 | "type": "image/png"
55 | },
56 | {
57 | "src": "logos/launcher-icon96.png",
58 | "sizes": "96x96",
59 | "type": "image/png"
60 | },
61 | {
62 | "src": "logos/launcher-icon128.png",
63 | "sizes": "128x128",
64 | "type": "image/png"
65 | },
66 | {
67 | "src": "logos/launcher-icon144.png",
68 | "sizes": "144x144",
69 | "type": "image/png"
70 | },
71 | {
72 | "src": "logos/launcher-icon168.png",
73 | "sizes": "168x168",
74 | "type": "image/png"
75 | },
76 | {
77 | "src": "logos/launcher-icon256_ios.webp",
78 | "sizes": "256x256",
79 | "type": "image/webp"
80 | }
81 | ],
82 | "background_color": "#000000",
83 | "theme_color": "#3E5F8A",
84 | "display": "standalone",
85 | "start_url": "../ui3.htm",
86 | "id": "/ui3.htm",
87 | "scope": "%%VIRTDIR%%"
88 | }
--------------------------------------------------------------------------------
/clappr/LICENSE.txt:
--------------------------------------------------------------------------------
1 | Copyright (c) 2014, Globo.com Player authors. All rights reserved.
2 |
3 | Redistribution and use in source and binary forms, with or without
4 | modification, are permitted provided that the following conditions are met:
5 |
6 | * Redistributions of source code must retain the above copyright
7 | notice, this list of conditions and the following disclaimer.
8 | * Redistributions in binary form must reproduce the above copyright
9 | notice, this list of conditions and the following disclaimer in the
10 | documentation and/or other materials provided with the distribution.
11 | * Neither the name of the Globo.com nor the names of its contributors
12 | may be used to endorse or promote products derived from this software without
13 | specific prior written permission.
14 |
15 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18 | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19 | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
21 | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 |
--------------------------------------------------------------------------------
/sounds/airhorn.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/airhorn.mp3
--------------------------------------------------------------------------------
/sounds/alarm-frenzy.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/alarm-frenzy.mp3
--------------------------------------------------------------------------------
/sounds/alarm.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/alarm.mp3
--------------------------------------------------------------------------------
/sounds/alarming.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/alarming.mp3
--------------------------------------------------------------------------------
/sounds/alien-message.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/alien-message.mp3
--------------------------------------------------------------------------------
/sounds/alien-tune.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/alien-tune.mp3
--------------------------------------------------------------------------------
/sounds/are-you-kidding.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/are-you-kidding.mp3
--------------------------------------------------------------------------------
/sounds/attention-required.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/attention-required.mp3
--------------------------------------------------------------------------------
/sounds/blocker.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/blocker.mp3
--------------------------------------------------------------------------------
/sounds/decay.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/decay.mp3
--------------------------------------------------------------------------------
/sounds/demonstrative.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/demonstrative.mp3
--------------------------------------------------------------------------------
/sounds/determined.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/determined.mp3
--------------------------------------------------------------------------------
/sounds/doorbell.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/doorbell.mp3
--------------------------------------------------------------------------------
/sounds/enough-with-the-talking.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/enough-with-the-talking.mp3
--------------------------------------------------------------------------------
/sounds/gentle-alarm.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/gentle-alarm.mp3
--------------------------------------------------------------------------------
/sounds/gesture.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/gesture.mp3
--------------------------------------------------------------------------------
/sounds/good-morning.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/good-morning.mp3
--------------------------------------------------------------------------------
/sounds/goodbye.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/goodbye.mp3
--------------------------------------------------------------------------------
/sounds/hail.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/hail.mp3
--------------------------------------------------------------------------------
/sounds/hell-yeah.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/hell-yeah.mp3
--------------------------------------------------------------------------------
/sounds/high-pitch.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/high-pitch.mp3
--------------------------------------------------------------------------------
/sounds/i-demand-attention.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/i-demand-attention.mp3
--------------------------------------------------------------------------------
/sounds/i-saw-you.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/i-saw-you.mp3
--------------------------------------------------------------------------------
/sounds/job-done.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/job-done.mp3
--------------------------------------------------------------------------------
/sounds/just-like-magic.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/just-like-magic.mp3
--------------------------------------------------------------------------------
/sounds/long-chime-sound.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/long-chime-sound.mp3
--------------------------------------------------------------------------------
/sounds/may-i-have-your-attention.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/may-i-have-your-attention.mp3
--------------------------------------------------------------------------------
/sounds/munchausen.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/munchausen.mp3
--------------------------------------------------------------------------------
/sounds/news-bringer.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/news-bringer.mp3
--------------------------------------------------------------------------------
/sounds/no-way.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/no-way.mp3
--------------------------------------------------------------------------------
/sounds/not-kiddin.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/not-kiddin.mp3
--------------------------------------------------------------------------------
/sounds/oh-really.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/oh-really.mp3
--------------------------------------------------------------------------------
/sounds/on-serious-matters.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/on-serious-matters.mp3
--------------------------------------------------------------------------------
/sounds/paranoid.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/paranoid.mp3
--------------------------------------------------------------------------------
/sounds/pizzicato.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/pizzicato.mp3
--------------------------------------------------------------------------------
/sounds/police.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/police.mp3
--------------------------------------------------------------------------------
/sounds/pop.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/pop.mp3
--------------------------------------------------------------------------------
/sounds/professionals.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/professionals.mp3
--------------------------------------------------------------------------------
/sounds/quiet-knock.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/quiet-knock.mp3
--------------------------------------------------------------------------------
/sounds/robot-walking.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/robot-walking.mp3
--------------------------------------------------------------------------------
/sounds/served.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/served.mp3
--------------------------------------------------------------------------------
/sounds/sorted.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/sorted.mp3
--------------------------------------------------------------------------------
/sounds/springy.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/springy.mp3
--------------------------------------------------------------------------------
/sounds/surprise-on-a-spring.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/surprise-on-a-spring.mp3
--------------------------------------------------------------------------------
/sounds/system-fault.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/system-fault.mp3
--------------------------------------------------------------------------------
/sounds/the-squeaky-wheel-gets-the-grease.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/the-squeaky-wheel-gets-the-grease.mp3
--------------------------------------------------------------------------------
/sounds/this-is-it.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/this-is-it.mp3
--------------------------------------------------------------------------------
/sounds/warning.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/warning.mp3
--------------------------------------------------------------------------------
/sounds/what.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/what.mp3
--------------------------------------------------------------------------------
/sounds/wiggle.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/wiggle.mp3
--------------------------------------------------------------------------------
/sounds/will-you.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/will-you.mp3
--------------------------------------------------------------------------------
/sounds/you-wouldnt-believe.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/you-wouldnt-believe.mp3
--------------------------------------------------------------------------------
/timeout.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Timeout - %%SYSNAME%% UI3
9 |
54 |
55 |
56 |
57 |

58 |
59 |
%%SYSNAME%% - Web Interface Timeout
60 |
You have been idle too long, and were redirected here to save resources.
61 |
The idle timeout can be adjusted in "UI Settings" under UI3's Main Menu.
62 |
63 |
64 |
%%SYSNAME%% - Session Limit Reached
65 |
Your session has reached the time limit configured for your user account in Blue Iris Settings > Users.
66 |
67 |
68 |
%%SYSNAME%% - Daily Limit Reached
69 |
Your user account has reached the daily time limit configured in Blue Iris Settings > Users.
70 |
71 |
72 |
73 | Click here to reconnect
76 |
77 |
78 |
79 |
200 |
201 |
--------------------------------------------------------------------------------
/ui3/LoadingImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/LoadingImage.png
--------------------------------------------------------------------------------
/ui3/ajax-loader-big.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/ajax-loader-big.gif
--------------------------------------------------------------------------------
/ui3/flag24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/flag24.png
--------------------------------------------------------------------------------
/ui3/help/css/help.css:
--------------------------------------------------------------------------------
1 | .navbar
2 | {
3 | margin-bottom: 0px;
4 | }
5 | .baseContainer
6 | {
7 | padding: 8px;
8 | }
9 | p.padded-info
10 | {
11 | padding: 15px;
12 | }
13 | .tab-pane
14 | {
15 | margin-bottom: 144px;
16 | }
--------------------------------------------------------------------------------
/ui3/help/img/CameraContextMenu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/help/img/CameraContextMenu.png
--------------------------------------------------------------------------------
/ui3/help/img/ClipContextMenu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/help/img/ClipContextMenu.png
--------------------------------------------------------------------------------
/ui3/help/img/ConvertExport.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/help/img/ConvertExport.png
--------------------------------------------------------------------------------
/ui3/help/img/ConvertExportIcon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/help/img/ConvertExportIcon.png
--------------------------------------------------------------------------------
/ui3/help/img/ExportList.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/help/img/ExportList.png
--------------------------------------------------------------------------------
/ui3/help/img/ExportRange.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/help/img/ExportRange.png
--------------------------------------------------------------------------------
/ui3/help/img/ExportStatus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/help/img/ExportStatus.png
--------------------------------------------------------------------------------
/ui3/help/img/MainMenuIcon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/help/img/MainMenuIcon.png
--------------------------------------------------------------------------------
/ui3/help/img/MqttSample.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/help/img/MqttSample.png
--------------------------------------------------------------------------------
/ui3/help/img/ProfileEditor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/help/img/ProfileEditor.png
--------------------------------------------------------------------------------
/ui3/help/img/RecordingFilters.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/help/img/RecordingFilters.png
--------------------------------------------------------------------------------
/ui3/help/img/ServerSideStreamingProfile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/help/img/ServerSideStreamingProfile.png
--------------------------------------------------------------------------------
/ui3/help/img/StatsForNerds.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/help/img/StatsForNerds.png
--------------------------------------------------------------------------------
/ui3/help/js/help.js:
--------------------------------------------------------------------------------
1 | (function ($)
2 | {
3 | if (navigator.cookieEnabled)
4 | NavRemoveUrlParams("session");
5 | $('.nav-pills').stickyTabs();
6 | //$(function ()
7 | //{
8 | // $("#navEle").resize(navResized);
9 | // navResized();
10 | //});
11 | //function navResized()
12 | //{
13 | // $('body').css("padding-top", ($("#navEle").height()) + "px");
14 | //}
15 | })(jQuery);
16 | /**
17 | * Changes the current URL by removing the specified query string parameter(s) from it.
18 | * @returns {String} Returns null if successful, otherwise returns the new URL if changing the history state failed.
19 | */
20 | function NavRemoveUrlParams()
21 | {
22 | var url = RemoveUrlParams.apply(this, arguments);
23 | try { history.replaceState(history.state, "", url); return null; } catch (ex) { return url; }
24 | }
25 | function RemoveUrlParams()
26 | {
27 | var s = location.search;
28 | for (var i = 0; i < arguments.length; i++)
29 | {
30 | var param = arguments[i];
31 | var rx = new RegExp('(&|\\?)' + param + '=[^&?#%]+', 'gi');
32 | s = s.replace(rx, "");
33 | while (s.indexOf("&") === 0)
34 | {
35 | if (s.length > 1)
36 | s = s.substr(1);
37 | else
38 | s = "";
39 | }
40 | if (s.length > 0 && s.indexOf("?") === -1)
41 | s = "?" + s;
42 | }
43 | return location.origin + location.pathname + s + location.hash;
44 | }
45 |
46 |
47 | $(function ()
48 | {
49 | var imgs = document.getElementsByTagName("img");
50 | for (var i = 0; i < imgs.length; i++)
51 | {
52 | var src = imgs[i].getAttribute("mysrc");
53 | if (src)
54 | imgs[i].src = src + (navigator.cookieEnabled ? "" : "?session=" + local_bi_session);
55 | }
56 | try
57 | {
58 | var profileData = JSON.parse(localStorage.ui3_streamingProfileArray);
59 | for (var i = 0; i < profileData.length; i++)
60 | {
61 | var row = $('
');
62 | var cell_name = $(' | ').text(profileData[i].name);
63 | var cell_nameEnc = $(' | ').append($('
').text(encodeURIComponent(profileData[i].name)));
64 | row.append(cell_name);
65 | row.append(cell_nameEnc);
66 | $("#streamingProfileTbody").append(row);
67 | }
68 | $("#streamingProfileListParagraph").show();
69 | }
70 | catch (ex)
71 | {
72 | console.log("Unable to load streaming profiles. Local storage is probably not enabled.");
73 | console.error(ex);
74 | }
75 |
76 | try
77 | {
78 | // Set the current time minus one minute in the Timeline example link on the URL Parameters page
79 | $("#timelineLink").attr("href", $("#timelineLink").attr("href") + (Date.now() - 60000));
80 | $("#timelineLink").text($("#timelineLink").text() + (Date.now() - 60000));
81 | }
82 | catch (ex)
83 | {
84 | console.log("Unable to set timelineLink.");
85 | console.error(ex);
86 | }
87 |
88 | function GetFirstHeading(ele)
89 | {
90 | for (var i = 1; i <= 9; i++)
91 | {
92 | var h = ele.find("h" + i).first();
93 | if (h.length)
94 | return h;
95 | }
96 | return null;
97 | }
98 |
99 | try
100 | {
101 | // Copy all navbar links to a list on the Home page.
102 | var tabPanels = $('div.tab-pane');
103 | var homeLinks = [];
104 | var allTabPanes = [];
105 | for (var i = 0; i < tabPanels.length; i++)
106 | {
107 | var tabPanel = tabPanels.eq(i);
108 | allTabPanes.push(tabPanel);
109 | var firstHeading = GetFirstHeading(tabPanel);
110 | if (firstHeading)
111 | {
112 | var id = tabPanel.attr('id');
113 | if (id && id !== '' && id !== 'home' && id !== 'template')
114 | {
115 | var dst = $('');
116 | dst.attr('href', "#" + id);
117 | var text = firstHeading.text().trim();
118 | dst.text(text);
119 |
120 | homeLinks.push({ key: text, a: dst });
121 | }
122 | }
123 | }
124 |
125 | homeLinks.sort(function (a, b)
126 | {
127 | return a.key.localeCompare(b.key);
128 | });
129 |
130 | var homeIndex = $("#homeIndex");
131 | for (var i = 0; i < homeLinks.length; i++)
132 | homeIndex.append(homeLinks[i].a);
133 |
134 | if (!$("#home").is(":hidden"))
135 | $('div.tab-pane').addClass("active");
136 | }
137 | catch (ex)
138 | {
139 | console.log("Unable to create list of section links in Home page.");
140 | console.error(ex);
141 | }
142 | });
143 | $("#nav-home").on("shown.bs.tab", function ()
144 | {
145 | $('div.tab-pane').addClass("active");
146 | });
--------------------------------------------------------------------------------
/ui3/help/js/jquery.stickytabs.js:
--------------------------------------------------------------------------------
1 | /**
2 | * jQuery Plugin: Sticky Tabs
3 | *
4 | * @author Aidan Lister
5 | * @version 1.2.0
6 | */
7 | (function ( $ ) {
8 | $.fn.stickyTabs = function( options ) {
9 | var context = this
10 |
11 | var settings = $.extend({
12 | getHashCallback: function(hash, btn) { return hash },
13 | selectorAttribute: "href",
14 | backToTop: false,
15 | initialTab: $('li.active > a', context)
16 | }, options );
17 |
18 | // Show the tab corresponding with the hash in the URL, or the first tab.
19 | var showTabFromHash = function() {
20 | var hash = settings.selectorAttribute == "href" ? window.location.hash : window.location.hash.substring(1);
21 | var selector = hash ? 'a[' + settings.selectorAttribute +'="' + hash + '"]' : settings.initialTab;
22 | $(selector, context).tab('show');
23 | setTimeout(backToTop, 1);
24 | }
25 |
26 | // We use pushState if it's available so the page won't jump, otherwise a shim.
27 | var changeHash = function(hash) {
28 | if (history && history.pushState) {
29 | history.pushState(null, null, window.location.pathname + window.location.search + '#' + hash);
30 | } else {
31 | scrollV = document.body.scrollTop;
32 | scrollH = document.body.scrollLeft;
33 | window.location.hash = hash;
34 | document.body.scrollTop = scrollV;
35 | document.body.scrollLeft = scrollH;
36 | }
37 | }
38 |
39 | var backToTop = function() {
40 | if (settings.backToTop === true) {
41 | window.scrollTo(0, 0);
42 | }
43 | }
44 |
45 | // Set the correct tab when the page loads
46 | showTabFromHash();
47 |
48 | // Set the correct tab when a user uses their back/forward button
49 | $(window).on('hashchange', showTabFromHash);
50 |
51 | // Change the URL when tabs are clicked
52 | $('a', context).on('click', function(e) {
53 | var hash = this.href.split('#')[1];
54 | var adjustedhash = settings.getHashCallback(hash, this);
55 | changeHash(adjustedhash);
56 | setTimeout(backToTop, 1);
57 | });
58 |
59 | return this;
60 | };
61 | }( jQuery ));
--------------------------------------------------------------------------------
/ui3/horror.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/horror.png
--------------------------------------------------------------------------------
/ui3/icons-src/Flag.xcf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/Flag.xcf
--------------------------------------------------------------------------------
/ui3/icons-src/RedDot5px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/RedDot5px.png
--------------------------------------------------------------------------------
/ui3/icons-src/Ripple.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/Rolling.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/Trigger.xcf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/Trigger.xcf
--------------------------------------------------------------------------------
/ui3/icons-src/Trigger2.xcf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/Trigger2.xcf
--------------------------------------------------------------------------------
/ui3/icons-src/Trigger24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/Trigger24.png
--------------------------------------------------------------------------------
/ui3/icons-src/Trigger_8color.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/Trigger_8color.png
--------------------------------------------------------------------------------
/ui3/icons-src/alert.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/ui3/icons-src/alert1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/alert1.png
--------------------------------------------------------------------------------
/ui3/icons-src/alert1.svg:
--------------------------------------------------------------------------------
1 |
2 |
54 |
--------------------------------------------------------------------------------
/ui3/icons-src/alert1_20px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/alert1_20px.png
--------------------------------------------------------------------------------
/ui3/icons-src/auto_maximize.svg:
--------------------------------------------------------------------------------
1 |
2 |
60 |
--------------------------------------------------------------------------------
/ui3/icons-src/chrome.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/clipicons.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/clipicons.png
--------------------------------------------------------------------------------
/ui3/icons-src/closeBtn.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/contrast.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/edge.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/ellipsis.svg:
--------------------------------------------------------------------------------
1 |
2 |
60 |
--------------------------------------------------------------------------------
/ui3/icons-src/firefox.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/flag24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/flag24.png
--------------------------------------------------------------------------------
/ui3/icons-src/flag24_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/flag24_1.png
--------------------------------------------------------------------------------
/ui3/icons-src/flag24_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/flag24_2.png
--------------------------------------------------------------------------------
/ui3/icons-src/flag24_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/flag24_3.png
--------------------------------------------------------------------------------
/ui3/icons-src/gamepad_public_domain.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
48 |
--------------------------------------------------------------------------------
/ui3/icons-src/horror.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/horror.png
--------------------------------------------------------------------------------
/ui3/icons-src/launcher-icon192_ios_lossless.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/launcher-icon192_ios_lossless.webp
--------------------------------------------------------------------------------
/ui3/icons-src/launcher-icon256_ios_sharpened_lossless.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/launcher-icon256_ios_sharpened_lossless.webp
--------------------------------------------------------------------------------
/ui3/icons-src/logo_icon_ios.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/logo_icon_ios.png
--------------------------------------------------------------------------------
/ui3/icons-src/logo_icon_ios_visualcenter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/logo_icon_ios_visualcenter.png
--------------------------------------------------------------------------------
/ui3/icons-src/logosrc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/logosrc.png
--------------------------------------------------------------------------------
/ui3/icons-src/logosrc_ai.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/logosrc_ai.png
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/apps_black_24dp.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/baseline-access_time-24px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/baseline-branding_watermark-24px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/baseline-edit-24px.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/baseline-movie_filter-24px.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/bolt_black_24dp.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/close_fullscreen-24px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/crop-black-24dp.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/directions_car_black_24dp.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/download_black_24dp.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/folder-24px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/folder_special-24px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/hide_image_black_24dp.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/home_black_24dp.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/ic_brightness_low_black_24px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/ic_check_box_black_24px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/ic_check_box_outline_blank_black_24px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/ic_cloud_upload_black_24px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/ic_content_copy_black_24px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/ic_delete_black_48px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/ic_directions_run_black_24px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/ic_filter_frames_black_24px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/ic_fullscreen_black_48px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/ic_fullscreen_exit_black_48px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/ic_help_black_24px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/ic_lightbulb_outline_black_24px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/ic_lock_black_24px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/ic_movie_black_48px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/ic_perm_device_information_black_24px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/ic_photo_size_select_large_black_24px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/ic_refresh_black_48px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/ic_replay_black_24px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/ic_tab_black_48px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/ic_view_quilt_black_24px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/ic_volume_down_black_24px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/ic_volume_mute_black_24px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/ic_volume_off_black_24px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/ic_volume_up_black_24px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/ic_warning_black_24px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/indeterminate_check_box-24px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/launch-24px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/man_black_24dp.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/open_in_full-24px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/pending_black_24dp.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/picture_in_picture_alt_black_24dp.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/search_black_24dp.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/sports_esports_24dp.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/star_rate-24px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/storage-24px.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/update.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/videocam_black_24dp.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/view_sidebar.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/zoom_in_black_24dp.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/material.io/zoom_out_black_24dp.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/person24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/person24.png
--------------------------------------------------------------------------------
/ui3/icons-src/pets.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/sentry_human.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/sentry_human_src.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
69 |
--------------------------------------------------------------------------------
/ui3/icons-src/sentry_logo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/sentry_logo_src.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
79 |
--------------------------------------------------------------------------------
/ui3/icons-src/shield.svg:
--------------------------------------------------------------------------------
1 |
2 |
71 |
--------------------------------------------------------------------------------
/ui3/icons-src/sidebar_hidden.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui3/icons-src/sidebar_hidden2.svg:
--------------------------------------------------------------------------------
1 |
2 |
105 |
--------------------------------------------------------------------------------
/ui3/icons-src/trigger@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/trigger@2x.png
--------------------------------------------------------------------------------
/ui3/icons-src/ui3gamepad_optimized.svg:
--------------------------------------------------------------------------------
1 |
27 |
--------------------------------------------------------------------------------
/ui3/icons-src/vehicle24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/vehicle24.png
--------------------------------------------------------------------------------
/ui3/icons-src/wildlife.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/ui3/icons-src/wildlife24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/wildlife24.png
--------------------------------------------------------------------------------
/ui3/libs-src/Css Z-index Planner.txt:
--------------------------------------------------------------------------------
1 | .clipIconWrapper 1
2 | #exportOffsetStart 1
3 | #exportOffsetEnd 2
4 | .clipDesc 10
5 | #statusArea 50
6 | #layouttop 100
7 | #datePickerDialog 100
8 | #bigThumb 9999
9 | #loadingmsgwrapper 99999 (defined in html style attribute)
10 | .inputRequiredToPlay 500000
11 | #toast-container 999999 (defined in toastr css)
12 | .dropdown_list 9999999
13 | .playbackSettings 9999999
14 | .profileListItem.ghost 999999999
--------------------------------------------------------------------------------
/ui3/libs-src/Dialog.css:
--------------------------------------------------------------------------------
1 | .dialog_close_icon svg
2 | {
3 | stroke: currentColor;
4 | pointer-events: none;
5 | }
6 |
7 | .dialog_refresh_icon svg
8 | {
9 | fill: currentColor;
10 | pointer-events: none;
11 | }
12 |
13 | .dialog_overlay
14 | {
15 | position: absolute;
16 | width: 100%;
17 | height: 100%;
18 | top: 0px;
19 | left: 0px;
20 | background-color: #000000;
21 | }
22 |
23 | .dialog_wrapper
24 | {
25 | position: absolute;
26 | border: 1px solid #1870B5;
27 | background-color: #FFFFFF;
28 | color: #000000;
29 | font-size: 10pt;
30 | overflow-x: hidden;
31 | overflow-y: hidden;
32 | min-width: 160px;
33 | min-height: 24px;
34 | max-width: 90vw;
35 | box-shadow: 0px 0px 35px 1px rgba(0,0,0,0.4);
36 | }
37 |
38 | .dialog_wrapper.darkTheme
39 | {
40 | background-color: #393939;
41 | color: #cdcdcd;
42 | }
43 |
44 | .dialog_titlebar
45 | {
46 | position: relative;
47 | height: 24px;
48 | overflow: hidden;
49 | padding-right: 40px;
50 | border-bottom: 1px solid #B5D5FF;
51 | user-select: none;
52 | cursor: default;
53 | font-size: 0px;
54 | }
55 |
56 | .dialog_wrapper.darkTheme .dialog_titlebar
57 | {
58 | border-bottom: 1px solid #15273f;
59 | background-color: #272727;
60 | }
61 |
62 | .dialog_title
63 | {
64 | padding: 0px 4px;
65 | top: 0px;
66 | left: 0px;
67 | height: 24px;
68 | line-height: 24px;
69 | font-size: 16px;
70 | user-select: none;
71 | }
72 |
73 | .dialog_close,
74 | .dialog_refresh
75 | {
76 | position: absolute;
77 | top: 0px;
78 | right: 0px;
79 | width: 40px;
80 | height: 24px;
81 | background-color: #FFFFFF;
82 | }
83 |
84 | .dialog_close:hover
85 | {
86 | background-color: #E81123;
87 | color: #FFFFFF;
88 | }
89 |
90 | .dialog_close:active
91 | {
92 | background-color: #F1707A;
93 | color: #FFFFFF;
94 | }
95 |
96 | .dialog_wrapper.darkTheme .dialog_close,
97 | .dialog_wrapper.darkTheme .dialog_refresh
98 | {
99 | background-color: #272727;
100 | color: #cdcdcd;
101 | }
102 |
103 | .dialog_wrapper.darkTheme .dialog_close:hover
104 | {
105 | background-color: #9b0612;
106 | }
107 |
108 | .dialog_wrapper.darkTheme .dialog_close:active
109 | {
110 | background-color: #7d040e;
111 | }
112 |
113 | .dialog_refresh
114 | {
115 | right: 40px;
116 | }
117 |
118 | .dialog_refresh:hover,
119 | .dialog_wrapper.darkTheme .dialog_refresh:hover
120 | {
121 | background-color: #158e1d;
122 | color: #FFFFFF;
123 | }
124 |
125 | .dialog_refresh:active,
126 | .dialog_wrapper.darkTheme .dialog_refresh:active
127 | {
128 | background-color: #146619;
129 | color: #FFFFFF;
130 | }
131 |
132 | .dialog_close_icon, .dialog_refresh_icon
133 | {
134 | width: 12px;
135 | height: 12px;
136 | margin: 6px auto;
137 | }
138 |
139 | .dialog_content
140 | {
141 | position: relative;
142 | padding: 2px 4px;
143 | overflow: auto;
144 | max-width: 90vw;
145 | max-height: 85vh;
146 | max-height: calc(100vh - 27px);
147 | box-sizing: border-box;
148 | }
149 |
150 | .dialog_content a, .dialog_content a:visited
151 | {
152 | color: #88DDFF;
153 | }
154 |
155 | .dialog_wrapper.loading::after
156 | {
157 | content: "";
158 | position: absolute;
159 | top: 24px;
160 | left: 0px;
161 | width: 100%;
162 | height: 100%;
163 | background-color: rgba(0,0,0,0.3);
164 | }
165 |
--------------------------------------------------------------------------------
/ui3/libs-src/HistoryButtonOverride.js:
--------------------------------------------------------------------------------
1 | /*
2 | HistoryButtonOverride.js
3 | by bp2008
4 | The HistoryButtonOverride code is released to the public domain.
5 | IMPORTANT: Safari on mac will not raise the window.load event if you create an instance of this object before window.load is raised.
6 | */
7 | function HistoryButtonOverride(BackButtonPressed, ForwardButtonPressed)
8 | {
9 | var activated = false;
10 | var Reset = function ()
11 | {
12 | if (history.state === null)
13 | return;
14 | if (history.state.customHistoryStage === 1)
15 | history.forward();
16 | else if (history.state.customHistoryStage === 3)
17 | history.back();
18 | };
19 | function hboPopState()
20 | {
21 | // Called when history navigation occurs.
22 | if (history.state === null || !activated)
23 | return;
24 | if (history.state.customHistoryStage === 1)
25 | {
26 | if (typeof BackButtonPressed === "function" && BackButtonPressed())
27 | {
28 | Reset();
29 | return;
30 | }
31 | if (history.state.initialHistoryLength > 1)
32 | history.back(); // There is back-history to go to.
33 | else
34 | history.forward(); // No back-history to go to, so undo the back operation.
35 | }
36 | else if (history.state.customHistoryStage === 3)
37 | {
38 | if (typeof ForwardButtonPressed === "function" && ForwardButtonPressed())
39 | {
40 | Reset();
41 | return;
42 | }
43 | if (history.length > history.state.initialHistoryLength + 2)
44 | history.forward(); // There is forward-history to go to.
45 | else
46 | history.back(); // No forward-history to go to, so undo the forward operation.
47 | }
48 | }
49 | $(window).on("popstate", hboPopState);
50 | if (history.state === null)
51 | {
52 | // This is the first page load. Inject new history states to help identify back/forward button presses.
53 | var initialHistoryLength = history.length;
54 | history.replaceState({ customHistoryStage: 1, initialHistoryLength: initialHistoryLength }, "", location.href);
55 | history.pushState({ customHistoryStage: 2, initialHistoryLength: initialHistoryLength }, "", location.href);
56 | if (typeof ForwardButtonPressed === "function")
57 | {
58 | history.pushState({ customHistoryStage: 3, initialHistoryLength: initialHistoryLength }, "", location.href);
59 | history.back();
60 | }
61 | }
62 | else if (history.state.customHistoryStage === 1)
63 | history.forward();
64 | else if (history.state.customHistoryStage === 3)
65 | history.back();
66 |
67 | this.Destroy = function ()
68 | {
69 | activated = false;
70 | $(window).off("popstate", hboPopState);
71 | history.back();
72 | }
73 |
74 | activated = true;
75 | }
--------------------------------------------------------------------------------
/ui3/libs-src/Queue.src.js:
--------------------------------------------------------------------------------
1 | /*
2 |
3 | Queue.js
4 |
5 | A function to represent a queue
6 |
7 | Created by Stephen Morley - http://code.stephenmorley.org/ - and released under
8 | the terms of the CC0 1.0 Universal legal code:
9 |
10 | http://creativecommons.org/publicdomain/zero/1.0/legalcode
11 |
12 | replaceFront method added by bp2008, Sept 2017
13 |
14 | other modifications made by bp2008
15 |
16 | */
17 |
18 | /* Creates a new queue. A queue is a first-in-first-out (FIFO) data structure -
19 | * items are added to the end of the queue and removed from the front.
20 | */
21 | function Queue()
22 | {
23 | // initialise the queue and offset
24 | var self = this;
25 | var queue = [];
26 | var offset = 0;
27 |
28 | /**
29 | * Returns the length of the queue.
30 | * @returns {Number} the length of the queue
31 | */
32 | this.getLength = function ()
33 | {
34 | return queue.length - offset;
35 | };
36 |
37 | /**
38 | * Returns true if the queue is empty, and false otherwise.
39 | * @returns {Boolean} true if the queue is empty
40 | */
41 | this.isEmpty = function ()
42 | {
43 | return queue.length === offset;
44 | };
45 |
46 | /**
47 | * Enqueues the specified item.
48 | * @param {Any} item the item to enqueue
49 | */
50 | this.enqueue = function (item)
51 | {
52 | queue.push(item);
53 | };
54 |
55 | /**
56 | * Dequeues an item and returns it. If the queue is empty, the value 'undefined' is returned.
57 | * @returns {Any} The item which was at the front of the queue, or 'undefined'.
58 | */
59 | this.dequeue = function ()
60 | {
61 |
62 | // if the queue is empty, return immediately
63 | if (self.isEmpty()) return undefined;
64 |
65 | // store the item at the front of the queue
66 | var item = queue[offset];
67 |
68 | // Remove the item from the queue so it can be garbage collected.
69 | queue[offset] = undefined;
70 |
71 | // increment the offset and remove the free space if necessary
72 | offset++;
73 | if (queue.length > 16 && offset * 2 >= queue.length)
74 | {
75 | queue = queue.slice(offset);
76 | offset = 0;
77 | }
78 |
79 | // return the dequeued item
80 | return item;
81 |
82 | };
83 |
84 | /**
85 | * Returns the item at the front of the queue (without dequeuing it). If the queue is empty then undefined is returned.
86 | * @returns {Any} The item which is at the front of the queue, or 'undefined'.
87 | */
88 | this.peek = function ()
89 | {
90 | return self.isEmpty() ? undefined : queue[offset];
91 | };
92 |
93 | /**
94 | * Replaces the item at the front of the queue with a different item. If the queue is empty then this method behaves like [enqueue].
95 | * @param {Any} newFront the item to put at the front of the queue
96 | */
97 | this.replaceFront = function (newFront)
98 | {
99 | if (self.isEmpty())
100 | self.enqueue(newFront);
101 | else
102 | queue[offset] = newFront;
103 | };
104 |
105 | /**
106 | * Returns an array containing all the items in the queue, in the order they would have been dequeued in.
107 | * @returns {Array} Returns an array containing all the items in the queue, in the order they would have been dequeued in.
108 | */
109 | this.toArray = function ()
110 | {
111 | var arr = new Array(self.getLength());
112 | for (var i = offset, n = 0; i < queue.length; i++, n++)
113 | arr[n] = queue[i];
114 | return arr;
115 | };
116 |
117 | /**
118 | * Returns the first item that causes the specified predicate to return true.
119 | * @param {Function} where A function to which each item from the queue is passed. The function should return true when the desired item is passed in.
120 | * @returns {Any} Returns the first item that causes the specified predicate to return true.
121 | */
122 | this.find = function (where)
123 | {
124 | for (var i = offset; i < queue.length; i++)
125 | if (where(queue[i]))
126 | return queue[i];
127 | return undefined;
128 | };
129 |
130 | /**
131 | * Removes all items that cause the specified predicate to return true.
132 | * @param {Function} where A function to which each item from the queue is passed. The function should return true when the desired item is passed in.
133 | * @returns {Any} Removes all items that cause the specified predicate to return true.
134 | */
135 | this.removeAll = function (where)
136 | {
137 | // An alternate implementation would be to create a new array, fill it with non-matching items, and reset the offset. However the current implementation is likely faster when there is only one match.
138 | for (var i = offset; i < queue.length; i++)
139 | if (where(queue[i]))
140 | {
141 | queue.splice(i, 1);
142 | i--;
143 | }
144 | };
145 | /**
146 | * Removes all items from the queue.
147 | */
148 | this.clear = function ()
149 | {
150 | queue = [];
151 | offset = 0;
152 | }
153 | }
154 |
--------------------------------------------------------------------------------
/ui3/libs-src/about-libs-src.txt:
--------------------------------------------------------------------------------
1 | This directory contains some of the source from which libs-ui3.css and libs-ui3.js, etc, were created.
2 |
3 | Other source files may be found in other directories, such as wdContextMenu and zebra_datepicker.
--------------------------------------------------------------------------------
/ui3/libs-src/base64Array.js:
--------------------------------------------------------------------------------
1 | function base64Array(arr)
2 | {
3 | var s = '';
4 | var size = 3 * 10250; // Encode small chunks at a time
5 | for (var i = 0; i < arr.length; i += size)
6 | {
7 | s += btoa(String.fromCharCode.apply(null, arr.slice(i, i + size)));
8 | }
9 | return s;
10 | }
11 | if (typeof btoa !== "function")
12 | {
13 | // A helper that returns Base64 characters and their indices.
14 | var chars = {
15 | ascii: function ()
16 | {
17 | return 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
18 | }
19 | };
20 | /**
21 | * Binary to ASCII (encode data to Base64)
22 | * @param {String} data
23 | * @returns {String}
24 | */
25 | window.btoa = function (data)
26 | {
27 | var ascii = chars.ascii(),
28 | len = data.length - 1,
29 | i = -1,
30 | b64 = [];
31 |
32 | while (i < len)
33 | {
34 | var code = data.charCodeAt(++i) << 16 | data.charCodeAt(++i) << 8 | data.charCodeAt(++i);
35 | b64.push(ascii[(code >>> 18) & 63] + ascii[(code >>> 12) & 63] + ascii[(code >>> 6) & 63] + ascii[code & 63]);
36 | }
37 |
38 | b64 = b64.join('');
39 | var pads = data.length % 3;
40 | if (pads > 0)
41 | {
42 | b64 = b64.slice(0, pads - 3);
43 |
44 | while (b64.length % 4 !== 0)
45 | {
46 | b64 += '=';
47 | }
48 | }
49 |
50 | return b64;
51 | }
52 | }
--------------------------------------------------------------------------------
/ui3/libs-src/basic-event-timer.js:
--------------------------------------------------------------------------------
1 | /**
2 | Constructor for BasicEventTimer which helps measure execution time of code.
3 |
4 | A class which makes it easy to time different parts of a procedure individually and later report the time in seconds taken for each part. This class is NOT thread-safe.
5 |
6 | Example:
7 |
8 | BasicEventTimer timer = new BasicEventTimer();
9 |
10 | timer.Start("Event 1");
11 | timed_procedure_1();
12 |
13 | timer.Start("Event 2");
14 | timed_procedure_2();
15 | timer.Stop();
16 |
17 | untimed_procedure();
18 |
19 | timer.Start("Event 3");
20 | timed_procedure_3();
21 | timer.Stop();
22 |
23 | Console.WriteLine(timer.ToString(Environment.NewLine));
24 |
25 | Example output:
26 | 0.01 - Procedure 1
27 | 50.15 - Procedure 2
28 | 1.51 - Procedure 3
29 | @param {Boolean} mergeSameEventTimes If true, multiple events with the same name will have their times added together into one record. Useful when repeating a sequence of operations in a loop.
30 | */
31 | function BasicEventTimer(mergeSameEventTimes)
32 | {
33 | var self = this;
34 | var dict_events = {};
35 | var events = [];
36 | var currentEvent;
37 |
38 | /**
39 | * Starts timing a new event, automatically stopping the previous event, if there was one.
40 | * @param {String} name Name of the event.
41 | */
42 | this.start = function (name)
43 | {
44 | self.stop();
45 | if (typeof name === "undefined")
46 | name = "undefined";
47 |
48 | if (mergeSameEventTimes)
49 | {
50 | currentEvent = dict_events[name];
51 | if (currentEvent)
52 | currentEvent.watch.start();
53 | else
54 | events.push(currentEvent = dict_events[name] = new TimedEvent(name));
55 | }
56 | else
57 | events.push(currentEvent = dict_events[name] = new TimedEvent(name));
58 | }
59 |
60 | /** Stops time measurement for the previously started event, if there was one. */
61 | this.stop = function ()
62 | {
63 | if (currentEvent)
64 | currentEvent.watch.stop();
65 | }
66 |
67 | /**
68 | * Returns the time (in milliseconds) elapsed for the most recent occurrence of the named event. -1 if the named event is not found.
69 | * @param {String} name Name of the event.
70 | */
71 | this.duration = function (name)
72 | {
73 | if (typeof name === "undefined")
74 | name = "undefined";
75 | var e = dict_events[name];
76 | if (e)
77 | return e.watch.elapsedMs();
78 | return -1;
79 | }
80 |
81 | /**
82 | * Returns a string containing the time in seconds measured for each event. Events are separated by the specified string.
83 | * @param {String} separator Separator to go between events. If undefined, '\r\n' will be used instead.
84 | */
85 | this.toString = function (separator)
86 | {
87 | if (typeof separator === "undefined")
88 | separator = '\r\n';
89 | var labels = new Array(events.length);
90 | for (var i = 0; i < events.length; i++)
91 | labels[i] = events[i].name + ": " + events[i].watch.elapsedMs().toFixed(1) + "ms";
92 | return labels.join(separator);
93 | }
94 |
95 | /**
96 | * Logs the events and their times to the console.
97 | * @param {String} title Optional string to log before logging the events and their times.
98 | * */
99 | this.log = function (title)
100 | {
101 | if (typeof title === "undefined")
102 | title = '';
103 | else
104 | title += '\r\n';
105 | console.log(title + self.toString('\r\n'));
106 | }
107 |
108 | function TimedEvent(name)
109 | {
110 | this.name = name;
111 | this.watch = new Stopwatch();
112 | this.watch.start();
113 | }
114 | }
115 | function Stopwatch()
116 | {
117 | var accumulatedTime = 0;
118 | var startTime = 0;
119 | var isStarted = false;
120 |
121 | this.start = function ()
122 | {
123 | if (!isStarted)
124 | {
125 | startTime = performance.now();
126 | isStarted = true;
127 | }
128 | };
129 | this.stop = function ()
130 | {
131 | if (isStarted)
132 | {
133 | accumulatedTime += performance.now() - startTime;
134 | isStarted = false;
135 | }
136 | };
137 | this.elapsedMs = function ()
138 | {
139 | if (isStarted)
140 | return accumulatedTime + (performance.now() - startTime);
141 | return accumulatedTime;
142 | }
143 | this.reset = function ()
144 | {
145 | accumulatedTime = 0;
146 | startTime = 0;
147 | isStarted = false;
148 | }
149 | }
--------------------------------------------------------------------------------
/ui3/libs-src/client-zip@2.3.1.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Skipped minification because the original files appears to be already minified.
3 | * Original file: /npm/client-zip@2.3.1/index.js
4 | *
5 | * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
6 | */
7 | "stream"in Blob.prototype||Object.defineProperty(Blob.prototype,"stream",{value(){return new Response(this).body}}),"setBigUint64"in DataView.prototype||Object.defineProperty(DataView.prototype,"setBigUint64",{value(n,e,t){const i=Number(0xffffffffn&e),o=Number(e>>32n);this.setUint32(n+(t?0:4),i,t),this.setUint32(n+(t?4:0),o,t)}});var n=n=>new DataView(new ArrayBuffer(n)),e=n=>new Uint8Array(n.buffer||n),t=n=>(new TextEncoder).encode(String(n)),i=n=>Math.min(4294967295,Number(n)),o=n=>Math.min(65535,Number(n));function f(n,i){if(void 0===i||i instanceof Date||(i=new Date(i)),n instanceof File)return{isFile:1,t:i||new Date(n.lastModified),i:n.stream()};if(n instanceof Response)return{isFile:1,t:i||new Date(n.headers.get("Last-Modified")||Date.now()),i:n.body};if(void 0===i)i=new Date;else if(isNaN(i))throw new Error("Invalid modification date.");if(void 0===n)return{isFile:0,t:i};if("string"==typeof n)return{isFile:1,t:i,i:t(n)};if(n instanceof Blob)return{isFile:1,t:i,i:n.stream()};if(n instanceof Uint8Array||n instanceof ReadableStream)return{isFile:1,t:i,i:n};if(n instanceof ArrayBuffer||ArrayBuffer.isView(n))return{isFile:1,t:i,i:e(n)};if(Symbol.asyncIterator in n)return{isFile:1,t:i,i:r(n)};throw new TypeError("Unsupported input format.")}function r(n){const e="next"in n?n:n[Symbol.asyncIterator]();return new ReadableStream({async pull(n){let t=0;for(;n.desiredSize>t;){const i=await e.next();if(!i.value){n.close();break}{const e=s(i.value);n.enqueue(e),t+=e.byteLength}}}})}function s(n){return"string"==typeof n?t(n):n instanceof Uint8Array?n:e(n)}function a(n,e,i){if(void 0===e||e instanceof Uint8Array||(e=t(e)),n instanceof File)return{o:u(e||t(n.name)),A:BigInt(n.size)};if(n instanceof Response){const o=n.headers.get("content-disposition"),f=o&&o.match(/;\s*filename\*?=["']?(.*?)["']?$/i),r=f&&f[1]||n.url&&new URL(n.url).pathname.split("/").findLast(Boolean),s=r&&decodeURIComponent(r),a=i||+n.headers.get("content-length");return{o:u(e||t(s)),A:BigInt(a)}}return e=u(e,void 0!==n||void 0!==i),"string"==typeof n?{o:e,A:BigInt(t(n).length)}:n instanceof Blob?{o:e,A:BigInt(n.size)}:n instanceof ArrayBuffer||ArrayBuffer.isView(n)?{o:e,A:BigInt(n.byteLength)}:{o:e,A:A(n,i)}}function A(n,e){return e>-1?BigInt(e):n?void 0:0n}function u(n,e=1){if(!n||n.every((n=>47===n)))throw new Error("The file must have a name.");if(e)for(;47===n[n.length-1];)n=n.subarray(0,-1);else 47!==n[n.length-1]&&(n=new Uint8Array([...n,47]));return n}var d=new WebAssembly.Instance(new WebAssembly.Module(Uint8Array.from(atob("AGFzbQEAAAABCgJgAABgAn9/AXwDAwIAAQUDAQACBwkCAW0CAAFjAAEIAQAKlQECSQEDfwNAIAEhAEEAIQIDQCAAQQF2IABBAXFBoIbi7X5scyEAIAJBAWoiAkEIRw0ACyABQQJ0IAA2AgAgAUEBaiIBQYACRw0ACwtJAQF/IAFBf3MhAUGAgAQhAkGAgAQgAGohAANAIAFB/wFxIAItAABzQQJ0KAIAIAFBCHZzIQEgAkEBaiICIABJDQALIAFBf3O4Cw"),(n=>n.charCodeAt(0))))),{c,m}=d.exports,l=e(m).subarray(65536);function y(n,e=0){for(const t of function*(n){for(;n.length>65536;)yield n.subarray(0,65536),n=n.subarray(65536);n.length&&(yield n)}(n))l.set(t),e=c(t.length,e);return e}function B(n,e,t=0){const i=n.getSeconds()>>1|n.getMinutes()<<5|n.getHours()<<11,o=n.getDate()|n.getMonth()+1<<5|n.getFullYear()-1980<<9;e.setUint16(t,i,1),e.setUint16(t+2,o,1)}function w(t){const i=n(30);return i.setUint32(0,1347093252),i.setUint32(4,754976768),B(t.t,i,10),i.setUint16(26,t.o.length,1),e(i)}async function*I(n){let{i:e}=n;if("then"in e&&(e=await e),e instanceof Uint8Array)yield e,n.u=y(e,0),n.A=BigInt(e.length);else{n.A=0n;const t=e.getReader();for(;;){const{value:e,done:i}=await t.read();if(i)break;n.u=y(e,n.u),n.A+=BigInt(e.length),yield e}}}function g(t,o){const f=n(16+(o?8:0));return f.setUint32(0,1347094280),f.setUint32(4,t.isFile?t.u:0,1),o?(f.setBigUint64(8,t.A,1),f.setBigUint64(16,t.A,1)):(f.setUint32(8,i(t.A),1),f.setUint32(12,i(t.A),1)),e(f)}function b(t,o,f=0){const r=n(46);return r.setUint32(0,1347092738),r.setUint32(4,755182848),r.setUint16(8,2048),B(t.t,r,12),r.setUint32(16,t.isFile?t.u:0,1),r.setUint32(20,i(t.A),1),r.setUint32(24,i(t.A),1),r.setUint16(28,t.o.length,1),r.setUint16(30,f,1),r.setUint16(40,t.isFile?33204:16893,1),r.setUint32(42,i(o),1),e(r)}function p(t,i,o){const f=n(o);return f.setUint16(0,1,1),f.setUint16(2,o-4,1),16&o&&(f.setBigUint64(4,t.A,1),f.setBigUint64(12,t.A,1)),f.setBigUint64(o-8,i,1),e(f)}function D(n){return n instanceof File||n instanceof Response?[[n],[n]]:[[n.input,n.name,n.size],[n.input,n.lastModified]]}var h=n=>function(n){let e=BigInt(22),t=0n,i=0;for(const o of n){if(!o.o)throw new Error("Every file must have a non-empty name.");if(void 0===o.A)throw new Error(`Missing size for file "${(new TextDecoder).decode(o.o)}".`);const n=o.A>=0xffffffffn,f=t>=0xffffffffn;t+=BigInt(46+o.o.length+(n&&8))+o.A,e+=BigInt(o.o.length+46+(12*f|28*n)),i||(i=n)}return(i||t>=0xffffffffn)&&(e+=BigInt(76)),e+t}(function*(n){for(const e of n)yield a(...D(e)[0])}(n));function F(n,e={}){const t={"Content-Type":"application/zip","Content-Disposition":"attachment"};return("bigint"==typeof e.length||Number.isInteger(e.length))&&e.length>0&&(t["Content-Length"]=String(e.length)),e.metadata&&(t["Content-Length"]=String(h(e.metadata))),new Response(Q(n),{headers:t})}function Q(t){return r(async function*(t){const f=[];let r=0n,s=0n,a=0;for await(const n of t){yield w(n),yield n.o,n.isFile&&(yield*I(n));const e=n.A>=0xffffffffn,t=12*(r>=0xffffffffn)|28*e;yield g(n,e),f.push(b(n,r,t)),f.push(n.o),t&&f.push(p(n,r,t)),e&&(r+=8n),s++,r+=BigInt(46+n.o.length)+n.A,a||(a=e)}let A=0n;for(const n of f)yield n,A+=BigInt(n.length);if(a||r>=0xffffffffn){const t=n(76);t.setUint32(0,1347094022),t.setBigUint64(4,BigInt(44),1),t.setUint32(12,755182848),t.setBigUint64(24,s,1),t.setBigUint64(32,s,1),t.setBigUint64(40,A,1),t.setBigUint64(48,r,1),t.setUint32(56,1347094023),t.setBigUint64(64,r+A,1),t.setUint32(72,1,1),yield e(t)}const u=n(22);u.setUint32(0,1347093766),u.setUint16(8,o(s),1),u.setUint16(10,o(s),1),u.setUint32(12,i(A),1),u.setUint32(16,i(r),1),yield e(u)}(async function*(n){for await(const e of n){const[n,t]=D(e);yield Object.assign(f(...t),a(...n))}}(t)))}window.clientZip = { downloadZip:F, makeZip: Q, predictLength: h };
--------------------------------------------------------------------------------
/ui3/libs-src/clipboard.js:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/libs-src/clipboard.js
--------------------------------------------------------------------------------
/ui3/libs-src/datepicker.css:
--------------------------------------------------------------------------------
1 | /*
2 |
3 | Zebra_DatePicker: a lightweight jQuery date picker plugin
4 |
5 | Default theme
6 |
7 | copyright (c) 2011 - 2014 Stefan Gabos
8 | http://stefangabos.ro/jquery/zebra-datepicker/
9 |
10 | */
11 |
12 | .Zebra_DatePicker *,
13 | .Zebra_DatePicker *:after,
14 | .Zebra_DatePicker *:before { -moz-box-sizing: content-box !important; -webkit-box-sizing: content-box !important; box-sizing: content-box !important }
15 |
16 | .Zebra_DatePicker { position: absolute; z-index: 1200; font-family: Verdana, Arial, sans-serif; font-size: 13px; top: 0 }
17 |
18 | .Zebra_DatePicker * { margin: 0; padding: 0; border: none }
19 |
20 | /* = GLOBALS
21 | ----------------------------------------------------------------------------------------------------------------------*/
22 | .Zebra_DatePicker table { border-collapse: collapse; border-spacing: 0; width: auto; table-layout: auto; border: 1px solid #969BA7 }
23 | .Zebra_DatePicker table.dp_header { border-bottom: none }
24 | .Zebra_DatePicker table.dp_footer { border-top: none }
25 |
26 | .Zebra_DatePicker td,
27 | .Zebra_DatePicker th { text-align: center; padding: 5px 0 }
28 |
29 | .Zebra_DatePicker td { cursor: pointer }
30 |
31 | .Zebra_DatePicker .dp_daypicker,
32 | .Zebra_DatePicker .dp_monthpicker,
33 | .Zebra_DatePicker .dp_yearpicker { }
34 |
35 | .Zebra_DatePicker .dp_daypicker td,
36 | .Zebra_DatePicker .dp_daypicker th,
37 | .Zebra_DatePicker .dp_monthpicker td,
38 | .Zebra_DatePicker .dp_yearpicker td { color: #d8d8d8; width: 30px; border: none }
39 |
40 | /* = VISIBLE/HIDDEN STATES (USE TRANSITIONS FOR EFFECTS)
41 | ----------------------------------------------------------------------------------------------------------------------*/
42 | .Zebra_DatePicker.dp_visible { visibility: visible; filter: alpha(opacity=100); -khtml-opacity: 1; -moz-opacity: 1; opacity: 1; transition: opacity 0.2s ease-in-out }
43 | .Zebra_DatePicker.dp_hidden { visibility: hidden; filter: alpha(opacity=0); -khtml-opacity: 0; -moz-opacity: 0; opacity: 0 }
44 |
45 | /* = HEADER
46 | ----------------------------------------------------------------------------------------------------------------------*/
47 | .Zebra_DatePicker .dp_header td { color: #FFF }
48 |
49 | .Zebra_DatePicker .dp_header .dp_previous,
50 | .Zebra_DatePicker .dp_header .dp_next { width: 30px }
51 |
52 | .Zebra_DatePicker .dp_header .dp_caption { }
53 | .Zebra_DatePicker .dp_header .dp_hover { background: #195f88; color: #FFF }
54 |
55 | /* = DATEPICKER
56 | ----------------------------------------------------------------------------------------------------------------------*/
57 | .Zebra_DatePicker .dp_daypicker th { color: #969BA7 }
58 | .Zebra_DatePicker td.dp_not_in_month { color: #393E45; cursor: default }
59 | .Zebra_DatePicker td.dp_not_in_month_selectable { color: #393E45; cursor: pointer }
60 | .Zebra_DatePicker td.dp_weekend { }
61 | .Zebra_DatePicker td.dp_weekend_disabled { color: #CCC; cursor: default }
62 | .Zebra_DatePicker td.dp_selected { background: #0097F0; color: #FFF !important }
63 | .Zebra_DatePicker td.dp_week_number { color: #FFF; cursor: text; font-style: italic }
64 |
65 | /* = MONTHPICKER
66 | ----------------------------------------------------------------------------------------------------------------------*/
67 | .Zebra_DatePicker .dp_monthpicker td { width: 33% }
68 |
69 | /* = YEARPICKER
70 | ----------------------------------------------------------------------------------------------------------------------*/
71 | .Zebra_DatePicker .dp_yearpicker td { width: 33% }
72 |
73 | /* = FOOTER
74 | ----------------------------------------------------------------------------------------------------------------------*/
75 | .Zebra_DatePicker .dp_footer { }
76 | .Zebra_DatePicker .dp_footer .dp_hover { color: #FFF }
77 |
78 | /* = SELECT CURRENT DAY
79 | ----------------------------------------------------------------------------------------------------------------------*/
80 | .Zebra_DatePicker .dp_today { color: #FFF; padding: 3px }
81 |
82 | /* = CLEAR DATE
83 | ----------------------------------------------------------------------------------------------------------------------*/
84 | .Zebra_DatePicker .dp_clear { color: #FFF; padding: 3px }
85 |
86 | /* = SOME MORE GLOBALS (MUST BE LAST IN ORDER TO OVERWRITE PREVIOUS PROPERTIES)
87 | ----------------------------------------------------------------------------------------------------------------------*/
88 | .Zebra_DatePicker td.dp_current { color: #0097F0 }
89 | .Zebra_DatePicker td.dp_disabled_current { color: #969BA7 }
90 | .Zebra_DatePicker td.dp_disabled { background: #F3F3F3; color: #CDCDCD; cursor: default }
91 | .Zebra_DatePicker td.dp_hover { background: #195f88; color: #FFF }
92 |
93 | /* = ICON
94 | ----------------------------------------------------------------------------------------------------------------------*/
95 | button.Zebra_DatePicker_Icon { display: block; position: absolute; width: 16px; height: 16px; background: #000 no-repeat left top; text-indent: -9000px; border: none; cursor: pointer; padding: 0; line-height: 0; vertical-align: top }
96 | button.Zebra_DatePicker_Icon_Disabled { background-color: #000 }
97 |
98 | /* don't set vertical margins! */
99 | button.Zebra_DatePicker_Icon { margin: 0 0 0 3px }
100 | button.Zebra_DatePicker_Icon_Inside_Right { margin: 0 3px 0 0 }
101 | button.Zebra_DatePicker_Icon_Inside_Left { margin: 0 0 0 3px }
--------------------------------------------------------------------------------
/ui3/libs-src/jquery.cookie.js:
--------------------------------------------------------------------------------
1 | /**
2 | * jQuery Cookie plugin
3 | *
4 | * Copyright (c) 2010 Klaus Hartl (stilbuero.de)
5 | * Dual licensed under the MIT and GPL licenses:
6 | * http://www.opensource.org/licenses/mit-license.php
7 | * http://www.gnu.org/licenses/gpl.html
8 | *
9 | */
10 | jQuery.cookie = function (key, value, options)
11 | {
12 |
13 | // key and at least value given, set cookie...
14 | if (arguments.length > 1 && String(value) !== "[object Object]")
15 | {
16 | options = jQuery.extend({}, options);
17 |
18 | if (value === null || value === undefined)
19 | {
20 | options.expires = -1;
21 | }
22 |
23 | if (typeof options.expires === 'number')
24 | {
25 | var days = options.expires, t = options.expires = new Date();
26 | t.setDate(t.getDate() + days);
27 | }
28 |
29 | value = String(value);
30 |
31 | return (document.cookie = [
32 | encodeURIComponent(key), '=',
33 | options.raw ? value : encodeURIComponent(value),
34 | options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
35 | options.path ? '; path=' + options.path : '',
36 | options.domain ? '; domain=' + options.domain : '',
37 | options.secure ? '; secure' : ''
38 | ].join(''));
39 | }
40 |
41 | // key and possibly options given, get cookie...
42 | options = value || {};
43 | var result, decode = options.raw ? function (s) { return s; } : decodeURIComponent;
44 | return (result = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie)) ? decode(result[1]) : null;
45 | };
--------------------------------------------------------------------------------
/ui3/libs-src/jquery.longpress.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Longpress is a jQuery plugin that makes it easy to support long press
3 | * events on mobile devices and desktop borwsers.
4 | *
5 | * @name longpress
6 | * @version 0.1.2
7 | * @requires jQuery v1.2.3+
8 | * @author Vaidik Kapoor
9 | * @license MIT License - http://www.opensource.org/licenses/mit-license.php
10 | *
11 | * For usage and examples, check out the README at:
12 | * http://github.com/vaidik/jquery-longpress/
13 | *
14 | * Copyright (c) 2008-2013, Vaidik Kapoor (kapoor [*dot*] vaidik -[at]- gmail [*dot*] com)
15 | *
16 | * Modified for UI3 by bp2008
17 | */
18 |
19 | (function ($)
20 | {
21 | $.fn.longpress = function (longCallback, shortCallback, duration)
22 | {
23 | if (typeof duration === "undefined")
24 | {
25 | duration = 500;
26 | }
27 |
28 | return this.each(function ()
29 | {
30 | var $this = $(this);
31 |
32 | // to keep track of how long something was pressed
33 | var timeout = null;
34 | var mouse_down_x = 0;
35 | var mouse_down_y = 0;
36 | var mouseMoveTolerance = 5;
37 | // mousedown or touchstart callback
38 | function mousedown_callback(e)
39 | {
40 | if (e.which != 1 && e.which != 0)
41 | return;
42 | var context = this;
43 | mouseCoordFixer.fix(e);
44 | mouse_down_x = e.mouseX;
45 | mouse_down_y = e.mouseY;
46 | // set a timeout to call the longpress callback when time elapses
47 | clearTimeout(timeout);
48 | timeout = setTimeout(function ()
49 | {
50 | timeout = null;
51 | if (typeof longCallback === "function")
52 | {
53 | longCallback.call(context, e);
54 | } else
55 | {
56 | $.error('Callback required for long press. You provided: ' + typeof longCallback);
57 | }
58 | }, duration);
59 | }
60 |
61 | // mouseup or touchend callback
62 | function mouseup_callback(e)
63 | {
64 | if (e.which != 1 && e.which != 0)
65 | return;
66 | if (timeout == null && e.type.indexOf('touch') == 0)
67 | e.preventDefault();
68 | if (timeout != null)
69 | {
70 | // cancel the timeout
71 | clearTimeout(timeout);
72 | timeout = null;
73 |
74 | // call the shortCallback if provided
75 | if (typeof shortCallback === "function")
76 | {
77 | shortCallback.call($(this), e);
78 | } else if (typeof shortCallback === "undefined")
79 | {
80 | ;
81 | } else
82 | {
83 | $.error('Optional callback for short press should be a function.');
84 | }
85 | }
86 | }
87 |
88 | // cancel long press event if the finger or mouse was moved
89 | function move_callback(e)
90 | {
91 | mouseCoordFixer.fix(e);
92 | if (Math.abs(mouse_down_x - e.mouseX) > mouseMoveTolerance
93 | || Math.abs(mouse_down_y - e.mouseY) > mouseMoveTolerance)
94 | {
95 | clearTimeout(timeout);
96 | timeout = null;
97 | }
98 | }
99 |
100 | // Browser Support
101 | $this.on('mousedown', mousedown_callback);
102 | $this.on('mouseup', mouseup_callback);
103 | $this.on('mousemove', move_callback);
104 |
105 | // Mobile Support
106 | $this.on('touchstart', mousedown_callback);
107 | $this.on('touchend', mouseup_callback);
108 | $this.on('touchmove', move_callback);
109 | });
110 | };
111 | var mouseCoordFixer =
112 | {
113 | last: {
114 | x: 0, y: 0
115 | }
116 | , fix: function (e)
117 | {
118 | if (e.alreadyMouseCoordFixed)
119 | return;
120 | e.alreadyMouseCoordFixed = true;
121 | if (typeof e.pageX == "undefined")
122 | {
123 | if (e.originalEvent && e.originalEvent.touches && e.originalEvent.touches.length > 0)
124 | {
125 | mouseCoordFixer.last.x = e.mouseX = e.originalEvent.touches[0].pageX + $(window).scrollLeft();
126 | mouseCoordFixer.last.y = e.mouseY = e.originalEvent.touches[0].pageY + $(window).scrollTop();
127 | }
128 | else if (e.touches && e.touches.length > 0)
129 | {
130 | mouseCoordFixer.last.x = e.mouseX = e.touches[0].pageX;
131 | mouseCoordFixer.last.y = e.mouseY = e.touches[0].pageY;
132 | }
133 | else
134 | {
135 | e.mouseX = mouseCoordFixer.last.x;
136 | e.mouseY = mouseCoordFixer.last.y;
137 | }
138 | }
139 | else
140 | {
141 | mouseCoordFixer.last.x = e.mouseX = e.pageX + $(window).scrollLeft();
142 | mouseCoordFixer.last.y = e.mouseY = e.pageY + $(window).scrollTop();
143 | }
144 | }
145 | };
146 | } (jQuery));
--------------------------------------------------------------------------------
/ui3/libs-src/jquery.ui2modal.js:
--------------------------------------------------------------------------------
1 | /*
2 | * UI3Modal - jQuery Plugin
3 | * Created for UI2, a custom Blue Iris web interface. Adapted for UI3.
4 | */
5 | ///
6 |
7 | (function ($)
8 | {
9 | var zIndexAutoIncrement = 200;
10 | $.fn.modal = function (options)
11 | {
12 | var dialog = new UI2Dialog(this, options);
13 | show(dialog);
14 | return dialog;
15 | }
16 | function UI2Dialog($content, options)
17 | {
18 | this.isOpen = false;
19 | this.$content = $content;
20 | this.settings = $.extend(
21 | {
22 | // These are the default settings
23 | maxWidth: 999999,
24 | maxHeight: 999999,
25 | sizeToFitContent: false,
26 | shrinkOnBothResizePasses: false,
27 | removeElementOnClose: false,
28 | onClosing: null,
29 | overlayOpacity: 0.3
30 | }, options);
31 | }
32 | function show(self)
33 | {
34 | if (self.isOpen)
35 | return;
36 | self.isOpen = true;
37 |
38 | self.myIndex = zIndexAutoIncrement;
39 | self.$overlay = $(document.createElement('div'));
40 | self.$overlay.addClass("ui2modal_overlay");
41 | self.$overlay.css("position", "absolute");
42 | self.$overlay.css("width", "100%");
43 | self.$overlay.css("height", "100%");
44 | self.$overlay.css("top", "0px");
45 | self.$overlay.css("left", "0px");
46 | self.$overlay.css("background-color", "#000000");
47 | self.$overlay.css("opacity", self.settings.overlayOpacity.toString());
48 | self.$overlay.css("z-index", ++zIndexAutoIncrement);
49 | self.$overlay.on("contextmenu", function () { self.close(); return false; });
50 | self.$overlay.click(function () { self.close(); });
51 |
52 | self.$dialog = $(document.createElement('div'));
53 | self.$dialog.addClass("ui2modal");
54 | self.$dialog.css("position", "absolute");
55 | self.$dialog.css("border", "4px ridge #377EC0");
56 | self.$dialog.css("background-color", "#373737");
57 | self.$dialog.css("color", "#DDDDDD");
58 | self.$dialog.css("overflow-y", "auto");
59 | self.$dialog.css("z-index", ++zIndexAutoIncrement);
60 | self.$dialog.append(self.$content);
61 |
62 | self.$closebtn = $('');
67 | self.$closebtn.addClass("ui2modal_close");
68 | self.$closebtn.css("position", "absolute");
69 | self.$closebtn.css("width", "25px");
70 | self.$closebtn.css("height", "25px");
71 | self.$closebtn.css("cursor", "pointer");
72 | self.$closebtn.css("z-index", ++zIndexAutoIncrement);
73 | self.$closebtn.click(function () { self.close(); });
74 |
75 | $("body").append(self.$overlay);
76 | $("body").append(self.$dialog);
77 | $("body").append(self.$closebtn);
78 | self.$content.show();
79 |
80 | $(window).bind("resize.ui2modal" + self.myIndex + " orientationchange.ui2modal" + self.myIndex, function () { onResize(self); });
81 |
82 | onResize(self);
83 | }
84 | UI2Dialog.prototype.close = function (suppressCallback)
85 | {
86 | if (!this.isOpen)
87 | return;
88 | this.isOpen = false;
89 |
90 | if (typeof suppressCallback == "undefined" || suppressCallback == null)
91 | suppressCallback = false;
92 |
93 | if (typeof this.settings.onClosing == "function" && !suppressCallback)
94 | if (this.settings.onClosing())
95 | return false;
96 |
97 | $(window).unbind(".ui2modal" + this.myIndex);
98 |
99 | if (this.settings.removeElementOnClose)
100 | this.$content.remove();
101 | else
102 | {
103 | this.$content.hide();
104 | $("body").append(this.$content);
105 | }
106 |
107 | this.$overlay.remove();
108 | this.$dialog.remove();
109 | this.$closebtn.remove();
110 |
111 | return true;
112 | }
113 | function onResize(self, isSecondPass)
114 | {
115 | var windowW = $(window).width();
116 | var windowH = $(window).height();
117 |
118 | var dialogW = windowW * 0.7;
119 | var dialogH = windowH * 0.8;
120 |
121 | if (dialogW < 300)
122 | dialogW = 300;
123 | if (dialogH < 150)
124 | dialogH = 150;
125 |
126 | if (self.settings.sizeToFitContent && (self.settings.shrinkOnBothResizePasses || isSecondPass))
127 | {
128 | var contentW = self.$content.outerWidth(true);
129 | var contentH = self.$content.outerHeight(true);
130 | if (dialogW > contentW)
131 | dialogW = contentW;
132 | if (dialogH > contentH)
133 | dialogH = contentH;
134 | }
135 |
136 | if (dialogW > self.settings.maxWidth)
137 | dialogW = self.settings.maxWidth;
138 | if (dialogH > self.settings.maxHeight)
139 | dialogH = self.settings.maxHeight;
140 |
141 | var dialogT = ((windowH - dialogH) / 2);
142 | var dialogL = ((windowW - dialogW) / 2);
143 |
144 | self.$dialog.css("top", dialogT + "px");
145 | self.$dialog.css("left", dialogL + "px");
146 | self.$dialog.css("width", dialogW + "px");
147 | self.$dialog.css("height", dialogH + "px");
148 |
149 | self.$closebtn.css("top", (dialogT - 8) + "px");
150 | self.$closebtn.css("left", ((dialogL + dialogW) - 8) + "px");
151 |
152 | if (self.settings.sizeToFitContent)
153 | {
154 | if (!isSecondPass)
155 | onResize(self, true);
156 | }
157 | }
158 | }(jQuery));
--------------------------------------------------------------------------------
/ui3/libs-src/jsonview/MIT_LICENSE.txt:
--------------------------------------------------------------------------------
1 | Copyright
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4 |
5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6 |
7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--------------------------------------------------------------------------------
/ui3/libs-src/jsonview/change_notice.txt:
--------------------------------------------------------------------------------
1 | CHANGE NOTICE
2 |
3 | The script of this library has been significantly modified by the UI2/UI3 projects.
--------------------------------------------------------------------------------
/ui3/libs-src/jsonview/jsonview.min.css:
--------------------------------------------------------------------------------
1 | .jsonview{font-family:monospace;font-size:1.1em;white-space:pre-wrap}.jsonview .prop{font-weight:700;text-decoration:none;color:#000}.jsonview .null,.jsonview .undefined{color:red}.jsonview .bool,.jsonview .num{color:#00f}.jsonview .string{color:green;white-space:pre-wrap}.jsonview .string.multiline{display:inline-block;vertical-align:text-top}.jsonview .collapser{position:absolute;left:-1em;cursor:pointer}.jsonview .collapsible{transition:height 1.2s;transition:width 1.2s}.jsonview .collapsible.collapsed{height:.8em;width:1em;display:inline-block;overflow:hidden;margin:0}.jsonview .collapsible.collapsed:before{content:"...";width:1em;margin-left:.2em}.jsonview .collapser.collapsed{transform:rotate(0)}.jsonview .q{display:inline-block;width:0;color:transparent}.jsonview li{position:relative}.jsonview ul{list-style:none;margin:0 0 0 2em;padding:0}.jsonview h1{font-size:1.2em}
--------------------------------------------------------------------------------
/ui3/libs-src/jsonview/jsonview.min.js:
--------------------------------------------------------------------------------
1 | (function(m){var q="object array number string boolean date null".split(" ");var p=function(){function a(b){null==b&&(b={});this.options=b}a.prototype.htmlEncode=function(b){return null!==b?b.toString().replace(/&/g,"&").replace(/"/g,""").replace(//g,">"):""};a.prototype.jsString=function(b){b=JSON.stringify(b).slice(1,-1);return this.htmlEncode(b)};a.prototype.decorateWithSpan=function(b,c){return''+this.htmlEncode(b)+""};a.prototype.valueToHTML=
2 | function(b,c){null==c&&(c=0);var a=Object.prototype.toString.call(b).match(/\s(.+)]/)[1].toLowerCase();if(this.options.strict&&!m.inArray(a,q))throw Error(""+a+" is not a valid JSON value type");return this[""+a+"ToHTML"].call(this,b,c)};a.prototype.nullToHTML=function(b){return this.decorateWithSpan("null","null")};a.prototype.dateToHTML=function(b){return this.stringToHTML(b)};a.prototype.functionToHTML=function(b){return this.decorateWithSpan("function","function")};a.prototype.undefinedToHTML=
3 | function(){return this.decorateWithSpan("undefined","undefined")};a.prototype.numberToHTML=function(b){return this.decorateWithSpan(b,"num")};a.prototype.stringToHTML=function(b){if(/^(http|https|file):\/\/[^\s]+$/i.test(b))return'"'+this.jsString(b)+'"';var c="";b=this.jsString(b);if(this.options.nl2br){var a=/([^>\\r\\n]?)(\\r\\n|\\n\\r|\\r|\\n)/g;a.test(b)&&(c=" multiline",b=(b+"").replace(a,"$1
"))}return'"'+b+'"'};a.prototype.booleanToHTML=function(b){return this.decorateWithSpan(b,"bool")};a.prototype.arrayToHTML=function(b,a){var c,d;null==a&&(a=0);var e=!1;var f="";var h=b.length;var l=c=0;for(d=b.length;c"+this.valueToHTML(l,a+1),1",h--;return e?'[]":"[ ]"};a.prototype.objectToHTML=function(b,a){var c;null==a&&(a=0);var d=!1;var e="";var f=0;for(c in b)f++;for(c in b){var h=
5 | b[c];d=!0;var l=this.options.escape?this.jsString(c):c;e+='"'+l+'": '+this.valueToHTML(h,a+1);1";f--}return d?'{}":"{ }"};a.prototype.jsonToHTML=function(b){return''+this.valueToHTML(b)+"
"};return a}();"undefined"!==typeof module&&null!==module&&(module.exports=p);var n=function(){function a(){}a.bindEvent=
6 | function(b,a){b.firstChild.addEventListener("click",function(b){return function(c){return b.toggle(c.target.parentNode.firstChild,a)}}(this));var c=document.createElement("div");c.className="collapser";c.innerHTML=a.collapsed?"+":"-";c.addEventListener("click",function(b){return function(c){return b.toggle(c.target,a)}}(this));b.insertBefore(c,b.firstChild);if(a.collapsed)return this.collapse(c)};a.expand=function(b){var a=this.collapseTarget(b);if(""!==a.style.display){var g=a.parentNode.getElementsByClassName("ellipsis")[0];
7 | a.parentNode.removeChild(g);a.style.display="";return b.innerHTML="-"}};a.collapse=function(b){var a=this.collapseTarget(b);if("none"!==a.style.display){a.style.display="none";var g=document.createElement("span");g.className="ellipsis";g.innerHTML=" … ";a.parentNode.insertBefore(g,a);return b.innerHTML="+"}};a.toggle=function(a,c){var b;null==c&&(c={});var d="none"===this.collapseTarget(a).style.display?"expand":"collapse";if(c.recursive_collapser){var e=a.parentNode.getElementsByClassName("collapser");
8 | var f=[];var h=0;for(b=e.length;h ul > li .collapsible").siblings(".collapser").each(function(){return k[b](this)})})}var c=a[0];var g=a[1]||{};g=m.extend({collapsed:!1,nl2br:!1,recursive_collapser:!1,escape:!0,strict:!1},g);var d=new p(g);"[object String]"===Object.prototype.toString.call(c)&&(c=JSON.parse(c));var e=d.jsonToHTML(c);return this.each(function(){var a;var b=
10 | m(this);b.html(e);var c=b[0].getElementsByClassName("collapsible");var d=[];var k=0;for(a=c.length;k
6 | "use strict";
7 | (function ($)
8 | {
9 | $.fn.lightbox = function (options)
10 | {
11 | return new Lightbox(this, options);
12 | }
13 | function Lightbox($img, options)
14 | {
15 | var $overlay, $bigImg, isIn;
16 | $img.css("cursor", "zoom-in");
17 | $img.click(toggle);
18 | function toggle(e)
19 | {
20 | if (isIn)
21 | {
22 | $overlay.remove();
23 | $bigImg.remove();
24 | }
25 | else
26 | {
27 | $overlay = $('');
28 | $overlay.css("cursor", "zoom-out")
29 | .click(toggle);
30 | $("body").append($overlay);
31 | $bigImg = $('
');
32 | $bigImg.attr('src', $img.attr('src'));
33 | $overlay.append($bigImg);
34 | $overlay.fadeIn(200);
35 | }
36 | isIn = !isIn;
37 | }
38 | }
39 | }(jQuery));
40 |
--------------------------------------------------------------------------------
/ui3/libs-src/lightbox.min.js:
--------------------------------------------------------------------------------
1 | (function(c){function e(b,e){function g(e){f?(a.remove(),d.remove()):(a=c(''),a.css("cursor","zoom-out").click(g),c("body").append(a),d=c('
'),d.attr("src",b.attr("src")),a.append(d),a.fadeIn(200));f=!f}var a,d,f;b.css("cursor","zoom-in");b.click(g)}
2 | c.fn.lightbox=function(b){return new e(this,b)}})(jQuery);
--------------------------------------------------------------------------------
/ui3/libs-src/loginScriptsSrc.js:
--------------------------------------------------------------------------------
1 | function ExecJSON(args, callbackSuccess, callbackFail, jsonBaseUrl, appPathFallback)
2 | {
3 | if (typeof jsonBaseUrl === "undefined" || jsonBaseUrl === null)
4 | jsonBaseUrl = appPath;
5 | var reqUrl = jsonBaseUrl + "json" + "?_" + encodeURIComponent(args.cmd);
6 | $.ajax({
7 | type: "POST",
8 | url: reqUrl,
9 | contentType: "text/plain",
10 | data: JSON.stringify(args),
11 | dataType: "json",
12 | success: function (c)
13 | {
14 | callbackSuccess && callbackSuccess(c);
15 | },
16 | error: function (jqXHR, textStatus, errorThrown)
17 | {
18 | if (jqXHR && jqXHR.status === 404)
19 | {
20 | if (jsonBaseUrl === appPath && appPath !== "" && !appPathFallback)
21 | {
22 | console.log('JSON API unreachable at "' + reqUrl + '"');
23 | ExecJSON(args, callbackSuccess, callbackFail, "", true); // First fallback
24 | return;
25 | }
26 | else if (jsonBaseUrl === "" && appPath !== "/")
27 | {
28 | ExecJSON(args, callbackSuccess, callbackFail, "/", true); // Second fallback
29 | return;
30 | }
31 | }
32 | callbackFail && callbackFail(jqXHR, textStatus, errorThrown);
33 | }
34 | });
35 | }
36 | var UrlParameters = {
37 | loaded: !1,
38 | parsed_url_params: {},
39 | Get: function (a)
40 | {
41 | if (!this.loaded)
42 | {
43 | var b = this.parsed_url_params;
44 | window.location.search.replace(/[?&]+([^=&]+)=([^&]*)/gi, function (a, c, e)
45 | {
46 | b[c.toLowerCase()] = decodeURIComponent(e)
47 | });
48 | this.loaded = !0
49 | }
50 | return "undefined" != typeof this.parsed_url_params[a.toLowerCase()] ? this.parsed_url_params[a.toLowerCase()] : ""
51 | }
52 | };
--------------------------------------------------------------------------------
/ui3/libs-src/md5.js:
--------------------------------------------------------------------------------
1 | // From http://www.myersdaily.org/joseph/javascript/md5-text.html
2 |
3 | function md5cycle(x, k) {
4 | var a = x[0], b = x[1], c = x[2], d = x[3];
5 |
6 | a = ff(a, b, c, d, k[0], 7, -680876936);
7 | d = ff(d, a, b, c, k[1], 12, -389564586);
8 | c = ff(c, d, a, b, k[2], 17, 606105819);
9 | b = ff(b, c, d, a, k[3], 22, -1044525330);
10 | a = ff(a, b, c, d, k[4], 7, -176418897);
11 | d = ff(d, a, b, c, k[5], 12, 1200080426);
12 | c = ff(c, d, a, b, k[6], 17, -1473231341);
13 | b = ff(b, c, d, a, k[7], 22, -45705983);
14 | a = ff(a, b, c, d, k[8], 7, 1770035416);
15 | d = ff(d, a, b, c, k[9], 12, -1958414417);
16 | c = ff(c, d, a, b, k[10], 17, -42063);
17 | b = ff(b, c, d, a, k[11], 22, -1990404162);
18 | a = ff(a, b, c, d, k[12], 7, 1804603682);
19 | d = ff(d, a, b, c, k[13], 12, -40341101);
20 | c = ff(c, d, a, b, k[14], 17, -1502002290);
21 | b = ff(b, c, d, a, k[15], 22, 1236535329);
22 |
23 | a = gg(a, b, c, d, k[1], 5, -165796510);
24 | d = gg(d, a, b, c, k[6], 9, -1069501632);
25 | c = gg(c, d, a, b, k[11], 14, 643717713);
26 | b = gg(b, c, d, a, k[0], 20, -373897302);
27 | a = gg(a, b, c, d, k[5], 5, -701558691);
28 | d = gg(d, a, b, c, k[10], 9, 38016083);
29 | c = gg(c, d, a, b, k[15], 14, -660478335);
30 | b = gg(b, c, d, a, k[4], 20, -405537848);
31 | a = gg(a, b, c, d, k[9], 5, 568446438);
32 | d = gg(d, a, b, c, k[14], 9, -1019803690);
33 | c = gg(c, d, a, b, k[3], 14, -187363961);
34 | b = gg(b, c, d, a, k[8], 20, 1163531501);
35 | a = gg(a, b, c, d, k[13], 5, -1444681467);
36 | d = gg(d, a, b, c, k[2], 9, -51403784);
37 | c = gg(c, d, a, b, k[7], 14, 1735328473);
38 | b = gg(b, c, d, a, k[12], 20, -1926607734);
39 |
40 | a = hh(a, b, c, d, k[5], 4, -378558);
41 | d = hh(d, a, b, c, k[8], 11, -2022574463);
42 | c = hh(c, d, a, b, k[11], 16, 1839030562);
43 | b = hh(b, c, d, a, k[14], 23, -35309556);
44 | a = hh(a, b, c, d, k[1], 4, -1530992060);
45 | d = hh(d, a, b, c, k[4], 11, 1272893353);
46 | c = hh(c, d, a, b, k[7], 16, -155497632);
47 | b = hh(b, c, d, a, k[10], 23, -1094730640);
48 | a = hh(a, b, c, d, k[13], 4, 681279174);
49 | d = hh(d, a, b, c, k[0], 11, -358537222);
50 | c = hh(c, d, a, b, k[3], 16, -722521979);
51 | b = hh(b, c, d, a, k[6], 23, 76029189);
52 | a = hh(a, b, c, d, k[9], 4, -640364487);
53 | d = hh(d, a, b, c, k[12], 11, -421815835);
54 | c = hh(c, d, a, b, k[15], 16, 530742520);
55 | b = hh(b, c, d, a, k[2], 23, -995338651);
56 |
57 | a = ii(a, b, c, d, k[0], 6, -198630844);
58 | d = ii(d, a, b, c, k[7], 10, 1126891415);
59 | c = ii(c, d, a, b, k[14], 15, -1416354905);
60 | b = ii(b, c, d, a, k[5], 21, -57434055);
61 | a = ii(a, b, c, d, k[12], 6, 1700485571);
62 | d = ii(d, a, b, c, k[3], 10, -1894986606);
63 | c = ii(c, d, a, b, k[10], 15, -1051523);
64 | b = ii(b, c, d, a, k[1], 21, -2054922799);
65 | a = ii(a, b, c, d, k[8], 6, 1873313359);
66 | d = ii(d, a, b, c, k[15], 10, -30611744);
67 | c = ii(c, d, a, b, k[6], 15, -1560198380);
68 | b = ii(b, c, d, a, k[13], 21, 1309151649);
69 | a = ii(a, b, c, d, k[4], 6, -145523070);
70 | d = ii(d, a, b, c, k[11], 10, -1120210379);
71 | c = ii(c, d, a, b, k[2], 15, 718787259);
72 | b = ii(b, c, d, a, k[9], 21, -343485551);
73 |
74 | x[0] = add32(a, x[0]);
75 | x[1] = add32(b, x[1]);
76 | x[2] = add32(c, x[2]);
77 | x[3] = add32(d, x[3]);
78 |
79 | }
80 |
81 | function cmn(q, a, b, x, s, t) {
82 | a = add32(add32(a, q), add32(x, t));
83 | return add32((a << s) | (a >>> (32 - s)), b);
84 | }
85 |
86 | function ff(a, b, c, d, x, s, t) {
87 | return cmn((b & c) | ((~b) & d), a, b, x, s, t);
88 | }
89 |
90 | function gg(a, b, c, d, x, s, t) {
91 | return cmn((b & d) | (c & (~d)), a, b, x, s, t);
92 | }
93 |
94 | function hh(a, b, c, d, x, s, t) {
95 | return cmn(b ^ c ^ d, a, b, x, s, t);
96 | }
97 |
98 | function ii(a, b, c, d, x, s, t) {
99 | return cmn(c ^ (b | (~d)), a, b, x, s, t);
100 | }
101 |
102 | function md51(s) {
103 | txt = '';
104 | var n = s.length,
105 | state = [1732584193, -271733879, -1732584194, 271733878], i;
106 | for (i=64; i<=s.length; i+=64) {
107 | md5cycle(state, md5blk(s.substring(i-64, i)));
108 | }
109 | s = s.substring(i-64);
110 | var tail = [0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0];
111 | for (i=0; i>2] |= s.charCodeAt(i) << ((i%4) << 3);
113 | tail[i>>2] |= 0x80 << ((i%4) << 3);
114 | if (i > 55) {
115 | md5cycle(state, tail);
116 | for (i=0; i<16; i++) tail[i] = 0;
117 | }
118 | tail[14] = n*8;
119 | md5cycle(state, tail);
120 | return state;
121 | }
122 |
123 | /* there needs to be support for Unicode here,
124 | * unless we pretend that we can redefine the MD-5
125 | * algorithm for multi-byte characters (perhaps
126 | * by adding every four 16-bit characters and
127 | * shortening the sum to 32 bits). Otherwise
128 | * I suggest performing MD-5 as if every character
129 | * was two bytes--e.g., 0040 0025 = @%--but then
130 | * how will an ordinary MD-5 sum be matched?
131 | * There is no way to standardize text to something
132 | * like UTF-8 before transformation; speed cost is
133 | * utterly prohibitive. The JavaScript standard
134 | * itself needs to look at this: it should start
135 | * providing access to strings as preformed UTF-8
136 | * 8-bit unsigned value arrays.
137 | */
138 | function md5blk(s) { /* I figured global was faster. */
139 | var md5blks = [], i; /* Andy King said do it this way. */
140 | for (i=0; i<64; i+=4) {
141 | md5blks[i>>2] = s.charCodeAt(i)
142 | + (s.charCodeAt(i+1) << 8)
143 | + (s.charCodeAt(i+2) << 16)
144 | + (s.charCodeAt(i+3) << 24);
145 | }
146 | return md5blks;
147 | }
148 |
149 | var hex_chr = '0123456789abcdef'.split('');
150 |
151 | function rhex(n)
152 | {
153 | var s='', j=0;
154 | for(; j<4; j++)
155 | s += hex_chr[(n >> (j * 8 + 4)) & 0x0F]
156 | + hex_chr[(n >> (j * 8)) & 0x0F];
157 | return s;
158 | }
159 |
160 | function hex(x) {
161 | for (var i=0; i> 16) + (y >> 16) + (lsw >> 16);
184 | return (msw << 16) | (lsw & 0xFFFF);
185 | }
186 | }
--------------------------------------------------------------------------------
/ui3/libs-src/nosleep.js.7z:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/libs-src/nosleep.js.7z
--------------------------------------------------------------------------------
/ui3/libs-src/point-in-polygon.js:
--------------------------------------------------------------------------------
1 | /*
2 | The MIT License (MIT)
3 |
4 | Copyright (c) 2016 James Halliday
5 |
6 | Permission is hereby granted, free of charge, to any person obtaining a copy
7 | of this software and associated documentation files (the "Software"), to deal
8 | in the Software without restriction, including without limitation the rights
9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | copies of the Software, and to permit persons to whom the Software is
11 | furnished to do so, subject to the following conditions:
12 |
13 | The above copyright notice and this permission notice shall be included in all
14 | copies or substantial portions of the Software.
15 |
16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 | SOFTWARE.
23 | */
24 | function pointInPolygon(point, vs) {
25 | // ray-casting algorithm based on
26 | // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
27 |
28 | var x = point[0], y = point[1];
29 |
30 | var inside = false;
31 | for (var i = 0, j = vs.length - 1; i < vs.length; j = i++) {
32 | var xi = vs[i][0], yi = vs[i][1];
33 | var xj = vs[j][0], yj = vs[j][1];
34 |
35 | var intersect = ((yi > y) != (yj > y))
36 | && (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
37 | if (intersect) inside = !inside;
38 | }
39 |
40 | return inside;
41 | };
--------------------------------------------------------------------------------
/ui3/libs-src/promise.polyfill.min.js:
--------------------------------------------------------------------------------
1 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t():"function"==typeof define&&define.amd?define(t):t()}(0,function(){"use strict";function e(e){var t=this.constructor;return this.then(function(n){return t.resolve(e()).then(function(){return n})},function(n){return t.resolve(e()).then(function(){return t.reject(n)})})}function t(e){return new this(function(t,n){function o(e,n){if(n&&("object"==typeof n||"function"==typeof n)){var f=n.then;if("function"==typeof f)return void f.call(n,function(t){o(e,t)},function(n){r[e]={status:"rejected",reason:n},0==--i&&t(r)})}r[e]={status:"fulfilled",value:n},0==--i&&t(r)}if(!e||"undefined"==typeof e.length)return n(new TypeError(typeof e+" "+e+" is not iterable(cannot read property Symbol(Symbol.iterator))"));var r=Array.prototype.slice.call(e);if(0===r.length)return t([]);for(var i=r.length,f=0;r.length>f;f++)o(f,r[f])})}function n(e){return!(!e||"undefined"==typeof e.length)}function o(){}function r(e){if(!(this instanceof r))throw new TypeError("Promises must be constructed via new");if("function"!=typeof e)throw new TypeError("not a function");this._state=0,this._handled=!1,this._value=undefined,this._deferreds=[],l(e,this)}function i(e,t){for(;3===e._state;)e=e._value;0!==e._state?(e._handled=!0,r._immediateFn(function(){var n=1===e._state?t.onFulfilled:t.onRejected;if(null!==n){var o;try{o=n(e._value)}catch(r){return void u(t.promise,r)}f(t.promise,o)}else(1===e._state?f:u)(t.promise,e._value)})):e._deferreds.push(t)}function f(e,t){try{if(t===e)throw new TypeError("A promise cannot be resolved with itself.");if(t&&("object"==typeof t||"function"==typeof t)){var n=t.then;if(t instanceof r)return e._state=3,e._value=t,void c(e);if("function"==typeof n)return void l(function(e,t){return function(){e.apply(t,arguments)}}(n,t),e)}e._state=1,e._value=t,c(e)}catch(o){u(e,o)}}function u(e,t){e._state=2,e._value=t,c(e)}function c(e){2===e._state&&0===e._deferreds.length&&r._immediateFn(function(){e._handled||r._unhandledRejectionFn(e._value)});for(var t=0,n=e._deferreds.length;n>t;t++)i(e,e._deferreds[t]);e._deferreds=null}function l(e,t){var n=!1;try{e(function(e){n||(n=!0,f(t,e))},function(e){n||(n=!0,u(t,e))})}catch(o){if(n)return;n=!0,u(t,o)}}var a=setTimeout,s="undefined"!=typeof setImmediate?setImmediate:null;r.prototype["catch"]=function(e){return this.then(null,e)},r.prototype.then=function(e,t){var n=new this.constructor(o);return i(this,new function(e,t,n){this.onFulfilled="function"==typeof e?e:null,this.onRejected="function"==typeof t?t:null,this.promise=n}(e,t,n)),n},r.prototype["finally"]=e,r.all=function(e){return new r(function(t,o){function r(e,n){try{if(n&&("object"==typeof n||"function"==typeof n)){var u=n.then;if("function"==typeof u)return void u.call(n,function(t){r(e,t)},o)}i[e]=n,0==--f&&t(i)}catch(c){o(c)}}if(!n(e))return o(new TypeError("Promise.all accepts an array"));var i=Array.prototype.slice.call(e);if(0===i.length)return t([]);for(var f=i.length,u=0;i.length>u;u++)r(u,i[u])})},r.allSettled=t,r.resolve=function(e){return e&&"object"==typeof e&&e.constructor===r?e:new r(function(t){t(e)})},r.reject=function(e){return new r(function(t,n){n(e)})},r.race=function(e){return new r(function(t,o){if(!n(e))return o(new TypeError("Promise.race accepts an array"));for(var i=0,f=e.length;f>i;i++)r.resolve(e[i]).then(t,o)})},r._immediateFn="function"==typeof s&&function(e){s(e)}||function(e){a(e,0)},r._unhandledRejectionFn=function(e){void 0!==console&&console&&console.warn("Possible Unhandled Promise Rejection:",e)};var d=function(){if("undefined"!=typeof self)return self;if("undefined"!=typeof window)return window;if("undefined"!=typeof global)return global;throw Error("unable to locate global object")}();"function"!=typeof d.Promise?d.Promise=r:(d.Promise.prototype["finally"]||(d.Promise.prototype["finally"]=e),d.Promise.allSettled||(d.Promise.allSettled=t))});
2 |
--------------------------------------------------------------------------------
/ui3/libs-src/seeded-random.js:
--------------------------------------------------------------------------------
1 | // From https://stackoverflow.com/questions/521295/seeding-the-random-number-generator-in-javascript
2 | // and https://github.com/bryc/code/blob/master/jshash/PRNGs.md
3 |
4 | /**
5 | * Construct one of these and call its [rand] function to create random numbers using a specific seed.
6 | * @param {String} seed Seed string
7 | */
8 | function SeededRandom(seed)
9 | {
10 | if (typeof seed !== "string")
11 | throw new Error("SeededRandom requires a seed string");
12 |
13 | // Create xmur3 state:
14 | var seeder = xmur3(seed);
15 |
16 | // Output four 32-bit hashes to provide the seed for sfc32.
17 | var randGenFn = sfc32(seeder(), seeder(), seeder(), seeder());
18 |
19 | /** Returns a random number between 0 and 1. */
20 | this.rand = randGenFn;
21 |
22 | function xmur3(str)
23 | {
24 | for (var i = 0, h = 1779033703 ^ str.length; i < str.length; i++)
25 | {
26 | h = Math.imul(h ^ str.charCodeAt(i), 3432918353);
27 | h = h << 13 | h >>> 19;
28 | }
29 | return function ()
30 | {
31 | h = Math.imul(h ^ (h >>> 16), 2246822507);
32 | h = Math.imul(h ^ (h >>> 13), 3266489909);
33 | return (h ^= h >>> 16) >>> 0;
34 | }
35 | }
36 | function sfc32(a, b, c, d)
37 | {
38 | return function ()
39 | {
40 | a >>>= 0; b >>>= 0; c >>>= 0; d >>>= 0;
41 | var t = (a + b) | 0;
42 | a = b ^ b >>> 9;
43 | b = c + (c << 3) | 0;
44 | c = (c << 21 | c >>> 11);
45 | d = d + 1 | 0;
46 | t = t + d | 0;
47 | c = c + t | 0;
48 | return (t >>> 0) / 4294967296;
49 | }
50 | }
51 | }
--------------------------------------------------------------------------------
/ui3/libs-src/simple-scrollbar.css:
--------------------------------------------------------------------------------
1 | .ss-wrapper {
2 | overflow: hidden;
3 | width: 100%;
4 | height: 100%;
5 | position: relative;
6 | z-index: 1;
7 | float: left;
8 | }
9 |
10 | .ss-content {
11 | height: 100%;
12 | width: 100%;
13 | padding: 0 32px 0 0;
14 | position: relative;
15 | right: -18px;
16 | overflow: auto;
17 | box-sizing: border-box;
18 | }
19 |
20 | .ss-scroll {
21 | position: relative;
22 | background: rgba(0, 0, 0, 0.1);
23 | width: 9px;
24 | border-radius: 4px;
25 | top: 0;
26 | z-index: 2;
27 | cursor: pointer;
28 | opacity: 0;
29 | transition: opacity 0.25s linear;
30 | }
31 |
32 | .ss-hidden {
33 | display: none;
34 | }
35 |
36 | .ss-container:hover .ss-scroll {
37 | opacity: 1;
38 | }
39 |
40 | .ss-grabbed {
41 | -o-user-select: none;
42 | -ms-user-select: none;
43 | -moz-user-select: none;
44 | -webkit-user-select: none;
45 | user-select: none;
46 | }
47 |
--------------------------------------------------------------------------------
/ui3/libs-src/simple-scrollbar.min.js:
--------------------------------------------------------------------------------
1 | // MIT License
2 | (function(e,d){function g(a){a.hasOwnProperty("data-simple-scrollbar")||Object.defineProperty(a,"data-simple-scrollbar",new SimpleScrollbar(a))}function l(a,b){function c(a){var c=a.pageY-e;e=a.pageY;h(function(){b.el.scrollTop+=c/b.scrollRatio})}function f(){a.classList.remove("ss-grabbed");d.body.classList.remove("ss-grabbed");d.removeEventListener("mousemove",c);d.removeEventListener("mouseup",f)}var e;a.addEventListener("mousedown",function(b){e=b.pageY;a.classList.add("ss-grabbed");d.body.classList.add("ss-grabbed");
3 | d.addEventListener("mousemove",c);d.addEventListener("mouseup",f);return!1})}function f(a){this.target=a;this.bar='