Sample details: 28c4ac2bbd4448ef7d6738f823c92f6c --

Hashes
MD5: 28c4ac2bbd4448ef7d6738f823c92f6c
SHA1: 56f5f7af213fd222d44dbad56ff6624789afeb68
SHA256: 6a97c1ee44173d1536bbe68a711d50495bbcb40964f0c240644db031f898cc7e
SSDEEP: 49152:ERCA7xU81kHR6gWakurxp9PTC7WHI1xEjKXcwD:ERF7Wo1yjQcwD
Details
File Type: PE32
Added: 2018-02-24 04:10:00
Yara Hits
CuckooSandbox/vmdetect | YRP/Visual_Cpp_2005_Release_Microsoft | YRP/VC8_Microsoft_Corporation | YRP/Microsoft_Visual_Cpp_8 | YRP/IsPE32 | YRP/IsWindowsGUI | YRP/HasOverlay | YRP/HasDigitalSignature | YRP/HasRichSignature | YRP/domain | YRP/IP | YRP/url | YRP/contentis_base64 | YRP/Browsers | YRP/VM_Generic_Detection | YRP/VMWare_Detection | YRP/VirtualBox_Detection | YRP/Dropper_Strings | YRP/WMI_strings | YRP/Misc_Suspicious_Strings | YRP/Check_VBox_Description | YRP/Check_VBox_VideoDrivers | YRP/vmdetect | YRP/Check_OutputDebugStringA_iat | YRP/anti_dbg | YRP/antivm_bios | YRP/network_http | YRP/network_ftp | YRP/screenshot | YRP/migrate_apc | YRP/win_mutex | YRP/win_registry | YRP/win_files_operation | YRP/vmdetect_misc | YRP/android_meterpreter | YRP/Big_Numbers1 | YRP/CRC32_poly_Constant | YRP/CRC32_table | YRP/spyeye | YRP/Str_Win32_Wininet_Library | YRP/Str_Win32_Internet_API | YRP/Str_Win32_Http_API |
Parent Files
0729f5e0f69487e19c611a30ddf4011d
Strings
		!This program cannot be run in DOS mode.
`.rdata
@.data
@.rsrc
D$,SRPV
|$ WSPV
D$$PQV
D$h`W@
D$x`X@
D$@`^@
D$H`_@
D$ `\@
D$ PhP
T$(Rhx
L$0Qh(
D$8Ph 
XSUVWjT
D$ p*@
L$lj2h
UWSVPQ
PSSSSSSh 
PUUVUS
L$8PWQ
QWUVRS
L$LRVPQ3
D$ PVW
D$<SPV
D$lVQU3
T$(RVW
~49~ u
wR9D$$rL3
D$ ;D$4
D$ ;D$4
+T$(@#T$<G
T$4+T$ 
D$ ;D$4
T$ ;T$4
D$4+D$ 
D$ WUP
!!!!!!!!
L$ ;L$$
F0;F4s
FD	VH;
F0;F4s
FD	VH;
F0;F4s
F0;F4s
F0;F4s
n0;n4s	
F0;F4s
F0;F4s
h0;h4s	
x0;x4s
x0;x4s
HD	xH;
p0;p4s
H0;H4s
H0;H4^
p0;p4s
+F@;F$w
tf9^dua
ND	^H;
N0;N4s
~D9VDs
ND	^H;
N0;N4s
~D9VDs
ND	^H;
N0;N4s
~D9VDs
F0;F4s
F0;F4s
+N@;N$
F0;F4s
F0;F4s
F0;F4s
F0;F4s
^D9~Ds
FD	VH;
F0;F4s
F0;F4s
F0;F4s
F\_^][
D$4;D$
n ;\$0
G;\$0u
T$@;L$
Fl[]_^
L$,QRP
T$0RPW
D$0PQW
T$,RWV
S9.r	V
URPQQhP
jXhxyH
v	N+D$
UQPXY]Y[
bad allocation
return {
{ name=[[res/common.js]] };
{ name=[[res/knockout.js]] };
{ name=[[res/jquery.js]] };
{ name=[[res/common.css]] };
return {
{ name=[[nsisunz.dll]] };
{ name=[[nsis7z.dll]] };
return {
{ name=[[tlbs/interfaces.tlb]] };
{ name=[[../../../../../ClientBuilds/b3bec46b-82b5-4467-ac9e-689b7e3fa322/.build/luabridge.dll]] };
{ name=[[../../../../../ClientBuilds/b3bec46b-82b5-4467-ac9e-689b7e3fa322/.build/shared_library.dll]] };
{ name=[[../../../../../ClientBuilds/b3bec46b-82b5-4467-ac9e-689b7e3fa322/.build/lua51.dll]] };
{ name=[[loading_screen.dll]] };
Microsoft Enhanced Cryptographic Provider v1.0
zMenNpyF1(^%c3VcOh0$4Sy0hMo~-fX}am38(FPgz9|u2xjV9,FM-B{D$+6OMji{b8x~D>^zksGJi{'yKcT]2CMu=5{l(`+h+xH-
advapi32.dll
								
inflate
length
default_decrypt
) [compressed_lua_loader]
Couldn't find module(
loadstring
codeDeFilter
LUA_ENCRYPTED
%.	gsub
string
old_loaders
limited
loaders
package
old_loaders
preload
insert
loaders
package
ipairs
loadstring
resources.overlay
resources.compressed
LUA_USING_OVERLAY
win32_crypto
require
waitForInput
shutdownBuffer
cleanup
require
AllocConsole
AttachConsole
kernel32	load
string
table	math
setfenv
loadfile
BM_GLOBAL_CONF
VARIABLES
windows_environment
FileExists
luabridge.fs
require
/settings.conf
RUN_DIR
__STARTUPINFO
-/Failed loading settings file  %s
Reason:%s
settings
loggerFor
logging
require
console
^%-%-(.*)$
--nil--
tostring
^%-%-([^=]+)=(.*)$
string
insert
ipairs
executeLater
luabridge.nsis
require
build_timestamp
Build Timestamp: %s
build_guid
Build Guid: %s
Build Version: %s	Info
build_version
setGitVersion
build_version_info
requireJ
ipairs
	file	name
extractEmbeddedResources
randomNameSeq
PLUGINSDIR
NSISVars
%s\%s.dll
format
string
7	I	>	
lazy_s
setToString
conditional_engine-require('GuiInit').loadSkinOptionFlags()
nsis7z.dll
set7zPlugin
nsisunz.dll
setUnzipPlugin
bootstrap_fs
process_free_file(require([[install_process]]).boot()-=require('bootstrap').setCliOptions(...)	call1require([[wininet.http]]).USERAGENT = [[%s]]k    require('shared');
    require('embedded_loader');
    require('bootstrap').afterBootstrap();
    	code
Installer
updateUserAgent
environment_options
tostring
Local Environment=
finalizeEnvironment
addEnvVar
surveyEnvironment
survey_environment
Process
Install
Prepare
Tracking
loader
getDownloadsDir
addDownloadDir
startupInfo
afterBootstrap
Build Information Error:%s	Info
local_environment
requires
logger
DebugTrace
ErrorPrintF
DebugPrintF
ErrorPrint
DebugPrint
NSISVars
guiinit
luabridge.%s
format
string
ipairs
luabridge.nsis
Debug	main
loggerFor
logging
timing
bs_int
bootstrap.internal
tasks.base
bootstrap
setDefaultJobBreakaway
no-breakaway
luabridge.config
require3
onClose
close_handlery
runCleanup
cleanup
require
Stop After Executed!	Info3
executeLater
runCancel
cancel
Commands
ui_commands.nav
require
runCancel
requireBFailure in close/cancel handling will close in 60  seconds
User clicked on close
loadXmlFile
setXmlInitTime&Failed to load loadinstall xml:%s
traceback
xpcall
install_details
require
Executable is -> %s
is_self	from
is_self
EXE_PATH
startupInfo.
App Tasks Completed!0
maybeStartBundle3
executeLaterM
setFileInitTime
All Bundles are Ready
isFailure
maybeStartPrepareTasks
preStartCheck
onComplete
startAppTasks
format
string
TaskSequence
PLUGINSDIR
NSISVars
getBundles
tasks.sequence
install_details
require
cancel
dismiss
Preload Cancelled
processPendingErrorTrack
error_store
requireb
runCleanup
cleanup
require"Preload Cancel Sequence Done!
onComplete
dismiss
fromError
fromPreload
startCancelStep,
updateProgressE
Focusing Dialog> %sj
SetFocus Failed: %s
dismiss
executeLater
getDisplayName
set_text	show
offerBundle
setupBundles
onUiStarted
fromError
message
tostring
Post Ui Ready Failed!:%s
format
string	type
Startup	Type
addExecError
UISetup Failed!
toCompleteScreen
Going To Complete Screen!
startFinishStep
Closing browser window!
has_complete_page'Install sequence failed to finish!h
runCleanup
cleanup
require$Finish sequence is done ! -> %sd
runCleanup
cleanup
require$Cancel Sequence is Complete! ->
getCancelSequence
getFinishSequence
onComplete
getInstallSequence
onError
andThen
getUiReadyTask	init
register
ui_commands
runCleanup
cleanup
message'Primary Ready Task Failed to load:	type
Startup	Type
addExecError
error_store
require
dismiss#Primary Failed to be ready! %s
tostring
Primary Selected! (%s)	Good
setForcePreload7Skipping present and run due to preload cancelled!
preloadCancelled
onComplete
getPrimaryReadyTask
fromError
All Init Cancelled!
CANCELLED
message
tostring%Init tasks failed to complete:%s
format
string	type
Startup	Type
addExecError
Tsk AllInit Failed!
error_store
require
All Init  Complete %s,%s
onComplete
getPrimaryReadyTask
isAsyncPrepare
setForcePreload
force_preload
skinOptions
Application Started!
onProgress
updateWithProduct
getDisplayName
Display Name -> %s
preloadCancelled
runCleanup
cleanup/Cleanup Called due to failed downloadXml()
Tracking Error:%s
Installer
FAILED_ERROR_UNKNOWN
FAIL_REASON
MB_TOPMOST
MessageBoxConstants
message
messageBox
generic_fail_dialog
win32_constants
dismiss
tostring
Download Xml Code => %s	Info
Trace	Good
values_mr
install_details
tracking
bindBundles
guiinit
present
onPreloadCancel
setCallback
loading_popup
error_store
require
breakLoop
Stopping Application!	Warn
to_foreground
show_normal
register
ui_commands
string
popup	type
loadfile
executef
loadstring
execute
config
luabridge.config
bridge-debug
runCleanup
waitForInput
shutdownBuffer
test_suite
old_loaders
cleanup
dkjson
require{
tostring
Main Failed: %s
Error	main
loggerFor
logging
require
:#)"4"
:#,"4"
7#/">#
7#0">#
7#4#>!
traceback
xpcall
enableSmartCall
setupDefaultState
luabridge.config
guiinit_env
setfenv
guiinit
loaded
preloadCancelled
onPreloadCancel
onClose
olong __stdcall AllocConsole();
long __stdcall FreeConsole();
long __stdcall AttachConsole(long process);
cli-options
preload
package
build_info
state_names
win32_crypto_constants
shared
embedded_loader
require
registry
__index
setmetatable
in_module
no_path_change
no_cpath_change
trlocalconfig
require6
LUA_PATH
PLUGINSDIR|
\LuaSocket\lua\?.lua
\?.lua;
\LuaSocket\?.dll
\?.dll;
PLUGINSDIRV
/?/?.lua
/?.lua
;	path
package
_domain_
ProductBinary
<APPURL>
_body_
ProductName
<APPNAME>	gsub
bundles
CurrentBundle
INSTALLER_UI_TEXT
([A-Za-z0-9%.]+)[,]?(%d*)	find
string
tostring(Exception expanding name '%s' => %s
ErrorPrint
function	type
NSISVars
string
$($*)([A-Za-z0-9._]*)	gsub
string
tostring
PLUGINSDIR
WORKINGDIR
NSISVars<
entries
return  %s
format
loadstring
assert
string	type
condition	file
insert	true
ExecFile[%s] %s if %s
unpack
format
string
ipairs
table	type
stateTable
condition
insert	true
default
Exec[%s]=>%s if %s
unpack
format
string
stateTable	code
ipairs
table	type0
doCommit4
altstate
doCommit
[BootLoader]Skipping %s
execFileInState
loadfile	file
evalInState	nsis
loadstring
	code	desc
[BootLoader]Running %s
DebugPrintF
condition
ipairs
processEntries
entries
ALL)[BootLoader] Committing entries [%s]
DebugPrintF	only
altstatei
__index
setmetatable
activeState
entries
loader
definitions
bootloader
preload
package
doCommit
processEntries
commit
commitOnly
stateTable
activeState
entries
expandNsisVars
NSISVars
WORKINGDIR
FUNC_ADDR_COMSCORE_LEAVE
FUNC_ADDR_COMSCORE_CREATE
MaxBundles
lookupUIMessage
INSTALLER_UI_TEXT
UI.CANCELCONFIRMDENY
<Click 'Quit' to exit without installing any program(s).
UI.CANCELCONFIRMACCEPT
AClick 'Accept' to install the programs(s) you have selected.
UI.CANCELCONFIRM
DIf you quit now, the selected program(s) will not be installed.
UI.OPTIONACCEPT
8You must accept the terms of <APPNAME> to continue.
UI.QUIT
UI.INSTINCOMPLETE
Installation Incomplete
INSTALL.INPROGRESS
Installing <APPNAME>
SYSTRAY.EXTRACT.INPROGRESS
Extracting <APPNAME> SYSTRAY.DOWNLOAD.INPROGRESS
Downloading <APPNAME>
DOWNLOAD.FAIL
Error downloading <APPURL>
DOWNLOAD.INPROGRESS
5Downloading <APPNAME> component(s) from <APPURL>
DOWNLOAD.SUCCESS
Download Success
UI.WOULDNOTINSTALL
 Would Not Install <APPNAME>
UI.WOULDINSTALL
Would Install <APPNAME>
UI.ALREADYINSTALLED
#<APPNAME> is already Installed
UI.INSTALL
Install
UI.DECLINE
Decline
UI.FINISH
Finish
UI.CLOSE
UI.CANCEL
Cancel
UI.ACCEPT
ACCEPT >
UI.NEXT
Next >
UI.BACK
< Back
UI.LANG.NAME
English
Please put the name of the conversion language in the conversion language
i.e. In the Chinese translation put the Chinese representation of Chinese
UI.INST.QUESTION
*Please select the installer language?7This is the text on the langauge selection window.
UI.INST.LANG
Installer Language8This is the Title of the Language selection window.
URL_SUBST:NOTE: <APPURL> will be replaced with application url.
APP_SUBST;NOTE: <APPNAME> will be replaced with application name
PROGRESS_PRELOAD_TEXT2Preparing your installation, please wait ... 
PROGRESS_PRELOAD_TITLE%Downloading Installation Details
ContentY
LinkRowHeight
CheckBoxHeight
OptInPixels
InterFeaturePadding
EulaPadding
InitEulaHeight
InitBannerWidth
BannerMarginBottom
LogoMarginRight
LogoHeight
LogoWidth
InitialHeight
InitialWidth
setupDebuggerDir
generatePaths
setupDirs
LUA_PATH
PLUGINSDIR
INIT_EULA_WIDTH
INIT_EULA_HEIGHT
PROGRESS_HEIGHT
PROGRESS_WIDTH	164u
PROGRESS_X
IDD_INST_LIST
IDD_INST_LABEL2
IDD_INST_LABEL1
IDD_INSTFILES_FRAME
IDD_DOWNLOAD_BUTTON
IDD_DOWNLOAD_TEXT
IDD_DOWNLOAD_PROGRESS
IDD_INSTALL_PROGRESS
IDD_ACCEPT_BUTTON
IDD_BACK_BUTTON
IDD_CANCEL_BUTTON
IDD_DECLINE_BUTTON
_entries
_entries0
_entries 
_entries"
_entries
deleteItem
containsItem
setItem
getItem
_entries
char*	cast
char[?]
void*	cast
char[?]
string	type"
GetLastErrorP
GetModuleHandleA
HLOCAL
LocalFree
[%d]%s
tostring
System Error:%d from %s
format
string	NULL
char*	cast
FORMAT_MESSAGE_FROM_SYSTEM#FORMAT_MESSAGE_ALLOCATE_BUFFER
FormatMessageA FORMAT_MESSAGE_FROM_HMODULE
char*[1]
GetLastErroro
message
reason
tostring
Stack:
format
string(
is_errorP
setmetatable
traceback
reason
???	code
reason
message
currentline
short_src
format
%s:%d:%s
getinfo
INTERNET_SCHEME_FILE
INTERNET_SCHEME_FTP
INTERNET_SCHEME_HTTPS	http
INTERNET_SCHEME_HTTP 
SchemeF
Scheme
Reason:(
currentline
short_src
format
%s:%d:%s
getinfo
debugW
%S	find
makeError
maybeError
str2scheme
scheme2str
Scheme
winerror
__index
__tostring
GetLastError
lshift
buffer	pstr
cstring	TRUE
INVALID_HANDLE_VALUE
void*	cast	NULL
void DebugBreak();
 static const int GENERIC_READ    =  (0x80000000L);
 static const int GENERIC_WRITE   =  (0x40000000L);
 static const int GENERIC_EXECUTE =  (0x20000000L);
 static const int GENERIC_ALL     =  (0x10000000L);
Astatic const int INTERNET_ERROR_BASE                   =  12000;
static const int ERROR_INTERNET_OUT_OF_HANDLES           =(INTERNET_ERROR_BASE + 1);
static const int ERROR_INTERNET_TIMEOUT                  =(INTERNET_ERROR_BASE + 2);
static const int ERROR_INTERNET_EXTENDED_ERROR           =(INTERNET_ERROR_BASE + 3);
static const int ERROR_INTERNET_INTERNAL_ERROR           =(INTERNET_ERROR_BASE + 4);
static const int ERROR_INTERNET_INVALID_URL              =(INTERNET_ERROR_BASE + 5);
static const int ERROR_INTERNET_UNRECOGNIZED_SCHEME      =(INTERNET_ERROR_BASE + 6);
static const int ERROR_INTERNET_NAME_NOT_RESOLVED        =(INTERNET_ERROR_BASE + 7);
static const int ERROR_INTERNET_PROTOCOL_NOT_FOUND       =(INTERNET_ERROR_BASE + 8);
static const int ERROR_INTERNET_INVALID_OPTION           =(INTERNET_ERROR_BASE + 9);
static const int ERROR_INTERNET_BAD_OPTION_LENGTH        =(INTERNET_ERROR_BASE + 10);
static const int ERROR_INTERNET_OPTION_NOT_SETTABLE      =(INTERNET_ERROR_BASE + 11);
static const int ERROR_INTERNET_SHUTDOWN                 =(INTERNET_ERROR_BASE + 12);
static const int ERROR_INTERNET_INCORRECT_USER_NAME      =(INTERNET_ERROR_BASE + 13);
static const int ERROR_INTERNET_INCORRECT_PASSWORD       =(INTERNET_ERROR_BASE + 14);
static const int ERROR_INTERNET_LOGIN_FAILURE            =(INTERNET_ERROR_BASE + 15);
static const int ERROR_INTERNET_INVALID_OPERATION        =(INTERNET_ERROR_BASE + 16);
static const int ERROR_INTERNET_OPERATION_CANCELLED      =(INTERNET_ERROR_BASE + 17);
static const int ERROR_INTERNET_INCORRECT_HANDLE_TYPE    =(INTERNET_ERROR_BASE + 18);
static const int ERROR_INTERNET_INCORRECT_HANDLE_STATE   =(INTERNET_ERROR_BASE + 19);
static const int ERROR_INTERNET_NOT_PROXY_REQUEST        =(INTERNET_ERROR_BASE + 20);
static const int ERROR_INTERNET_REGISTRY_VALUE_NOT_FOUND =(INTERNET_ERROR_BASE + 21);
static const int ERROR_INTERNET_BAD_REGISTRY_PARAMETER   =(INTERNET_ERROR_BASE + 22);
static const int ERROR_INTERNET_NO_DIRECT_ACCESS         =(INTERNET_ERROR_BASE + 23);
static const int ERROR_INTERNET_NO_CONTEXT               =(INTERNET_ERROR_BASE + 24);
static const int ERROR_INTERNET_NO_CALLBACK              =(INTERNET_ERROR_BASE + 25);
static const int ERROR_INTERNET_REQUEST_PENDING          =(INTERNET_ERROR_BASE + 26);
static const int ERROR_INTERNET_INCORRECT_FORMAT         =(INTERNET_ERROR_BASE + 27);
static const int ERROR_INTERNET_ITEM_NOT_FOUND           =(INTERNET_ERROR_BASE + 28);
static const int ERROR_INTERNET_CANNOT_CONNECT           =(INTERNET_ERROR_BASE + 29);
static const int ERROR_INTERNET_CONNECTION_ABORTED       =(INTERNET_ERROR_BASE + 30);
static const int ERROR_INTERNET_CONNECTION_RESET         =(INTERNET_ERROR_BASE + 31);
static const int ERROR_INTERNET_FORCE_RETRY              =(INTERNET_ERROR_BASE + 32);
static const int ERROR_INTERNET_INVALID_PROXY_REQUEST    =(INTERNET_ERROR_BASE + 33);
static const int ERROR_INTERNET_NEED_UI                  =(INTERNET_ERROR_BASE + 34);
static const int ERROR_INTERNET_HANDLE_EXISTS            =(INTERNET_ERROR_BASE + 36);
static const int ERROR_INTERNET_SEC_CERT_DATE_INVALID    =(INTERNET_ERROR_BASE + 37);
static const int ERROR_INTERNET_SEC_CERT_CN_INVALID      =(INTERNET_ERROR_BASE + 38);
static const int ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR   =(INTERNET_ERROR_BASE + 39);
static const int ERROR_INTERNET_HTTPS_TO_HTTP_ON_REDIR   =(INTERNET_ERROR_BASE + 40);
static const int ERROR_INTERNET_MIXED_SECURITY           =(INTERNET_ERROR_BASE + 41);
static const int ERROR_INTERNET_CHG_POST_IS_NON_SECURE   =(INTERNET_ERROR_BASE + 42);
static const int ERROR_INTERNET_POST_IS_NON_SECURE       =(INTERNET_ERROR_BASE + 43);
static const int ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED  =(INTERNET_ERROR_BASE + 44);
static const int ERROR_INTERNET_INVALID_CA               =(INTERNET_ERROR_BASE + 45);
static const int ERROR_INTERNET_CLIENT_AUTH_NOT_SETUP    =(INTERNET_ERROR_BASE + 46);
static const int ERROR_INTERNET_ASYNC_THREAD_FAILED      =(INTERNET_ERROR_BASE + 47);
static const int ERROR_INTERNET_REDIRECT_SCHEME_CHANGE   =(INTERNET_ERROR_BASE + 48);
static const int ERROR_INTERNET_DIALOG_PENDING           =(INTERNET_ERROR_BASE + 49);
static const int ERROR_INTERNET_RETRY_DIALOG             =(INTERNET_ERROR_BASE + 50);
static const int ERROR_INTERNET_HTTPS_HTTP_SUBMIT_REDIR  =(INTERNET_ERROR_BASE + 52);
static const int ERROR_INTERNET_INSERT_CDROM             =(INTERNET_ERROR_BASE + 53);
static const int ERROR_INTERNET_FORTEZZA_LOGIN_NEEDED    =(INTERNET_ERROR_BASE + 54);
static const int ERROR_INTERNET_SEC_CERT_ERRORS          =(INTERNET_ERROR_BASE + 55);
static const int ERROR_INTERNET_SEC_CERT_NO_REV          =(INTERNET_ERROR_BASE + 56);
static const int ERROR_INTERNET_SEC_CERT_REV_FAILED      =(INTERNET_ERROR_BASE + 57);
// FTP API errors
static const int ERROR_FTP_TRANSFER_IN_PROGRESS          =(INTERNET_ERROR_BASE + 110);
static const int ERROR_FTP_DROPPED                       =(INTERNET_ERROR_BASE + 111);
static const int ERROR_FTP_NO_PASSIVE_MODE               =(INTERNET_ERROR_BASE + 112);
// gopher API errors
static const int ERROR_GOPHER_PROTOCOL_ERROR             =(INTERNET_ERROR_BASE + 130);
static const int ERROR_GOPHER_NOT_FILE                   =(INTERNET_ERROR_BASE + 131);
static const int ERROR_GOPHER_DATA_ERROR                 =(INTERNET_ERROR_BASE + 132);
static const int ERROR_GOPHER_END_OF_DATA                =(INTERNET_ERROR_BASE + 133);
static const int ERROR_GOPHER_INVALID_LOCATOR            =(INTERNET_ERROR_BASE + 134);
static const int ERROR_GOPHER_INCORRECT_LOCATOR_TYPE     =(INTERNET_ERROR_BASE + 135);
static const int ERROR_GOPHER_NOT_GOPHER_PLUS            =(INTERNET_ERROR_BASE + 136);
static const int ERROR_GOPHER_ATTRIBUTE_NOT_FOUND        =(INTERNET_ERROR_BASE + 137);
static const int ERROR_GOPHER_UNKNOWN_LOCATOR            =(INTERNET_ERROR_BASE + 138);
// HTTP API errors
static const int ERROR_HTTP_HEADER_NOT_FOUND             =(INTERNET_ERROR_BASE + 150);
static const int ERROR_HTTP_DOWNLEVEL_SERVER             =(INTERNET_ERROR_BASE + 151);
static const int ERROR_HTTP_INVALID_SERVER_RESPONSE      =(INTERNET_ERROR_BASE + 152);
static const int ERROR_HTTP_INVALID_HEADER               =(INTERNET_ERROR_BASE + 153);
static const int ERROR_HTTP_INVALID_QUERY_REQUEST        =(INTERNET_ERROR_BASE + 154);
static const int ERROR_HTTP_HEADER_ALREADY_EXISTS        =(INTERNET_ERROR_BASE + 155);
static const int ERROR_HTTP_REDIRECT_FAILED              =(INTERNET_ERROR_BASE + 156);
static const int ERROR_HTTP_NOT_REDIRECTED               =(INTERNET_ERROR_BASE + 160);
static const int ERROR_HTTP_COOKIE_NEEDS_CONFIRMATION    =(INTERNET_ERROR_BASE + 161);
static const int ERROR_HTTP_COOKIE_DECLINED              =(INTERNET_ERROR_BASE + 162);
static const int ERROR_HTTP_REDIRECT_NEEDS_CONFIRMATION  =(INTERNET_ERROR_BASE + 168);
// additional Internet API error codes
static const int ERROR_INTERNET_SECURITY_CHANNEL_ERROR   =(INTERNET_ERROR_BASE + 157);
static const int ERROR_INTERNET_UNABLE_TO_CACHE_FILE     =(INTERNET_ERROR_BASE + 158);
static const int ERROR_INTERNET_TCPIP_NOT_INSTALLED      =(INTERNET_ERROR_BASE + 159);
static const int ERROR_INTERNET_DISCONNECTED             =(INTERNET_ERROR_BASE + 163);
static const int ERROR_INTERNET_SERVER_UNREACHABLE       =(INTERNET_ERROR_BASE + 164);
static const int ERROR_INTERNET_PROXY_SERVER_UNREACHABLE =(INTERNET_ERROR_BASE + 165);
static const int ERROR_INTERNET_BAD_AUTO_PROXY_SCRIPT    =(INTERNET_ERROR_BASE + 166);
static const int ERROR_INTERNET_UNABLE_TO_DOWNLOAD_SCRIPT =(INTERNET_ERROR_BASE + 167);
static const int ERROR_INTERNET_SEC_INVALID_CERT         =(INTERNET_ERROR_BASE + 169);
static const int ERROR_INTERNET_SEC_CERT_REVOKED         =(INTERNET_ERROR_BASE + 170);
// InternetAutodial specific errors
static const int ERROR_INTERNET_FAILED_DUETOSECURITYCHECK  =(INTERNET_ERROR_BASE + 171);
static const int ERROR_INTERNET_NOT_INITIALIZED          =(INTERNET_ERROR_BASE + 172);
static const int ERROR_INTERNET_NEED_MSN_SSPI_PKG          =(INTERNET_ERROR_BASE + 173);
static const int ERROR_INTERNET_LOGIN_FAILURE_DISPLAY_ENTITY_BODY   =(INTERNET_ERROR_BASE + 174);
// Decoding/Decompression specific errors
static const int ERROR_INTERNET_DECODING_FAILED          =(INTERNET_ERROR_BASE + 175);
static const int INTERNET_ERROR_LAST                 =    ERROR_INTERNET_DECODING_FAILED;
	typedef void * HLOCAL;
DWORD GetLastError(void);
HLOCAL LocalFree(
  HLOCAL hMem
static const int FORMAT_MESSAGE_ALLOCATE_BUFFER= 0x00000100;
static const int FORMAT_MESSAGE_IGNORE_INSERTS = 0x00000200;
static const int FORMAT_MESSAGE_FROM_STRING    = 0x00000400;
static const int FORMAT_MESSAGE_FROM_HMODULE   = 0x00000800;
static const int FORMAT_MESSAGE_FROM_SYSTEM    = 0x00001000;
static const int FORMAT_MESSAGE_ARGUMENT_ARRAY = 0x00002000;
static const int FORMAT_MESSAGE_MAX_WIDTH_MASK = 0x000000FF;
DWORD FormatMessageA(
     DWORD dwFlags,
     LPCVOID lpSource,
     DWORD dwMessageId,
     DWORD dwLanguageId,
     LPSTR lpBuffer,
     DWORD nSize,
     void *Arguments
    );
static const int ERROR_INSUFFICIENT_BUFFER=122L;// dderror
// GetModuleHandle
HMODULE GetModuleHandleA( const char *lpModuleName);
static const int FLAGS_ERROR_UI_FILTER_FOR_ERRORS        =0x01;
static const int FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS     =0x02;
static const int FLAGS_ERROR_UI_FLAGS_GENERATE_DATA      =0x04;
static const int FLAGS_ERROR_UI_FLAGS_NO_UI              =0x08;
static const int FLAGS_ERROR_UI_SERIALIZE_DIALOGS        =0x10;
// Internet API error returns
// HttpQueryInfo info levels. Generally, there is one info level
// for each potential RFC822/HTTP/MIME header that an HTTP server
// may send as part of a request response.
// The HTTP_QUERY_RAW_HEADERS info level is provided for clients
// that choose to perform their own header parsing.
static const int HTTP_QUERY_MIME_VERSION=0;
static const int HTTP_QUERY_CONTENT_TYPE=1;
static const int HTTP_QUERY_CONTENT_TRANSFER_ENCODING=2;
static const int HTTP_QUERY_CONTENT_ID=3;
static const int HTTP_QUERY_CONTENT_DESCRIPTION=4;
static const int HTTP_QUERY_CONTENT_LENGTH=5;
static const int HTTP_QUERY_CONTENT_LANGUAGE=6;
static const int HTTP_QUERY_ALLOW=7;
static const int HTTP_QUERY_PUBLIC=8;
static const int HTTP_QUERY_DATE=9;
static const int HTTP_QUERY_EXPIRES=10;
static const int HTTP_QUERY_LAST_MODIFIED=11;
static const int HTTP_QUERY_MESSAGE_ID=12;
static const int HTTP_QUERY_URI=13;
static const int HTTP_QUERY_DERIVED_FROM=14;
static const int HTTP_QUERY_COST=15;
static const int HTTP_QUERY_LINK=16;
static const int HTTP_QUERY_PRAGMA=17;
static const int HTTP_QUERY_VERSION=18;// special: part of status line
static const int HTTP_QUERY_STATUS_CODE=19;// special: part of status line
static const int HTTP_QUERY_STATUS_TEXT=20;// special: part of status line
static const int HTTP_QUERY_RAW_HEADERS=21;// special: all headers as ASCIIZ
static const int HTTP_QUERY_RAW_HEADERS_CRLF=22;// special: all headers
static const int HTTP_QUERY_CONNECTION=23;
static const int HTTP_QUERY_ACCEPT=24;
static const int HTTP_QUERY_ACCEPT_CHARSET=25;
static const int HTTP_QUERY_ACCEPT_ENCODING=26;
static const int HTTP_QUERY_ACCEPT_LANGUAGE=27;
static const int HTTP_QUERY_AUTHORIZATION=28;
static const int HTTP_QUERY_CONTENT_ENCODING=29;
static const int HTTP_QUERY_FORWARDED=30;
static const int HTTP_QUERY_FROM=31;
static const int HTTP_QUERY_IF_MODIFIED_SINCE=32;
static const int HTTP_QUERY_LOCATION=33;
static const int HTTP_QUERY_ORIG_URI=34;
static const int HTTP_QUERY_REFERER=35;
static const int HTTP_QUERY_RETRY_AFTER=36;
static const int HTTP_QUERY_SERVER=37;
static const int HTTP_QUERY_TITLE=38;
static const int HTTP_QUERY_USER_AGENT=39;
static const int HTTP_QUERY_WWW_AUTHENTICATE=40;
static const int HTTP_QUERY_PROXY_AUTHENTICATE=41;
static const int HTTP_QUERY_ACCEPT_RANGES=42;
static const int HTTP_QUERY_SET_COOKIE=43;
static const int HTTP_QUERY_COOKIE=44;
static const int HTTP_QUERY_REQUEST_METHOD=45;// special: GET/POST etc.
static const int HTTP_QUERY_REFRESH=46;
static const int HTTP_QUERY_CONTENT_DISPOSITION=47;
// HTTP 1.1 defined headers
static const int HTTP_QUERY_AGE=48;
static const int HTTP_QUERY_CACHE_CONTROL=49;
static const int HTTP_QUERY_CONTENT_BASE=50;
static const int HTTP_QUERY_CONTENT_LOCATION=51;
static const int HTTP_QUERY_CONTENT_MD5=52;
static const int HTTP_QUERY_CONTENT_RANGE=53;
static const int HTTP_QUERY_ETAG=54;
static const int HTTP_QUERY_HOST=55;
static const int HTTP_QUERY_IF_MATCH=56;
static const int HTTP_QUERY_IF_NONE_MATCH=57;
static const int HTTP_QUERY_IF_RANGE=58;
static const int HTTP_QUERY_IF_UNMODIFIED_SINCE=59;
static const int HTTP_QUERY_MAX_FORWARDS=60;
static const int HTTP_QUERY_PROXY_AUTHORIZATION=61;
static const int HTTP_QUERY_RANGE=62;
static const int HTTP_QUERY_TRANSFER_ENCODING=63;
static const int HTTP_QUERY_UPGRADE=64;
static const int HTTP_QUERY_VARY=65;
static const int HTTP_QUERY_VIA=66;
static const int HTTP_QUERY_WARNING=67;
static const int HTTP_QUERY_EXPECT=68;
static const int HTTP_QUERY_PROXY_CONNECTION=69;
static const int HTTP_QUERY_UNLESS_MODIFIED_SINCE=70;
static const int HTTP_QUERY_ECHO_REQUEST=71;
static const int HTTP_QUERY_ECHO_REPLY=72;
// These are the set of headers that should be added back to a request when
// re-doing a request after a RETRY_WITH response.
static const int HTTP_QUERY_ECHO_HEADERS=73;
static const int HTTP_QUERY_ECHO_HEADERS_CRLF=74;
static const int HTTP_QUERY_PROXY_SUPPORT=75;
static const int HTTP_QUERY_AUTHENTICATION_INFO=76;
static const int HTTP_QUERY_PASSPORT_URLS=77;
static const int HTTP_QUERY_PASSPORT_CONFIG=78;
static const int HTTP_QUERY_MAX=78;
// HTTP_QUERY_CUSTOM - if this special value is supplied as the dwInfoLevel
// parameter of HttpQueryInfo() then the lpBuffer parameter contains the name
// of the header we are to query
static const int HTTP_QUERY_CUSTOM=65535;
// HTTP_QUERY_FLAG_REQUEST_HEADERS - if this bit is set in the dwInfoLevel
// parameter of HttpQueryInfo() then the request headers will be queried for the
// request information
static const int HTTP_QUERY_FLAG_REQUEST_HEADERS=0x80000000;
// HTTP_QUERY_FLAG_SYSTEMTIME - if this bit is set in the dwInfoLevel parameter
// of HttpQueryInfo() AND the header being queried contains date information,
// e.g. the "Expires:" header then lpBuffer will contain a SYSTEMTIME structure
// containing the date and time information converted from the header string
static const int HTTP_QUERY_FLAG_SYSTEMTIME=0x40000000;
// HTTP_QUERY_FLAG_NUMBER - if this bit is set in the dwInfoLevel parameter of
// HttpQueryInfo(), then the value of the header will be converted to a 32bit
// number before being returned to the caller, if applicable
static const int HTTP_QUERY_FLAG_NUMBER=0x20000000;
// HTTP_QUERY_FLAG_COALESCE - combine the values from several headers of the
// same name into the output buffer
static const int HTTP_QUERY_FLAG_COALESCE=0x10000000;
// HTTP_QUERY_FLAG_NUMBER64 - if this bit is set in the dwInfoLevel parameter of
// HttpQueryInfo(), then the value of the header will be converted to a 64bit
// number before being returned to the caller, if applicable
static const int HTTP_QUERY_FLAG_NUMBER64=0x08000000;
static const int HTTP_QUERY_MODIFIER_FLAGS_MASK=(HTTP_QUERY_FLAG_REQUEST_HEADERS 
                                                | HTTP_QUERY_FLAG_SYSTEMTIME        
                                                | HTTP_QUERY_FLAG_NUMBER            
                                                | HTTP_QUERY_FLAG_COALESCE          
                                                | HTTP_QUERY_FLAG_NUMBER64          
                                                );
static const int HTTP_QUERY_HEADER_MASK=(~HTTP_QUERY_MODIFIER_FLAGS_MASK);
// HTTP Response Status Codes:
static const int HTTP_STATUS_CONTINUE=100;// OK to continue with request
static const int HTTP_STATUS_SWITCH_PROTOCOLS=101;// server has switched protocols in upgrade header
static const int HTTP_STATUS_OK=200;// request completed
static const int HTTP_STATUS_CREATED=201;// object created, reason = new URI
static const int HTTP_STATUS_ACCEPTED=202;// async completion (TBS)
static const int HTTP_STATUS_PARTIAL=203;// partial completion
static const int HTTP_STATUS_NO_CONTENT=204;// no info to return
static const int HTTP_STATUS_RESET_CONTENT=205;// request completed, but clear form
static const int HTTP_STATUS_PARTIAL_CONTENT=206;// partial GET furfilled
static const int HTTP_STATUS_AMBIGUOUS=300;// server couldn't decide what to return
static const int HTTP_STATUS_MOVED=301;// object permanently moved
static const int HTTP_STATUS_REDIRECT=302;// object temporarily moved
static const int HTTP_STATUS_REDIRECT_METHOD=303;// redirection w/ new access method
static const int HTTP_STATUS_NOT_MODIFIED=304;// if-modified-since was not modified
static const int HTTP_STATUS_USE_PROXY=305;// redirection to proxy, location header specifies proxy to use
static const int HTTP_STATUS_REDIRECT_KEEP_VERB=307;// HTTP/1.1: keep same verb
static const int HTTP_STATUS_BAD_REQUEST=400;// invalid syntax
static const int HTTP_STATUS_DENIED=401;// access denied
static const int HTTP_STATUS_PAYMENT_REQ=402;// payment required
static const int HTTP_STATUS_FORBIDDEN=403;// request forbidden
static const int HTTP_STATUS_NOT_FOUND=404;// object not found
static const int HTTP_STATUS_BAD_METHOD=405;// method is not allowed
static const int HTTP_STATUS_NONE_ACCEPTABLE=406;// no response acceptable to client found
static const int HTTP_STATUS_PROXY_AUTH_REQ=407;// proxy authentication required
static const int HTTP_STATUS_REQUEST_TIMEOUT=408;// server timed out waiting for request
static const int HTTP_STATUS_CONFLICT=409;// user should resubmit with more info
static const int HTTP_STATUS_GONE=410;// the resource is no longer available
static const int HTTP_STATUS_LENGTH_REQUIRED=411;// the server refused to accept request w/o a length
static const int HTTP_STATUS_PRECOND_FAILED=412;// precondition given in request failed
static const int HTTP_STATUS_REQUEST_TOO_LARGE=413;// request entity was too large
static const int HTTP_STATUS_URI_TOO_LONG=414;// request URI too long
static const int HTTP_STATUS_UNSUPPORTED_MEDIA=415;// unsupported media type
static const int HTTP_STATUS_RETRY_WITH=449;// retry after doing the appropriate action.
static const int HTTP_STATUS_SERVER_ERROR=500;// internal server error
static const int HTTP_STATUS_NOT_SUPPORTED=501;// required not supported
static const int HTTP_STATUS_BAD_GATEWAY=502;// error response received from gateway
static const int HTTP_STATUS_SERVICE_UNAVAIL=503;// temporarily overloaded
static const int HTTP_STATUS_GATEWAY_TIMEOUT=504;// timed out waiting for gateway
static const int HTTP_STATUS_VERSION_NOT_SUP=505;// HTTP version not supported
static const int HTTP_STATUS_FIRST=HTTP_STATUS_CONTINUE;
static const int HTTP_STATUS_LAST=HTTP_STATUS_VERSION_NOT_SUP;
static const int HTTP_ADDREQ_INDEX_MASK=0x0000FFFF;
static const int HTTP_ADDREQ_FLAGS_MASK=0xFFFF0000;
// HTTP_ADDREQ_FLAG_ADD_IF_NEW - the header will only be added if it doesn't
// already exist
static const int HTTP_ADDREQ_FLAG_ADD_IF_NEW=0x10000000;
// HTTP_ADDREQ_FLAG_ADD - if HTTP_ADDREQ_FLAG_REPLACE is set but the header is
// not found then if this flag is set, the header is added anyway, so long as
// there is a valid header-value
static const int HTTP_ADDREQ_FLAG_ADD=0x20000000;
// HTTP_ADDREQ_FLAG_COALESCE - coalesce headers with same name. e.g.
// "Accept: text/*" and "Accept: audio/*" with this flag results in a single
// header: "Accept: text/*, audio/*"
static const int HTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA=0x40000000;
static const int HTTP_ADDREQ_FLAG_COALESCE_WITH_SEMICOLON=0x01000000;
static const int HTTP_ADDREQ_FLAG_COALESCE=HTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA;
// HTTP_ADDREQ_FLAG_REPLACE - replaces the specified header. Only one header can
// be supplied in the buffer. If the header to be replaced is not the first
// in a list of headers with the same name, then the relative index should be
// supplied in the low 8 bits of the dwModifiers parameter. If the header-value
// part is missing, then the header is removed
static const int HTTP_ADDREQ_FLAG_REPLACE=0x80000000;
// flags for InternetCrackUrl() and InternetCreateUrl()
static const int ICU_ESCAPE     = 0x80000000;  // (un)escape URL characters
static const int ICU_USERNAME   = 0x40000000; // use internal username & password
// flags for InternetCanonicalizeUrl() and InternetCombineUrl()
static const int ICU_NO_ENCODE   =0x20000000;  // Don't convert unsafe characters to escape sequence
static const int ICU_DECODE      =0x10000000;  // Convert %XX escape sequences to characters
static const int ICU_NO_META     =0x08000000;  // Don't convert .. etc. meta path sequences
static const int ICU_ENCODE_SPACES_ONLY= 0x04000000;  // Encode spaces only
static const int ICU_BROWSER_MODE =0x02000000; // Special encode/decode rules for browser
static const int ICU_ENCODE_PERCENT   =   0x00001000;      // Encode any percent (ASCII25)
static const int FTP_TRANSFER_TYPE_UNKNOWN=0x00000000;
static const int FTP_TRANSFER_TYPE_ASCII=0x00000001;
static const int FTP_TRANSFER_TYPE_BINARY=0x00000002;
static const int FTP_TRANSFER_TYPE_MASK=(FTP_TRANSFER_TYPE_ASCII| FTP_TRANSFER_TYPE_BINARY);
static const int INTERNET_OPEN_TYPE_PRECONFIG                   = 0;   // use registry configuration
static const int INTERNET_OPEN_TYPE_DIRECT                      = 1;   // direct to net
static const int INTERNET_OPEN_TYPE_PROXY                       = 3;   // via named proxy
static const int INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY = 4;   // prevent using java/script/INS
// manifests
static const int INTERNET_INVALID_PORT_NUMBER=0;// use the protocol-specific default
static const int INTERNET_DEFAULT_FTP_PORT=21;// default for FTP servers
static const int INTERNET_DEFAULT_GOPHER_PORT=70;//    "     "  gopher "
static const int INTERNET_DEFAULT_HTTP_PORT=80;//    "     "  HTTP   "
static const int INTERNET_DEFAULT_HTTPS_PORT=443;//    "     "  HTTPS  "
static const int INTERNET_DEFAULT_SOCKS_PORT=1080;// default for SOCKS firewall servers.
// maximum field lengths (arbitrary)
static const int INTERNET_MAX_HOST_NAME_LENGTH=256;
static const int INTERNET_MAX_USER_NAME_LENGTH=128;
static const int INTERNET_MAX_PASSWORD_LENGTH=128;
static const int INTERNET_MAX_PORT_NUMBER_LENGTH=5;// INTERNET_PORT is unsigned short
static const int INTERNET_MAX_PORT_NUMBER_VALUE=65535;// maximum unsigned short value
static const int INTERNET_MAX_PATH_LENGTH=2048;
static const int INTERNET_MAX_SCHEME_LENGTH=32;// longest protocol name length
static const int INTERNET_MAX_URL_LENGTH=(INTERNET_MAX_SCHEME_LENGTH 
                                        + 4
                                        + INTERNET_MAX_PATH_LENGTH);
// values returned by InternetQueryOption() with INTERNET_OPTION_KEEP_CONNECTION:
static const int INTERNET_KEEP_ALIVE_UNKNOWN=((DWORD)-1);
static const int INTERNET_KEEP_ALIVE_ENABLED=1;
static const int INTERNET_KEEP_ALIVE_DISABLED=0;
// flags returned by InternetQueryOption() with INTERNET_OPTION_REQUEST_FLAGS
static const int INTERNET_REQFLAG_FROM_CACHE=0x00000001;// response came from cache
static const int INTERNET_REQFLAG_ASYNC=0x00000002;// request was made asynchronously
static const int INTERNET_REQFLAG_VIA_PROXY=0x00000004;// request was made via a proxy
static const int INTERNET_REQFLAG_NO_HEADERS=0x00000008;// orginal response contained no headers
static const int INTERNET_REQFLAG_PASSIVE=0x00000010;// FTP: passive-mode connection
static const int INTERNET_REQFLAG_CACHE_WRITE_DISABLED=0x00000040;// HTTPS: this request not cacheable
static const int INTERNET_REQFLAG_NET_TIMEOUT=0x00000080;// w/ _FROM_CACHE: net request timed out
// flags for IDN enable/disable via INTERNET_OPTION_IDN
static const int INTERNET_FLAG_IDN_DIRECT=0x00000001;// IDN enabled for direct connections
static const int INTERNET_FLAG_IDN_PROXY=0x00000002;// IDN enabled for proxy
// flags common to open functions (not InternetOpen()):
static const int INTERNET_FLAG_RELOAD=0x80000000;// retrieve the original item
// flags for InternetOpenUrl():
static const int INTERNET_FLAG_RAW_DATA=0x40000000;// FTP/gopher find: receive the item as raw (structured) data
static const int INTERNET_FLAG_EXISTING_CONNECT=0x20000000;// FTP: use existing InternetConnect handle for server if possible
// flags for InternetOpen():
static const int INTERNET_FLAG_ASYNC=0x10000000;// this request is asynchronous (where supported)
// protocol-specific flags:
static const int INTERNET_FLAG_PASSIVE=0x08000000;// used for FTP connections
// additional cache flags
static const int INTERNET_FLAG_NO_CACHE_WRITE=0x04000000;// don't write this item to the cache
static const int INTERNET_FLAG_DONT_CACHE=INTERNET_FLAG_NO_CACHE_WRITE;
static const int INTERNET_FLAG_MAKE_PERSISTENT=0x02000000;// make this item persistent in cache
static const int INTERNET_FLAG_FROM_CACHE=0x01000000;// use offline semantics
static const int INTERNET_FLAG_OFFLINE=INTERNET_FLAG_FROM_CACHE;
// additional flags
static const int INTERNET_FLAG_SECURE=0x00800000;// use PCT/SSL if applicable (HTTP)
static const int INTERNET_FLAG_KEEP_CONNECTION=0x00400000;// use keep-alive semantics
static const int INTERNET_FLAG_NO_AUTO_REDIRECT=0x00200000;// don't handle redirections automatically
static const int INTERNET_FLAG_READ_PREFETCH=0x00100000;// do background read prefetch
static const int INTERNET_FLAG_NO_COOKIES=0x00080000;// no automatic cookie handling
static const int INTERNET_FLAG_NO_AUTH=0x00040000;// no automatic authentication handling
static const int INTERNET_FLAG_RESTRICTED_ZONE=0x00020000;// apply restricted zone policies for cookies, auth
static const int INTERNET_FLAG_CACHE_IF_NET_FAIL=0x00010000;// return cache file if net request fails
// Security Ignore Flags, Allow HttpOpenRequest to overide
//  Secure Channel (SSL/PCT) failures of the following types.
static const int INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP=0x00008000;// ex: https:// to http://
static const int INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS=0x00004000;// ex: http:// to https://
static const int INTERNET_FLAG_IGNORE_CERT_DATE_INVALID=0x00002000;// expired X509 Cert.
static const int INTERNET_FLAG_IGNORE_CERT_CN_INVALID=0x00001000;// bad common name in X509 Cert.
// more caching flags
static const int INTERNET_FLAG_RESYNCHRONIZE=0x00000800;// asking wininet to update an item if it is newer
static const int INTERNET_FLAG_HYPERLINK=0x00000400;// asking wininet to do hyperlinking semantic which works right for scripts
static const int INTERNET_FLAG_NO_UI=0x00000200;// no cookie popup
static const int INTERNET_FLAG_PRAGMA_NOCACHE=0x00000100;// asking wininet to add "pragma: no-cache"
static const int INTERNET_FLAG_CACHE_ASYNC=0x00000080;// ok to perform lazy cache-write
static const int INTERNET_FLAG_FORMS_SUBMIT=0x00000040;// this is a forms submit
static const int INTERNET_FLAG_FWD_BACK=0x00000020;// fwd-back button op
static const int INTERNET_FLAG_NEED_FILE=0x00000010;// need a file for this request
static const int INTERNET_FLAG_MUST_CACHE_REQUEST=INTERNET_FLAG_NEED_FILE;
// flags for FTP
static const int INTERNET_FLAG_TRANSFER_ASCII=FTP_TRANSFER_TYPE_ASCII;// 0x00000001
static const int INTERNET_FLAG_TRANSFER_BINARY=FTP_TRANSFER_TYPE_BINARY;// 0x00000002
// options manifests for Internet{Query|Set}Option
static const int INTERNET_OPTION_CALLBACK=1;
static const int INTERNET_OPTION_CONNECT_TIMEOUT=2;
static const int INTERNET_OPTION_CONNECT_RETRIES=3;
static const int INTERNET_OPTION_CONNECT_BACKOFF=4;
static const int INTERNET_OPTION_SEND_TIMEOUT=5;
static const int INTERNET_OPTION_CONTROL_SEND_TIMEOUT=INTERNET_OPTION_SEND_TIMEOUT;
static const int INTERNET_OPTION_RECEIVE_TIMEOUT=6;
static const int INTERNET_OPTION_CONTROL_RECEIVE_TIMEOUT=INTERNET_OPTION_RECEIVE_TIMEOUT;
static const int INTERNET_OPTION_DATA_SEND_TIMEOUT=7;
static const int INTERNET_OPTION_DATA_RECEIVE_TIMEOUT=8;
static const int INTERNET_OPTION_HANDLE_TYPE=9;
static const int INTERNET_OPTION_LISTEN_TIMEOUT=11;
static const int INTERNET_OPTION_READ_BUFFER_SIZE=12;
static const int INTERNET_OPTION_WRITE_BUFFER_SIZE=13;
static const int INTERNET_OPTION_ASYNC_ID=15;
static const int INTERNET_OPTION_ASYNC_PRIORITY=16;
static const int INTERNET_OPTION_PARENT_HANDLE=21;
static const int INTERNET_OPTION_KEEP_CONNECTION=22;
static const int INTERNET_OPTION_REQUEST_FLAGS=23;
static const int INTERNET_OPTION_EXTENDED_ERROR=24;
static const int INTERNET_OPTION_OFFLINE_MODE=26;
static const int INTERNET_OPTION_CACHE_STREAM_HANDLE=27;
static const int INTERNET_OPTION_USE
RNAME=28;
static const int INTERNET_OPTION_PASSWORD=29;
static const int INTERNET_OPTION_ASYNC=30;
static const int INTERNET_OPTION_SECURITY_FLAGS=31;
static const int INTERNET_OPTION_SECURITY_CERTIFICATE_STRUCT=32;
static const int INTERNET_OPTION_DATAFILE_NAME=33;
static const int INTERNET_OPTION_URL=34;
static const int INTERNET_OPTION_SECURITY_CERTIFICATE=35;
static const int INTERNET_OPTION_SECURITY_KEY_BITNESS=36;
static const int INTERNET_OPTION_REFRESH=37;
static const int INTERNET_OPTION_PROXY=38;
static const int INTERNET_OPTION_SETTINGS_CHANGED=39;
static const int INTERNET_OPTION_VERSION=40;
static const int INTERNET_OPTION_USER_AGENT=41;
static const int INTERNET_OPTION_END_BROWSER_SESSION=42;
static const int INTERNET_OPTION_PROXY_USERNAME=43;
static const int INTERNET_OPTION_PROXY_PASSWORD=44;
static const int INTERNET_OPTION_CONTEXT_VALUE=45;
static const int INTERNET_OPTION_CONNECT_LIMIT=46;
static const int INTERNET_OPTION_SECURITY_SELECT_CLIENT_CERT=47;
static const int INTERNET_OPTION_POLICY=48;
static const int INTERNET_OPTION_DISCONNECTED_TIMEOUT=49;
static const int INTERNET_OPTION_CONNECTED_STATE=50;
static const int INTERNET_OPTION_IDLE_STATE=51;
static const int INTERNET_OPTION_OFFLINE_SEMANTICS=52;
static const int INTERNET_OPTION_SECONDARY_CACHE_KEY=53;
static const int INTERNET_OPTION_CALLBACK_FILTER=54;
static const int INTERNET_OPTION_CONNECT_TIME=55;
static const int INTERNET_OPTION_SEND_THROUGHPUT=56;
static const int INTERNET_OPTION_RECEIVE_THROUGHPUT=57;
static const int INTERNET_OPTION_REQUEST_PRIORITY=58;
static const int INTERNET_OPTION_HTTP_VERSION=59;
static const int INTERNET_OPTION_RESET_URLCACHE_SESSION=60;
static const int INTERNET_OPTION_ERROR_MASK=62;
static const int INTERNET_OPTION_FROM_CACHE_TIMEOUT=63;
static const int INTERNET_OPTION_BYPASS_EDITED_ENTRY=64;
static const int INTERNET_OPTION_HTTP_DECODING=65;
static const int INTERNET_OPTION_DIAGNOSTIC_SOCKET_INFO=67;
static const int INTERNET_OPTION_CODEPAGE=68;
static const int INTERNET_OPTION_CACHE_TIMESTAMPS=69;
static const int INTERNET_OPTION_DISABLE_AUTODIAL=70;
static const int INTERNET_OPTION_MAX_CONNS_PER_SERVER=73;
static const int INTERNET_OPTION_MAX_CONNS_PER_1_0_SERVER=74;
static const int INTERNET_OPTION_PER_CONNECTION_OPTION=75;
static const int INTERNET_OPTION_DIGEST_AUTH_UNLOAD=76;
static const int INTERNET_OPTION_IGNORE_OFFLINE=77;
static const int INTERNET_OPTION_IDENTITY=78;
static const int INTERNET_OPTION_REMOVE_IDENTITY=79;
static const int INTERNET_OPTION_ALTER_IDENTITY=80;
static const int INTERNET_OPTION_SUPPRESS_BEHAVIOR=81;
static const int INTERNET_OPTION_AUTODIAL_MODE=82;
static const int INTERNET_OPTION_AUTODIAL_CONNECTION=83;
static const int INTERNET_OPTION_CLIENT_CERT_CONTEXT=84;
static const int INTERNET_OPTION_AUTH_FLAGS=85;
static const int INTERNET_OPTION_COOKIES_3RD_PARTY=86;
static const int INTERNET_OPTION_DISABLE_PASSPORT_AUTH=87;
static const int INTERNET_OPTION_SEND_UTF8_SERVERNAME_TO_PROXY=88;
static const int INTERNET_OPTION_EXEMPT_CONNECTION_LIMIT=89;
static const int INTERNET_OPTION_ENABLE_PASSPORT_AUTH=90;
static const int INTERNET_OPTION_HIBERNATE_INACTIVE_WORKER_THREADS=91;
static const int INTERNET_OPTION_ACTIVATE_WORKER_THREADS=92;
static const int INTERNET_OPTION_RESTORE_WORKER_THREAD_DEFAULTS=93;
static const int INTERNET_OPTION_SOCKET_SEND_BUFFER_LENGTH=94;
static const int INTERNET_OPTION_PROXY_SETTINGS_CHANGED=95;
static const int INTERNET_OPTION_DATAFILE_EXT=96;
static const int INTERNET_OPTION_CODEPAGE_PATH=100;
static const int INTERNET_OPTION_CODEPAGE_EXTRA=101;
static const int INTERNET_OPTION_IDN=102;
static const int INTERNET_OPTION_MAX_CONNS_PER_PROXY=103;
static const int INTERNET_OPTION_SUPPRESS_SERVER_AUTH=104;
static const int INTERNET_OPTION_SERVER_CERT_CHAIN_CONTEXT=105;
static const int INTERNET_FIRST_OPTION=INTERNET_OPTION_CALLBACK;
static const int INTERNET_LAST_OPTION=INTERNET_OPTION_SERVER_CERT_CHAIN_CONTEXT;
// values for INTERNET_OPTION_PRIORITY
static const int INTERNET_PRIORITY_FOREGROUND=1000;
// handle types
static const int INTERNET_HANDLE_TYPE_INTERNET=1;
static const int INTERNET_HANDLE_TYPE_CONNECT_FTP=2;
static const int INTERNET_HANDLE_TYPE_CONNECT_GOPHER=3;
static const int INTERNET_HANDLE_TYPE_CONNECT_HTTP=4;
static const int INTERNET_HANDLE_TYPE_FTP_FIND=5;
static const int INTERNET_HANDLE_TYPE_FTP_FIND_HTML=6;
static const int INTERNET_HANDLE_TYPE_FTP_FILE=7;
static const int INTERNET_HANDLE_TYPE_FTP_FILE_HTML=8;
static const int INTERNET_HANDLE_TYPE_GOPHER_FIND=9;
static const int INTERNET_HANDLE_TYPE_GOPHER_FIND_HTML=10;
static const int INTERNET_HANDLE_TYPE_GOPHER_FILE=11;
static const int INTERNET_HANDLE_TYPE_GOPHER_FILE_HTML=12;
static const int INTERNET_HANDLE_TYPE_HTTP_REQUEST=13;
static const int INTERNET_HANDLE_TYPE_FILE_REQUEST=14;
// values for INTERNET_OPTION_AUTH_FLAGS
static const int AUTH_FLAG_DISABLE_NEGOTIATE=0x00000001;
static const int AUTH_FLAG_ENABLE_NEGOTIATE=0x00000002;
static const int AUTH_FLAG_DISABLE_BASIC_CLEARCHANNEL=0x00000004;
// values for INTERNET_OPTION_SECURITY_FLAGS
// query only
static const int SECURITY_FLAG_SECURE=0x00000001;// can query only
static const int SECURITY_FLAG_STRENGTH_WEAK=0x10000000;
static const int SECURITY_FLAG_STRENGTH_MEDIUM=0x40000000;
static const int SECURITY_FLAG_STRENGTH_STRONG=0x20000000;
static const int SECURITY_FLAG_UNKNOWNBIT=0x80000000;
static const int SECURITY_FLAG_FORTEZZA=0x08000000;
static const int SECURITY_FLAG_NORMALBITNESS=SECURITY_FLAG_STRENGTH_WEAK;
// The following are unused
static const int SECURITY_FLAG_SSL=0x00000002;
static const int SECURITY_FLAG_SSL3=0x00000004;
static const int SECURITY_FLAG_PCT=0x00000008;
static const int SECURITY_FLAG_PCT4=0x00000010;
static const int SECURITY_FLAG_IETFSSL4=0x00000020;
// The following are for backwards compatability only.
static const int SECURITY_FLAG_40BIT=SECURITY_FLAG_STRENGTH_WEAK;
static const int SECURITY_FLAG_128BIT=SECURITY_FLAG_STRENGTH_STRONG;
static const int SECURITY_FLAG_56BIT=SECURITY_FLAG_STRENGTH_MEDIUM;
// setable flags
static const int SECURITY_FLAG_IGNORE_REVOCATION=0x00000080;
static const int SECURITY_FLAG_IGNORE_UNKNOWN_CA=0x00000100;
static const int SECURITY_FLAG_IGNORE_WRONG_USAGE=0x00000200;
static const int SECURITY_FLAG_IGNORE_CERT_CN_INVALID=INTERNET_FLAG_IGNORE_CERT_CN_INVALID;
static const int SECURITY_FLAG_IGNORE_CERT_DATE_INVALID=INTERNET_FLAG_IGNORE_CERT_DATE_INVALID;
static const int SECURITY_FLAG_IGNORE_REDIRECT_TO_HTTPS=INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS;
static const int SECURITY_FLAG_IGNORE_REDIRECT_TO_HTTP=INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP;
static const int SECURITY_SET_MASK=(SECURITY_FLAG_IGNORE_REVOCATION|
SECURITY_FLAG_IGNORE_UNKNOWN_CA |
SECURITY_FLAG_IGNORE_CERT_CN_INVALID |
SECURITY_FLAG_IGNORE_CERT_DATE_INVALID |
SECURITY_FLAG_IGNORE_WRONG_USAGE);
// flags field masks
static const int SECURITY_INTERNET_MASK=(INTERNET_FLAG_IGNORE_CERT_CN_INVALID| 
                                 INTERNET_FLAG_IGNORE_CERT_DATE_INVALID  |  
                                 INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS  | 
                                 INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP   );
static const int SECURITY_IGNORE_ERROR_MASK=(INTERNET_FLAG_IGNORE_CERT_CN_INVALID|  
                                     INTERNET_FLAG_IGNORE_CERT_DATE_INVALID |  
                                     SECURITY_FLAG_IGNORE_UNKNOWN_CA        |  
                                     SECURITY_FLAG_IGNORE_REVOCATION    );
static const int INTERNET_FLAGS_MASK=(INTERNET_FLAG_RELOAD
                                | INTERNET_FLAG_RAW_DATA            
                                | INTERNET_FLAG_EXISTING_CONNECT   
                                | INTERNET_FLAG_ASYNC              
                                | INTERNET_FLAG_PASSIVE            
                                | INTERNET_FLAG_NO_CACHE_WRITE     
                                | INTERNET_FLAG_MAKE_PERSISTENT    
                                | INTERNET_FLAG_FROM_CACHE         
                                | INTERNET_FLAG_SECURE             
                                | INTERNET_FLAG_KEEP_CONNECTION    
                                | INTERNET_FLAG_NO_AUTO_REDIRECT   
                                | INTERNET_FLAG_READ_PREFETCH      
                                | INTERNET_FLAG_NO_COOKIES         
                                | INTERNET_FLAG_NO_AUTH            
                                | INTERNET_FLAG_CACHE_IF_NET_FAIL  
                                | SECURITY_INTERNET_MASK           
                                | INTERNET_FLAG_RESYNCHRONIZE      
                                | INTERNET_FLAG_HYPERLINK          
                                | INTERNET_FLAG_NO_UI              
                                | INTERNET_FLAG_PRAGMA_NOCACHE     
                                | INTERNET_FLAG_CACHE_ASYNC        
                                | INTERNET_FLAG_FORMS_SUBMIT       
                                | INTERNET_FLAG_NEED_FILE          
                                | INTERNET_FLAG_RESTRICTED_ZONE    
                                | INTERNET_FLAG_TRANSFER_BINARY    
                                | INTERNET_FLAG_TRANSFER_ASCII     
                                | INTERNET_FLAG_FWD_BACK           
                                );
static const int INTERNET_ERROR_MASK_INSERT_CDROM=0x1;
static const int INTERNET_ERROR_MASK_COMBINED_SEC_CERT=0x2;
static const int INTERNET_ERROR_MASK_NEED_MSN_SSPI_PKG=0X4;
static const int INTERNET_ERROR_MASK_LOGIN_FAILURE_DISPLAY_ENTITY_BODY=0x8;
static const int INTERNET_OPTIONS_MASK=(~INTERNET_FLAGS_MASK);
// common per-API flags (new APIs)
static const int WININET_API_FLAG_ASYNC=0x00000001;// force async operation
static const int WININET_API_FLAG_SYNC=0x00000004;// force sync operation
static const int WININET_API_FLAG_USE_CONTEXT=0x00000008;// use value supplied in dwContext (even if 0)
// INTERNET_NO_CALLBACK - if this value is presented as the dwContext parameter
// then no call-backs will be made for that API
static const int INTERNET_NO_CALLBACK=0;
// status manifests for Internet status callback
static const int INTERNET_STATUS_RESOLVING_NAME=10;
static const int INTERNET_STATUS_NAME_RESOLVED=11;
static const int INTERNET_STATUS_CONNECTING_TO_SERVER=20;
static const int INTERNET_STATUS_CONNECTED_TO_SERVER=21;
static const int INTERNET_STATUS_SENDING_REQUEST=30;
static const int INTERNET_STATUS_REQUEST_SENT=31;
static const int INTERNET_STATUS_RECEIVING_RESPONSE=40;
static const int INTERNET_STATUS_RESPONSE_RECEIVED=41;
static const int INTERNET_STATUS_CTL_RESPONSE_RECEIVED=42;
static const int INTERNET_STATUS_PREFETCH=43;
static const int INTERNET_STATUS_CLOSING_CONNECTION=50;
static const int INTERNET_STATUS_CONNECTION_CLOSED=51;
static const int INTERNET_STATUS_HANDLE_CREATED=60;
static const int INTERNET_STATUS_HANDLE_CLOSING=70;
static const int INTERNET_STATUS_DETECTING_PROXY=80;
static const int INTERNET_STATUS_REQUEST_COMPLETE=100;
static const int INTERNET_STATUS_REDIRECT=110;
static const int INTERNET_STATUS_INTERMEDIATE_RESPONSE=120;
static const int INTERNET_STATUS_USER_INPUT_REQUIRED=140;
static const int INTERNET_STATUS_STATE_CHANGE=200;
static const int INTERNET_STATUS_COOKIE_SENT=320;
static const int INTERNET_STATUS_COOKIE_RECEIVED=321;
static const int INTERNET_STATUS_PRIVACY_IMPACTED=324;
static const int INTERNET_STATUS_P3P_HEADER=325;
static const int INTERNET_STATUS_P3P_POLICYREF=326;
static const int INTERNET_STATUS_COOKIE_HISTORY=327;
// the following can be indicated in a state change notification:
static const int INTERNET_STATE_CONNECTED=0x00000001;// connected state (mutually exclusive with disconnected)
static const int INTERNET_STATE_DISCONNECTED=0x00000002;// disconnected from network
static const int INTERNET_STATE_DISCONNECTED_BY_USER=0x00000010;// disconnected by user request
static const int INTERNET_STATE_IDLE=0x00000100;// no network requests being made (by Wininet)
static const int INTERNET_STATE_BUSY=0x00000200;// network requests being made (by Wininet)
static const int INTERNET_SERVICE_FTP=1;
static const int INTERNET_SERVICE_GOPHER=2;
static const int INTERNET_SERVICE_HTTP=3;
kernel32
wininet	load
wininet.wininet_h
wininet.wintypes
require
static const int  MAX_PATH = 260;
// Basic Data types
typedef unsigned char	BYTE,*LPBYTE,*PBYTE;
typedef long			BOOL;
typedef BYTE			BOOLEAN;
typedef char			CHAR;
typedef wchar_t			WCHAR;
typedef uint16_t		WORD;
typedef unsigned long	DWORD,DWORDLONG;
typedef uint32_t		DWORD32;
typedef int				INT;
typedef int32_t			INT32;
typedef int64_t			INT64;
typedef float 			FLOAT;
typedef long			LONG;
typedef signed int		LONG32;
typedef int64_t			LONGLONG;
typedef size_t			SIZE_T;
typedef uint8_t			BCHAR;
typedef unsigned char	UCHAR;
typedef unsigned int	UINT;
typedef unsigned int	UINT32;
typedef unsigned long	ULONG;
typedef unsigned int	ULONG32;
typedef unsigned short	USHORT;
typedef uint64_t		ULONGLONG;
// Some pointer types
typedef unsigned char	*PUCHAR;
typedef unsigned int	*PUINT;
typedef unsigned int	*PUINT32;
typedef unsigned long	*PLONG;
typedef unsigned long	*PULONG;
typedef unsigned int	*PULONG32;
typedef unsigned short	*PUSHORT;
typedef LONGLONG 		*PLONGLONG;
typedef ULONGLONG 		*PULONGLONG;
typedef void            VOID;
typedef void *			PVOID;
typedef DWORD *			DWORD_PTR;
typedef intptr_t		LONG_PTR;
typedef uintptr_t		UINT_PTR;
typedef uintptr_t		ULONG_PTR;
typedef ULONG_PTR *		PULONG_PTR;
typedef DWORD *			LPCOLORREF;
typedef BOOL *			LPBOOL;
typedef char *			LPSTR,*PWSTR;
typedef short *			LPWSTR;
typedef const short *	LPCWSTR;
typedef LPSTR			LPTSTR;
typedef DWORD *			LPDWORD;
typedef void *			LPVOID;
typedef WORD *			LPWORD;
typedef const char *	LPCSTR;
typedef LPCSTR			LPCTSTR;
typedef const void *	LPCVOID;
typedef LONG_PTR		LRESULT;
typedef LONG_PTR		LPARAM;
typedef UINT_PTR		WPARAM;
typedef unsigned char	TBYTE;
typedef char			TCHAR;
typedef USHORT			COLOR16;
typedef DWORD			COLORREF;
// Special types
typedef WORD			ATOM;
typedef DWORD			LCID;
typedef USHORT			LANGID;
// Various Handles
typedef void *			HANDLE;
typedef HANDLE			*PHANDLE;
typedef HANDLE			LPHANDLE;
typedef void *			HBITMAP;
typedef void *			HBRUSH;
typedef void *			HICON;
typedef HICON			HCURSOR;
typedef HANDLE			HDC;
typedef void *			HDESK;
typedef HANDLE			HDROP;
typedef HANDLE			HDWP;
typedef HANDLE			HENHMETAFILE;
typedef INT				HFILE;
typedef HANDLE			HFONT;
typedef void *			HGDIOBJ;
typedef HANDLE			HGLOBAL;
typedef HANDLE 			HGLRC;
typedef HANDLE			HHOOK;
typedef void *			HINSTANCE;
typedef void *			HKEY;
typedef void *			HKL;
typedef HANDLE			HLOCAL;
typedef void *			HMEMF;
typedef HANDLE			HMENU;
typedef HANDLE			HMETAFILE;
typedef void			HMF;
typedef HINSTANCE		HMODULE;
typedef HANDLE			HMONITOR;
typedef HANDLE			HPALETTE;
typedef void *			HPEN;
typedef LONG			HRESULT;
typedef HANDLE			HRGN;
typedef void *			HRSRC;
typedef void *			HSTR;
typedef HANDLE			HSZ;
typedef void *			HTASK;
typedef void *			HWINSTA;
typedef HANDLE			HWND;
// Ole Automation
typedef WCHAR			OLECHAR;
typedef OLECHAR 		*LPOLESTR;
typedef const OLECHAR	*LPCOLESTR;
typedef OLECHAR *BSTR;
typedef BSTR *LPBSTR;
typedef DWORD ACCESS_MASK;
typedef ACCESS_MASK* PACCESS_MASK;
typedef LONG FXPT16DOT16, *LPFXPT16DOT16;
typedef LONG FXPT2DOT30, *LPFXPT2DOT30;
typedef int NTSTATUS;
typedef struct _FILETIME {
    DWORD dwLowDateTime;
    DWORD dwHighDateTime;
} FILETIME, *PFILETIME, *LPFILETIME;
typedef struct _SYSTEMTIME {
  WORD wYear;
  WORD wMonth;
  WORD wDayOfWeek;
  WORD wDay;
  WORD wHour;
  WORD wMinute;
  WORD wSecond;
  WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME;
typedef struct _WIN32_FIND_DATAA
    DWORD dwFileAttributes;
    FILETIME ftCreationTime;
    FILETIME ftLastAccessTime;
    FILETIME ftLastWriteTime;
    DWORD nFileSizeHigh;
    DWORD nFileSizeLow;
    DWORD dwReserved0;
    DWORD dwReserved1;
    CHAR cFileName[ 260 ];
    CHAR cAlternateFileName[ 14 ];
    } 	WIN32_FIND_DATAA;
typedef struct _WIN32_FIND_DATAA *PWIN32_FIND_DATAA;
typedef struct _WIN32_FIND_DATAA *LPWIN32_FIND_DATAA;
typedef struct _WIN32_FIND_DATAW
    DWORD dwFileAttributes;
    FILETIME ftCreationTime;
    FILETIME ftLastAccessTime;
    FILETIME ftLastWriteTime;
    DWORD nFileSizeHigh;
    DWORD nFileSizeLow;
    DWORD dwReserved0;
    DWORD dwReserved1;
    WCHAR cFileName[ 260 ];
    WCHAR cAlternateFileName[ 14 ];
    } 	WIN32_FIND_DATAW;
typedef struct _WIN32_FIND_DATAW *PWIN32_FIND_DATAW;
typedef struct _WIN32_FIND_DATAW *LPWIN32_FIND_DATAW;
require
	task	 on 
tostring
ErrSequenceFailed:&
index	taskA
__init
setmetatable
pausedE
idxPending
pauseTask
paused
startNext
pauseTask
tostring.Nothing to start (paused=%s,pauseTask=%s)
pausedG
cancelled
pendingCancel
taskst
tostring	
TaskSequence[
append
insert
tostringATaskSequence::append invalid argument. expected 'Task' got '7Cannot modify cancelled or completed task sequence
completed
cancelled
insert
tasksEInvalid argument to TaskSequence::merge expected 'TaskSequence'.
append
__classJ
insert
successes
failures
all_success
insert
isSuccess
tasks~
setResult
handleCancel Called!
pendingCancel
cancelledR
startNext
setResult
tostring
startNext :: 
idxStarted
setError#StartNext :: failure @ %d-> %s
tostring
Starting 
executeLater
cancel
 is cancelled!
isCancelled
 already completed
tostring
isComplete
startNext$State %s <> %s (next completed)
handleCancel
idxStarted
State %s <> %s (cancelled)
idxPending
(State %s <> %s (on Complete LInked)
onComplete
pauseTask
paused
current
onProgress
setResult
idxStarted
State %s <> %s
idxPending
handleCancel
pendingCancel
cancelled
pendingCancel
onProgress
pauseTask
idxStarted
idxPending
nextTask
paused
__initB
rawgetA
__init
setmetatable
TaskSequence
__inherited
__parent
__name
TaskSequence
startNext
handleCancel
summary
addList
append
length
cancel
resume
isPaused
__class
__call
__base
__init
__name
ErrSequenceFailed
setmetatable
__index
__tostring
DebugPrint
CANCELLED
isTask	Task
luabridge.nsis
tasks.base
requires
tasks.sequence
loggerFor
logging	moon
bootstrap
require
addJsError"
JsLog|%s"
JsLog|%s3
ShellExecute=
javascript
execScript
Script Failed!:%s
pcallZ").call(window);}catch(e){
                error_log(e,'Script Error!')
            }
try{ new Function("
Executing: %sh
MB_ICONWARNING
MB_YESNO
tostringS
add_command_group
misc_functions
cancelDetails
register
cancel
parent	open
ui_commands.nav
bundle
ui_commands.bundle
Commands
ui_commands.app
message
execute
MB_ICONWARNING
MB_YESNO
bor1Are you sure you want to exit the Installer?
bundles
MessageBoxConstants
SwConstants
MsgConstants
IdConstants
wrappedScript
getBrowser	Info
ErrorPrint
DebugPrint
DebugTrace
ui_commands
loggerFor
win32_constants
luabridge.win32
install_details
error_store
logging
guiinit
requires
bootstrap
require
simplecom Error[%s] :: %sA
reltime
begin_move 
minimize
restore1
/	find
string
%s -> %s
result
Unknown-Commands"Unsupported commands:%s -> %s
Error:%s
format
string
opt2issuedCommandError::%s
Command:%s(%s,%s)->
+window2Document failed for %s(hr=%d)%s
get_document
(unwrapWindow failed for %s(hr=%d)%s
get_browser
IDataStore
impl_from_tlb
setmetatable
kIncludeTable
__inner
data_stores
require
registerService
Adding Js Service %s -> %s
Service %s -> %s
Unsupported Service '%s'
Bad Service Request!
getService
setResult
Application Skin is ready!8
Ambient Dl Control Called!
addJsError
tostring
Javascript Error:%s
error_store
requireA
About to Navigate To:%s|
opt%DocumentComplete %s Args: %s, %s
misc_functions
ui_commands
require
Navigation Error!@
Property Changed:%s
PropertyChange
NavigateError
NewWindow3
DocumentComplete
BeforeNavigate2
add_event_handler
event_handlers
onScriptError
set_other_handler
other_handlers
set_external
impl_from_tlb	file
binlib	name
tlbs/interfaces.tlb
extractEmbeddedResources
PLUGINSDIR
NSISVars
randomNameSeq
bootstrap.fs
require
LUA_EMBED_TLB
DISPID#-5512
onAppSkinReady
getService
addService
getDataStore
unwrapWindow
window2Document
issueCommand
load_url
setup_dialog
borderless
center	move
load_url
setup_dialog
borderless
center
height
width	move
errorFunction
exceptionHandler
set_error_handlers
skinDir
file://%s/index.html
format
string
skinOptions|
load_html_dialog
mainwindow
ole_initialize
Ole Init:%sl
Window Loop shown!.
window_loop
Starting Window Loop
to_foreground
topmost
topmost_installer
show_normal
skinOptions
msg_filter
addMessageFilterl
msg_filter
removeMessageFilter6
minimize
CreateLuaCOM
pointer
browser
ImportIUnknown
parentWindow
document
        %s
    }catch(e){
        issueCommand("logging/error","JS-ERROR|(%s)" + e + "|" + e.lineNumber + "|" + e.message + "\nStack" + e.stack)
format
string
javascript
execScript
Script:%s
    updateBundleData(%s);
format
string
encodeI
%s is complete syncing...=
executeLater
onComplete
isComplete
canOfferTask
ipairs
javascript
execScript
syncBundles
Script:%s
skinOptions
exception
encodeexception
environment_options
appNForUi^    setBundleData(%s);
    setAppData(%s); 
    setEnvData(%s);
    setSkinData(%s);
format
string
encode
bundlesForUi'
bundleIndex
resumeOffer
javascript
execScript
Running Script:%s
SCREEN_OFFERS0offerBundle(getClientIndex(%d));commitUi();
format
string
javascript
execScript
toCancelScreen
beginCancel();commitUi()
SCREEN_CANCEL
javascript
execScript
toInstallScreen
beginInstall();commitUi();
SCREEN_INSTALL
javascript
execScript
toInstallScreen beginComplete();commitUi();
SCREEN_COMPLETE
javascript
execScript
parentWindow
document
Script:%s
tostring*updateInstallProgress(%d,%d,%d,%d,%s)
format
string
"Failed to Update Ui Status:%s
progressTargetIdx InstallProgress Error %s,%s
getBundles
javascript
execScript
parentWindow
document
Script: %s
updateInstallLine(
"Failed to Update Ui Status:%s
progressTargetIdx
InstallStatus Error %s,%s
getBundles
setItem
__inner
getItem
__inner8
contains
__inner:
deleteItem
__inner
:% $7%!
:,d,1-f
:-e,1-h
:-g,1-j
:-i,1-l
:-k,:(m
wrappedScript
getBrowser
deleteItem
contains
getItem
setItem
__index
getScreenTimes
getLastScreen
getCurrentScreen
InstallStatus
InstallProgress
toCompleteScreen
toInstallScreen
toCancelScreen
resumeOffer
offerBundle
setupBundles
getUiReadyTask
runloop
load_html_dialog
setup_dialog
window
innerloaded
refresh
restore
minimize
begin_drag
other_commands
core_commands
add_command_group
close_handler
set_error_handler
exception
encodeexception
indent
SCREEN_PRELOAD	Task
luabridge.nsis
ui.constants
guiinit
guiinit_env
timing
local_environment
install_details
tasks.base
service_registry
simplecom
luacom
Trace	Info
ErrorPrint
DebugPrint
values_mr
loggerFor
logging
requires
bootstrap
dialog
dialog.image
dialog.html
require
tostring
Pending Error:[%s]%s
message	type
Startup5
insert
table6
insert
table6
insert
table7
insert
table}
callInState
lazy_s
Remote state error %s/
js	getn
VerboseErrors	Name
ipairs
CustomParameter
Bundlee
!verboseErrorReport: Error %s
pcallk
	*all	read
b64	mime
r	open
ErrorReport:%d|%s
format
string	body
headers
encode
errorTrack
tracking
require
status
status_text
http_code
source_url
table	typeu
addNetError
downloadErrorFilter:%s
LuaTestRun
LuaTestRunError
BinaryRun
BinaryRunError
Startup
StartupError
ScriptRun
ScriptRunError
FileRun
FileRunError
DownloadError
DownloadError	Type
downloadErrorFilter
getErrors
maybePackageErrorResponse
doSendLoggedErrors
processPendingErrorTrack
$=require('error_store').%s(...)
format
string
ipairs
addJsError
addNetError
addXmlError
addExecError
addExecError
addXmlError
addNetError
addJsError
setPendingErrorTrack
hasErrorTracking
stateName
ErrorPrint
values_mr
error_store
loggerFor
logging
luabridge.nsis
tasks.network
wininet.ltn12
wininet.http	json
wininet.url
timing
requires
bootstrap
require
dismissCompleteScreen#Primary Action %s was selected
resumeInstall
runCancel	hide
Warning	hwnd
MessageBoxA
pauseInstall
getCurrentScreen
cancelDetails
ui_commands
require
+nav/install called in invalid state:%d9nav/install from cancel called from invalid state:%d
resumeInstall
toCompleteScreen
SCREEN_COMPLETE
resumeOffer
Last Offer Index -> %d
getLastOfferIndex
toInstallScreen
startInstallStep
getCurrentScreen
getLastScreen
*nav/cancel called in invalid state:%d
dismissCompleteScreen	quit
SCREEN_COMPLETE
runCancel	hide
toCancelScreen
pauseInstall
getCurrentScreen
isSimpleCancelM
runCleanup
cleanup
require	hide/
executeLater
dismissCompleteScreen
runAsyncPrimary
getInstallsAtEnd
install
getJsCurrentBundle
processSkipAll
:#*"1#+
:#,"1#-
:#."1#/
:#<"1#=
@":!A"0
presentCancel
Commands
skipall
install-quit	quit
install-later
install-saveas
saveas
install-close
install-show	show
install-open	open
install-now
realClose
cancel
install
buildRedirector
ui_commands.utils
wrappedScript
getBrowser
bundles{int __stdcall MessageBoxA(
   void * hWnd,
   const char * lpText,
   const char * lpCaption,
   unsigned int uType
);	cdef
user32	load
SCREEN_INSTALL
SCREEN_CANCEL
SCREEN_OFFERS
MessageBoxConstants
SwConstants
MsgConstants
IdConstants
setPrimaryAction	Info
ErrorPrint
DebugPrint
ui_commands.nav
loggerFor
ui.constants
win32_constants
luabridge.nsis
primary_action
ui_commands.bundle
install_details	json
logging
guiinit
requires
bootstrap
require
*BLANK*
Zip File Header => '%s'
format
string	read
rb	open
getlocal
!Error|Found an offline file!"File Copy Complete (%d,rc=%s)
tostring File Copy Failed!(%d,rc=%s)
format
string
CopyFiles
fileDestName
fileDest
localFile
Copying %s -> %s\%s
Online
Extract
format
string
plugincall
getPluginsDir
tostring
Result -> %s
Extract Files
$OUTDIR=%s
format
string
Extracting 7z	call
Extracting Zip
fileDest
localFile
Extract Files .. %s -> %s6
localFile
processXpi
$Failed to Launch Firefox(rc=%s)
runDir
firefox.exe
ShellExecute
-new-tab "file:///%s"
Launching Xpi: %s
FileExists
tostring&Failed  to Copy(%d,rc=%s:%s -> %s
localFile
CopyFiles
fileDestName
%s\%s'Destination was not a directory:%s
format
string
fileDest
IsDirectory
	wait Waiting for Run to Complete
WaitForExe
runDir
Running %s
"%s" %s
format
string
executeApplication
packaged_app
require
Executing Packaged App:%s
isPackagedApp
ExecuteLuaScript
Executing Lua Script:%s
isLuaFile!Bundle[%d]:Run Action for %s
Options
expandNsisVars
unscrambleFile
finalFile
localFile
>Unscrambling %s -> %s	true
Scramble
commitBundle
start_triggered	open
ShellExecute
extract	copy
Destination
expandNsisVars
ShowFolder
AlreadyRun
showfolders
actualProcessFreeFile
shouldProcessFile	test
FileAction
FileTrigger	File
ipairs	true
shouldDoFileTriggers
getBundle
CurrentBundle
installation
getNumBundles
tostring
>ProcessFreeFiles(%s,%s)
#Skipping Action status is '%s'
processXpiDirectAction
xpidirect
extract	copy
finalFile
fileDestName
fileDest
runDir
localFile
sourceFile
Creating:%s	true
ForceCreate
extract xpi copy xpidirect.Exiting File processing due to SkipAction
SkipAction
FileExists	fail%Offline File  ... Check for File
HandleCancel
_UiState%Alternate Download Status  is %s!Trying Alternate Download %s
AlternateSourceFile
cancel
FileSize
allowByteRange
InstallStepIdx
standardProgress
downloadFile
download_status
File is already downloaded
success
FileTrigger
start offer
Downloading File -> %s
CreateDirectory
FileAction
extract xpi copy	find
format
string'Direct Download ... due to (inTmp)
>Downloading %s -> %s
Online
RunDir
FinalFile
DestName
Destination
expandNsisVars
normalizePath
FileName
SourceFile
AlreadyRunP
success	call~
Extract Files
$OUTDIR=%s
format
string	call
isScrambledZip
Extract
actualProcessFreeFile
processFreeFiles
setDllDir
set7zPlugin
setUnzipPlugin
nsis7z.dll
nsisunz.dll
ErrorPrint
DebugPrintF
DebugPrint
Downloads
sandbox	json
require
wininet.%s
format
string
require
socket.%s
format
string
preload
package
ipairs
loadfile
tostring
:	find
string
RUN_DIR
__STARTUPINFO
string
insert
^rx:(.*)$
([^, ]+)
gmatch
ipairs
string	type
log_spec%
DebugPrintF
ErrorPrintF
DebugTrace
DebugPrint
ErrorPrint	Info
Trace	Warn	Good	GOOD
ERROR	WARN	warn
debug	INFO	info
setFilters
makeLogger
	warn	info
trace	info	warn
closed
cancel
Distribute Call Error:%s
callInState
Distribute Error:%s
ipairs
tostring
=require('tasks.network').
add_to_cache
tostring
Caching 
add_source_copy
Marking Copy %s -> %s)
length
current
callback
downloaded
unpack
filter$Unable to lookup Transform '%s'
insert
ipairs
table	typev
cancel
errorA
cancel
errora
w+b	open
io	file
cancel
errorF
concat
string
insert
table	copy
const char *	cast
int8_t[?]
w+b	open
io Opening Destination file %s
' already exists!
tostring
Target file '
FileExists
lazy_s
Open Headers are -> %s
cancel
errorM
%([A-Za-z0-9]+) (%d+)-(%d+)/(%d+)	find
string
redir_to
lazy_s
Names Choices: %s
filename
parse_mime_header
content-disposition	path
parse_path
location
redirected_to
tostring
string
backup_name
sub	path
"Suggested file name not found
IsDirectory
string
function	typeh
tonumber
length
continue_handler
command	size
can_pause
downloaded
content-range
content-length
tonumber
Invalid Response(rc=
close	sink
beforebody
headers
request
tostring
bytes=
min	math
length
content-length
tonumber
close	sink
beforebody
request
unsupported protocol
https	http
scheme
basename
status_text
filesize
length
source_url
status
message
status
remove
os.downloadFile:Removing [%s] due to failure
Failed Download:
Skipped Cache for '
Missed Cache for '!Failed file copy  (%s,rc=%s)
CopyFiles
Copy %s -> %s
filename %s is already copied to %s!
headers	copy
explicit_name
tostring
Using cached copy of '
use_cached
on_progress
callback
can_pause
length
downloaded
:table:
transforms
allow_range
pcall	path
parse_path
unpack
>	opts
tostring
DownloadTask<
insert
table	opts
is_remov	byte
string	type
filename
tostring
Downloaded -> 
status
lazy_s
Starting Download -> %s
runFunction
Download Progress ->%s
backup_name
transforms
explicit_name
use_cached
on_progress
allow_range
target
source_url	opts-
__initB
rawgetA
__init
setmetatableB
downloadCopys
downloadCache
__initB
rawgetA
__init
setmetatable
downloadCopys
downloadCache
records
pairs1Syncing downloadCache and downloadCopy items0
records
__initB
rawgetA
__init
setmetatable2
remotelyZ
loadTsk
andThen
remotely
70/1311
:9<819=
:9>819?
:9@8:8A849B
7;C7>9
:;F::8C::7G:3;I
:<A;1<J
:<K;>9
:9L87:M7
::@9:9A94:B
7<C8>:
:<F;:9C;:8G;3<S
:=A<1=T
:=K<>:
::L97;M8
:;@:::A:4;B
7=C9>;
:=F<::C<:9G<3=Z
:>A=1>[
:>K=>;
:;L:7<M9
:5a=:1b=:<c=:'d=:(e=:6f=:9g=:
h=::i=:;j=0
ReadCachesTaskId
UpdateCachesTaskId
Filters
DownloadTaskId
DownloadTask
add_source_copy
add_to_cache
syncCacheToState
proxyForUrl
downloadFile
!tasks.network/ReadCachesTask#tasks.network/UpdateCachesTask
tasks.network/DownloadTask
__name
UpdateCachesTask
__name
ReadCachesTask
__inherited
__class
__call
__parent
__init
__name
DownloadTask
__base
setmetatable
__index
update
__tostring
unscramble
min	math
ErrorPrintF
DebugPrintF	Info
-	byte
string
stateName
normalizePath	sink
Prepare
Install
Process
bootstrap.fs
net_utils
luabridge.fs
luabridge.nsis
wininet.ltn12
wininet.ftp
wininet.url
wininet.http
tasks.network
loggerFor
logging
requires
bootstrap.utils
bootstrap
RemoteTask	Task
state_names
tasks.base
require
TimeGetTime
win32%
TimeGetTime
tostring
format
string	type
val_to_str
^[_%a][_%a%d]*$
string	type
concat
key_to_str
val_to_str
insert
ipairs
ipairs
insert
	find	(.-)
getmetatable
setmetatable
pairs3
insert
gmatch ^[0123456789abcdefABCDEF]+$
string	type
assert
select
selectI
remove
insert
asHEX	byte
%02x%02x%02x%02x
format	modf	math
string	type
assert
tonumber	char
string(
..	gsub"
	sha1	char
.	gsub
sha1_binary0text passed to hmac_sha1 should be a string/key passed to hmac_sha1 should be a string
string	type
assert+
hmac_sha1^
hmac_sha1_binary
hmac_sha1
sha1_binary	sha1
preload
package
hmac_sha1_binary
hmac_sha1
string
sha1_binary
CA62C1D6
8F1BBCDC
6ED9EBA1
5A827999
C3D2E1F0
10325476
98BADCFE
EFCDAB89
67452301
5	0000
0	0010
2	1000
8	0001
1	0111
7	1011
b	1100
c	1110
e	0011
3	1101
d	1001
9	1111
f	0100
4	0110
6	1010
'(sha1hash from 
	no file '
Unable to load 
assert
loadlib
package
%.	gsub
string
luaopen_
rb	open
io	.dll
NativeFsLoad	.lua
FileExists
PLUGINSDIR
sha1hash
w	open
function	typev
format
string
TRACE|
DebugPrintF
TRACE_ENABLED
DATE_FORMAT	date
%s(%d)|%s
format
string
write	time
DebugPrint
format
string
select
tostring'%s(%d)|ERROR|Bad Format of %s[%s]
unpack
DATE_FORMAT	date
%s(%d)|ERROR|
format
string
%s	time
logging
preload
package
getLogger
ErrorPrint
DebugTrace
DebugPrintF
DebugPrintl
format
string
ErrorPrint
%s:ComError:%s
format
string
ErrorPrint
last_error
config
luacom3
/	gsub
string
string
ipairs
table	type
wininet.compat
require
setupNetworking
endswith
string
normalizePath
ComGuard
Guarded
ErrorPrint
DebugPrintF
DebugPrint
DebugTrace
isDebug
setupDebugFile
DATE_FORMAT
no_sha1_loader
insert
remove
searchers
loaders
NativeFsLoad
sha1hash
contains
tostring
key_to_str
val_to_str
timing
preload
package
setinitialtime
initialtime
abstime
reltime
TimeGetTime
require
ipairs
unpack(
[^%w]	gsubF
genShortCode
requires
tostring
ipairs
ipairs
unpack
 keys|
 items,
table<
tostring
number	type
summarize
pluck	join
values_mr
values
Not  enough data
error	read
sizeof
Writing 
sizeof
string
void*	cast
set	seek
e_lfanew
r+b	open
sizeof	copy
TimeDateStamp
struct IMAGE_FILE_HEADER
offsetof
int8_t*	cast
int8_t[4]
base_addr
timestamp_bytes
win32_magic
string
dos_header
NO Optional Header!
error$struct IMAGE_OPTIONAL_HEADER64*
HDR64"struct IMAGE_OPTIONAL_HEADER*
Magic => %s
WORD[1]
struct IMAGE_FILE_HEADER
struct IMAGE_FILE_HEADER*
sizeof	copy
char[?]
Dos headers=>%s(next=%d)	Info
e_lfanew
struct IMAGE_DOS_HEADER*
int8_t*	cast
tostring
Invalid baseAddr '
GetModuleHandleA	self
timestamp_bytes
win32_magic
&NO OPTIONAL HEADER!(magic = '%d')#struct IMAGE_OPTIONAL_HEADER64
HDR64!struct IMAGE_OPTIONAL_HEADER
WORD[1]
struct IMAGE_FILE_HEADER
char[4]
e_lfanew
set	seek
struct IMAGE_DOS_HEADER
Unable to open '%s'(%s)
format
string
rb	open
readPeHeaders
readPeHeadersMapped
updatePeHeaders
VFT2_UNKNOWN
VFT2_FONT_RASTER
VFT2_FONT_VECTOR
VFT2_FONT_TRUETYPE
VFT2_DRV_DISPLAY
VFT2_DRV_MOUSE
VFT2_DRV_NETWORK
VFT2_DRV_SYSTEM
VFT2_DRV_INSTALLABLE
VFT2_DRV_SOUND
VFT2_DRV_COMM
VFT2_DRV_VERSIONED_PRINTER
VFT_UNKNOWN
VFT_APP
VFT_DLL
VFT_DRV
VFT_FONT
VFT_VXD
VFT_STATIC_LIB
VOS_UNKNOWN
VOS__WINDOWS16
VOS__PM16
VOS__PM32
VOS__WINDOWS32
VOS_DOS_WINDOWS32
VOS_DOS_WINDOWS16
VOS_DOS
VOS_OS232_PM32
VOS_OS232
VOS_NT_WINDOWS32
VOS_NT
VOS_OS216_PM16
VOS_OS216
VS_FF_DEBUG
VS_FF_PREPRELEASE
VS_FF_PATCHED
VS_FF_PRIVATEBUILD
VS_FF_INFOINFERRED
VS_FF_SPECIALBUILD
IMAGE_SCN_ALIGN_32BYTES
IMAGE_SCN_ALIGN_4096BYTES
IMAGE_SCN_MEM_SHARED
IMAGE_SCN_ALIGN_64BYTES
IMAGE_SCN_CNT_CODE
IMAGE_SCN_LNK_REMOVE
IMAGE_SCN_ALIGN_128BYTES
IMAGE_SCN_LNK_COMDAT
%IMAGE_SCN_CNT_UNINITIALIZED_DATA
IMAGE_SCN_ALIGN_512BYTES
IMAGE_SCN_MEM_LOCKED
IMAGE_SCN_TYPE_NO_PAD
IMAGE_SCN_ALIGN_2048BYTES
IMAGE_SCN_LNK_OTHER
IMAGE_SCN_MEM_EXECUTE
IMAGE_SCN_ALIGN_8192BYTES
#IMAGE_SCN_CNT_INITIALIZED_DATA
IMAGE_SCN_MEM_DISCARDABLE
IMAGE_SCN_LNK_NRELOC_OVFL
IMAGE_SCN_MEM_WRITE
IMAGE_SCN_MEM_PRELOAD
IMAGE_SCN_MEM_READ
IMAGE_SCN_LNK_INFO
IMAGE_SCN_ALIGN_1BYTES
IMAGE_SCN_GPREL
IMAGE_SCN_ALIGN_256BYTES
IMAGE_SCN_MEM_NOT_CACHED
IMAGE_SCN_ALIGN_1024BYTES
IMAGE_SCN_ALIGN_2BYTES
IMAGE_SCN_ALIGN_4BYTES
IMAGE_SCN_MEM_NOT_PAGED
IMAGE_SCN_ALIGN_8BYTES
IMAGE_SCN_ALIGN_16BYTES
IMAGE_SCN_MEM_16BIT
.IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY
+IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE
(IMAGE_DLL_CHARACTERISTICS_NX_COMPAT
$IMAGE_DLLCHARACTERISTICS_NO_SEH
%IMAGE_DLLCHARACTERISTICS_NO_BIND
(IMAGE_DLLCHARACTERISTICS_WDM_DRIVER
*IMAGE_DLLCHARACTERISTICS_NO_ISOLATION
3IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE
IMAGE_SUBSYSTEM_UNKNOWN
IMAGE_SUBSYSTEM_NATIVE IMAGE_SUBSYSTEM_WINDOWS_GUI IMAGE_SUBSYSTEM_WINDOWS_CUI
IMAGE_SUBSYSTEM_POSIX_CUI
#IMAGE_SUBSYSTEM_WINDOWS_CE_GUI$IMAGE_SUBSYSTEM_EFI_APPLICATION,IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER'IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER
IMAGE_SUBSYSTEM_EFI_ROM
IMAGE_SUBSYSTEM_XBOX
IMAGE_FILE_RELOCS_STRIPPED IMAGE_FILE_EXECUTABLE_IMAGE
"IMAGE_FILE_LINE_NUMS_STRIPPED
#IMAGE_FILE_LOCAL_SYMS_STRIPPED
"IMAGE_FILE_AGGRESSIVE_WS_TRIM
IMAGE_FILE_DEBUG_STRIPPED
IMAGE_FILE_32BIT_MACHINE
IMAGE_FILE_SYSTEM
#IMAGE_FILE_LARGE_ADDRESS_AWARE
!IMAGE_FILE_BYTES_REVERSED_LO
IMAGE_FILE_UP_SYSTEM_ONLY
!IMAGE_FILE_NET_RUN_FROM_SWAP
!IMAGE_FILE_BYTES_REVERSED_HI
'IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP
IMAGE_FILE_DLL
IMAGE_FILE_MACHINE_UNKNOWN
IMAGE_FILE_MACHINE_MIPSFPU
IMAGE_FILE_MACHINE_POWERPC
!IMAGE_FILE_MACHINE_MIPSFPU16
IMAGE_FILE_MACHINE_AMD64
IMAGE_FILE_MACHINE_EBC
IMAGE_FILE_MACHINE_SH4
IMAGE_FILE_MACHINE_M32R
IMAGE_FILE_MACHINE_SH5
IMAGE_FILE_MACHINE_THUMB
IMAGE_FILE_MACHINE_AM33
!IMAGE_FILE_MACHINE_POWERPCFP
!IMAGE_FILE_MACHINE_WCEMIPSV2
IMAGE_FILE_MACHINE_I386
IMAGE_FILE_MACHINE_MIPS16
IMAGE_FILE_MACHINE_ARM64
IMAGE_FILE_MACHINE_ARMNT
IMAGE_FILE_MACHINE_R4000
IMAGE_FILE_MACHINE_ARM
IMAGE_FILE_MACHINE_SH3
IMAGE_FILE_MACHINE_SH3DSP
IMAGE_FILE_MACHINE_IA64
struct IMAGE_DOS_HEADER {
     WORD   e_magic;                     // Magic number
    WORD   e_cblp;                      // Bytes on last page of file
    WORD   e_cp;                        // Pages in file
    WORD   e_crlc;                      // Relocations
    WORD   e_cparhdr;                   // Size of header in paragraphs
    WORD   e_minalloc;                  // Minimum extra paragraphs needed
    WORD   e_maxalloc;                  // Maximum extra paragraphs needed
    WORD   e_ss;                        // Initial (relative) SS value
    WORD   e_sp;                        // Initial SP value
    WORD   e_csum;                      // Checksum
    WORD   e_ip;                        // Initial IP value
    WORD   e_cs;                        // Initial (relative) CS value
    WORD   e_lfarlc;                    // File address of relocation table
    WORD   e_ovno;                      // Overlay number
    WORD   e_res[4];                    // Reserved words
    WORD   e_oemid;                     // OEM identifier (for e_oeminfo)
    WORD   e_oeminfo;                   // OEM information; e_oemid specific
    WORD   e_res2[10];                  // Reserved words
    LONG   e_lfanew;                    // File address of new exe header
struct IMAGE_FILE_HEADER {
    WORD    Machine;
    WORD    NumberOfSections;
    DWORD   TimeDateStamp;
    DWORD   PointerToSymbolTable;
    DWORD   NumberOfSymbols;
    WORD    SizeOfOptionalHeader;
    WORD    Characteristics;
struct IMAGE_OPTIONAL_HEADER {
    // Standard fields.
    //
    WORD    Magic;
    BYTE    MajorLinkerVersion;
    BYTE    MinorLinkerVersion;
    DWORD   SizeOfCode;
    DWORD   SizeOfInitializedData;
    DWORD   SizeOfUninitializedData;
    DWORD   AddressOfEntryPoint;
    DWORD   BaseOfCode;
    DWORD   BaseOfData;
    //
    // NT additional fields.
    //
    DWORD   ImageBase;
    DWORD   SectionAlignment;
    DWORD   FileAlignment;
    WORD    MajorOperatingSystemVersion;
    WORD    MinorOperatingSystemVersion;
    WORD    MajorImageVersion;
    WORD    MinorImageVersion;
    WORD    MajorSubsystemVersion;
    WORD    MinorSubsystemVersion;
    DWORD   Win32VersionValue;
    DWORD   SizeOfImage;
    DWORD   SizeOfHeaders;
    DWORD   CheckSum;
    WORD    Subsystem;
    WORD    DllCharacteristics;
    DWORD   SizeOfStackReserve;
    DWORD   SizeOfStackCommit;
    DWORD   SizeOfHeapReserve;
    DWORD   SizeOfHeapCommit;
    DWORD   LoaderFlags;
    DWORD   NumberOfRvaAndSizes;
struct IMAGE_OPTIONAL_HEADER64 {
    WORD        Magic;
    BYTE        MajorLinkerVersion;
    BYTE        MinorLinkerVersion;
    DWORD       SizeOfCode;
    DWORD       SizeOfInitializedData;
    DWORD       SizeOfUninitializedData;
    DWORD       AddressOfEntryPoint;
    DWORD       BaseOfCode;
    ULONGLONG   ImageBase;
    DWORD       SectionAlignment;
    DWORD       FileAlignment;
    WORD        MajorOperatingSystemVersion;
    WORD        MinorOperatingSystemVersion;
    WORD        MajorImageVersion;
    WORD        MinorImageVersion;
    WORD        MajorSubsystemVersion;
    WORD        MinorSubsystemVersion;
    DWORD       Win32VersionValue;
    DWORD       SizeOfImage;
    DWORD       SizeOfHeaders;
    DWORD       CheckSum;
    WORD        Subsystem;
    WORD        DllCharacteristics;
    ULONGLONG   SizeOfStackReserve;
    ULONGLONG   SizeOfStackCommit;
    ULONGLONG   SizeOfHeapReserve;
    ULONGLONG   SizeOfHeapCommit;
    DWORD       LoaderFlags;
    DWORD       NumberOfRvaAndSizes;
//Get module handler
void * __stdcall GetModuleHandleA(const char *);
pe_info
loggerFor
logging
kernel32	load
wininet.wintypes
require
"INTERNET_FLAG_KEEP_CONNECTION
no_auth
INTERNET_FLAG_SECURE
is_https INTERNET_FLAG_RESYNCHRONIZE!INTERNET_FLAG_NO_CACHE_WRITE
INTERNET_FLAG_RELOAD$INTERNET_FLAG_CACHE_IF_NET_FAIL
wininit
INTERNET_FLAG_NO_COOKIES
cookies#INTERNET_FLAG_NO_AUTO_REDIRECT
%s%s: %s
format
string
tostring
concat
tableQ
SSL_CERTIFICATEF
rawget;
ssl_cert
get_all
setmetatable
__index
insert
(.-)%s*:%s*([^
string
HttpSendRequestEx() failed
winerror
HttpSendRequestExA|
dwBufferTotal
sizeof
dwStructSize
INTERNET_BUFFERSA
tonumber
content-length
headers
maybeError
HTTP_QUERY_FLAG_NUMBER
HttpQueryInfoA
sizeof
DWORD[1]
string
maybeError
sizeof
char[?]
ERROR_INSUFFICIENT_BUFFER
GetLastError
HttpQueryInfoA
DWORD[1]
 HTTP_QUERY_WWW_AUTHENTICATE
HTTP_STATUS_DENIED
HTTP_STATUS_PROXY_AUTH_REQ
Failed to get status code!
HTTP_QUERY_STATUS_CODE
nredirects	HEAD
method
redirect
%s	gsub
string
location
getMaxRedirects
max_redirects
nredirects
redirected_to
ipairs
absolute
location
CloseHandle
GetLastError
HttpEndRequest() failed
HttpEndRequestA
all	pump
inetFileSink
chain	sink
HttpSendRequest() error
winerror
HttpSendRequestA
source
inetFileSource
all	pump	sink
beforebody
nredirects
redirected_to
source HTTP_QUERY_RAW_HEADERS_CRLF
HTTP_QUERY_STATUS_TEXT
HTTP_QUERY_STATUS_CODE
errorDialog	code
is_error
no_auth
tostring
Error Adding Headers:%s
format
string
winerror
HTTP_ADDREQ_FLAG_ADD
HttpAddRequestHeadersA
headers
InternetCloseHandle
maybeError
TIMEOUT
timeout
setTimeout
INTERNET_OPTION_PASSWORD
password
INTERNET_OPTION_USERNAME
inetSetOption	user
object_name
HttpOpenRequestA
method
no_cache_conn
connect
canonicalizeS
concat	sink
method
source
format
string
content-length&application/x-www-form-urlencoded
content-type
headers	POST
table	type
LocalFree
string\
insert
gmatch
subject
lpszSubjectInfo
encryption_algo
lpszEncryptionAlgName
signature_algo
lpszSignatureAlgName
protocol
lpszProtocolName
issuer
lpszIssuerInfo
keysize
dwKeySize
tonumber
Error Getting Certifiate!
SSL_CERTIFICATE
tostring
Certs=>
print0INTERNET_OPTION_SECURITY_CERTIFICATE_STRUCT
inetGetStructOption
INTERNET_CERTIFICATE_INFO
rawget
getUserAgent
USERAGENT[
rawset
setUserAgent
USERAGENT
__newindex
__index
setmetatable
readSslCert
request
create
source	sink
headers
method
beforebody
create
no_cache_conn
timeout
no_auth
TIMEOUT	trim
wininet.dll
wininet.ltn12
wininet.url
kernel32
wininet	NULL
wininet.core
wininet.defs
require
setState
unpack	self
string(
buildRedirector
Lua 5.2
_VERSION<
tostring	app-
bootloader_configs
ipairs
bootloader_configs
insert
!Cannot find inthread file %s
in_thread
Cannot find main file %s	main5Expected string service entry value for key '%s'!Can't find service file '%s'
Invalid service name '%s'	type
ipairs
servicesGUnsupported Packaged App Interface (version 2 or greater required)
interface_version(Unable to parse manifest
	%s:%s
*a	read
decode!Unable to open manifest file
rb	open
io)Unable to find packaged app manifest
FileExists
%s/manifest.json
format
string
setfenv
loadfile
svcEnv
No service registered!
registerService
errorG
execFileInState
=_PAPP_VERSION=...
callInState
bootloader
commit@require('bootstrap.output').setupDebugFile([[%s\logs.log]])7require('bootstrap.output').setupDebugFile([[%s]])
function	type
packagedAppLogFileName
USERAGENT2require([[wininet.http]]).USERAGENT = [[%s]]  require([[wininet.compat]])	code
new*Launching Main Component in Thread:%s	main'Unable to load in_thread '%s':'%s'
!Launching Inthread Component
in_thread#Unable to load service '%s':%s
Loading service %s -> %s
Loading Services
services
svcEnv
__index
setmetatable
fs	nsis
fileNode
logger
DebugPrint
DebugPrintF
ErrorPrint
ErrorPrintF
DebugTrace
ipairs
loggerFor
markSkipped
_PAPP_VERSION
bundleIndex
singleton
+packaged-%s
stateName
appFolder
Running from source dir:%s
FileExists
source_dir
manifest
FileName
tostring
Extracting %s -> %s
CreateDirectory
Destination
normalizePath
format
string
SourceFile
_a_	sha1
setResult
&=require('scheduler').atSync(...)
coderef
SourceFile
_a_	sha1
singleton	main
stateName
callInState
Application not prepared!
manifest
appFolder
Launching Application
 PackagedAppRunError<%s>:%s"
launchApplication -> %s,%s
launchApplication
withResult Singleton %s already loaded
<location_sha1>
manifest
tostring
SourceFile
_a_!PackagedAppInitError<%s>:%s"
format
string
withError prepareApplication -> %s,%s
prepareApplication#
appFolderF
insert
pairsH
closeState
shutdown
applicationStates
getPackagedAppDir
registerLuaCallback
executeApplication
launchApplication
prepareApplication
addBootConfig
bootloader_configs
setDebugMode
setAppDir
ErrorPrint
DebugPrint
packaged_app
loggerFor
isDebug
expandNsisVars
values_mr
luabridge.classes
tasks.base
luabridge.fs
luabridge.nsis
callback_proxy	sha1
bootloader
socket.http
logging
env	json
service_registry
process_free_file
requires
bootstrap
require
PK	read
rb	open
getlocal
!Error|Found an offline file!#File already in destination:%s"File Copy Complete (%d,rc=%s)
tostring File Copy Failed!(%d,rc=%s)
CopyFiles
Copying %s -> %s
localFile
fileDestName
fileDest
format
string
Online
Extract
format
string
getPluginsDird
generator
inst_b
generator
function	type/
Unzip1
Extract
tostring
Result -> %s
Extract Files
$OUTDIR=%s
format
string
Extracting 7z	call
Extracting Zip
fileDest
localFile
Extract Files .. %s -> %s6
localFile
processXpi
$Failed to Launch Firefox(rc=%s)
runDir
firefox.exe
ShellExecute
-new-tab "file:///%s"
Launching Xpi: %s
FileExists
tostring&Failed  to Copy(%d,rc=%s:%s -> %s
localFile
CopyFiles
fileDestName
%s\%s'Destination was not a directory:%s
format
string
fileDest
IsDirectory
%s[%d] Lua script complete
ExecuteLuaScript-%s[%d] Running Lua script in main thread	File
getBundle
message
tostring
PackageAppError
SourceFile
addExecError
Package App Error:%so
%s invoking %s!%s[%d] Packaged App complete
onComplete
onError
executeApplication %s[%d] Running Packaged App	File
getBundle
packaged_app
require
fileIndex4=require("process_free_file").runLuaScript(...)
callInState
coderef'Requesting Executing Lua Script:%s
fileIndex6=require("process_free_file").runPackagedApp(...)
callInState.Requesting Executing Packaged App:%s (%s)
coderef
error_code
message
Job creation failed(rc=%d)	type
FileRun	Type
SourceFile
addExecError
Running file failed!	wait Waiting for Run to Complete	true
WaitForExe
runDir
Running %s
runOpts
msiexec /i "%s" %s
"%s" %s
format
string
isPackagedApp
withResumer
isLuaFile
%s Run Action for %s
finalFile
Options
expandNsisVars
commitBundle
start_triggered	open
ShellExecute
extract	copy
Destination
expandNsisVars	true
ShowFolder
AlreadyRun
showfolders
actualProcessFreeFile
shouldProcessFile	test
FileAction
FileTrigger	File
ipairs
shouldDoFileTriggers
getBundle
CurrentBundle
finish
installation
getNumBundles
tostring
>ProcessFreeFiles(%s,%s)
cancel#Skipping Action status is '%s'
processXpiDirectAction
xpidirect
extract	copy
finalFile
fileDestName
fileDest
runDir
localFile
sourceFile
FinalFile
Creating:%s	true
ForceCreate
extract xpi copy xpidirect.Exiting File processing due to SkipAction
SkipAction
FileExists	fail%Offline File  ... Check for File4Can't process files before they are downloaded!
error*Free file processing tasks not ready!
download_status
File is already downloaded
success
FileTrigger
start offer
CreateDirectory
FileAction
extract xpi copy	find
format
string'Direct Download ... due to (inTmp)
>Checking  %s -> %s
Online
RunDir
DestName
Destination
expandNsisVars
normalizePath
FileName
SourceFile
File:%s
AlreadyRunT
success	call~
Extract Files
$OUTDIR=%s
format
string	call
isScrambledZip
Extract
actualProcessFreeFile
processFreeFiles
runPackagedApp
runLuaScript
setDllDir
set7zPlugin
setUnzipPlugin
nsis7z.dll
nsisunz.dll
lazy_s
stateName
ErrorPrint
DebugPrintF
DebugPrint
error_store
scheduler
process_free_file
loggerFor
plugincall
values_mr
luabridge.classes
sandbox
logging
bootstrap.table_utils	json
luabridge.nsis
luabridge.win32
luabridge.fs
requires
bootstrap
require
__index
setmetatable
propertySource
filters
tostring
OfferFilter:T
getBundles
GuiInit
require
parameter
bad_offer_filter
addExecError
GuiInit
require
tostring %s is non numeric or is < 1
format
string
arg '%s' in %s
format
insert
tonumber
([^,]+),?
gmatch"^([A-Za-z0-9_]+)%[([^%]]+)%]$
string
withArgs&Filter '%s'  matches %d out of %d
DebugPrintF
addFilter
tonumber
numeric	deps
ipairs
options
FILTERS
propertySource
$Expected filter object got  NIL
filters
insert
table\
parameters
propertySource
addExecError
GuiInit
require
ErrorPrint
tostring Error running filter[%s]:%s
format
string
filters
ipairs
handler
concat
<OfferFilter:%s[%s]>
format
string
tostring
insert
parameters
ipairs_
setmetatable
parameters
pairs1
FILTERS
setmetatable
parameters	prio
handler
options	deps
accepts
slot_slice
max_ad_accepts
tonumber
declines
slot_slice
max_ad_declines
tonumber
is_hidden
Max Offers:%d vs %d
DebugPrintF
filter
slot_slice
max_offers
tonumber
accepts
declines
slot_slice
post_decline_accept_offers
tonumber
declines
slot_slice
post_decline_max_offers
tonumber
accepts
slot_slice
post_accept_max_offers
tonumber
declines
accepts
slot_slice
post_accept_max_declines
tonumber
post_accept_max_declines
numeric
 PostAcceptMaxDeclinesFilter
post_accept_max_offers
numeric
PostAcceptMaxOffersFilter
post_decline_max_offers
numeric
PostDeclineMaxOffersFilter
post_decline_accept_offers
numeric
PostDeclineAcceptFilter
max_offers
numeric
MaxOffersFilter
max_ad_declines
numeric
DeclineAllAddFilter
max_ad_accepts
numeric
AcceptAllAddFilter
registerFilter
__index
withArgs
__tostring
__call
addFilter
discoverFilters
create
INSTALL
FILTERS
VERSION
offer_filters
loggerFor
logging
require
VARIABLES
FreeEnvironmentStringsA
=	byte
string
GetEnvironmentStringsA
        const char * __stdcall GetEnvironmentStringsA();
        int __stdcall FreeEnvironmentStringsA(const char * block);
    	cdef
kernel32	load
require
SCREEN_CANCEL
SCREEN_FINISH
SCREEN_COMPLETE
SCREEN_INSTALL
SCREEN_OFFERS
+tracking
commitOnlyB
PLUGINSDIR
%s\skin
format
string
!Skin path is not a directory
IsDirectory
Skin path doesn't exist
FileExists
Skin Path => %s
string	path	file
scheme
ipairs
Bundle
addBundle
ProductName
processApp$Loader Environment is complete!
commit
table$Loading Deferred Environment:%s
_extSkinComplete
Loading Skin Data
one_browser
_body_
tonumber
DialogHeight
DialogWidth
height
width+Failed to parse Skin Options.json !:%s	*all	read*Unable to open Skin options.json file
Opening Options File:%s
%s\options.json
Extracting Skin1Error extracting Skin![url=%s]:%s%s
Message:
unscrambleFile
_Downloads
%s\skin.unscr.zip
Unscrambling Skin!
isScrambledZip!Copy Failed: %s -> %s(rc=%s)	/*.*
CopyDir$Copying Local Skin Directory:%s
prefix
extractEmbeddedResources
%s/res
Creating SkinDir:%s
skinDir
Download Skin File:%s
tostring&Skin Download Failed:%s[url=%s]%s
maybePackageErrorResponse
wb	open
io	file	sink
request
Downloading Skin File : %s
Odd skin url[%s]!:%s
PLUGINSDIR
%s\skin.zip
format
string
SkinUrl
SkinId
id Invalid Skin Entry : No URL
processEnvironment
Environment	appN
isPackagedApp	.lua
endswith
string
isLuaFile
bundleIndex
InstallProgress
require
current
progressTable
ipairsH
%s Scheduling UpdateQ
executeLater
current
Progress Code Ref  => %s
insert
progressTable
on_progress
update
current
unpack
isContinuation!Bundle[%d] is a continuation
continuation=true	find
string
tostring
Query is %s
_body_
parseh
_body_
filename
Download Complete->%s 
_body_
FileName	Name
ipairs
CustomParametere
basename
DestName
filename
FileName
onSuccess
orElse
AlternateSourceFile
Destination
SourceFile
CreateDirectory
FileAction
extract xpi copy	find
string(Direct Download ...  due to (inTmp)
inTmp!
success
download_status
filesize
FileSize
FileName
filename
%s Download Complete -> %s.
download_statusI
headers
filename
basename
DestName
LocalFile
basename
_body_
ProductBinary
filename
Download Complete -> %sH
_body_
ProductBinary
bm.plain-thanks
bm.dynamic-combo
bm.start-before-test
bm.defer-if
%s*,%s*
Category
appendFeatureAcceptClause
AcceptIf
isConditionalFeature
isDirective
*FEATUREACCEPT*	Name
isFeatureAccept
isDownloadDotCom
last_init_download
comboParent
hidden
_installed_
_willDisplay_
_wouldInstall_
_willInstall_
+transforms
unscramble
$INSTALLDIR/
isManuallyInstallPrimary
basename
filename
withResult
file://
DestName
LocalFile
Embedded
http://
_domain_
&Using Alternate Filename:%s -> %s
CustomParameter
conditionalExpr
tostring.ConditionalPrepareError|Bundle/File/If:%s
addXmlError
+transforms
unscramble Adding unscramble transform
target
update
Download Target -> %s
RunDir
WORKINGDIR
ForceCreate
getDownloadsDir
xpidirect
add	file
onError
onSuccess
ProductBinary
extract	copy
followedBy
Destination
FunctionTask
Online
SourceFile
FileTrigger
FileAction
(%S+) (%S+) (%S+)	find
Action
isPackagedApp
isLuaFile
Options
fileIndex
PLUGINSDIR
andThen
Resource: %s -> %s 
Failed to Get Query:%s
DOWNLOAD_DOT_COM
ProductEula
ipairs
Continuation	true
Primary
_body_
_body_
PlainEula
insert
preOfferTask
%s - Can Offer
canOfferTask
%s - ComboReady
comboTask
%s - Prepared
format
string
named	Task
preparedTask
installTasks
prepareTasks
finish
installation
binary
CallbackList
slotNumber
SoleCategoryList
CategoryList
allowByteRange	getn
first_init_download
start_triggered
failed
errors
started
downloaded
status
isPlainThanks
isDynamicCombo
isStartBeforeTest
isDeferIf
isContinuation
isPrimary
hasExplicitName
progressTargetIdx
noBinary
noProgress
isScrambled
isConsolidated
consolidated
unreached
trackString
_body_
RegistryKey
_body_
Scramble
Feature	File
bundleIndex
updateBundleMeta
.No <SkinFile> entries found in the bundle
addXmlError
SkinConditionError|%s
format
string
ipairs
SkinFile
test-id
skin-url
cli-options
require3
filename
_body_
preload
package
Setup Resource:%s  from %s+Unable to parse resource:'%d'
Error:%s
loadstring	body
concat
tostring;ConditionalPrepareError|TopLevelCondition[id=%s]/If:%s
format
addXmlError
<If/> missing
TopLevelCondition
target
:table:
update
[/\\]([^/]+)%.lua$
string
hasErrorTracking
ErrorUrl
_body_CThis installer is incompatible with your system configuration.
UnsupportedBundleMessage
_body_eYour version of Internet Explorer is incompatible. Please install Internet Explorer 7 or higher.
UnsupportedIEMessage	Name
genShortCode
InstallerCode
_body_
MinimizeDelay
insert
onSuccess
CarrotIcon
ASYNC_PREPARE
ipairs
_body_
tonumber
_body_
OptInRows
OptInHeight
OptInPixels
_body_
MaxOffers
tonumber
addPostbackField
^post%-back:(.*)$	%%%1#([%^%$%^%(%)%%%.%[%]%*%+%-%?])	gsub
^domain%-mapping:(.*)$
insert
^resource%.	find$Dynamic Combo disabled globally
bm.dynamic-combo
max_offers-CategoryModeError|Unsupported mode: '%s'
format
string
addXmlError
category-mode
custom
addEnvVar!Adding Custom Var  %s => %s 
_body_	name
ipairs
tracking
require
downloadErrorFilter
lazy_s
tostring#Bundle[%s]Download Failed ->%s
insert
onError
remotely
explicit_name
backup_name
target
source_url
use_cached
Install
Prepare
status
filename
/Non Online resource '%s' is not supported!
tostring
PLUGINSDIR
%s/%s/
format
string
status
filename
withResult
unpack
p.apiVersion
parseQs
table	type_
-jsmetrics-
EXEFILE	find
string.
EXEFILE
escape
tostring
%?	find
string
wb	open
keepxml
cli-options
require	eval
concat
Processing Geo Xml
processEnvironment
Environment
concat	eval
Downloading Geo Xml
request-failed(code=%s)
format
Xml Request Failed:%s
table	sink
headers
request
Downloading GeoXml:%s
string
_body_
GeoUrl
_dlGeoStartTime
DL + Process Geo XML
7#Q#3$R
:"S$>#
processAPIEnvironment
message
GeoUrlError
addExecError
Error Processing XML:%s
Processing Web Xml#Expansion Complete with :=> %s
processAPIExpansion$FAILED_PROCESSING_ERROR_MESSAGE,Template Xml without ApiData or 'SDATA'
setPendingErrorTrack
Api Data from SDATA: %s
is_self
getSubstData
Api Data from Xml: %s
ApiData
Processing API template!	true
IsTemplate
isTemplate
api_substitution	Code"FAILED_DOWNLOAD_ERROR_MESSAGE
_body_
Message
ErrorhThere was an error downloading the product information. Please try downloading the installer again.
Xml Processing Error: %s
Downloading Xml:&Xml Request Failed:c=%s|r=%s|h=%s
table	sink
headers
request
asyncTrack
tracking
Loading Xml from %s
\__web.xml
PLUGINSDIR
X-WebInstallUrl
X-Exe-Checksum
X-Exename
EXEFILE
X-WebInstallCode
apiVersion
ApiVersion -> %s
checksum
CheckSum
%$EXENAME
JSDEBUGCHECK
GuardedKThe installer was unable to access the server. Please try again later.
Final Url -->%s
Found a direct url: %s
Loading WebCode
%$WEBCODE	gsub
string
tostring Get Embedded  Code -> %s,%s
getEmbeddedCode
data_injection
require
readPeHeaders
pe_headers
Complete
Loading Local Xml
is_self
_body_
UnsupportedIEMessage9
_body_
UnsupportedBundleMessage
 FAILED_DOWNLOAD_PRODUCT_DEP
_body_
PrimaryFailBundleMessageF
_body_
MinLoadingTime
tonumber.
Generic Install
_body_
DisplayName
7!!!%""
79997::
:EKD3EL
:EMD3EN
7]][7^$
getDisplayName
getCategorySettings
getLoadingScreenDelay
 getPrimaryFailBundleMessage
 getUnsupportedBundleMessage
getUnsupportedIEMessage
getPrimaryCount
getAppTasks
getAppN
getTopLevelConditions
getBundles
FAIL_REASON
loadXmlFile
processEnvironment
processApp
addBundle
max	math
coderef
luabridge.nsis
luabridge.classes
skinDir
addDomainRewrite
processDomainRewrite
domain_rewrites
ignore
accept
ignore
TrackingUrl
ThankYouUrl	Skin	Icon
InstallerCode
	Skin	Icon
CarrotIcon
ProductLogo
ProductEula
ProductBanner
ComScorePageBanner
preserveForm
MinimizeDelayIf
AcceptIf
forceArray
Language
TopLevelConditionLink
Bundle
PartnerTrackingUrl
SharedCondition
RegistryEntry
TopLevelCondition
MaxOffersIf
Consolidate
AcceptIf
ThankYou
CustomParameter
SkinFile
Resource
Feature
ProductUninstaller
complete+url:[There was an error starting the installer. Please try downloading the installer again.
FAILED_ERROR_UNKNOWNgThere was an error processing the product information. Please try downloading the installer again.$FAILED_PROCESSING_ERROR_MESSAGEkThere seems to be a problem. Please close the installer, check your internet connection and try again. FAILED_DOWNLOAD_PRODUCT_DEPhThere was an error downloading the product information. Please try downloading the installer again."FAILED_DOWNLOAD_ERROR_MESSAGE
DownloadTaskId
TaskSequence	Task
RemoteTask
proxyForUrl
string
res2FileName
isOnlineResource
expandNsisVars
evalConditional!prepareConditionalExpression
getNodeConditional
loader
setSkinOptions
skinOptions
loadingMetricAdd
namedTable
processPreserved	Info
DebugTrace
ErrorPrint
DebugPrintF
values_mr
install_details
loggerFor
logging
reltime
abstime
pe_info
bundle_def	json
xml_processing
NSISVars
luabridge.fs
tasks.sequence
state_names
tasks.network
tasks.base
local_environment
wininet.url
net_utils
process_free_file
bootstrap.table_utils
error_store
guiinit_env
conditional_engine
GuiInit
wininet.http
timing
ltn12	mime
bootstrap.internal
bootstrap
requires
bootstrap.utils
require
tostring
'	^"+$
string	type
val_to_str
^[_%a][_%a%d]*$
string	type
concat
key_to_str
val_to_str
insert
ipairs
tostring
userdata
table	type
tostring
___stringU
setmetatable
table	type>
ipairs
insert
	find	(.-)
getmetatable
setmetatable
pairsc
format
string
%s:ComError:%s
format
string
last_error
config
luacom3
/	gsub
string
string
ipairs
table	type
endswith
normalizePath
ComGuard
Guarded
string
contains
lazy_s
__tostring
tostring
key_to_str
val_to_str
DebugPrint
ErrorPrint
bootstrap.internal
require
WriteRegValue
environment_options
encode'
getInstallInOrder*
getSingleProgressBar&
hasVariation
javascript
execScript
contentWindow-frameEval+ :: failed to get frame(id=%s)
getElementsById
documentG
unpack
decodeh
 Failed to write registry:%s
install
Commands
ui_commands.nav
setPrimaryAction
primary_action
require
setInstallTargetDir
Pick a Folder
selectFolderDialog
getInstallTargetDir
doThanks'
doTrackingHit"
doPartnerHit>
javascript
execScript
Commands
evalJs
frameEval
partnertrack
thanks
pickfolder
writeRegistryBlock
frameEval+
hasVariation?
SingleProgressBar?
InstallInOrder?
environment
buildRedirector
ui_commands.utils
bundles
wrappedScript
getBrowser	Info
ErrorPrint
DebugPrint
ui_commands.app
loggerFor
win32.shell
luabridge.registry
local_environment	json
install_details
error_store
tracking
logging
guiinit
requires
bootstrap
require
VMPatterns
ipairs
virtual	find
string
InterfacePatterns
ServiceNamePatterns
^vnet$
^VNET$
^tunnel$
DescriptionPatterns
Tunnel$
Private Tunnel
	^Tun	^Tap	^TUN	^TAP
VMPatterns
vmware
virtualbox	vbox
parallels
Version
VmDSDT
VBOX__
PRLS__
VmMacPatterns
^08:00:27 VmGuestServicePatternFields
DisplayName
Description
VmGuestServices
^VirtualBox.*
VboxVideo
VBoxSF
VBoxService
VBoxMouse
VBoxGuest
^VMware.*
^VMWare.*
^Parallels.*
prl_boot
prl_fs
prl_memdev
prl_mouf
prl_strg
prl_time
prl_tg
prl_uprof
prl_pv64
PrlVssProvider
prl_sound
VmGuestProcesses
description
VMWare Tools Core Service	name
vmtoolsd.exe
BiosFields
BaseBoardManufacturer
BaseBoardProduct
BaseBoardVersion
SystemFamily
SystemManufacturer
SystemProductName
SystemFields
SystemBiosVersion
VideoBiosVersion
BIOSVersionValues
^VBOX	^Xen
DefaultVMPatterns
^VMWare.*
^VMware.*
^Parallels.*
^Xen.*
Version
VMWARE_SERVICES
vmusbmouse
vmrawdisk
vmmouse
vmmemctl
vmhgfs
 Failed to load %q
concat
loadstring
Loading module %q
net-error*Failed to request %q
(r=%s,c=%s,h=%s)
table	sink
proxyForUrl
_Downloads
request
Requesting %q
bad-version
tostring!%q insufficient version (%q)
not-available
%q no url
tonumber
.version	.url
custom
maybeLoadRemoteDefinitions
environment_options	Info
ErrorPrint
values_mr
remote_loader
loggerFor
wininet.url
wininet.http
logging
local_environment
requires
bootstrap
require
printL
__class
table	typeH
__class
table	type
setupvalue
tostring
Failed to find upvalue: 
getupvalue
setfenv
__index
setmetatable
getfenv
function	type>
__index
setmetatable8
rawsetL
__index
setmetatable
__index
setmetatable
pairsi
__init
__base
pairs#
pairsc
mixin_table
mixin_object
mixin	copy
extend
defaultbl
bind_methods
run_with_scope
is_object
__index
upvalue
setmetatable
	dump	type
moonscript.util
require
tostring
unknown key (
default
string	type
filter]
=0D=0A
binary
filter;
filter:
filterQ
filter>
filter<
filter8
filter
normalize	wrap
decode
encode
default
quoted-printable
base64
decodet
encodet
string
mime.core
require
setError
setResult-
	args	funcn
setError
cancelled
maybeResult	args
,	name
tostring
ScheduledTask<]
	func	name	args
__initB
rawgetA
__init
setmetatable4
remotely
ScheduledTaskId
ScheduledTask
__inherited
remotely
__class
__call
__parent
__init
__name
ScheduledTask
__base
setmetatable
__index
__tostring
"tasks.scheduled/ScheduledTask
ErrorPrintF
DebugPrintF
stateName
scheduler
luabridge.fs
luabridge.nsis
task.scheduled
loggerFor
logging
requires
bootstrap.utils
bootstrap
parseFunctionId
resolveFunctionId	Task
RemoteTask
tasks.base
require
destination
source	gsub
string
ipairs
addXmlError
source
DomainRewriteError|(%s):%s
format
string
Mapped %s -> %s
GuiInit
require
#Adding Domain Mapping %s -> %s
destination
source
insert
addDomainRewrite
processDomainRewrite
DebugPrintF
bootstrap.internal
error_store
requires
bootstrap
require
ipairs
getCategorySettings
getAppN
getBundles
install_details
requirei
function	type
commitOnly
require([[tracking]])
USERAGENT1require([[wininet.http]]).USERAGENT = [[%s]]
package.path=[[%s]]
package.cpath=[[%s]]
Tracking	code
loader
generatePaths
definitions
require
Consolidate
.Bundle[%d]: No Nested Consolidation/Combo
Bundle[%d]: Nesting [%d]
_body_
otherBundleIndex
insert
Consolidate
Found Nesting!
DebugPrintF	true
comboPrimary
ProductEula
bundleIndex
_willDisplay_
isPrimary
C%s <Consolidate> with already Consolidated Bundle productId=%s
ErrorPrint
AcceptIf
isConsolidated
_willDisplay_
Combo Product Count -> %s,%s Forcing Display due to consolidation
DebugPrintF
_willDisplay_
chainTo
andThen
collect
hasConsolidated1%s <Consolidate> without productId attribute
followedBy
preparedTask6%s <Consolidate> with unknown target productId=%d
ErrorPrint
isConsolidated
ProductId
bundleIndex
otherBundleIndex
productId
consolidateRelIdx
ipairs
CategoryList1%s Combo Clearing Category List for Primary!
DebugPrintF
consolidateHideFeature
hidden_0
consolidateFeature
unchecked
InitialState
_wasSuppressed_
isHidden
Feature
insert
accept_0
_body_
ProductName
Install 	getn
withResult	Task
setResult
comboTask
Consolidate!%s Processing Combo Products
id	Name
Options
InitialState
checked
2Combo %d[%d] -> suppressed due to category %s
DebugTrace
hidden
trackString
_categoryOfferSuppressed_
isDynamicCombo
ignore
CategoryList
AccumCategoryList
SoleCategoryList
consolidateRelIdx
ipairs
comboParent
isConsolidated
_willDisplay_
hideFeature
feature
linked
isHidden
unchecked
InitialState
_wasSuppressed_
hidden_
Feature
insert
accept_
ProductName
Install 
consolidated	getn
bundleIndex'Bundle[%s] Consolidating <- %s(%s)
DebugPrintF
_body_
ProductId
   	byte
format
string
_suppressedReason_
SUPPRESS_REASONS
ipairs
BringWindowToTopR
status
!%s finished bundles %d -> %d
setResult
%s is the first bundle
%s Advertiser Index -> %d
advertiserIndex
isPrimary)%s is not ready so waiting to finish
_willDisplay_
canOfferTask
There are %d bundles
isComplete
_wasSuppressed_
advancedTests
bundleIndex
processFreeFiles
%s Running 'Start'
isStartBeforeTest
_suppressedReason_
_wasSuppressed_ %s wasSuppressed -> %d [%s]
DebugPrintF
setResult
canOfferTask!%s Start processing complete
DebugPrintF
Start Task: %s
DebugPrint
onComplete
andThen
comboTask
_suppressedReason_ %s wasSuppressed -> %d [%s]
_wasSuppressed_
followedBy
bundleIndex
processFreeFiles
%s Running 'Start' early
DebugPrintF
isStartBeforeTest
withResult
MANUALLY_INSTALL_PRIMARY<
MANUALLY_INSTALL_PRIMARY!
ASYNC_PREPARE$
DOWNLOAD_DOT_COM1
ASYNC_PREPARE4
DOWNLOAD_DOT_COM
setDownloadDotCom
is_downloaddotcom
simple_cancel
eager_install
setInstallsAtEnd
do_install_at_finish
async_download
manual_install_primary
skinOptions
tostring
Update SkinOptions:=> %s
DebugPrintF
decode
decode
_body_
custom
addEnvVar	Name
ipairs
CustomParameter=
addDownloadComVars
Guarded
_willInstall_
ipairs
isPrimary
_willDisplay_
ipairs
FIRST_BUNDLE
tostring
PRIMARY_MARKERS0Primary Markers Count =%s|First Bundle = %s
DebugPrintF
_skipped_
_willDisplay_
_willInstall_
decline
isPrimary
unreached
trackString
ipairs
_skipped_
_willInstall_
decline
_willDisplay_
unreached
trackString
isPrimary
ipairs
Advertisers
_body_
SkipAllTypem
isPrimary
_willInstall_
ipairs
CurrentFileBundle
CurrentBundle
internal
status
activity
LoadingMetrics
insert
tableN
Complete
INIT_START
loadingMetricAdd
Offer Filter:%s
DebugPrintF
custom
discoverFilters
getOfferFilters
tostring0OfferFilter|Error loading Offer Filters!:%s
format
string
addXmlError!Offer Filter Setup Fiiled:%s
ErrorPrint
pcall/
isFeatureAccept
featureAcceptFunction
EnumRegStr
EnumRegKey
registry
_body_
RegistryValue
_wasSuppressed_
_willDisplay_
_willInstall_
_regKeySuppressed_
hidden
trackString
_body_
RegistryKey
advancedTests
App Task Complete
DebugPrintF
Start Tasks:%s
DebugPrintF
onSuccess
supervise
collect	Task
getAppTasks
install_details
require
successes!%s is ready (after %d tasks)
DebugPrint
%s has %d failures
ErrorPrint
failures
andThen
sequential
collect
Bundle will not be shown
withError	Task
preparedTask
_suppressedReason_
%s Dropping %d tasks -> %s
DebugPrint
_willDisplay_
prepareTasks
ReadRegStr
registry
_body_
RegistryValue
expandRegistryVarList
RegistryVariables
_advRegKeySuppressed_(advancedRegistryChecks() -> Failed!
DebugPrintF
advancedRegistryChecks	hide
_willDisplay_
_willInstall_
_regKeySuppressed_
hidden
trackString
_body_
RegistryKey
default
_installed_
expandRegistryVarList
_body_!PostInstallRegistryVariables
ReadRegStr
registry
Registry.
%s =>%s
([^=]+)=(.*)
gmatch
string	[;]+
ipairs
tostring$expandRegistryVarList(%s,%s,%s)
DebugPrintF
>Bundle[%d][%s] in slot %d
_wasSuppressed_
ipairs
consolidated
slotNumber
Bundle[%d][%s] in slot %d
DebugPrintF
_body_
ProductId
Error running callback:%s
ErrorPrint
ipairs
CallbackList
tostring
Running Callbacks:%s
DebugPrintF&
pcallC
CallbackList
insert
cancel
getJsCurrentBundle
SCREEN_CANCEL
SCREEN_OFFERS
getCurrentScreen
getLastScreen
isCancel
ui_commands.bundle
ui.constants
requires.
decline
hidden
decline
feature+Bundle suppressed within dynamic combo
hideFeature
lazy_s$%s Consolidated(inState=%s)=>%s
consolidated(Skipping as Product was Suppressed!$Eager Install is not Supported!
slotNumber
addOffer
getOfferStats
isContinuation
trackString
_willInstall_!%s is hidden due to category
_wasSuppressed_
_categoryUseSuppressed_
bundleIndex.Bundle[%d]  Category Use Suppressed -> %s
hidden
consolidateHideFeature
consolidateFeature/%s[Updated/FeatureAccept]Prod State %s ,%s
accept	Name Feature Named  %s => Accept
addXmlError
ErrorPrint*ConditionalError|Bundle/Feature/If:%s
format
string
bundle_is_consolidated
tostring
Running Function Args %s
DebugPrintF
checked
InitialState
isDirective
Feature
ipairs
featureAcceptFunction
isFeatureAccept
hasConsolidated
isConsolidated
tonumber
Category %s is used
DebugPrintF
trackString
_willInstall_
%s Final Prod State %s,%s 
SetProdState failure:%s
ErrorPrint&Category %s is no longer used yet
decline
ignore
accept
ipairs
tonumber
CategoryList+%s Updating Category List[state=%d] %s
DebugTrace
tostring %s Prod State %d -> %s (%s)
DebugPrintF
unpack
table	type
_willInstall_ 
_willDisplay_
_willInstall_
_parentIdx_/
Featurew
FileTrigger	File
ipairs
%s=>true
%s=>false[suppressed]
_wasSuppressed_
ASYNC_PREPARE
%s=>false[not prepared]
isComplete
preparedTask"%s=>false[single-trigger<%d>]
start_triggered
%s=>false
bundleIndex
CurrentBundle
_installed_
DebugPrint
_willInstall_
installation
finish
=>false
DebugTrace
tostring#shouldDoFileTriggers(%d,%s,%s)
format
tonumber
string
addXmlError
ErrorPrint
ConditionalError|File:%s
format
string
lazy_s
Feature Options:%s
DebugTrace
conditionalExpr
Could not find file!	File
Invalid file index
Invalid Bundle Index
addXmlError
ErrorPrint&ConditionalError|ThankYouUrl(IE):
tostring4ThankYouUrl(IE) Conditional Expression => %s/%s
DebugPrintF
string
targetBrowser
ThankYouUrl
addXmlError
ErrorPrint&ConditionalError|MinimizeDelayIf:
MinimizeDelayIf
MinimizeDelay
addXmlError
ErrorPrint
ConditionalError|ThankYou:
ipairs	getn
ThankYou
_body_
ThankYouUrl
No Thankyou Url set	open
openThanks
thankyou_opener
require
iexplore.exe
ShellExecute
getThankYouUrl
_body_
InstallInOrder
DOWNLOAD_DOT_COM]
_body_
ConsolidateProgressS
_body_
ProductName
FIRST_BUNDLE
DisplayName
Install 
DOWNLOAD_DOT_COM
_body_
InstallShortcut
generateExtraTrackInfo
ThankYouUrlOptions
_installed_
ipairs
&ProductId=
&Action=
&Product=
generateTrackInfo
_body_
InstallerCode
Installer=
isPlainThanks
%?	find
string
getRawThankYouUrl
tracking
require
checked
InitialState
isConditionalFeature
bundleIndex
Feature
ipairsf
custom
browser
windows
conditionalExpr
Feature Options -> %s
_featureOptions_
checked
InitialState
Options
 $Conditional Expression Error:%s
ErrorPrint
conditionalExpr
isConditionalFeature
bundleIndex
Feature
ipairs
lazy_s
table5Running Evaluating Conditional with features: %s
DebugPrintF
evalFeatureOptionso
msioptions
ProductBinary
_body_
SkipAllType
skip-all
variation
custom'
eager_install
cli-options
require-=require('bootstrap').setCliOptions(...)	call{        require('shared');
        require('embedded_loader');
        require('bootstrap').afterBootstrap();
        
???	code
trlocalconfig
require
addBootConfig
[[%s\definitions.lua]]
USERAGENT1require([[wininet.http]]).USERAGENT = [[%s]]
+tracking.require('packaged_app').setAppDir([[%s]])
+asyncinstall	code
loader
setAppDir
CreateDirectory
%s\apps
format
string
skinOptions
???	code
addBootConfig
is_eagerInstall
+asyncinstall	code
loader%setArchPluginsDir([[%s]],[[%s]])
set7zPlugin
%s.dll
format
string
setUnzipPlugin
mac_address
interface_index
mac_address_length
IfOperStatusUp
interface_status
IfTypeEthernet
interface_type
ipairs	getn
$Error processing mac address:%s
ErrorPrint
GetAdapters
format
string%
not_readyE
'%s': %s
format
string
 VMDetect:We are not a VM:%s	invm
lazy_s
VMDetect:We are in a VM:%s
DebugPrintF
isGuestOs
survey_environment
require
message
VMTestError
addExecError
GuiInit
require
fakenonvmm
cli-options
require
VMDetect Enabled
DebugTrace
has_vpn
has_proxy}
enabled+Enabling Late bound conditional checks
DebugPrint)
vm_tester
require
$Error net_config load error!:%s
tostring#Error vm_tester load error!:%s
ErrorPrint
survey_environment
require#Forcing remote module loading!
DebugPrint
callback	nsis
callstack_push
ipairs
tostring
table Resuming Nsis at %d with %s
DebugPrintF
table#
%s:Commit Update=>%s
DebugPrintF
tostring
%s,%s=%s
format
string
ipairs
bundleIndex
evalFeatureOptions
skinOptions&
ShellExecuteE
tostring
ChildError:%s
ErrorPrintq
tostring
New Queue State -> %s/%d
DebugPrintFX
working	nsis
+asyncinstall
progress
isDownloadDotCom
Init Icon -> %s 
Completed %d%%
DisplayName
_body_	Icon0
remove
update
tostring
Notify Info Call : %s
<Skipping  Cancel Tracking call because of preload error
doSendLoggedErrors
doPartnerHit
isCancel
doTrackingHit
tracking
require
fromError
fromPreload
unpack
ShellExecute
Opening Cancel Url:%s
DebugPrint
_body_
CancelUrl
arguments
--shortcut
$EXEPATH
createShortcut
win32.shell
require
$DESKTOP/%s.lnk
format
string6
!Install Process is Complete!$
resume
executeLater	nsis
startLater
length&Install Sequence has %d steps
onComplete
startMinimizeTimer
sequenceInstall
install_process
require
setInstallInitTime
declines
Declines:%s
accepts
Accepts:%s	dump
getOfferStats
Status:%s
DebugPrintF
Install Is Beginning!--
startLater
length(Std Finish Sequence has %d steps
doThanks
skipThanks
isCancel
sequencePrimaryAction	quit
getPrimaryAction
primary_action
MANUALLY_INSTALL_PRIMARY
sequenceFinish
install_process
require
skinOptions
Starting Finish Step!---
startLater
length(Std Cancel Sequence has %d steps
unfinished_shortcut
fromError
fromPreload
isCancel
skinOptionsN
startFinishStep
require
doDelayMinimize
executeLater	nsis'Scheduling minimize delay in -> %s
tostring,Bad or missing minimize Delay: %s -> %s
tonumber
_body_
MinimizeDelay
setResult	copy
minimize
Minimizing User interface,Skipping minimize (current_screen = %d)
SCREEN_INSTALL
getCurrentScreen
ui.constants
requires
Minimize Delay skipped
Minimize Delay Triggered!6
Async PRimary Run !
ErrorPrint
Bundle
_body_
maxOffers
MaxOffers
&Initial %d bundles (rendering %d)
DebugPrintF
insert
CategoryList
categoryUsed
isContinuation
_willDisplay_
_wasSuppressed_
maxOffers
Adding Variable %s -> %s
DebugTrace
_body_
MaxOffers
CondMaxOffers => %d
addXmlError
ErrorPrint"ConditionalError|MaxOffersIf:
tonumber
ipairs
Checking MaxOffersIf
DebugTrace
MaxOffersIf_
ipairs
table	type
_categoryUseSuppressed_
tostring'%s has categories that are used %s
DebugPrintF
CategoryList
categoryUsedD
FinalFile	FileP
create
offer_stats
requireR
create
offer_filters
require
tostring
Install -> Filter:%s|%s
DebugPrintF
INSTALL	SHOW
getOfferStats
getOfferFilters
offer_filters
require?
addFilter
getOfferFilters
doStartTrack
tracking
require|
%Error Running Start Tracking :%s
ErrorPrint
pcall+
_freeFileCallbackAddrs
)install_process/startProcessFreeFile
Process
remotely,
Install is paused!]
onComplete
Pausing InstallC
resume
Resuming InstallV
startCancelStep
Cancelling Installer!
ErrorPrint
7%0%7&"
7.?-7/@-70A-71B-42
73D274E275F276G2
:ING0G
getUiMinimized
getCancelSequence
getFinishSequence
getInstallSequence
hasOfferActions
getSingleProgressBar
isSimpleCancel
runCancel
resumeInstall
pauseInstall
processFreeFiles
setFreeFileNsisAddr
onUiStarted
addOfferFilter
isFilteredOut
installNext
getOfferFilters
getOfferStats
setOutputFile
checkCategory
categoryUsed
maxOffers
addVariable
addTrackingParameter
tracking
bundlesForUi
appNForUi
runAsyncPrimary
doDelayMinimize
startMinimizeTimer
dismissCompleteScreen
startCancelStep
startFinishStep
startInstallStep
notifyIcon
isQueueFinished
setQueueState
ErrorPrint
DebugPrintF
DebugPrint
childError
shellExecute
getSkinOptions
getInstallInOrder
getInstallTargetDir
getDownloadsDir
getPluginsDir
commitBundle
getBundle
getNumBundles
getBundles
resumeNsis
registerLuaCallback
FILE_COMMIT_FIELD
BUNDLE_COMMIT_FIELDS
VPN Detect is not ready
has_vpn
Proxy Detect is not ready
has_proxy
VMDetect is not ready	invm
macsha1	sha1
00:00:00:00:00:00
setInstallIdSalt
setArchPluginsDir
IfOperStatusDown
IfTypeOther
IfTypeEthernet
IFConnectionPassive
IfOperStatusUp
IfConnectionDedicated
hasVariation
categoryMode
msiOptions
featureOptions
evalFeatureOptions
getThankYouUrl
doneThanks
doThanks
getRawThankYouUrl
shouldDoFileTriggers
shouldProcessFile
bundleFeatureState
displayBundle
canDecline
getProdState
setProdState
addBundleCallback
setBundleSlot
expandRegistryVarList
postCompleteRegistryCheck
maybeStartPrepareTasks
startAppTasks
preStartCheck
metricComplete
loadingMetricAdd
LoadingMetrics
selectPrimaryBundle
processSkipAll
getSkipAllDetails
hasProductsToInstall
willInstallProducts
getInstallsAtEnd
setInstallsAtEnd
addDownloadComVars
ProductSetId
ProductId
buildOptions
setBuildOptions
skinOptions
setSkinOptions
loadSkinOptionFlags
isDownloadDotCom
isAsyncPrepare
setDownloadDotCom
isManuallyInstallPrimary
maybeStartBundle
markDownloadsComplete
TopInstallationWindow
getPrimaryReadyTask
getBundlesReadyTask
setBundlesReadyTask
commitTracking
__index
custom
setmetatable
bindBundles
withRegistryValues!prepareConditionalExpression
getNodeConditional
evalConditional
conditional_engine
res2FileName
isOnlineResource
net_utils
ErrorList
onPrimaryFailCallback
onBundleReadyCallback
compile_skin_options
abstime
reltime
IS_UNINSTALLER
DOWNLOAD_DOT_COM
ASYNC_PREPARE
MANUALLY_INSTALL_PRIMARY
SUPPRESS_REASONS
_condExprSuppressed_
_regKeySuppressed_
_fileTestSuppressed_
_advRegKeySuppressed_
_overThreshold_
_fileDownloadFailed_
_consParentSuppressed_
_categoryOfferSuppressed_
_multiPrimarySuppressed_
string	Warn
Trace	Info
logger
isSynBundle
expandNsisVars
TaskSequence
ScheduledTask
FunctionTask
RemoteTask	Task
PLUGINSDIR
NSISVars
environment_options
values_mr
tasks.sequence
bundle_def
luabridge.win32
state_names
tasks.scheduled
error_store
tasks.base
advanced_tests
timing
local_environment
packaged_app
callback_proxy
process_free_file
sandbox
bit	mime	json
wininet.ltn12
wininet.url
wininet.http
wininet.compat
LuaXml
requires
GuiInit
preload
package
bootstrap.table_utils
bootstrap.utils
bootstrap
require
&=require('ui').InstallStatus(...)
callInStates
installStatus
luabridge.nsis
requires
bootstrap
require
select
assert
&filter returned inappropriate nil
BLOCKSIZE	read`
unable to open file
assertm
BLOCKSIZE
insert
remove3
assert
filter returned ""
eating
&filter returned inappropriate nil
feeding
source is empty!
errorN
feeding
assertl
remove?
remove6
insert*
assertQ
close`
unable to open file
assertS
assert
filter	pump	sink
source
rewind
simplify
_VERSION
LTN12 1.0.1
BLOCKSIZE
string
require
stateName1=require('cleanup').remoteStateShutdown(...)
callInState
Inside Signal main!
executeLaterK
closeState
Closing %sY
Logging
closeState	stop
require
executeLater+All States are Done .. Closing Logging
Pending States %d
State %s is done
handle
GetExitCodeThread
%=require('cleanup').signalMain()
callInState	name
$Cleanup failed to find state %q
CleanupOrder
hLoggingThread
Logging
CloseHandle
%s,Thread Handle -> %s
threadId
OpenThread
handle
ipairs"Cleaning  Up %d Active States
pairsR
require
Cleanup Deadline Hit!
shuttingDown
executeLater
stateList Running Application Cleanup
executeLater
shutdownStarted"Deferring Application Cleanup
error.Cleanup can only be run from main thread!
isDefaultState
shutdownBuffer
remoteStateShutdown
signalMain
runCleanup
shutdownLoaded
__SHUTDOWNINFO
struct shutdown_buffer_t *	cast
DWORD[?]
BOOL  __stdcall GetExitCodeThread(HANDLE hThread, LPDWORD lpExitCode);
HANDLE __stdcall OpenThread(
    DWORD dwDesiredAccess,
    BOOL bInheritHandle,
    DWORD dwThreadId
BOOL __stdcall CloseHandle(
    HANDLE hObject
//internal stuff
struct shutdown_buffer_t {
    DWORD shutdownLoaded;
    DWORD shutdownStarted;
    HANDLE hLoggingThread;
    int waitForInput;
    };
        	cdef
kernel32	load
isDefaultState
Error	Info	Warn
cleanup
loggerFor
logging
luabridge.config
state_names
luabridge.fs
luabridge.nsis
requires
bootstrap
require
Final Test Result -> %s
ipairs
string+Failed to Run file test(rc=%d,werr=%d).Run Resulted in -> %s (werr= %s), %s/ %s 
RunDir
RunProcess
ResultPattern&Launching -> %s , Will Wait => %s
TestWaitTime
tonumber
Options
tostring
File is ->  %s 
ExecutionResultTest
hidden
trackString
_willInstall_
_willDisplay_
_fileTestSuppressed_
ExecutionLuaTest	%s%s
RunDir
RunProcess
Unscrambling  %s  ->
%s" "B"
format
un.package.exe" "
PLUGINSDIR
FinalFile
.un.lua
.un.exe	true
Scramble(Missing Result  File at File Entry 
 in product *Missing Result pattern at File Entry 
match	.lua
endswith
string
FileName
DestName
ResultPattern
_a_	test
FileAction
FileTrigger
shouldProcessFile
ipairs
bundleIndex	File
isSynBundle
GuiInit
require
hidden
trackString
_willInstall_
_condExprSuppressed_
_willDisplay_(%s Hiding Bundle due to conditional
ConditionalError|%s/If:%s<ConditionalError|Bundle/If:(not ready at final check)%s
format
string"%s Check deferred until later
GuiInit
require
bundleIndex
evalConditional!prepareConditionalExpression
lazy_s
tostring'%s Conditional Expression => %s,%s
getNodeConditional
hidden
trackString
_willDisplay_
_willInstall_
_overThreshold_+%s Hiding Bundle due to over-threshold	true
over-threshold:%s
format
string
_body_
ProductName
custom
.%s: Skipping Post Start Check for for now
postStartFileChecks&%s: Running Post Start File Check
isComplete
preparedTask5%s: Deferring Condition Check due to bm.defer-if
bundleConditionExprChecks
isDeferIf
advancedTests
bundleConditionExprChecks
postStartFileChecks
ExecutionResultTest
expandNsisVars
addXmlError
DebugTrace
ErrorPrint
DebugPrintF
environment_options
error_store
advanced_tests
loggerFor
logging
luabridge.win32
local_environment
bootstrap
require
conditional_engine
sandbox
require
lua_packer
09/05/15 @ 21:10:55
build_timestamp-7113e110b58c5ea6c2a5da13252386ec8a86eb14
support-projects-9fceacc6a567ad9246c4607637c3665469ecfe4f
site_scons-396424f5870b84f8dea2bc2b665d5b175078d4b2
luabridge-cbd695e277390d8deede7fa478ac1f5b945767a8
lua-xml-86585e427a2ef7b41bde853b49a037a86228f268
lua-wininet-e7628c84fa95601f112c915fca508d9d3ee64c32
lua-windialog-d34325308cac8a911aa125a0328e2d2837ef7a4c
lua-win32-pipeserver-2100af83e6d4bb5256fbe1b5397b17ef803dbbc8
lua-win32-crypto-8db6d5ca74789f8686d994f364c2ab71a9d237b3
lua-socket-099ee1aa9c98e139c88767bdf4407e0630e2dd17
lua-miniz-10646fd1ecada97beb9c51803a00510169cd3c68
lua-lpeg-9f01c6503bd14a92adf8cb545f03d3f9660f0c0b
lua-lfs-983dca88a8326c1cca49da60103195afc7082fe3
lua-jit-694021bdd8ef4c6261ea3e399913faea689d06f1
bundlemanager-client-5b81251397be3c5fa55e9247d71d2689393d13ac
bm-client-buildservice-51d92db94cf2117e81142c3c33dae1f0a2bcbdce
bm-client-30-93ad256f0704e22027e9fb986229d2940904f821
build_version
sub_modules)b3bec46b-82b5-4467-ac9e-689b7e3fa322
build_guid
Primary Action Set -> %s
bundleIndex
_willInstall_
isPrimary
bundlesForUiV
Destination
_a_	File0
Primary Action Close (NOP)/
Primary Action Quit (NOP)|
runInstallProductBinary
Launch installer
bundle_install
require
/select,"#{finalExe}"
explorer.exe
ShellExecute
LocalFile
FinalFile
Show Installer
/select,"#{finalExe}"
explorer
ShellExecute
finalFile
Selecting! [
DestName
tostring
Destination
FinalFile
No File for 'Show' action
error	File
Show File
ShellExecute-'open' action requires single file entry
error	File
moveFile
Moving %s -> %s
Save Installer	mode	save
filtersQAll Files (*.*)
Executables (*.exe)
MSI Installers (*.msi)
selectFileDialog
Initial Location is => %s
LocalFile
FinalFile
DestName
tostring
Destination
noBinary	File
Save As Action
'  is not supported
tostring
Sequence action '
Running Action :%s1
addXmlErrorH
onComplete
sequencePrimaryAction
getPrimaryAction
setPrimaryAction
saveas
expandNsisVars
normalizePath
RemoteTask
FunctionTask	Info
ErrorPrint
DebugPrint
primary_action
loggerFor
win32.shell
state_names
bootstrap.fs
luabridge.win32
tasks.base
error_store
logging
install_details
guiinit
requires
bootstrap
require
luaopen_LuaXML_lib
loadlib
package
assert
\LuaXml_lib.dll
PLUGINSDIRh
table	type
string
__tostring
__index
setmetatable
table	typeQ
table	type
ipairs
tostring
encode
string
nil	type
str!", generated by LuaXML -->
&<?xml version="1.0"?>
<!-- file "
w	open
ipairs
__tostring
__index
setmetatable
string
table	type
append
module
LuaXML_lib
require
loadXmlLib
function
isTask
userdata
table	type2
traceback
xpcall
linedefined
short_src
namewhat
tostring
getinfo
function	name	type
callbacks
namer	name
start7
executeLaterM
 Tracing ON!
tostring
tostring%Start must be implemented! (for 
cancelled
completed
tostring
maybeResult
tostring
???	name
tostringe
rawget
namer	nameD
function	typeo
string	name)
error*
result-
cancelled-
completed
cancelled
%Attempt to alter cancelled task[
cancelled
] with 
shortName
tostring%Attempt to alter completed task[
completedq
triggerCallbacks
completed
result
checkCanSetp
triggerCallbacks
completed
checkCanSet
Callback Error:%s
callbacks6Trigger callbacks (good=%s) against #%d callbacks
%Filter (%s) Comparing %s <->  %s(Skipping callback(%s) for  %s != %s
callbacks
insert
result
traceB
startLater
chainTo4
unpack
chainTo
tostring
[P]	name
select
supervise
addCallback
tostring	nameo
setError
chainTo
startLater4
unpack
setError
setResult
chainTo
unpack
setError
onComplete
tostring
[P]	name
setError
Chaining Tasks failed:%s
select
supervise
addCallback
tostring	name
setError
setResult
chainTo*
addCallbackm
chainTo
startLater
result-
setResultu
setError
setResult
addCallback
onComplete
tostring	name+
addCallback+
addCallback'
addCallback\
tostring
encode
table	type
Pending:#{???}
Failure:
tostring
Success:
result
setResulta
encode
number
string	type
setError
tostring
runFunction::Error %s %s
followedBy
startLaterN
cancel\
cancel
markSkipped
cancelled
callbacks
completed	func
result
<Unnamed>	nameA
__init
setmetatable/
setResult.
setError
tostring
Collector[
failures
successes
setResult
insert
sequential
supervise	name
onComplete
failures
successes
setResult
Collector[
^([A-Za-z0-9.%-_]+)/(%S+)$
string
traceback
Trace:%s
require
Invalid Task function '
' in <
Invalid Task module '
tostring
Cant Parse Function id '
errorA
n	args
unpack
runFunction
n	args	func
started
completed
cancelled&
	namex
maybeResult
,	func	name
tostring
FunctionTask<
started
select
nameFrom	name
unpack	args	func
table	type
__initB
rawgetA
__init
setmetatable
taskname
module
message
tostring
Invalid Function Id(
withError
tostring
table#fromFunction  Trigger:%s -> %s
addCallback
tostring
fromFunction Hooking:
startLater
callable
started
completed
cancelled;
callable
setTrace'
cancel
callable
update
callable
function	type
pairse
maybeResult
,	name
tostring
RemoteTask<E
started
callable
__initB
rawgetA
__init
setmetatable
setError
setResult
tostring
%s Completed %s[%s]
callable
setError
tostring	name:=return require('tasks.base').startFunctionTask(...);
callInState
fromFunction
 ' is not supported by task 
tostring
Action '
error`
identifier
fromFunction
CANCELLED
parseFunctionId
resolveFunctionId
RemoteTask
startFunctionTask
FunctionTask	Task
remotely
__name
RemoteTask
__inherited
fromFunction
__parent
__name
FunctionTask
nameFrom
collect
withError
withResult
__class
__call
__base
__init
__name	Task
setmetatable
supervise
runFunction
isTask
maybeResult
onComplete
onError
onSuccess
orElse
chainTo
andThen
followedBy
addCallback
triggerCallbacks
setError
setResult
checkCanSet
cancel
isComplete
isCancelled
isSuccess
isFailure
shortName
__index
__tojson
__tostring
update
identifier
setTrace
startLater
coderef
stateName
ErrorPrint	Info
tasks.base
loggerFor
logging
luabridge.nsis
luabridge.classes	moon	json
wininet.ltn12
wininet.http
bootstrap
require
Final Code is %s
Invalid size block!
tonumber
Size is %s)Code not found (Entire file scanned)
sub	find
string
tostring!IO ERROR READING BLOCK AT %s	read
set	seek
7#$#6$ 
Scanned %d elements
Trace	bxor
int8_t[?]
new Matched %s -> %s (%d bytes)
Potential match at %s
Debug	band
bit-Markers are %x -> %x[end=%x/%x](size=%x)	Info	size
int8_t*	addr
mapFile
wininet.io
int32_t*	cast
get_data
sizeof
hash_data
(context = %s)
format
string	SHA1
Hashes
create_hash%Expected pe_headers or opts.seed
timestamp_bytes	seed
no_xor
default_context
win32_crypto
require
unpack
len	read
File Too small
end	seek
rb	open
tonumber	find
string
findXorData
pe_headers
details
unpack
-	gsub
stringN
unb64	mimeG
pe_headers
details
pe_headers
details
pe_headers
details
getSubstData
getNodeNumber
getEmbeddedCode
findXorData
SDAT[AB]
NODE[#B]
BIG%-[OB]
values_mr
data_injection
loggerFor
logging
require
======================"[%s]Unhandled Exception:====
format
string
TimeGetTime!
TimeGetTime+
initXmlTime,
initFileTime/
initInstallTime
abstime
reltime
setinitialtime
initialtime
setInstallInitTime
setFileInitTime
setXmlInitTime
wininet.ltn12
require"
dkjson
require
/=require('bootstrap.output').printOut(...)
Logging
callInStateo
shuttingDown
unpack
format
string
tostring
Log Error '%s' in '%s'
format
string
select
DEBUG+
ERRORC
trace*
	INFO*
	GOOD*
makeLoggerM
loggerFor
bootstrap.logger
require
Delete Failed:%s	Warn
remove
IsDirectory
Deleting Dir: %s
FileExists
/.bm-debug
IsDirectory
sync-logging
setFilters
bootstrap.logger
require
cli-options
preload
package
	path-Error Creating Temp Dir(%s[%d times]):%s
Creating Temp Dir:%s
%sinst%d
GetTickCount	TEMP
WORKINGDIR
PLUGINSDIR
USING DEBUG PLUGINSDIR:%s 'Debug Path '%s' is not a directory
format
string
RUN_DIR
Rel2AbsPath	loop
cli-options
require
isDefaultState
GetCommandLineA
CMDLINE
folders
DOWNLOADS
tostring(Exception expanding name '%s' => %s
function	type
string
$($*)([A-Za-z0-9._]*)	gsub
string
tostring
PLUGINSDIR
WORKINGDIR
write)ExtractEmbError:Cant write file '%s'
format
wb	open
string
ipairs	file
dir	name
prefix
debug3
exception
skipnlogb
defaultStateFactory
bundle_def
dkjson
require"
requires
:!f 7 
7#k"7$l"1%n
7!w >!
$"#">!
tostring
CoInitialize -> %s 
CoInitializeEx*Failed to setup MessageOnly Window:%s	good
MsgWindow_
setupMessageOnlyWindow
loader
bootloader
requires
afterBootstrap
isDebug
extractEmbeddedResources
mt_to_string
entriesForType)bootstrap.overlay_resource_extractor*bootstrap.standard_resource_extractor
LUA_USING_OVERLAY
definitions
expandNsisVars
addDownloadDir
populateShellFolders
setCliOptions
bootstrap.fs
bootstrap.shell
wininet.compat
bootstrap.old_names
bootstrap.table_utils
bootstrap.utils
bootstrap.old_utils
logging
bootstrap.internal
DebugPrintF
ErrorPrintF
DebugTrace
ErrorPrint
DebugPrint
sync-logging
setFilters
bootstrap.logger4=require('bootstrap.output').setCliOptions(...)5=require('bootstrap.output').setStartupInfo(...)(=require('bootstrap').syncTime(...)
callInStatez    require('shared');
    require('embedded_loader');
    require('bootstrap');
    require('bootstrap.output')
Logging
evalInState
cli-options
EXE_FILE
EXEFILE
EXE_DIR
EXEDIR
EXE_PATH
EXEPATH
startupInfo
__STARTUPINFO
        void  __stdcall OutputDebugStringA(const char *);
        DWORD __stdcall GetTickCount();
        DWORD __stdcall GetCurrentProcessId();
        const char * __stdcall GetCommandLineA();
        HRESULT __stdcall  CoInitializeEx(
        void * pvReserved,
        DWORD  dwCoInit
        );
        	cdef
kernel32	load
wintypes
wininet.wintypes
timing
preload
package
syncTime
WORKINGDIR
NSISVars
isDefaultState
.installer-working
TimeGetTime
exceptionHandler
state_names
setErrorHandler
stateName
luabridge.classes
luabridge.config
luabridge.fs
luabridge.nsis
luabridge.win32
require
inflate
length
default_decrypt
loadstring
mt_to_string
table	type
resources.
require
entriesForType
mt_to_string
win32_crypto
require
BINRES_ENCRYPTED
 INTERNET_FLAG_RESYNCHRONIZE
INTERNET_FLAG_RELOAD
FTP_TRANSFER_TYPE_BINARYl
parsed_url
inetFileSource
all	pump	sink
FtpGetFileSize
DWORD[1]
size_callback
CloseHandle
maybeError
GENERIC_READ	path
FtpOpenFileA
TIMEOUT
timeout
setTimeout
password	user
no_cache_conn
connect
parsed_url
concat
table	sink
string	typeB
has_size_callback
TIMEOUT
wininet.dll
wininet.ltn12
wininet.url
wininet	NULL
wininet.core
wininet.defs
require
intptr_t	cast
tonumberg
setText^
1Preparing your installation, please wait ...
Generic Install
setPos
setRange
current
executeLater
wasCancelled
setHideClose
setEnableCancel
nonToolWindow
loading_icon	load	file
binlib	name
loading_screen.dll
extractEmbeddedResources
Loading Screen => %s	.dll
PLUGINSDIR
NSISVars
tostring
randomNameSeq
hideTrusteVisuals
skin_option
isTruste
showFloatingProgress
hideFloatingProgress
Dismissing loading Screen
:!!": "":
updateProgress
setForcePreload
setCallback
updateWithProduct
updateText
present
dismiss
HWND[1]
skin_options
Trace	Info
plugincall2Preparing your installation, please wait ... %Downloading Installation Details
        void nonToolWindow();
        HWND showFloatingProgress(HWND *, HWND *);
        void hideTrusteVisuals();
        void showTrusteVisuals();
        int wasCancelled();
        void setEnableCancel(int enabled);
        void setHideClose(int hide);
        void hideFloatingProgress();
    	cdef
loading_popup
loggerFor
logging
bootstrap.fs
luabridge.nsis
build_info
luabridge.classes
requires
bootstrap
require
__index
setmetatable
entries
__index
setmetatable
entries
entriesd
position
entries
ipairs
entries
insert
setmetatable
position
action
bundleIndex
__create
insert
entries
__create
insert
position
entries|
__create
insert
entries
ipairsW
entriesO
entries#
entries 
filter
entries=
entries
tostring
OfferStats:{
is_accept
is_decline
unreached
is_unreached
hidden
is_hidden
decline
is_decline
accept
action
is_accept
__index
declines
accepts
findLast
findFirst
filter
slot_slice
addOffer
length
__create
create
VERSION
getBundles
getAppN
install_details
require
escape
%s&%s=%s
format
string
tostring
thankYouAlso
ipairs
_installed_
tostring
slotNumber
ProductId
_body_
ProductName
hidden
trackString
ipairs
tostring
&%s=%s
format
string
CurrentState
CurrentSlot
currentSlot
currentState
getItem
com.tr.InstallModel
data_stores
require
tostring
escape
&%s=%s
format
string
pairs:
numInstalls=
%s&lScrT=%s&cScrT=%s
getScreenTimes
getCurrentScreen
getLastScreen
tostring
%slScr=%s&cScr=%s
format
string
build_version
build_guid
escape#build_guid=%s&build_version=%s
format
string
build_version_info
require
NSISVars
Adding Key -> %s -> %s
tracking.%s
format
ipairs	rxml	eval
tostring
Tracking Request Failed:%s
concat
source
headers
Content-Length
Content-Type&application/x-www-form-urlencoded
string
proxyForUrl
method	POST
request
table	sink
 Error In Tracking Code ->%s
Tracking -> %s
%sInitInstallDelta=%s
initInstallTime
%sInitFileDelta=%s
initFileTime
%sInitXmlDelta=%s
initXmlTime
%sTimeDelta=%s
RunningElevated=
is_elevated
windows
environment_options
tostring
skipAllSlot=%s
skipAll=1
getSkipAllDetails
guiinit	exec
js	getn
table;%s&jsErrors=%d&netErrors=%d&xmlErrors=%d&execErrors=%d
format
getErrors
cancel=1
ProductId=
Product=
_numInstalls
TrackingError
message
TrackingError
addExecError
&ProductId=
&Slots=
&Action=
&Product=
escape"Tracking will be POST request
InstallerCode
Installer=
require
%?	find
string
_body_
TrackingUrl
proxyForUrl
method	POST
request
Sending Partner Hit -> %s
_body_+ConditionalError|PartnerTrackingUrl:%s
tostring2ConditionalPrepareError|PartnerTrackingUrl:%s
format
string
addXmlError
ipairs
PartnerTrackingUrl
thankYouAlso
insert
tostring9Adding Tracking Parameter:%s -> %s [thankYouAlso=%s]
DebugTrace3
_body_
ErrorUrl
source
headers
Content-Length
Content-Type&application/x-www-form-urlencoded
string
trackStr
proxyForUrl
method	POST
request
escape
error=%s
encode
format
string
InstallDelta
initInstallTime
FileDelta
initFileTime
XmlDelta
initXmlTime
No Error Tracking:%s
pcall	json
require
asyncTrack
_body_
StartTrackingUrl
concat*=require('tracking').trackAction(...)
+tracking
callInState
escape
format
string
insert
tostring
delta=
	null	sink
source
headers
proxyForUrl
method	POST
request
string
Content-Length&application/x-www-form-urlencoded
Content-Type
generateExtraTrackInfo
generateTrackInfo
addPostbackField
trackAction
asyncTrack
doStartTrack
errorTrack
addTrackingParameter
doPartnerHit
donePartner
doTrackingHit
doneTrack
bindBundles
cancel
loading
!prepareConditionalExpression
getNodeConditional
evalConditional
isSynBundle
expandNsisVars
processDomainRewrite
domain_rewrites
abstime
reltime
genShortCode
ErrorPrint
DebugPrint
values_mr
bundle_def
tasks.network
tracking
loggerFor
logging
local_environment
conditional_engine
error_store
timing
wininet.ltn12
wininet.url
wininet.http
luabridge.nsis
bootstrap.utils
requires
bootstrap
require
string
Rel2AbsPath Failed
GetFullPathNameA
char *[1]
char[?]
*BLANK*
Zip File Header => '%s'
DebugPrint	read
rb	open
pcall(
/	gsub
MoveFileA-Invalid argument 'dest' expected string!,Invalid argument 'src' expected string!
concat
string
insert
random	math
randomNameSeq
moveFile
normalizePath
Rel2AbsPath
stringCAaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz1234567890
ErrorPrint
kernel32	load
     DWORD __stdcall GetFullPathNameA(LPCTSTR lpFileName,
     DWORD nBufferLength,
     LPTSTR lpBuffer,
     LPTSTR * lpFilePart);
BOOL __stdcall MoveFileA(
    LPCTSTR lpExistingFileName,
  LPCTSTR lpNewFileName
    	cdef
bootstrap.fs
loggerFor
logging
wintypes
require
resumeMainAt
tostring
Resuming at %d(%s)
create
coroutine
processFreeFiles
CurrentBundle
tostring
ProcessFreeFile(%s,%s)
unpack
create
coroutine
Download dir complete!
CreateDirectory
Creating directory %s
getDownloadsDir
manual_install_primary
getSkinOptions!Starting create download dirn
Setup %s -> %s
create
coroutine
insert
sequenceBundleInstall
isPrimary
bundleIndex
sequenceBundlePrepare
%s Sequencing for install
_willInstall_
ipairs2Sequencing install (in_order=%s,at_finish=%s)
manual_install_primary
getInstallInOrder
do_install_at_finish
append
Remotely <- %s&install_process/createDownloadDir
Install
remotely
getBundles
install_details
require
getSkinOptions
postCompleteRegistryCheck
ipairs
showfolders%bundle_install/doProcessFreeFile
Install
remotely
sequenceBundleFinish
bundleIndex
sequenceBundleInstall
isPrimary
_willInstall_
_installed_
ipairs
getBundles
install_details
manual_install_primary
getInstallInOrder
do_install_at_finish
guiinit
require
getSkinOptions
coroutine
Pause Loop Called! V
updatePcall
updateQueueState8
isComplete}
set7zPlugin
%s.dll
format
string
setUnzipPluginm
ExecuteLuaScript
getBundles
install_details
require7
addXmlError=
executeApplication
ExecutePackagedApp
ExecuteLuaScript
setArchPluginsDir
isComplete
sequenceFinish
sequenceInstall
createDownloadDir
startProcessFreeFile
resumeMainAt
ErrorPrint
DebugPrint
defer	done
ScheduledTask
TaskSequence
FunctionTask	Task
values_mr
install_process
loggerFor
logging
tasks.scheduled
tasks.sequence
tasks.base
state_names
luabridge.fs
error_store
packaged_app
sandbox
scheduler
process_free_file
bundle_install
callback_proxy	mime	json
wininet.http
requires
bootstrap
require
skin_options
gitVersion
select
unpack
4=require('bootstrap.queue_state').setState(...)
callInState
tostring
UpdateQueueState -> %s
AtSync Complete -> %sS
AtSync Scheduled -> %sO
thread
ipairsa
remove
ipairs>
callback
%Error calling thread callback:%s
callback
Resumed from Pcall With:%s
Yielding Pcall to %s
caller	prio
thread
insert
create
coroutine
function	type>Scheduler.pcall can only be called from the active thread
tostring7Attempt to call Scheduler.call from non active(%s)N
Schedule Resumer Called!X
coroutine
thread
3Dangling Coroutine!!!!! <- Thread(%s) -> %s
select
Resuming(%s) from pcall %s
suspended
status
executeLater!Complete(%s) ( %d remaining)	done!Waiting (%s) ( %d remaining)
pcall(%s) ->%s
calling
pending
Thread -> Proxy:%s
isPending
Failed:%s
traceback
caller
unpack
resume
Resuming:%s
updateQueueState
insert
callback	prio	data
tostring
Queued Thread:%s
waiting
thread
ipairs
create
coroutine
function	type	null	getn
paused
cancel
__call
setmetatable
cancelled
paused
withResumer
atSync
isComplete
updateQueueState
stateName
luabridge.nsis
ErrorPrint
DebugPrintF
DebugTrace
scheduler
loggerFor
logging	json
callback_proxy
require
ErrorPrint(%q)
evalLater	nsis
format
string
select
evalLater	nsis
format
concat
tostring
Tracking Request Failed:%s	sink
string
source
headers
proxyForUrl
method	POST
request
table	null	sink
string
Content-Length&application/x-www-form-urlencoded
Content-Type
AsyncTracking_trackAction
trackAction
Downloads
wininet.url
wininet.http
wininet.compat
require
tostring
Bundle[%s][%s]
format
string
bundleIndex
_body_
ProductId
__name{
'Failing Encode Error @ %s 
	 -> %s
ErrorPrint	null
unsupported type
"Bundle Serialization Error:%s
format
string
result
encode
JsonFieldsF
JsonFields
pairs<
_synBundle_
setmetatable
skipnlog
FILE_COMMIT_FIELD
BUNDLE_COMMIT_FIELDS
BundleMeta
updateBundleMeta
isSynBundle
__tojson
__tostring
__index
JsonFields
DestName
ProductName
_willInstall_
trackString
OptInDefault
Scramble
Feature
_wouldInstall_
RunDir
consolidated
FileName
LocalFile
isContinuation
CustomCss
_body_
CustomParameter
noBinary
isConsolidated
advertiserIndex
Primary
ProductBinary
comboParent
isPrimary
_willDisplay_
OptInStyle
slotNumber
FinalFile
ProductId
ProductBanner
ProductEula
_installed_
isScrambled
bundleIndex
PlainEula
DebugPrint
AlreadyRun
_installed_
_prepareStatus_
start_triggered
bundle_def
loggerFor
logging
dkjson
require
^%s*;(.*)
Fail Match 
^%s*=%s*(
^%s*=%s*"([^"]+)"(.*)
insert
([^;]+)(.*)
string
+)(.*)
^%s*;%s*(
table	type
endswith
string	path
endswith
string	path
ftp://
http://
https://	find
	File	.mht
	host	getn
table	path
parse_path
insert
%+	gsub
unescape
&*([^=&]+)=([^&]*)
gmatch
string
parseQs
res2FileName
isOnlineResource
parse_mime_header
^()<>@,;:\"/?%[%]=
wininet.url
require
USERREQUESTED
FORCETAB
HTMLDIALOG
FORCEWINDOW
FROMDIALOGCHILD
USERALLOWED
SHOWHELP
SUGGESTWINDOW
UNLOADING
USERINITED
OVERRIDEKEY
SUGGESTTAB
INACTIVETAB
@	NWMP
VK_ESCAPE
KeyConstants
MB_ABORTRETRYIGNORE
MB_YESNO
MB_RETRYCANCEL
MB_YESNOCANCEL
MB_ICONWARNING
MB_TOPMOST
MB_OKCANCEL
MessageBoxConstants
SW_SHOWNORMAL
SW_NORMAL
SW_MAX
SW_SHOWNA
SW_SHOW
SW_SHOWMINIMIZED
SW_SHOWMAXIMIZED
SW_MINIMIZE
SW_SHOWNOACTIVATE
SW_SHOWMINNOACTIVE
SW_SHOWDEFAULT
SW_FORCEMINIMIZE
SW_MAXIMIZE
SW_RESTORE
SW_HIDE
SwConstants
MsgConstants
WM_NOTIFY_CUSTOM_READY
WM_USER
WM_NOTIFY_OUTER_NEXT
WM_CLOSE
WM_USER
WM_SIZE
WM_MBUTTONUP
WM_NCLBUTTONDBLCLK
WM_RBUTTONDOWN
WM_KEYUP
WM_LBUTTONDOWN
WM_MBUTTONDOWN
WM_LBUTTONUP
WM_KEYDOWN
WM_QUIT
WM_COMMAND
WM_NCLBUTTONDOWN
BM_CLICKED
WM_NCMOUSEMOVE
HTCAPTION
WM_RBUTTONUP
IDABORT
IDCANCEL
IdConstants
 with 
tostring$Showing Select File dialog for
messageBoxf
tostring!Pick a folder starting  in 
messageBox
selectFileDialog
selectFolderDialog
wintypes
luabridge.nsis
win32.shell
requires
bootstrap
require
string
GetCommandLineA
getCommandLine	NULL
jit4const char * __stdcall GetCommandLineA(void);
kernel32	load
require
getDownloadsDir3
getInstallTargetDirP
tostring InstallTargetDir is now  %s
$PROFILE\Downloads
$DOCUMENTS\Downloads
version_name
windows^
custom.%s
format
string
custom=
custom.s
custom
addEnvVar
tostring
Added Custom Var %s -> %s
version_name	name
minor_version
major_version
windows
minor_version
major_version
tonumber
ipairs
[\. ]+
minor_version
major_version
default_exe	find
string
)Custom environment finalizer applied	Info
environment_finalizer
cli-options
require
lazy_s
Final Environment is:%s	Info.Can't apply cli environment_finalizer:
default_contains
Chrome
default_browser
is_default
chrome_version_string
chrome
ff_version_string
ie_version_string
browser
USERAGENT
CURRENT_PROCESS_ID
initialtime
;startTime=
dotnet_version
;dotnet=
is_elevated
;elevated=
ie_version_string	;ie=
uac_enabled
minor_version
major_version
tostring
windows=
GIT_VERSION
(ref=[
browser
windowsa
USERAGENT
UserAgent:%s
pcalla
])#Tightrope Bundle Manager(ref=[
USERAGENT
GIT_VERSION
setGitVersion
updateUserAgent
finalizeEnvironment
addCustomVar
hasCustomVar
addEnvVar
getDownloadsDir
setInstallTargetDir
INSTALLDIR
getInstallTargetDir
environment_options
setmetatable
PlainJsonMeta
custom
windows
version_name
browser
CURRENT_PROCESS_ID
GetCurrentProcessId
GIT_VERSION
0	2000
2	2003
kernel32	load
string
expandNsisVars
NSISVars
DebugPrintF
values_mr
local_environment
loggerFor
timing
wininet.http
bootstrap.json_utils
logging
bootstrap.table_utils
bootstrap.utils
requires
bootstrap
require
tostring
Registing %s -> %s$Invalid Callback proxy handler!
errora
registerLuaCallback
pairs4
Proxy Error:%s.
invoke2
invokeImpl,
	call5
invokeForResp-
invokeForResp$
string
rawget
__index
setmetatable
invokeForResp
invokeImpl
invoke
invokeImpl
unpack
handler
(=require('callback_proxy').run(...)
format
string	args	name
No handler found for:%s
tostring
table+Handler (%s) with args(%s) failed (%s)
handler
tostring
Bad Call with (%s)(%s)
callInState
summarize
table!CallbackProxy-Calling:[%s]%s
invoke
unpack
handler
pending
coroutine
callInState
summarize	name(CallbackProxy-Requesting:[%s]{%s}%s
invokeImpl
format
string
unpack
tostring
table+Handler (%s) with args(%s) failed (%s)
handler
select
thread
pendingx
resumeRaw
decode
string	type
thread
summarize
CallbackProxy-Resuming:%s5CallbackProxy-Resume:No Entry Found (token='%s')
unpack
1CallbackProxy-Response:(Response Sent!)=> %s
callInState*CallbackProxy-Response:(state=>%s),%s
torun.=require('callback_proxy').resumeRaw(...)
tostring+Handler (%s) with args(%s) failed (%s)
pcall"Bad Call with no args or name	name	args
lazy_s
-!CallbackProxy-Request:#%s|%s
decode
string	type
forceLocal
resumeRaw
resume
isPending
pending
invokeForResp
invokeImpl
invoke
namespacedPort
registerPrivatePort
registerLuaCallback
DebugTrace
ErrorPrint
DebugPrintF
values_mr
lazy_s
callback_proxy
loggerFor
stateName
logging
luabridge.nsis	mime	json
bootstrap.table_utils
bootstrap.utils
require
moon.init
require
function
return  %s
format
loadstring
assert
string	type<
entries
condition	file
insert	true
ExecFile[%s] %s if %s
unpack
format
string
ipairs
table	type
stateTable
condition
insert	true
default
Exec[%s]=>%s if %s
unpack
format
string
stateTable	code
ipairs
table	type
	args	desc
condition
insert	true
default"Exec[%s]=>%s(%d values) if %s
format
string
stateTable	call
ipairs
table	type0
doCommit4
altstate
doCommit
[BootLoader]Skipping %s
execFileInState
loadfile	file
Bootstrap Error:%s
ErrorPrint
unpack
callInState	args	call
evalInState
loadstring
	code	desc
[BootLoader]Running %s
condition
ipairs
processEntries
entries
ALL)[BootLoader] Committing entries [%s]	only
altstatei
__index
setmetatable
activeState
entries
preload
package
doCommit
processEntries
commit
commitOnly
stateTable
luabridge.nsis
DebugTrace
ErrorPrintF
DebugPrintF
bootloader
loggerFor
logging
require
activeState
entries
tonumber
ProxyEnable	HKCU
ReadRegStr
AutoConfigURL	HKCU
ReadRegStr
system_proxy_enabled
has_autoconf_url
tostring has_proxy -> %s 
Details:%s
	Next4
GetEnumerator
message
Failed to load Wmi	type
VpnDetectError
addExecError
GuiInit	conf
tostring
Element
IPEnabled
Setting
winmgmts:.select * from Win32_NetworkAdapterSetting
ExecQuery=winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2
GetObject
luacom
require
function	find
string	type
ipairs
vpn_details_version
addTrackingParameter
tracking
tostring Using Latest Vpn Details:%s
Version
vpn_details
maybeLoadRemoteDefinitions
remote_loaderV
vpn_details
requireu
ensureVpnRemoteLoaded
tracking
remote_loader
requires
6[VPN]Checking Iface[%s/%s]:
	-> (Counts:%d/%d/%d)
ServiceNamePatterns
ServiceName
DescriptionPatterns
InterfacePatterns
Description	conf
maybeHasVpnNetworkAdaptor
ensureVpnDetails
maybeHasVpnishRouting
ensureVpnDetails]
maybeHasWindowsStandardVpn
ensureVpnDetails
standard_windows_vpn
vpnish_routing
network_device
tostring
has_vpn -> %s
Details:%sp
Vpn Detect error:%s
pcallh
has_vpn
has_proxy
NSISVars
definitions
require
has_vpn
ensureVpnDetails
ensureVpnRemoteLoaded
initWmi
NetInterfaces
vpn_error
has_proxy
@Software\Microsoft\Windows\CurrentVersion\Internet Settings
luacom
DebugTrace
ErrorPrint
DebugPrint
values_mr
net_config
loggerFor
logging
luabridge.registry
requires
bootstrap
require
tostring
Added Service [%s] -> %s
getService
registerService
service_registry
loggerFor
logging
require
DebugPrintF
getmetatable
number
\u%.4x\u%.4x
\u%.4x
]+	%%%0
[%^%$%(%)%%%.%[%]%*%+%-%?]
[^0-9%-%+eE
([^05+])
buffer
bufferlen
indent
(key='
,)' is not supported as a key by JSON.
type '
number
string
string
bufferlen
bufferlen
exception%
 ' is not supported by JSON.
type '
unsupported type
__jsonorder
object
__jsontype
string
false	true
boolean
number	null
custom encoder failed
bufferlen
reference cycle
__tojson
makeDefaultState
keyorder
tables
bufferlen
indent
buffer
makeDefaultState
, column 
unterminated 
string	["\]
)'cannot use nil as table index (at 
object
no valid JSON value at 	null
false	true
^%a%w*
^%-?[%d%.]+[eE]?[%+%-]?%d*
object
{*no valid JSON value (reached the end)
__jsontype
__jsontype
object
pos	 at 
arraymeta	last
objectmeta	last
arraymeta
objectmeta
 "#"7#&
"#" !"!7"6
#$# "#" " ">!
 #$#7$&
#$# "#"7#6
 "" +#
:$:#+#
:$<#+#
:$>#+#
using_lpeg
use_lpeg
decode
colon expected
Cp	last	cont
value expected
'}' expected
']' expected
	Carg	null
Cc	true
unterminated string
09 unsupported escape sequence
"\/bfnrt
matchCdue to a bug in LPeg 0.11, it cannot be used for JSON matching	0.11
version	lpeg
use_lpeg
decode
encode
makeDefaultState
defaultStateFactory
encodeexception
addnewline
quotestring
__tojson
version
dkjson 2.5
concat
format
len	find	char	byte
sub	gsub
string	huge
floor	math
select
require
rawset
setmetatable
getmetatable
tonumber
tostring	type
pairs	json
isPrimary
is_downloaddotcom
getSkinOptions3
installStatus
success
_prepareStatus_o
_body_
ProductName
Downloading %s
format
string
infoTip
%s prepareStatus -> %s
_prepareStatus_
success
all_success	fail
summary
Downloaded
binary
Embedded
CurrentBundle
SkipAction
installation%bundle_install/doProcessFreeFile
Install
remotely
installation
Downloading
installTasks
rawBundle
Downloading
bundleIndex
installStatus
Download Error
_installedMessage_
_failed_	fail
_prepareStatus_
_body_
ProductName
Installing %s
format
string
infoTipA
success
_prepareStatus_
%s Skipping Binary
startLater
%s Queueing Binary
_prepareStatus_
Status is %s From -> %s
andThen
#bundle_install/doInstallBinary
Install
remotely
Installing	name
%s check-prepare-fail
format
string
getSkinOptions
rawBundle
CurrentBundle
bundleIndex
finish%bundle_install/doProcessFreeFile
Install
remotely
finish
installTasks
InstallBundle
isPrimary
manual_install_primary
getSkinOptions
installation
processFreeFiles
_willInstall_
_installed_
withBundlesE
unpack
processFreeFilesK
create
coroutine
commitBundle
Installed
Success
_installedMessage_
_installed_
No primary product to Run	wait
Waiting for Install
nowait_installs
getSkinOptions
error_code
message
Job creation failed(rc=%s)
bundleIndex	type
BinaryRun	Type
addExecError,Error Running process(success=%s,rc=%s)
Running :%s in (%s)
RunDir
"%s" %s
msiexec %s /i "%s" %s 
format
string
options
msioptions
evalFeatureOptions
expandNsisVars
LocalFile
FinalFile
Installing
_body_
ProductBinary
getBundle
installStatus@
create
coroutine
runInstallProductBinary#bundle_install/doInstallBinary
InstallBinaryId
doInstallBinary
doProcessFreeFile
DoDeferredInstall
sequenceBundleFinish
sequenceBundleInstall
sequenceBundlePrepare
PHASE_FINISH
PHASE_INSTALL
finish
install
defer	done
DownloadTask
ScheduledTask
TaskSequence
RemoteTask
FunctionTask	Task
error_store
state_names
ErrorPrint
DebugPrintF
DebugPrint
values_mr
bundle_install
loggerFor
tasks.network
tasks.scheduled
tasks.sequence
tasks.base
process_free_file
UiState
NotifyIcon
scheduler	json
luabridge.classes
logging
luabridge.fs
requires
bootstrap
require
insert
gmatch ^[0123456789abcdefABCDEF]+$
string	type
assert
select
selectI
remove
insert
asHEX	byte
%02x%02x%02x%02x
format	modf	math
string	type
assert
tonumber	char
string(
..	gsub
.	gsub0text passed to hmac_sha1 should be a string/key passed to hmac_sha1 should be a string
string	type
assert#
hmac_sha1_binary
hmac_sha1
sha1_binary	sha1
string
CA62C1D6
8F1BBCDC
6ED9EBA1
5A827999
C3D2E1F0
10325476
98BADCFE
EFCDAB89
67452301
5	0000
0	0010
2	1000
8	0001
1	0111
7	1011
b	1100
c	1110
e	0011
3	1101
d	1001
9	1111
f	0100
4	0110
6	1010
r	open
ipairs
except
table	type
DebugTrace
DebugPrintF
ErrorPrint
DebugPrint
luacom
ipairs
message
SandboxSetupError
addExecError
tostring%Failed to sandbox module(%s->%s)
format
string
table	type
GuiInit
require-
SCRIPT:-
SCRIPT:
insert
table"CustomParameter/Add[%s] -> %s%CustomParameter/Update[%s] -> %s
tostring"CustomParameter/Get[%s] -> %s
_body_
params	Name
ipairs
CustomParameter
select
bundleIndex
expandNsisVars
tostring
expand_path(%s)
feature_checked(%s)-> %s
unchecked
number	type
checked
InitialState
isConditionalFeature
Feature
ipairs
select
tostring
Script:feature_checked(%s)
format
string
addVariable2
addTrackingParameterz
bundleIndex
addBundleCallback
GuiInit
require
Adding Callback!
add_callback
add_tracking_parameter
add_variable
feature_checked
expand_path
custom_parameter
ErrorPrint
DebugPrint
bundle
setfenv
LuaScriptError!Failed to run test code!: %s
current	test
message
tostring
ScriptLoadError
SourceFile
addExecError/Failed to load lua(filename=%s,message=%s)
format
string
GuiInit
require
loadfileO
tostring
SCRIPT:Install State -> %sY
setfenv
Executing Lua Test %s
LuaTestError:%s
LuaTestRunError!Failed to run test code!: %s
set_install_state
bundle
current
message
LuaTestLoadError
SourceFile
addExecError/Failed to load lua(filename=%s,message=%s)
format
string
loadfile
GuiInit
require
updatePcall
ExecutionLuaTest
ExecuteLuaScript
SANDBOX_ENV
cloneNode
prepare
scriptFileEnvironment
file_exists
file_exist
luacom
luabridge.fs	nsis
luabridge.nsis
luabridge.win32
registry
luabridge.registry	json
getenv
difftime
clock	date	time	math
except
randomseed
string
	byte	char	find
format
gmatch	gsub
reverse
assert
ipairs
tonumber
tostring
pcall	next
require
DebugTrace
ErrorPrint
DebugPrintF
DebugPrint
values_mr
sandbox
loggerFor
error_store
logging
requires
bootstrap
require
require Loading old package name:%s	Warn
preload
package
BundleInstall
bundle_install
UiState
ui_bridge
ProcessFreeFile
process_free_file
CallbackProxy
callback_proxy
EagerInstall
install_process
old_names
loggerFor
logging
require
											  
#pragma pack(4)
typedef LPVOID HINTERNET;
typedef HINTERNET * LPHINTERNET;
typedef WORD INTERNET_PORT;
typedef INTERNET_PORT * LPINTERNET_PORT;
typedef enum {
    INTERNET_SCHEME_PARTIAL = -2,
    INTERNET_SCHEME_UNKNOWN = -1,
    INTERNET_SCHEME_DEFAULT = 0,
    INTERNET_SCHEME_FTP,
    INTERNET_SCHEME_GOPHER,
    INTERNET_SCHEME_HTTP,
    INTERNET_SCHEME_HTTPS,
    INTERNET_SCHEME_FILE,
    INTERNET_SCHEME_NEWS,
    INTERNET_SCHEME_MAILTO,
    INTERNET_SCHEME_SOCKS,
    INTERNET_SCHEME_JAVASCRIPT,
    INTERNET_SCHEME_VBSCRIPT,
    INTERNET_SCHEME_RES,
    INTERNET_SCHEME_FIRST = INTERNET_SCHEME_FTP,
    INTERNET_SCHEME_LAST = INTERNET_SCHEME_RES
} INTERNET_SCHEME, * LPINTERNET_SCHEME;
typedef struct {
    DWORD_PTR dwResult;
    DWORD dwError;
} INTERNET_ASYNC_RESULT, * LPINTERNET_ASYNC_RESULT;
typedef struct {
    DWORD_PTR Socket;
    DWORD     SourcePort;
    DWORD     DestPort;
    DWORD     Flags;
} INTERNET_DIAGNOSTIC_SOCKET_INFO, * LPINTERNET_DIAGNOSTIC_SOCKET_INFO;
typedef struct {
    DWORD dwAccessType;
    const char * lpszProxy;
    const char * lpszProxyBypass;
} INTERNET_PROXY_INFO, * LPINTERNET_PROXY_INFO;
typedef struct {
    DWORD   dwOption;            
    union {
        DWORD    dwValue;        
        LPSTR    pszValue;       
        FILETIME ftValue;        
    } Value;
} INTERNET_PER_CONN_OPTIONA, * LPINTERNET_PER_CONN_OPTIONA;
typedef struct {
    DWORD   dwOption;            
    union {
        DWORD    dwValue;        
        LPWSTR   pszValue;       
        FILETIME ftValue;        
    } Value;
} INTERNET_PER_CONN_OPTIONW, * LPINTERNET_PER_CONN_OPTIONW;
typedef INTERNET_PER_CONN_OPTIONA INTERNET_PER_CONN_OPTION;
typedef LPINTERNET_PER_CONN_OPTIONA LPINTERNET_PER_CONN_OPTION;
typedef struct {
    DWORD   dwSize;             
    LPSTR   pszConnection;      
    DWORD   dwOptionCount;      
    DWORD   dwOptionError;      
    LPINTERNET_PER_CONN_OPTIONA  pOptions;
                                
} INTERNET_PER_CONN_OPTION_LISTA, * LPINTERNET_PER_CONN_OPTION_LISTA;
typedef struct {
    DWORD   dwSize;             
    LPWSTR  pszConnection;      
    DWORD   dwOptionCount;      
    DWORD   dwOptionError;      
    LPINTERNET_PER_CONN_OPTIONW  pOptions;
                                
} INTERNET_PER_CONN_OPTION_LISTW, * LPINTERNET_PER_CONN_OPTION_LISTW;
typedef INTERNET_PER_CONN_OPTION_LISTA INTERNET_PER_CONN_OPTION_LIST;
typedef LPINTERNET_PER_CONN_OPTION_LISTA LPINTERNET_PER_CONN_OPTION_LIST;
typedef struct {
    DWORD dwMajorVersion;
    DWORD dwMinorVersion;
} INTERNET_VERSION_INFO, * LPINTERNET_VERSION_INFO;
typedef struct {
    DWORD dwMajorVersion;
    DWORD dwMinorVersion;
} HTTP_VERSION_INFO, * LPHTTP_VERSION_INFO;
typedef struct {
    DWORD dwConnectedState;
    DWORD dwFlags;
} INTERNET_CONNECTED_INFO, * LPINTERNET_CONNECTED_INFO;
typedef struct {
    DWORD   dwStructSize;       
    LPSTR   lpszScheme;         
    DWORD   dwSchemeLength;     
    INTERNET_SCHEME nScheme;    
    LPSTR   lpszHostName;       
    DWORD   dwHostNameLength;   
    INTERNET_PORT nPort;        
    LPSTR   lpszUserName;       
    DWORD   dwUserNameLength;   
    LPSTR   lpszPassword;       
    DWORD   dwPasswordLength;   
    LPSTR   lpszUrlPath;        
    DWORD   dwUrlPathLength;    
    LPSTR   lpszExtraInfo;      
    DWORD   dwExtraInfoLength;  
} URL_COMPONENTSA, * LPURL_COMPONENTSA;
typedef struct {
    DWORD   dwStructSize;       
    LPWSTR  lpszScheme;         
    DWORD   dwSchemeLength;     
    INTERNET_SCHEME nScheme;    
    LPWSTR  lpszHostName;       
    DWORD   dwHostNameLength;   
    INTERNET_PORT nPort;        
    LPWSTR  lpszUserName;       
    DWORD   dwUserNameLength;   
    LPWSTR  lpszPassword;       
    DWORD   dwPasswordLength;   
    LPWSTR  lpszUrlPath;        
    DWORD   dwUrlPathLength;    
    LPWSTR  lpszExtraInfo;      
    DWORD   dwExtraInfoLength;  
} URL_COMPONENTSW, * LPURL_COMPONENTSW;
typedef URL_COMPONENTSA URL_COMPONENTS;
typedef LPURL_COMPONENTSA LPURL_COMPONENTS;
typedef struct {
    FILETIME ftExpiry;
    FILETIME ftStart;
    LPTSTR lpszSubjectInfo;
    LPTSTR lpszIssuerInfo;
    LPTSTR lpszProtocolName;
    LPTSTR lpszSignatureAlgName;
    LPTSTR lpszEncryptionAlgName;
    DWORD dwKeySize;
} INTERNET_CERTIFICATE_INFO, * LPINTERNET_CERTIFICATE_INFO;
typedef struct _INTERNET_BUFFERSA {
    DWORD dwStructSize;                 
    struct _INTERNET_BUFFERSA * Next;   
    const char *   lpcszHeader;               
    DWORD dwHeadersLength;              
    DWORD dwHeadersTotal;               
    LPVOID lpvBuffer;                   
    DWORD dwBufferLength;               
    DWORD dwBufferTotal;                
    DWORD dwOffsetLow;                  
    DWORD dwOffsetHigh;
} INTERNET_BUFFERSA, * LPINTERNET_BUFFERSA;
typedef struct _INTERNET_BUFFERSW {
    DWORD dwStructSize;                 
    struct _INTERNET_BUFFERSW * Next;   
    LPCWSTR  lpcszHeader;               
    DWORD dwHeadersLength;              
    DWORD dwHeadersTotal;               
    LPVOID lpvBuffer;                   
    DWORD dwBufferLength;               
    DWORD dwBufferTotal;                
    DWORD dwOffsetLow;                  
    DWORD dwOffsetHigh;
} INTERNET_BUFFERSW, * LPINTERNET_BUFFERSW;
typedef INTERNET_BUFFERSA INTERNET_BUFFERS;
typedef LPINTERNET_BUFFERSA LPINTERNET_BUFFERS;
 BOOL __stdcall InternetTimeFromSystemTimeA(
      SYSTEMTIME *pst,           
     DWORD dwRFC,                     
     LPSTR lpszTime,  
     DWORD cbTime                     
    );
 BOOL __stdcall InternetTimeFromSystemTimeW(
      SYSTEMTIME *pst,            
     DWORD dwRFC,                      
     LPWSTR lpszTime,  
     DWORD cbTime                      
    );
 BOOL __stdcall InternetTimeFromSystemTime(
      SYSTEMTIME *pst,           
     DWORD dwRFC,                     
     LPSTR lpszTime,  
     DWORD cbTime                     
    );
 BOOL __stdcall InternetTimeToSystemTimeA(
     const char * lpszTime,          
     SYSTEMTIME *pst,         
     DWORD dwReserved
    );
 BOOL __stdcall InternetTimeToSystemTimeW(
     LPCWSTR lpszTime,         
     SYSTEMTIME *pst,         
     DWORD dwReserved
    );
 BOOL __stdcall InternetTimeToSystemTime(
     const char * lpszTime,          
     SYSTEMTIME *pst,         
     DWORD dwReserved
    );
 BOOL __stdcall
InternetCrackUrlA(
     const char * lpszUrl,
     DWORD dwUrlLength,
     DWORD dwFlags,
     LPURL_COMPONENTSA lpUrlComponents
    );
 BOOL __stdcall
InternetCrackUrlW(
     LPCWSTR lpszUrl,
     DWORD dwUrlLength,
     DWORD dwFlags,
     LPURL_COMPONENTSW lpUrlComponents
    );
 BOOL __stdcall
InternetCreateUrlA(
     LPURL_COMPONENTSA lpUrlComponents,
     DWORD dwFlags,
     LPSTR lpszUrl,
     LPDWORD lpdwUrlLength
    );
 BOOL __stdcall
InternetCreateUrlW(
     LPURL_COMPONENTSW lpUrlComponents,
     DWORD dwFlags,
     LPWSTR lpszUrl,
     LPDWORD lpdwUrlLength
    );
 BOOL __stdcall
InternetCanonicalizeUrlA(
     const char * lpszUrl,
     LPSTR lpszBuffer,
     LPDWORD lpdwBufferLength,
     DWORD dwFlags
    );
 BOOL __stdcall
InternetCanonicalizeUrlW(
     LPCWSTR lpszUrl,
     LPWSTR lpszBuffer,
     LPDWORD lpdwBufferLength,
     DWORD dwFlags
    );
 BOOL __stdcall
InternetCombineUrlA(
     const char * lpszBaseUrl,
     const char * lpszRelativeUrl,
     LPSTR lpszBuffer,
     LPDWORD lpdwBufferLength,
     DWORD dwFlags
    );
 BOOL __stdcall
InternetCombineUrlW(
     LPCWSTR lpszBaseUrl,
     LPCWSTR lpszRelativeUrl,
     LPWSTR lpszBuffer,
     LPDWORD lpdwBufferLength,
     DWORD dwFlags
    );
        
 HINTERNET __stdcall InternetOpenA(
     const char * lpszAgent,
     DWORD dwAccessType,
     const char * lpszProxy,
     const char * lpszProxyBypass,
     DWORD dwFlags
    );
 HINTERNET __stdcall InternetOpenW(
     LPCWSTR lpszAgent,
     DWORD dwAccessType,
     LPCWSTR lpszProxy,
     LPCWSTR lpszProxyBypass,
     DWORD dwFlags
    );
 BOOL __stdcall InternetCloseHandle(
     HINTERNET hInternet
    );
 HINTERNET __stdcall
InternetConnectA(
     HINTERNET hInternet,
     const char * lpszServerName,
     INTERNET_PORT nServerPort,
     const char * lpszUserName,
     const char * lpszPassword,
     DWORD dwService,
     DWORD dwFlags,
     DWORD_PTR dwContext
    );
 HINTERNET __stdcall
InternetConnectW(
     HINTERNET hInternet,
     LPCWSTR lpszServerName,
     INTERNET_PORT nServerPort,
     LPCWSTR lpszUserName,
     LPCWSTR lpszPassword,
     DWORD dwService,
     DWORD dwFlags,
     DWORD_PTR dwContext
    );
 HINTERNET __stdcall InternetOpenUrlA(
     HINTERNET hInternet,
     const char * lpszUrl,
     const char * lpszHeaders,
     DWORD dwHeadersLength,
     DWORD dwFlags,
     DWORD_PTR dwContext
    );
 HINTERNET __stdcall InternetOpenUrlW(
     HINTERNET hInternet,
     LPCWSTR lpszUrl,
     LPCWSTR lpszHeaders,
     DWORD dwHeadersLength,
     DWORD dwFlags,
     DWORD_PTR dwContext
    );
 BOOL __stdcall InternetReadFile(
     HINTERNET hFile,
      LPVOID lpBuffer,
     DWORD dwNumberOfBytesToRead,
     LPDWORD lpdwNumberOfBytesRead
    );
 BOOL __stdcall InternetReadFileExA(
     HINTERNET hFile,
      LPINTERNET_BUFFERSA lpBuffersOut,
     DWORD dwFlags,
     DWORD_PTR dwContext
    );
 BOOL __stdcall InternetReadFileExW(
     HINTERNET hFile,
      LPINTERNET_BUFFERSW lpBuffersOut,
     DWORD dwFlags,
     DWORD_PTR dwContext
    );
 DWORD __stdcall InternetSetFilePointer(
     HINTERNET hFile,
     LONG  lDistanceToMove,
     PLONG lpDistanceToMoveHigh,
     DWORD dwMoveMethod,
     DWORD_PTR dwContext
    );
 BOOL __stdcall InternetWriteFile(
     HINTERNET hFile,
     LPCVOID lpBuffer,
     DWORD dwNumberOfBytesToWrite,
     LPDWORD lpdwNumberOfBytesWritten
    );
 BOOL __stdcall InternetQueryDataAvailable(
     HINTERNET hFile,
     LPDWORD  lpdwNumberOfBytesAvailable,
     DWORD dwFlags,
     DWORD_PTR dwContext
    );
 BOOL __stdcall InternetFindNextFileA(
     HINTERNET hFind,
     LPVOID lpvFindData
    );
 BOOL __stdcall InternetFindNextFileW(
     HINTERNET hFind,
     LPVOID lpvFindData
    );
 BOOL __stdcall InternetQueryOptionA(
     HINTERNET hInternet,
     DWORD dwOption,
      LPVOID lpBuffer,
     LPDWORD lpdwBufferLength
    );
 BOOL __stdcall InternetQueryOptionW(
     HINTERNET hInternet,
     DWORD dwOption,
      LPVOID lpBuffer,
     LPDWORD lpdwBufferLength
    );
 BOOL __stdcall InternetSetOptionA(
     HINTERNET hInternet,
           DWORD dwOption,
     LPVOID lpBuffer,
           DWORD dwBufferLength
    );
 BOOL __stdcall InternetSetOptionW(
     HINTERNET hInternet,
           DWORD dwOption,
     LPVOID lpBuffer,
           DWORD dwBufferLength
    );
 BOOL __stdcall InternetSetOptionExA(
     HINTERNET hInternet,
           DWORD dwOption,
     LPVOID lpBuffer,
           DWORD dwBufferLength,
           DWORD dwFlags
    );
 BOOL __stdcall InternetSetOptionExW(
     HINTERNET hInternet,
           DWORD dwOption,
     LPVOID lpBuffer,
           DWORD dwBufferLength,
           DWORD dwFlags
    );
 BOOL __stdcall InternetLockRequestFile(
      HINTERNET hInternet,
     HANDLE * lphLockRequestInfo
    );
 BOOL __stdcall InternetUnlockRequestFile(
     HANDLE hLockRequestInfo
    );
 BOOL __stdcall
InternetGetLastResponseInfoA(
     LPDWORD lpdwError,
     LPSTR lpszBuffer,
     LPDWORD lpdwBufferLength
    );
 BOOL __stdcall
InternetGetLastResponseInfoW(
     LPDWORD lpdwError,
     LPWSTR lpszBuffer,
     LPDWORD lpdwBufferLength
    );
typedef
(__stdcall * INTERNET_STATUS___stdcall)(
     HINTERNET hInternet,
     DWORD_PTR dwContext,
     DWORD dwInternetStatus,
     LPVOID lpvStatusInformation,
     DWORD dwStatusInformationLength
    );
typedef INTERNET_STATUS___stdcall * LPINTERNET_STATUS___stdcall;
 INTERNET_STATUS___stdcall __stdcall InternetSetStatus__stdcallA(
     HINTERNET hInternet,
     INTERNET_STATUS___stdcall lpfnInternet__stdcall
    );
 INTERNET_STATUS___stdcall __stdcall InternetSetStatus__stdcallW(
     HINTERNET hInternet,
     INTERNET_STATUS___stdcall lpfnInternet__stdcall
    );
 INTERNET_STATUS___stdcall __stdcall InternetSetStatus__stdcall(
     HINTERNET hInternet,
     INTERNET_STATUS___stdcall lpfnInternet__stdcall
    );
typedef enum {
    COOKIE_STATE_UNKNOWN        = 0x0,
    COOKIE_STATE_ACCEPT         = 0x1,
    COOKIE_STATE_PROMPT         = 0x2,
    COOKIE_STATE_LEASH          = 0x3,
    COOKIE_STATE_DOWNGRADE      = 0x4,
    COOKIE_STATE_REJECT         = 0x5,
    COOKIE_STATE_MAX            = COOKIE_STATE_REJECT,
InternetCookieState;
typedef struct {
    int         cSession;           
    int         cPersistent;        
    int         cAccepted;          
    int         cLeashed;           
    int         cDowngraded;        
    int         cBlocked;           
    const char *pszLocation;        
                                    
IncomingCookieState;
typedef struct {
    int     cSent;
    int     cSuppressed;
    const char *pszLocation;        
                                    
OutgoingCookieState;
typedef struct {
    BOOL    fAccepted;
    BOOL    fLeashed;
    BOOL    fDowngraded;
    BOOL    fRejected;
InternetCookieHistory;
typedef struct {
    DWORD   dwCookieState;
    BOOL    fAllowSession;
CookieDecision;
 HINTERNET __stdcall FtpFindFirstFileA(
     HINTERNET hConnect,
     const char * lpszSearchFile,
     LPWIN32_FIND_DATAA lpFindFileData,
     DWORD dwFlags,
     DWORD_PTR dwContext
    );
 HINTERNET __stdcall FtpFindFirstFileW(
     HINTERNET hConnect,
     LPCWSTR lpszSearchFile,
     LPWIN32_FIND_DATAW lpFindFileData,
     DWORD dwFlags,
     DWORD_PTR dwContext
    );
 BOOL __stdcall FtpGetFileA(
     HINTERNET hConnect,
     const char * lpszRemoteFile,
     const char * lpszNewFile,
     BOOL fFailIfExists,
     DWORD dwFlagsAndAttributes,
     DWORD dwFlags,
     DWORD_PTR dwContext
    );
 BOOL __stdcall FtpGetFileW(
     HINTERNET hConnect,
     LPCWSTR lpszRemoteFile,
     LPCWSTR lpszNewFile,
     BOOL fFailIfExists,
     DWORD dwFlagsAndAttributes,
     DWORD dwFlags,
     DWORD_PTR dwContext
    );
 BOOL __stdcall FtpPutFileA(
     HINTERNET hConnect,
     const char * lpszLocalFile,
     const char * lpszNewRemoteFile,
     DWORD dwFlags,
     DWORD_PTR dwContext
    );
 BOOL __stdcall FtpPutFileW(
     HINTERNET hConnect,
     LPCWSTR lpszLocalFile,
     LPCWSTR lpszNewRemoteFile,
     DWORD dwFlags,
     DWORD_PTR dwContext
    );
 BOOL __stdcall FtpGetFileEx(
     HINTERNET hFtpSession,
     const char * lpszRemoteFile,
     LPCWSTR lpszNewFile,
     BOOL fFailIfExists,
     DWORD dwFlagsAndAttributes,
     DWORD dwFlags,
     DWORD_PTR dwContext
    );
 BOOL __stdcall FtpPutFileEx(
     HINTERNET hFtpSession,
     LPCWSTR lpszLocalFile,
     const char * lpszNewRemoteFile,
     DWORD dwFlags,
     DWORD_PTR dwContext
    );
 BOOL __stdcall FtpDeleteFileA(
     HINTERNET hConnect,
     const char * lpszFileName
    );
 BOOL __stdcall FtpDeleteFileW(
     HINTERNET hConnect,
     LPCWSTR lpszFileName
    );
 BOOL __stdcall FtpRenameFileA(
     HINTERNET hConnect,
     const char * lpszExisting,
     const char * lpszNew
    );
 BOOL __stdcall FtpRenameFileW(
     HINTERNET hConnect,
     LPCWSTR lpszExisting,
     LPCWSTR lpszNew
    );
 HINTERNET __stdcall FtpOpenFileA(
     HINTERNET hConnect,
     const char * lpszFileName,
     DWORD dwAccess,
     DWORD dwFlags,
     DWORD_PTR dwContext
    );
 HINTERNET __stdcall FtpOpenFileW(
     HINTERNET hConnect,
     LPCWSTR lpszFileName,
     DWORD dwAccess,
     DWORD dwFlags,
     DWORD_PTR dwContext
    );
 BOOL __stdcall FtpCreateDirectoryA(
     HINTERNET hConnect,
     const char * lpszDirectory
    );
 BOOL __stdcall FtpCreateDirectoryW(
     HINTERNET hConnect,
     LPCWSTR lpszDirectory
    );
 BOOL __stdcall FtpRemoveDirectoryA(
     HINTERNET hConnect,
     const char * lpszDirectory
    );
 BOOL __stdcall FtpRemoveDirectoryW(
     HINTERNET hConnect,
     LPCWSTR lpszDirectory
    );
 BOOL __stdcall FtpSetCurrentDirectoryA(
     HINTERNET hConnect,
     const char * lpszDirectory
    );
 BOOL __stdcall FtpSetCurrentDirectoryW(
     HINTERNET hConnect,
     LPCWSTR lpszDirectory
    );
 BOOL __stdcall FtpGetCurrentDirectoryA(
     HINTERNET hConnect,
     LPSTR lpszCurrentDirectory,
     LPDWORD lpdwCurrentDirectory
    );
 BOOL __stdcall FtpGetCurrentDirectoryW(
     HINTERNET hConnect,
     LPWSTR lpszCurrentDirectory,
     LPDWORD lpdwCurrentDirectory
    );
 BOOL __stdcall FtpCommandA(
     HINTERNET hConnect,
     BOOL fExpectResponse,
     DWORD dwFlags,
     const char * lpszCommand,
     DWORD_PTR dwContext,
     HINTERNET *phFtpCommand
    );
 BOOL __stdcall FtpCommandW(
     HINTERNET hConnect,
     BOOL fExpectResponse,
     DWORD dwFlags,
     LPCWSTR lpszCommand,
     DWORD_PTR dwContext,
     HINTERNET *phFtpCommand
    );
 DWORD __stdcall FtpGetFileSize(
     HINTERNET hFile,
     LPDWORD lpdwFileSizeHigh
    );
typedef struct {
    CHAR   DisplayString[128 + 1];
    DWORD GopherType;   
    DWORD SizeLow;
    DWORD SizeHigh;
    FILETIME LastModificationTime;
    CHAR   Locator[(1 + 128 + 1 + 256 + 1 + 256 + 1 + 5 + 1 + 1 + 2 ) + 1];
} GOPHER_FIND_DATAA, * LPGOPHER_FIND_DATAA;
typedef struct {
    WCHAR  DisplayString[128 + 1];
    DWORD GopherType;   
    DWORD SizeLow;
    DWORD SizeHigh;
    FILETIME LastModificationTime;
    WCHAR  Locator[(1 + 128 + 1 + 256 + 1 + 256 + 1 + 5 + 1 + 1 + 2 ) + 1];
} GOPHER_FIND_DATAW, * LPGOPHER_FIND_DATAW;
typedef GOPHER_FIND_DATAA GOPHER_FIND_DATA;
typedef LPGOPHER_FIND_DATAA LPGOPHER_FIND_DATA;
typedef struct {
    const char * Comment;
    const char * EmailAddress;
} GOPHER_ADMIN_ATTRIBUTE_TYPE, * LPGOPHER_ADMIN_ATTRIBUTE_TYPE;
typedef struct {
    FILETIME DateAndTime;
} GOPHER_MOD_DATE_ATTRIBUTE_TYPE, * LPGOPHER_MOD_DATE_ATTRIBUTE_TYPE;
typedef struct {
    DWORD Ttl;
} GOPHER_TTL_ATTRIBUTE_TYPE, * LPGOPHER_TTL_ATTRIBUTE_TYPE;
typedef struct {
    INT Score;
} GOPHER_SCORE_ATTRIBUTE_TYPE, * LPGOPHER_SCORE_ATTRIBUTE_TYPE;
typedef struct {
    INT LowerBound;
    INT UpperBound;
} GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, * LPGOPHER_SCORE_RANGE_ATTRIBUTE_TYPE;
typedef struct {
    const char * Site;
} GOPHER_SITE_ATTRIBUTE_TYPE, * LPGOPHER_SITE_ATTRIBUTE_TYPE;
typedef struct {
    const char * Organization;
} GOPHER_ORGANIZATION_ATTRIBUTE_TYPE, * LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPE;
typedef struct {
    const char * Location;
} GOPHER_LOCATION_ATTRIBUTE_TYPE, * LPGOPHER_LOCATION_ATTRIBUTE_TYPE;
typedef struct {
    INT DegreesNorth;
    INT MinutesNorth;
    INT SecondsNorth;
    INT DegreesEast;
    INT MinutesEast;
    INT SecondsEast;
} GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, * LPGOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE;
typedef struct {
    INT Zone;
} GOPHER_TIMEZONE_ATTRIBUTE_TYPE, * LPGOPHER_TIMEZONE_ATTRIBUTE_TYPE;
typedef struct {
    const char * Provider;
} GOPHER_PROVIDER_ATTRIBUTE_TYPE, * LPGOPHER_PROVIDER_ATTRIBUTE_TYPE;
typedef struct {
    const char * Version;
} GOPHER_VERSION_ATTRIBUTE_TYPE, * LPGOPHER_VERSION_ATTRIBUTE_TYPE;
typedef struct {
    const char * ShortAbstract;
    const char * AbstractFile;
} GOPHER_ABSTRACT_ATTRIBUTE_TYPE, * LPGOPHER_ABSTRACT_ATTRIBUTE_TYPE;
typedef struct {
    const char * ContentType;
    const char * Language;
    DWORD Size;
} GOPHER_VIEW_ATTRIBUTE_TYPE, * LPGOPHER_VIEW_ATTRIBUTE_TYPE;
typedef struct {
    BOOL TreeWalk;
} GOPHER_VERONICA_ATTRIBUTE_TYPE, * LPGOPHER_VERONICA_ATTRIBUTE_TYPE;
typedef struct {
    const char * QuestionType;
    const char * QuestionText;
} GOPHER_ASK_ATTRIBUTE_TYPE, * LPGOPHER_ASK_ATTRIBUTE_TYPE;
typedef struct {
    const char * Text;
} GOPHER_UNKNOWN_ATTRIBUTE_TYPE, * LPGOPHER_UNKNOWN_ATTRIBUTE_TYPE;
typedef struct {
    DWORD CategoryId;   
    DWORD AttributeId;  
    union {
        GOPHER_ADMIN_ATTRIBUTE_TYPE Admin;
        GOPHER_MOD_DATE_ATTRIBUTE_TYPE ModDate;
        GOPHER_TTL_ATTRIBUTE_TYPE Ttl;
        GOPHER_SCORE_ATTRIBUTE_TYPE Score;
        GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE ScoreRange;
        GOPHER_SITE_ATTRIBUTE_TYPE Site;
        GOPHER_ORGANIZATION_ATTRIBUTE_TYPE Organization;
        GOPHER_LOCATION_ATTRIBUTE_TYPE Location;
        GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE GeographicalLocation;
        GOPHER_TIMEZONE_ATTRIBUTE_TYPE TimeZone;
        GOPHER_PROVIDER_ATTRIBUTE_TYPE Provider;
        GOPHER_VERSION_ATTRIBUTE_TYPE Version;
        GOPHER_ABSTRACT_ATTRIBUTE_TYPE Abstract;
        GOPHER_VIEW_ATTRIBUTE_TYPE View;
        GOPHER_VERONICA_ATTRIBUTE_TYPE Veronica;
        GOPHER_ASK_ATTRIBUTE_TYPE Ask;
        GOPHER_UNKNOWN_ATTRIBUTE_TYPE Unknown;
    } AttributeType;
} GOPHER_ATTRIBUTE_TYPE, * LPGOPHER_ATTRIBUTE_TYPE;
 BOOL __stdcall GopherCreateLocatorA(
     const char * lpszHost,
     INTERNET_PORT nServerPort,
     const char * lpszDisplayString,
     const char * lpszSelectorString,
     DWORD dwGopherType,
     LPSTR lpszLocator,
     LPDWORD lpdwBufferLength
    );
 BOOL __stdcall GopherCreateLocatorW(
     LPCWSTR lpszHost,
     INTERNET_PORT nServerPort,
     LPCWSTR lpszDisplayString,
     LPCWSTR lpszSelectorString,
     DWORD dwGopherType,
     LPWSTR lpszLocator,
     LPDWORD lpdwBufferLength
    );
 BOOL __stdcall GopherGetLocatorTypeA(
     const char * lpszLocator,
     LPDWORD lpdwGopherType
    );
 BOOL __stdcall GopherGetLocatorTypeW(
     LPCWSTR lpszLocator,
     LPDWORD lpdwGopherType
    );
 HINTERNET __stdcall GopherFindFirstFileA(
     HINTERNET hConnect,
     const char * lpszLocator,
     const char * lpszSearchString,
     LPGOPHER_FIND_DATAA lpFindData,
     DWORD dwFlags,
     DWORD_PTR dwContext
    );
 HINTERNET __stdcall GopherFindFirstFileW(
     HINTERNET hConnect,
     LPCWSTR lpszLocator,
     LPCWSTR lpszSearchString,
     LPGOPHER_FIND_DATAW lpFindData,
     DWORD dwFlags,
     DWORD_PTR dwContext
    );
 HINTERNET __stdcall GopherOpenFileA(
     HINTERNET hConnect,
     const char * lpszLocator,
     const char * lpszView,
     DWORD dwFlags,
     DWORD_PTR dwContext
    );
 HINTERNET __stdcall GopherOpenFileW(
     HINTERNET hConnect,
     LPCWSTR lpszLocator,
     LPCWSTR lpszView,
     DWORD dwFlags,
     DWORD_PTR dwContext
    );
typedef BOOL (__stdcall * GOPHER_ATTRIBUTE_ENUMERATOR)(
     LPGOPHER_ATTRIBUTE_TYPE lpAttributeInfo,
     DWORD dwError
    );
 BOOL __stdcall GopherGetAttributeA(
     HINTERNET hConnect,
     const char * lpszLocator,
     const char * lpszAttributeName,
      LPBYTE lpBuffer,
     DWORD dwBufferLength,
     LPDWORD lpdwCharactersReturned,
     GOPHER_ATTRIBUTE_ENUMERATOR lpfnEnumerator,
     DWORD_PTR dwContext
    );
 BOOL __stdcall GopherGetAttributeW(
     HINTERNET hConnect,
     LPCWSTR lpszLocator,
     LPCWSTR lpszAttributeName,
      LPBYTE lpBuffer,
     DWORD dwBufferLength,
     LPDWORD lpdwCharactersReturned,
     GOPHER_ATTRIBUTE_ENUMERATOR lpfnEnumerator,
     DWORD_PTR dwContext
    );
 HINTERNET __stdcall HttpOpenRequestA(
     HINTERNET hConnect,
     const char * lpszVerb,
     const char * lpszObjectName,
     const char * lpszVersion,
     const char * lpszReferrer,
     const char *  * lplpszAcceptTypes,
     DWORD dwFlags,
     DWORD_PTR dwContext
    );
 HINTERNET __stdcall HttpOpenRequestW(
     HINTERNET hConnect,
     LPCWSTR lpszVerb,
     LPCWSTR lpszObjectName,
     LPCWSTR lpszVersion,
     LPCWSTR lpszReferrer,
     LPCWSTR  * lplpszAcceptTypes,
     DWORD dwFlags,
     DWORD_PTR dwContext
    );
 BOOL __stdcall HttpAddRequestHeadersA(
     HINTERNET hRequest,
     const char * lpszHeaders,
     DWORD dwHeadersLength,
     DWORD dwModifiers
    );
 BOOL __stdcall HttpAddRequestHeadersW(
     HINTERNET hRequest,
     LPCWSTR lpszHeaders,
     DWORD dwHeadersLength,
     DWORD dwModifiers
    );
 BOOL __stdcall HttpSendRequestA(
     HINTERNET hRequest,
     const char * lpszHeaders,
     DWORD dwHeadersLength,
     LPVOID lpOptional,
     DWORD dwOptionalLength
    );
 BOOL __stdcall HttpSendRequestW(
     HINTERNET hRequest,
     LPCWSTR lpszHeaders,
     DWORD dwHeadersLength,
     LPVOID lpOptional,
     DWORD dwOptionalLength
    );
 BOOL __stdcall HttpSendRequestExA(
     HINTERNET hRequest,
     LPINTERNET_BUFFERSA lpBuffersIn,
     LPINTERNET_BUFFERSA lpBuffersOut,
     DWORD dwFlags,
     DWORD_PTR dwContext
    );
 BOOL __stdcall HttpSendRequestExW(
     HINTERNET hRequest,
     LPINTERNET_BUFFERSW lpBuffersIn,
     LPINTERNET_BUFFERSW lpBuffersOut,
     DWORD dwFlags,
     DWORD_PTR dwContext
    );
 BOOL __stdcall HttpEndRequestA(
     HINTERNET hRequest,
     LPINTERNET_BUFFERSA lpBuffersOut,
     DWORD dwFlags,
     DWORD_PTR dwContext
    );
 BOOL __stdcall HttpEndRequestW(
     HINTERNET hRequest,
     LPINTERNET_BUFFERSW lpBuffersOut,
     DWORD dwFlags,
     DWORD_PTR dwContext
    );
 BOOL __stdcall HttpQueryInfoA(
     HINTERNET hRequest,
     DWORD dwInfoLevel,
      LPVOID lpBuffer,
     LPDWORD lpdwBufferLength,
     LPDWORD lpdwIndex
    );
 BOOL __stdcall HttpQueryInfoW(
     HINTERNET hRequest,
     DWORD dwInfoLevel,
      LPVOID lpBuffer,
     LPDWORD lpdwBufferLength,
     LPDWORD lpdwIndex
    );
 BOOL __stdcall
InternetSetCookieA(
     const char * lpszUrl,
     const char * lpszCookieName,
     const char * lpszCookieData
    );
 BOOL __stdcall
InternetSetCookieW(
     LPCWSTR lpszUrl,
     LPCWSTR lpszCookieName,
     LPCWSTR lpszCookieData
    );
 BOOL __stdcall
InternetGetCookieA(
     const char * lpszUrl,
     const char * lpszCookieName,
     LPSTR lpszCookieData,
     LPDWORD lpdwSize
    );
 BOOL __stdcall
InternetGetCookieW(
     LPCWSTR lpszUrl,
     LPCWSTR lpszCookieName,
     LPWSTR lpszCookieData,
     LPDWORD lpdwSize
    );
 DWORD __stdcall
InternetSetCookieExA(
     const char * lpszUrl,
     const char * lpszCookieName,
     const char * lpszCookieData,
     DWORD dwFlags,
     DWORD_PTR dwReserved
    );
 DWORD __stdcall
InternetSetCookieExW(
     LPCWSTR lpszUrl,
     LPCWSTR lpszCookieName,
     LPCWSTR lpszCookieData,
     DWORD dwFlags,
     DWORD_PTR dwReserved
    );
 BOOL __stdcall
InternetGetCookieExA(
     const char * lpszUrl,
     const char * lpszCookieName,
     LPSTR lpszCookieData,
     LPDWORD lpdwSize,
     DWORD dwFlags,
     LPVOID lpReserved
    );
 BOOL __stdcall
InternetGetCookieExW(
     LPCWSTR lpszUrl,
     LPCWSTR lpszCookieName,
     LPWSTR lpszCookieData,
     LPDWORD lpdwSize,
     DWORD dwFlags,
     LPVOID lpReserved
    );
 DWORD __stdcall
InternetAttemptConnect(
     DWORD dwReserved
    );
 BOOL __stdcall
InternetCheckConnectionA(
     const char * lpszUrl,
     DWORD dwFlags,
     DWORD dwReserved
    );
 BOOL __stdcall
InternetCheckConnectionW(
     LPCWSTR lpszUrl,
     DWORD dwFlags,
     DWORD dwReserved
    );
DWORD InternetAuthNotify__stdcall
    DWORD_PTR       dwContext,    
    DWORD           dwReturn,     
    LPVOID          lpReserved    
typedef DWORD (__stdcall * PFN_AUTH_NOTIFY) (DWORD_PTR, DWORD, LPVOID);
typedef struct
    DWORD            cbStruct;    
    DWORD            dwOptions;   
    PFN_AUTH_NOTIFY  pfnNotify;   
    DWORD_PTR        dwContext;   
    INTERNET_AUTH_NOTIFY_DATA;
 BOOL __stdcall ResumeSuspendedDownload(
     HINTERNET hRequest,
     DWORD dwResultCode
    );
 DWORD __stdcall InternetErrorDlg(
     HWND hWnd,
     HINTERNET hRequest,
     DWORD dwError,
     DWORD dwFlags,
     LPVOID * lppvData
    );
 DWORD __stdcall InternetConfirmZoneCrossingA(
     HWND hWnd,
     LPSTR szUrlPrev,
     LPSTR szUrlNew,
     BOOL bPost
    );
 DWORD __stdcall InternetConfirmZoneCrossingW(
     HWND hWnd,
     LPWSTR szUrlPrev,
     LPWSTR szUrlNew,
     BOOL bPost
    );
 DWORD __stdcall InternetConfirmZoneCrossing(
     HWND hWnd,
     LPSTR szUrlPrev,
     LPSTR szUrlNew,
     BOOL bPost
    );
typedef struct _INTERNET_CACHE_ENTRY_INFOA {
    DWORD dwStructSize;         
    LPSTR   lpszSourceUrlName;    
    LPSTR   lpszLocalFileName;  
    DWORD CacheEntryType;       
    DWORD dwUseCount;           
    DWORD dwHitRate;            
    DWORD dwSizeLow;            
    DWORD dwSizeHigh;           
    FILETIME LastModifiedTime;  
    FILETIME ExpireTime;        
    FILETIME LastAccessTime;    
    FILETIME LastSyncTime;      
                                
    LPSTR   lpHeaderInfo;        
    DWORD dwHeaderInfoSize;     
    LPSTR   lpszFileExtension;  
        union {                     
                DWORD dwReserved;
                DWORD dwExemptDelta;
    };                          
} INTERNET_CACHE_ENTRY_INFOA, * LPINTERNET_CACHE_ENTRY_INFOA;
typedef struct _INTERNET_CACHE_ENTRY_INFOW {
    DWORD dwStructSize;         
    LPWSTR  lpszSourceUrlName;    
    LPWSTR  lpszLocalFileName;  
    DWORD CacheEntryType;       
    DWORD dwUseCount;           
    DWORD dwHitRate;            
    DWORD dwSizeLow;            
    DWORD dwSizeHigh;           
    FILETIME LastModifiedTime;  
    FILETIME ExpireTime;        
    FILETIME LastAccessTime;    
    FILETIME LastSyncTime;      
                                
    LPWSTR  lpHeaderInfo;        
    DWORD dwHeaderInfoSize;     
    LPWSTR  lpszFileExtension;  
        union {                     
                DWORD dwReserved;
                DWORD dwExemptDelta;
    };                          
} INTERNET_CACHE_ENTRY_INFOW, * LPINTERNET_CACHE_ENTRY_INFOW;
typedef INTERNET_CACHE_ENTRY_INFOA INTERNET_CACHE_ENTRY_INFO;
typedef LPINTERNET_CACHE_ENTRY_INFOA LPINTERNET_CACHE_ENTRY_INFO;
typedef struct _INTERNET_CACHE_TIMESTAMPS {
    FILETIME    ftExpires;
    FILETIME    ftLastModified;
} INTERNET_CACHE_TIMESTAMPS, *LPINTERNET_CACHE_TIMESTAMPS;
typedef LONGLONG GROUPID;
typedef struct _INTERNET_CACHE_GROUP_INFOA {
    DWORD           dwGroupSize;
    DWORD           dwGroupFlags;
    DWORD           dwGroupType;
    DWORD           dwDiskUsage;    
    DWORD           dwDiskQuota;    
    DWORD           dwOwnerStorage[4];
    CHAR            szGroupName[120];
} INTERNET_CACHE_GROUP_INFOA, * LPINTERNET_CACHE_GROUP_INFOA;
typedef struct _INTERNET_CACHE_GROUP_INFOW {
    DWORD           dwGroupSize;
    DWORD           dwGroupFlags;
    DWORD           dwGroupType;
    DWORD           dwDiskUsage;    
    DWORD           dwDiskQuota;    
    DWORD           dwOwnerStorage[4];
    WCHAR           szGroupName[120];
} INTERNET_CACHE_GROUP_INFOW, * LPINTERNET_CACHE_GROUP_INFOW;
typedef INTERNET_CACHE_GROUP_INFOA INTERNET_CACHE_GROUP_INFO;
typedef LPINTERNET_CACHE_GROUP_INFOA LPINTERNET_CACHE_GROUP_INFO;
 BOOL __stdcall CreateUrlCacheEntryA(
           const char * lpszUrlName,
           DWORD dwExpectedFileSize,
     const char * lpszFileExtension,
     LPSTR lpszFileName,
           DWORD dwReserved
    );
 BOOL __stdcall CreateUrlCacheEntryW(
           LPCWSTR lpszUrlName,
           DWORD dwExpectedFileSize,
     LPCWSTR lpszFileExtension,
     LPWSTR lpszFileName,
           DWORD dwReserved
    );
 BOOL __stdcall
CommitUrlCacheEntryA(
     const char * lpszUrlName,
     const char * lpszLocalFileName,
     FILETIME ExpireTime,
     FILETIME LastModifiedTime,
     DWORD CacheEntryType,
     LPBYTE lpHeaderInfo,
     DWORD dwHeaderSize,
     const char * lpszFileExtension,
     const char * lpszOriginalUrl
    );
 BOOL __stdcall
CommitUrlCacheEntryW(
     LPCWSTR lpszUrlName,
     LPCWSTR lpszLocalFileName,
     FILETIME ExpireTime,
     FILETIME LastModifiedTime,
     DWORD CacheEntryType,
     LPWSTR lpszHeaderInfo,
     DWORD dwHeaders,
     LPCWSTR lpszFileExtension,
     LPCWSTR lpszOriginalUrl
    );
 BOOL __stdcall
RetrieveUrlCacheEntryFileA(
     const char * lpszUrlName,
     LPINTERNET_CACHE_ENTRY_INFOA lpCacheEntryInfo,
     LPDWORD lpcbCacheEntryInfo,
     DWORD dwReserved
    );
 BOOL __stdcall
RetrieveUrlCacheEntryFileW(
     LPCWSTR lpszUrlName,
     LPINTERNET_CACHE_ENTRY_INFOW lpCacheEntryInfo,
     LPDWORD lpcbCacheEntryInfo,
     DWORD dwReserved
    );
 BOOL __stdcall UnlockUrlCacheEntryFileA(
     const char * lpszUrlName,
     DWORD dwReserved
    );
 BOOL __stdcall UnlockUrlCacheEntryFileW(
     LPCWSTR lpszUrlName,
     DWORD dwReserved
    );
 BOOL __stdcall UnlockUrlCacheEntryFile(
     const char * lpszUrlName,
     DWORD dwReserved
    );
 HANDLE __stdcall
RetrieveUrlCacheEntryStreamA(
     const char *  lpszUrlName,
     LPINTERNET_CACHE_ENTRY_INFOA lpCacheEntryInfo,
     LPDWORD lpcbCacheEntryInfo,
     BOOL fRandomRead,
     DWORD dwReserved
    );
 HANDLE __stdcall
RetrieveUrlCacheEntryStreamW(
     LPCWSTR  lpszUrlName,
     LPINTERNET_CACHE_ENTRY_INFOW lpCacheEntryInfo,
     LPDWORD lpcbCacheEntryInfo,
     BOOL fRandomRead,
     DWORD dwReserved
    );
 BOOL __stdcall
ReadUrlCacheEntryStream(
     HANDLE hUrlCacheStream,
     DWORD dwLocation,
      LPVOID lpBuffer,
     LPDWORD lpdwLen,
     DWORD Reserved
    );
 BOOL __stdcall
ReadUrlCacheEntryStreamEx(
     HANDLE hUrlCacheStream,
     DWORDLONG qwLocation,
      LPVOID lpBuffer,
     LPDWORD lpdwLen
    );
 BOOL __stdcall
UnlockUrlCacheEntryStream(
     HANDLE hUrlCacheStream,
     DWORD Reserved
    );
 BOOL __stdcall
GetUrlCacheEntryInfoA(
     const char * lpszUrlName,
     LPINTERNET_CACHE_ENTRY_INFOA lpCacheEntryInfo,
     LPDWORD lpcbCacheEntryInfo
    );
 BOOL __stdcall
GetUrlCacheEntryInfoW(
     LPCWSTR lpszUrlName,
     LPINTERNET_CACHE_ENTRY_INFOW lpCacheEntryInfo,
     LPDWORD lpcbCacheEntryInfo
    );
 HANDLE __stdcall FindFirstUrlCacheGroup(
          DWORD                           dwFlags,
          DWORD                           dwFilter,
        LPVOID                          lpSearchCondition,
        DWORD                           dwSearchCondition,
         GROUPID*                        lpGroupId,
        LPVOID                          lpReserved
    );
 BOOL __stdcall FindNextUrlCacheGroup(
     HANDLE                               hFind,
     GROUPID*                            lpGroupId,
     LPVOID                             lpReserved
    );
 BOOL __stdcall GetUrlCacheGroupAttributeA(
          GROUPID                         gid,
        DWORD                           dwFlags,
          DWORD                           dwAttributes,
     LPINTERNET_CACHE_GROUP_INFOA lpGroupInfo,
       LPDWORD                         lpdwGroupInfo,
        LPVOID                          lpReserved
    );
 BOOL __stdcall GetUrlCacheGroupAttributeW(
          GROUPID                         gid,
        DWORD                           dwFlags,
          DWORD                           dwAttributes,
     LPINTERNET_CACHE_GROUP_INFOW lpGroupInfo,
       LPDWORD                         lpdwGroupInfo,
        LPVOID                          lpReserved
    );
 BOOL __stdcall SetUrlCacheGroupAttributeA(
        GROUPID                         gid,
      DWORD                           dwFlags,
        DWORD                           dwAttributes,
        LPINTERNET_CACHE_GROUP_INFOA    lpGroupInfo,
      LPVOID                          lpReserved
    );
 BOOL __stdcall SetUrlCacheGroupAttributeW(
        GROUPID                         gid,
      DWORD                           dwFlags,
        DWORD                           dwAttributes,
        LPINTERNET_CACHE_GROUP_INFOW    lpGroupInfo,
      LPVOID                          lpReserved
    );
 BOOL __stdcall
GetUrlCacheEntryInfoExA(
     const char * lpszUrl,
     LPINTERNET_CACHE_ENTRY_INFOA lpCacheEntryInfo,
     LPDWORD lpcbCacheEntryInfo,
     LPSTR lpszRedirectUrl,
     LPDWORD lpcbRedirectUrl,
     LPVOID lpReserved,
     DWORD dwFlags
    );
 BOOL __stdcall
GetUrlCacheEntryInfoExW(
     LPCWSTR lpszUrl,
     LPINTERNET_CACHE_ENTRY_INFOW lpCacheEntryInfo,
     LPDWORD lpcbCacheEntryInfo,
     LPWSTR lpszRedirectUrl,
     LPDWORD lpcbRedirectUrl,
     LPVOID lpReserved,
     DWORD dwFlags
    );
 BOOL __stdcall SetUrlCacheEntryInfoA(
     const char * lpszUrlName,
     LPINTERNET_CACHE_ENTRY_INFOA lpCacheEntryInfo,
     DWORD dwFieldControl
    );
 BOOL __stdcall SetUrlCacheEntryInfoW(
     LPCWSTR lpszUrlName,
     LPINTERNET_CACHE_ENTRY_INFOW lpCacheEntryInfo,
     DWORD dwFieldControl
    );
 GROUPID __stdcall CreateUrlCacheGroup(
       DWORD  dwFlags,
     LPVOID lpReserved
    );
 BOOL __stdcall DeleteUrlCacheGroup(
       GROUPID GroupId,
       DWORD   dwFlags,       
     LPVOID  lpReserved
    );
 BOOL __stdcall SetUrlCacheEntryGroupA(
       const char *   lpszUrlName,
       DWORD    dwFlags,
       GROUPID  GroupId,
     LPBYTE   pbGroupAttributes,
     DWORD    cbGroupAttributes,
     LPVOID   lpReserved
    );
 BOOL __stdcall SetUrlCacheEntryGroupW(
       LPCWSTR  lpszUrlName,
       DWORD    dwFlags,
       GROUPID  GroupId,
     LPBYTE   pbGroupAttributes,
     DWORD    cbGroupAttributes,
     LPVOID   lpReserved
    );
 BOOL __stdcall SetUrlCacheEntryGroup(
       const char *   lpszUrlName,
       DWORD    dwFlags,
       GROUPID  GroupId,
     LPBYTE   pbGroupAttributes,
     DWORD    cbGroupAttributes,
     LPVOID   lpReserved
    );
 HANDLE __stdcall
FindFirstUrlCacheEntryExA(
     const char *  lpszUrlSearchPattern,
     DWORD dwFlags,
     DWORD  dwFilter,
     GROUPID  GroupId,
     LPINTERNET_CACHE_ENTRY_INFOA lpFirstCacheEntryInfo,
     LPDWORD lpcbEntryInfo,
     LPVOID lpGroupAttributes,
     LPDWORD lpcbGroupAttributes,
     LPVOID lpReserved
    );
 HANDLE __stdcall
FindFirstUrlCacheEntryExW(
     LPCWSTR  lpszUrlSearchPattern,
     DWORD dwFlags,
     DWORD  dwFilter,
     GROUPID  GroupId,
     LPINTERNET_CACHE_ENTRY_INFOW lpFirstCacheEntryInfo,
     LPDWORD lpcbEntryInfo,
     LPVOID lpGroupAttributes,
     LPDWORD lpcbGroupAttributes,
     LPVOID lpReserved
    );
 BOOL __stdcall
FindNextUrlCacheEntryExA(
     HANDLE hEnumHandle,
     LPINTERNET_CACHE_ENTRY_INFOA lpNextCacheEntryInfo,
     LPDWORD lpcbEntryInfo,
     LPVOID lpGroupAttributes,
     LPDWORD lpcbGroupAttributes,
     LPVOID lpReserved
    );
 BOOL __stdcall
FindNextUrlCacheEntryExW(
     HANDLE hEnumHandle,
     LPINTERNET_CACHE_ENTRY_INFOW lpNextCacheEntryInfo,
     LPDWORD lpcbEntryInfo,
     LPVOID lpGroupAttributes,
     LPDWORD lpcbGroupAttributes,
     LPVOID lpReserved
    );
 HANDLE __stdcall
FindFirstUrlCacheEntryA(
     const char * lpszUrlSearchPattern,
     LPINTERNET_CACHE_ENTRY_INFOA lpFirstCacheEntryInfo,
     LPDWORD lpcbCacheEntryInfo
    );
 HANDLE __stdcall
FindFirstUrlCacheEntryW(
     LPCWSTR lpszUrlSearchPattern,
     LPINTERNET_CACHE_ENTRY_INFOW lpFirstCacheEntryInfo,
     LPDWORD lpcbCacheEntryInfo
    );
 BOOL __stdcall
FindNextUrlCacheEntryA(
     HANDLE hEnumHandle,
     LPINTERNET_CACHE_ENTRY_INFOA lpNextCacheEntryInfo,
     LPDWORD lpcbCacheEntryInfo
    );
 BOOL __stdcall
FindNextUrlCacheEntryW(
     HANDLE hEnumHandle,
     LPINTERNET_CACHE_ENTRY_INFOW lpNextCacheEntryInfo,
     LPDWORD lpcbCacheEntryInfo
    );
 BOOL __stdcall FindCloseUrlCache(
     HANDLE hEnumHandle
    );
 BOOL __stdcall DeleteUrlCacheEntryA(
     const char * lpszUrlName
    );
 BOOL __stdcall DeleteUrlCacheEntryW(
     LPCWSTR lpszUrlName
    );
 BOOL __stdcall DeleteUrlCacheEntry(
     const char * lpszUrlName
    );
 DWORD __stdcall InternetDialA(
     HWND     hwndParent,
     LPSTR   lpszConnectoid,
     DWORD    dwFlags,
     DWORD_PTR *lpdwConnection,
     DWORD    dwReserved
    );
 DWORD __stdcall InternetDialW(
     HWND     hwndParent,
     LPWSTR   lpszConnectoid,
     DWORD    dwFlags,
     DWORD_PTR *lpdwConnection,
     DWORD    dwReserved
    );
 DWORD __stdcall InternetDial(
     HWND     hwndParent,
     LPSTR   lpszConnectoid,
     DWORD    dwFlags,
     LPDWORD lpdwConnection,
     DWORD    dwReserved
    );
 DWORD __stdcall InternetHangUp(
       DWORD_PTR    dwConnection,
     DWORD        dwReserved);
 BOOL __stdcall InternetGoOnlineA(
     const char * lpszURL,
     HWND     hwndParent,
     DWORD    dwFlags
    );
 BOOL __stdcall InternetGoOnlineW(
     LPCWSTR lpszURL,
     HWND     hwndParent,
     DWORD    dwFlags
    );
 BOOL __stdcall InternetGoOnline(
     LPSTR   lpszURL,
     HWND     hwndParent,
     DWORD    dwFlags
    );
 BOOL __stdcall InternetAutodial(
           DWORD  dwFlags,
     HWND   hwndParent);
 BOOL __stdcall InternetAutodialHangup(
     DWORD    dwReserved);
 BOOL __stdcall InternetGetConnectedState(
      LPDWORD  lpdwFlags,
     DWORD    dwReserved);
 BOOL __stdcall
InternetGetConnectedStateExA(
     LPDWORD lpdwFlags,
     LPSTR lpszConnectionName,
     DWORD dwBufLen,
     DWORD dwReserved
    );
 BOOL __stdcall
InternetGetConnectedStateExW(
     LPDWORD lpdwFlags,
     LPWSTR lpszConnectionName,
     DWORD dwBufLen,
     DWORD dwReserved
    );
struct AutoProxyHelperFunctions;
typedef struct AutoProxyHelperVtbl
    BOOL ( __stdcall *IsResolvable )(
            LPSTR   lpszHost);
    DWORD ( __stdcall *GetIPAddress )(
           LPSTR   lpszIPAddress,
           LPDWORD lpdwIPAddressSize);
    DWORD ( __stdcall *ResolveHostName )(
           LPSTR   lpszHostName,
           LPSTR   lpszIPAddress,
           LPDWORD lpdwIPAddressSize);
    BOOL ( __stdcall *IsInNet )(
            LPSTR   lpszIPAddress,
            LPSTR   lpszDest,
            LPSTR   lpszMask);
    BOOL ( __stdcall *IsResolvableEx )(
            LPSTR lpszHost
        );
    DWORD ( __stdcall *GetIPAddressEx )(
            LPSTR     lpszIPAddress,
            LPDWORD lpdwIPAddressSize
        );
    DWORD ( __stdcall *ResolveHostNameEx )(
            LPSTR lpszHostName,
            LPSTR lpszIPAddress,
            LPDWORD lpdwIPAddressSize
        );
    BOOL ( __stdcall *IsInNetEx )(
            LPSTR lpszIPAddress,
            LPSTR lpszIPPrefix
        );
    DWORD ( __stdcall *SortIpList )(
            LPSTR lpszIPAddressList,
            LPSTR lpszIPSortedList,
            LPDWORD lpdwIPSortedListSize
        );
}AutoProxyHelperVtbl;
typedef struct
    DWORD dwStructSize;              
    LPSTR lpszScriptBuffer;          
    DWORD dwScriptBufferSize;        
} AUTO_PROXY_SCRIPT_BUFFER, *LPAUTO_PROXY_SCRIPT_BUFFER;
typedef struct AutoProxyHelperFunctions
    const struct AutoProxyHelperVtbl * lpVtbl;
} AutoProxyHelperFunctions;
typedef BOOL ( __stdcall *pfnInternetInitializeAutoProxyDll)(DWORD dwVersion,
                           LPSTR lpszDownloadedTempFile,
                           LPSTR lpszMime,
                           AutoProxyHelperFunctions* lpAutoProxy__stdcalls,
                           LPAUTO_PROXY_SCRIPT_BUFFER lpAutoProxyScriptBuffer );
typedef BOOL (__stdcall *pfnInternetDeInitializeAutoProxyDll)(LPSTR lpszMime,
                           DWORD dwReserved);
typedef BOOL (__stdcall *pfnInternetGetProxyInfo)(const char * lpszUrl,
                           DWORD dwUrlLength,
                           LPSTR lpszUrlHostName,
                           DWORD dwUrlHostNameLength,
                           LPSTR* lplpszProxyHostName,
                           LPDWORD lpdwProxyHostNameLength);
typedef enum{
    WPAD_CACHE_DELETE_CURRENT = 0x0,
    WPAD_CACHE_DELETE_ALL = 0x1
} WPAD_CACHE_DELETE;
 BOOL __stdcall DeleteWpadCacheForNetworks(
     WPAD_CACHE_DELETE
 BOOL __stdcall InternetInitializeAutoProxyDll(
     DWORD dwReserved
    );
 BOOL __stdcall DetectAutoProxyUrl(
     LPSTR lpszAutoProxyUrl,
     DWORD dwAutoProxyUrlLength,
     DWORD dwDetectFlags
    );
 BOOL __stdcall CreateMD5SSOHash (
     PWSTR    pszChallengeInfo,
     PWSTR    pwszRealm,
     PWSTR    pwszTarget,
     PBYTE   pbHexHash
    );
 BOOL __stdcall InternetGetConnectedStateEx(
     LPDWORD lpdwFlags,
     LPSTR lpszConnectionName,
     DWORD dwNameLen,
     DWORD dwReserved
    );
typedef DWORD (__stdcall * PFN_DIAL_HANDLER) (HWND, const char *, DWORD, LPDWORD);
 BOOL __stdcall InternetSetDialStateA(
     const char * lpszConnectoid,
     DWORD    dwState,
     DWORD    dwReserved
    );
 BOOL __stdcall InternetSetDialStateW(
     LPCWSTR lpszConnectoid,
     DWORD    dwState,
     DWORD    dwReserved
    );
 BOOL __stdcall InternetSetDialState(
     const char * lpszConnectoid,
     DWORD    dwState,
     DWORD    dwReserved
    );
 BOOL __stdcall InternetSetPerSiteCookieDecisionA(
     const char * pchHostName,
     DWORD dwDecision
 BOOL __stdcall InternetSetPerSiteCookieDecisionW(
     LPCWSTR pchHostName,
     DWORD dwDecision
 BOOL __stdcall InternetGetPerSiteCookieDecisionA(
     const char * pchHostName,
     unsigned long* pResult
 BOOL __stdcall InternetGetPerSiteCookieDecisionW(
     LPCWSTR pchHostName,
     unsigned long* pResult
 BOOL __stdcall InternetClearAllPerSiteCookieDecisions();
 BOOL __stdcall InternetEnumPerSiteCookieDecisionA(
     LPSTR pszSiteName,
     unsigned long *pcSiteNameSize,
     unsigned long *pdwDecision,
     unsigned long dwIndex
 BOOL __stdcall InternetEnumPerSiteCookieDecisionW(
     LPWSTR pszSiteName,
     unsigned long *pcSiteNameSize,
     unsigned long *pdwDecision,
     unsigned long dwIndex
 DWORD __stdcall
PrivacySetZonePreferenceW(
     DWORD       dwZone,
     DWORD       dwType,
     DWORD       dwTemplate,
     LPCWSTR     pszPreference
    );
 DWORD __stdcall
PrivacyGetZonePreferenceW(
     DWORD dwZone,
     DWORD dwType,
     LPDWORD pdwTemplate,
     LPWSTR pszBuffer,
     LPDWORD pdwBufferLength
    );
require
InternetAttemptConnect
CloseHandle
InternetOpen failed()
winerror!INTERNET_OPEN_TYPE_PRECONFIG	pstr
InternetOpenA
CloseHandle
InternetOpen failed()
winerror
INTERNET_OPEN_TYPE_PROXY	pstr
InternetOpenA
cleanup
CloseHandle
table	type
CloseHandle
InternetConnect() failed!
winerror
service
InternetConnectA
getProxyHandle
getActiveHandle
scheme
%s:%s:%d:%s:%s
format
string
no_cache_conn
password	user!INTERNET_INVALID_PORT_NUMBER
tonumber
is_https	port
Invalid argument 'in_url'
InternetCloseHandle
InternetWriteFile() failed
maybeError
InternetWriteFile7
DWORD[1]
string
maybeError
sizeof
InternetReadFile
DWORD[1]
char[2048]
ERROR_INTERNET_FORCE_RETRY
InternetErrorDlg
flags'FLAGS_ERROR_UI_FLAGS_GENERATE_DATA(FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS%FLAGS_ERROR_UI_FILTER_FOR_ERRORS
No window handle provided
InternetSetOption() failed
maybeError
sizeof
void*	cast
InternetSetOptionA
char[?]
tostring
DWORD[1]
number	type
maybeError
GetLastError
InternetQueryOptionA
sizeof
DWORD[1]
string
char[?]
maybeError
ERROR_INSUFFICIENT_BUFFER
GetLastError
InternetQueryOptionA
DWORD[1]
inetSetOption
ipairs
CloseHandle
cleanup
setTimeout$INTERNET_OPTION_CONNECT_TIMEOUT&INTERNET_OPTION_DATA_SEND_TIMEOUT)INTERNET_OPTION_DATA_RECEIVE_TIMEOUT$INTERNET_OPTION_RECEIVE_TIMEOUT!INTERNET_OPTION_SEND_TIMEOUT
inetGetStringOption
inetGetStructOption
inetSetOption
errorDialog
inetFileSource
inetFileSink
CloseHandle
connect
gopher
INTERNET_SERVICE_GOPHER
ftp#INTERNET_FLAG_EXISTING_CONNECT
INTERNET_FLAG_PASSIVE
INTERNET_SERVICE_FTP
INTERNET_FLAG_SECURE
service
INTERNET_SERVICE_HTTP
getUserAgent
setUserAgent
setMaxRedirects
getMaxRedirects
getProxyHandle
getActiveHandle
attemptConnect
setWindowHandle
Lua/WinInet - 1.0.0
wininet.dll
wininet.url
wininet	NULL
wininet.defs
require
CipherModes
EXPORTABLE
CREATE_SALT
SILENT
SERVER
VERIFYCONTEXT
NEWKEYSET
NO_SALT
UPDATE_KEY
DELETE_KEYSET
MACHINE_KEYSET
BAD_LEN
BAD_PROV_TYPE
NO_KEY
BAD_PROVIDER
BAD_PUBLIC_KEY
BAD_ALGID
BAD_KEYSET
NO_MEMORY
BAD_DATA
Errors
MS_EXCHANGE
FORTEZZA
DH_SCHANNEL
RSA_FULL
SPYRUS_LYNKS
REPLACE_OWF
RSA_SIG
EC_ECDSA_SIG
EC_ECDSA_FULL
EC_ECNRA_FULL
DSS_DH
INTEL_SEC
EC_ECNRA_SIG
RSA_SCHANNEL
RSA_AES
ProvTypes
MS_ENH_RSA_AES_PROV:Microsoft Enhanced RSA and AES Cryptographic Provider
MS_DEF_DSS_PROV.Microsoft Base DSS Cryptographic Provider
MS_DEF_PROV/Microsoft Base Cryptographic Provider v1.0
MS_STRONG_PROV,Microsoft Strong Cryptographic Provider
MS_DEF_RSA_SIG_PROV3Microsoft RSA Signature Cryptographic Provider
MS_ENHANCED_PROV3Microsoft Enhanced Cryptographic Provider v1.0
Providers
AES_192
AES_256
AES_128
SHA_256
SHA_384
SHA_512
Hashes
win32_crypto
require
RegistryEntry
bundleIndex(Bundle[%s] Advanced Registry Check:
Loaded Value => %s
ReadRegStr
EnumRegStr
EnumRegKey
tostring
%s::%s::%s::%s
Pass is  %s	true
Loading Key:%s
key!Failed And Operator %s <> %s
ipairs
RegistryEntry
tostring
evalRegistryEntry:(%s)
string
insert	getn
table	[\]+
DIRECTa
custom
browser
windows
reset	args
DIRECT	func
table	type
is_not_ready
e=%s,not_ready = %s
last_not_ready
tostring
tostring&evalPropertyAccessor: %s  =>  %s 
 => ??
evalPropertyAccessor:	 -> 
ipairs
tostring
tostring@
feature	name
' value='
' op='%Error evaluating <Env property='
 in <Env> clause
tostring
Unsupported operator 
value%Missing Property in <Env> clause
property
IsDirectory
FileExists
isDirectory
bundleIndex	path
id=Cycle detected in Top level condition processing!(id=%s)
format
string
+Linked Condition(id=%s) commited => %s
error'Top Level Condition:%s,%s,%s,%s,%s
DebugPrintF9Linked Condition(id=%s) commited(via cycle) => false	args	func
evalConditional
tostring)Linked Condition(id=%s) cached => %s
boolean	type
common_conds
2processIfCond:Unhandled Conditional Clause %sBCondition Of %d clauses matched %d, not_ready: %d ,needed ,%d	getn
tostring+Not Readies = %s(or=%s,and=%s)(ret=%s)'Not Ready Count %d before %d after
not_ready_count
ipairs
processIfCond: %s for %s
tostring)processIfCond:Failed to %s,Reason:%s
Or	true
last_not_ready
tostring
processIfCond:not ready:%s
common_conds
getTopLevelConditions
bundleIndex
custom
browser
windows
feature
require
DIRECT
1Overall Conditional =>True(Not Readies = %d)!Overall Conditional => False
DIRECT
ipairs
)Failed to parse conditional code: %s
format
string"Bad Conditional Expression %s
loadstring
Expression Code => %s
return D    return function(feature,windows,browser,custom,bundleIndex)"Conditional Expression =>  %s
Not Ready Triggered
not_ready_count
last_not_ready
is_not_ready
not_ready_count
last_not_ready
is_not_ready
not_ready
evalRegistryEntry
withRegistryValues
!prepareConditionalExpression
Common
TopLevelConditionLink	Link
FileExists
RegistryEntry
Feature
AcceptIf
evalConditional
getNodeConditional
DIRECT
advancedRegistryChecks
setToString
tostring
string
ErrorPrint
DebugTrace
install_details
luabridge.fs
luabridge.registry
conditional_engine
loggerFor
bootstrap
local_environment
GuiInit
expandNsisVars
environment_options
registry
logging
require
is_not_ready
not_ready_count
insert
ipairs
Firing Event 
DebugPrint
fire_event
add_event_handler
EVENT_MAP
EVT_INSTALL_END
EVT_INSTALL_START
EVT_DOWNLOAD_END
EVT_DOWNLOAD_START
!Failed Looking Up :%s(rc=%d)
SHGFP_TYPE_CURRENT
SHGetFolderPathA
string	TEMP
GetTempPathA
char*	cast
char[?]
folders
CSIDL_MYMUSIC
COMMONFILES64
CSIDL_PROGRAM_FILES_COMMON
STARTMENU
CSIDL_STARTMENU
SENDTO
CSIDL_SENDTO
CSIDL_FONTS
SYSDIR
CSIDL_SYSTEM
DESKTOP
CSIDL_DESKTOP
COMMONFILES32"CSIDL_PROGRAM_FILES_COMMONX86
PROFILE
CSIDL_PROFILE
VIDEOS
CSIDL_MYVIDEO
WINDIR
CSIDL_WINDOWS
COMMONFILES
CSIDL_PROGRAM_FILES_COMMON
INTERNET
CSIDL_INTERNET
PRINTHOOD
CSIDL_PRINTHOOD
PROGRAMFILES32
CSIDL_PROGRAM_FILESX86
RESOURCES_LOCALIZED
CSIDL_RESOURCES_LOCALIZED
APPDATA
CSIDL_APPDATA
RECENT
CSIDL_RECENT
DOCUMENTS
CSIDL_MYDOCUMENTS
FAVORITES
CSIDL_FAVORITES
CDBURN_READ
CSIDL_CDBURN_AREA
PICTURES
CSIDL_MYPICTURES
HISTORY
CSIDL_HISTORY
INTERNET_CACHE
CSIDL_INTERNET_CACHE
SMPROGRAMS
CSIDL_PROGRAMS
SMSTARTUP
CSIDL_STARTUP
PROGRAMFILES
CSIDL_PROGRAM_FILES
TEMPLATES
CSIDL_TEMPLATES
ADMINTOOLS
CSIDL_ADMINTOOLS
RESOURCES
CSIDL_RESOURCES
LOCALAPPDATA
CSIDL_LOCAL_APPDATA
NETHOOD
CSIDL_NETHOOD
COOKIES
CSIDL_COOKIES
PROGRAMFILES64
CSIDL_PROGRAM_FILES
kernel32
shell32	load
static const int SHGFP_TYPE_CURRENT =0;
static const int SHGFP_TYPE_DEFAULT =1;
static const int CSIDL_DESKTOP =0x0000 ;// <desktop>
static const int CSIDL_INTERNET =0x0001 ;// Internet Explorer (icon on desktop)
static const int CSIDL_PROGRAMS =0x0002 ;// Start Menu\Programs
static const int CSIDL_CONTROLS =0x0003 ;// My Computer\Control Panel
static const int CSIDL_PRINTERS =0x0004 ;// My Computer\Printers
static const int CSIDL_PERSONAL =0x0005 ;// My Documents
static const int CSIDL_FAVORITES =0x0006 ;// <user name>\Favorites
static const int CSIDL_STARTUP =0x0007 ;// Start Menu\Programs\Startup
static const int CSIDL_RECENT =0x0008 ;// <user name>\Recent
static const int CSIDL_SENDTO =0x0009 ;// <user name>\SendTo
static const int CSIDL_BITBUCKET =0x000a ;// <desktop>\Recycle Bin
static const int CSIDL_STARTMENU =0x000b ;// <user name>\Start Menu
static const int CSIDL_MYDOCUMENTS= CSIDL_PERSONAL ;// Personal was just a silly name for My Documents
static const int CSIDL_MYMUSIC =0x000d ;// "My Music" folder
static const int CSIDL_MYVIDEO =0x000e ;// "My Videos" folder
static const int CSIDL_DESKTOPDIRECTORY =0x0010 ;// <user name>\Desktop
static const int CSIDL_DRIVES =0x0011 ;// My Computer
static const int CSIDL_NETWORK =0x0012 ;// Network Neighborhood (My Network Places)
static const int CSIDL_NETHOOD =0x0013 ;// <user name>\nethood
static const int CSIDL_FONTS =0x0014 ;// windows\fonts
static const int CSIDL_TEMPLATES =0x0015;
static const int CSIDL_COMMON_STARTMENU =0x0016 ;// All Users\Start Menu
static const int CSIDL_COMMON_PROGRAMS =0x0017 ;// All Users\Start Menu\Programs
static const int CSIDL_COMMON_STARTUP =0x0018 ;// All Users\Startup
static const int CSIDL_COMMON_DESKTOPDIRECTORY =0x0019 ;// All Users\Desktop
static const int CSIDL_APPDATA =0x001a ;// <user name>\Application Data
static const int CSIDL_PRINTHOOD =0x001b ;// <user name>\PrintHood
static const int CSIDL_LOCAL_APPDATA =0x001c ;// <user name>\Local Settings\Applicaiton Data (non roaming)
static const int CSIDL_ALTSTARTUP =0x001d ;// non localized startup
static const int CSIDL_COMMON_ALTSTARTUP =0x001e ;// non localized common startup
static const int CSIDL_COMMON_FAVORITES =0x001f;
static const int CSIDL_INTERNET_CACHE =0x0020;
static const int CSIDL_COOKIES =0x0021;
static const int CSIDL_HISTORY =0x0022;
static const int CSIDL_COMMON_APPDATA =0x0023 ;// All Users\Application Data
static const int CSIDL_WINDOWS =0x0024 ;// GetWindowsDirectory()
static const int CSIDL_SYSTEM =0x0025 ;// GetSystemDirectory()
static const int CSIDL_PROGRAM_FILES =0x0026 ;// C:\Program Files
static const int CSIDL_MYPICTURES =0x0027 ;// C:\Program Files\My Pictures
static const int CSIDL_PROFILE =0x0028 ;// USERPROFILE
static const int CSIDL_SYSTEMX86 =0x0029 ;// x86 system directory on RISC
static const int CSIDL_PROGRAM_FILESX86 =0x002a ;// x86 C:\Program Files on RISC
static const int CSIDL_PROGRAM_FILES_COMMON =0x002b ;// C:\Program Files\Common
static const int CSIDL_PROGRAM_FILES_COMMONX86 =0x002c ;// x86 Program Files\Common on RISC
static const int CSIDL_COMMON_TEMPLATES =0x002d ;// All Users\Templates
static const int CSIDL_COMMON_DOCUMENTS =0x002e ;// All Users\Documents
static const int CSIDL_COMMON_ADMINTOOLS =0x002f ;// All Users\Start Menu\Programs\Administrative Tools
static const int CSIDL_ADMINTOOLS =0x0030 ;// <user name>\Start Menu\Programs\Administrative Tools
static const int CSIDL_CONNECTIONS =0x0031 ;// Network and Dial-up Connections
static const int CSIDL_COMMON_MUSIC =0x0035 ;// All Users\My Music
static const int CSIDL_COMMON_PICTURES =0x0036 ;// All Users\My Pictures
static const int CSIDL_COMMON_VIDEO =0x0037 ;// All Users\My Video
static const int CSIDL_RESOURCES =0x0038 ;// Resource Direcotry
static const int CSIDL_RESOURCES_LOCALIZED =0x0039 ;// Localized Resource Direcotry
static const int CSIDL_COMMON_OEM_LINKS =0x003a ;// Links to All Users OEM specific apps
static const int CSIDL_CDBURN_AREA =0x003b ;// USERPROFILE\Local Settings\Application Data\Microsoft\CD Burning
;// unused =0x003c
static const int CSIDL_COMPUTERSNEARME =0x003d ;// Computers Near Me (computered from Workgroup membership)
static const int CSIDL_FLAG_CREATE =0x8000 ;// combine with CSIDL_ value to force folder creation in SHGetFolderPath()
static const int CSIDL_FLAG_DONT_VERIFY =0x4000 ;// combine with CSIDL_ value to return an unverified folder path
static const int CSIDL_FLAG_DONT_UNEXPAND =0x2000 ;// combine with CSIDL_ value to avoid unexpanding environment variables
static const int CSIDL_FLAG_NO_ALIAS =0x1000 ;// combine with CSIDL_ value to insure non-alias versions of the pidl
static const int CSIDL_FLAG_PER_USER_INIT =0x0800 ;// combine with CSIDL_ value to indicate per-user init (eg. upgrade)
static const int CSIDL_FLAG_MASK =0xFF00 ;// mask for all possible flag values
DWORD GetTempPathA( DWORD nBufferLength, char *lpBuffer);
HRESULT SHGetFolderPathA( HWND hwndOwner, int nFolder,
HANDLE hToken, DWORD dwFlags, char * pszPath);
wintypes
ErrorPrint
DebugPrintF
bootstrap.internal
require
ipairs
sizeof
dwStructSize
URL_COMPONENTS
string
authority
userinfo
password	user
fragment
%#[^#]*$
^%?[^#]*()	find
tostring
extra => %s
format
string
dwExtraInfoLength
lpszExtraInfo
unpack
pairs	port
format
string	path
query0
scheme
insert
is_directory
is_absolute
unescape	getn
([^/]+)	gsub
string
setmetatable
maybeError
InternetCrackUrlA
char[?]
string
maybeError
ERROR_INSUFFICIENT_BUFFER
GetLastError
InternetCanonicalizeUrlA
sizeof
DWORD[1]
ICU_ENCODE_SPACES_ONLY
ICU_NO_META
tonumber	char
string;
%%(%x%x)	gsub
stringA
%%%02x
format
string@
([^A-Za-z0-9_])	gsub
string#
fragment!
scheme$
authority 
query!
params#
userinfo
	port#
password
userinfo	host
:([^:]*)$
^([^@]*)@
authority	path
%;(.*)
%?(.*)
^//([^/]*)
^([%w][%w%+%-%.]*)%:
#(.*)$	gsub
string
invalid url
message*expected table for argument 'default'
makeError
table	type
setmetatable@
ipairs_
%%%02x
format
stringB
([^A-Za-z0-9_])	gsub
string
is_absolute
is_directory
/	getn
fragment
scheme
password	user
userinfo
:	port	host
authority
params
	path'
../../*
([^/]*/%.%.)$
([^/]*/%.%./)	/%.$
([^/]*%./)
[^/]*$	gsub
string
params	path
authority
scheme
base_parsed
table	type
parse_path
absolute
escape
unescape
canonicalize
char[512]
winparse
__index
is_https
object_name
lpszUrlPath
dwUrlPathLength
password
lpszPassword
dwPasswordLength	user
lpszUserName
dwUserNameLength	host
lpszHostName
dwHostNameLength
scheme
lpszScheme
dwSchemeLength
dwSchemeLength
dwHostNameLength
dwUserNameLength
dwPasswordLength
dwUrlPathLength
dwExtraInfoLength
char*	cast	TRUE
wininet	NULL
wininet.defs
require
notifyIcon	callE
notifyIcon	call`
errorTip
infoTip
callback_proxy
require
Prepare
Process
Install
Tracking
CleanupOrder
setmetatable
__index
Install
+install
Tracking
+tracking
Logging
+logging
Process
+process
Prepare
+prepare
$PLUGINSDIR/NotifyIcon.dll
expandNsisVars
ytp	call
progress
titleL
r	callB
	call"
remove
update
plugincall
values_mr
luabridge.classes
logging
callback_proxy
bootstrap.table_utils
requires
bootstrap
require
Custom Features => OFF
offerBundlel
offerBundle
preOfferProcessed
%s preOffer Complete
%s preOffer called
%s preOffer waiting
processFreeFiles
%s has offer actions
preOfferTask
hasOfferActions!%s is not ready. Waiting ...
onComplete
isComplete
canOfferTask
Last Bundle:%s
tonumber
encode
tostring
%s ProductState: %s
filteredOut
_wasSuppressed_
checkCategory
ipairs
consolidated
isDynamicCombo
isFilteredOut
isContinuation
CategoryList
categoryUsed
_willDisplay_
tonumber
_wouldInstall_
tostring
%s Would Install is %s
tonumber
)]._wouldInstall_ = 
bundleIndex
BundleData[getClientIndex(
javascript
execScript
wouldInstall
tostring2window.model && window.model.installThisOne('!Setting installThisOne -> %s
_wouldInstall_
Failed Updating Model!:%s
_wouldInstall_
tonumber
tonumber
setBundleSlot
encode
_willDisplay_
_willInstall_
insert
bundlesForUi
setProdState
tonumber)SetProdStateCalled :: %s,%s,%s,%s,%s
InitialState
Feature
tonumber
tonumber
Current Bundle Set ->%s
consolidated
bundleIndex Current Nested Bundle is %d
tostring,Failed to get CurrentNested  Bundles:%s
encode
Feature	copy
tonumber
consolidated
tostring)Category Used For %s -> %s[%s] -> %s
CategoryList
categoryUsed
categoryUsed failed!: %s
tonumber
_wasSuppressed_
consolidated
!Consolidated lookup error:%s
_wasSuppressed_
tonumber
tostring
_featureOptions_
tonumber
unchecked
tostring
consolidateRelIdx
InitialState
Feature
ipairs
tonumber
javascript
execScript
customFeatures:window.model && window.model.hasCustomFeatures(true);
tostring
Custom Features :: 
Custom Features => ON
consolidated
tonumber
encode
insert
consolidated
tonumber
insert
CustomParameter
isContinuation
encode
consolidated
tonumber
getLastOfferIndex
getJsCurrentBundle
Commands
featureById
categoryUsed?
wouldInstall?
wasSuppressed?
featureOptions
featureState
setProdState
customParameters
linkedBundles
numConsolidated
customFeatures?
customFeatures
featureById+
featureOptions+
wasSuppressed?+
categoryUsed?+
features
CurrentNested
Current
featureState+
setProdState+
setBundleSlot
wouldInstall?+
hasWouldInstall?
getProdState
preOffer
resetCustomFeatures
buildRedirector
ui_commands.utils
_willInstall_
advertiserIndex
consolidated
isConsolidated
wrappedScript
getBrowser
string
getBundles
Trace	Info
ErrorPrint
DebugPrint
ui_commands.bundle
loggerFor	json
install_details
logging
guiinit
requires
bootstrap
require
definitions
require
NSISVars
GuiInit
require8
variable
context
MissingVariable
addXmlError
guiinit
parseQs
decode
^json:(.*)
string
table	type
silent
table	type
string
%{([^|]+)|(.*)%}
string
@(%b{})
@(@*)([A-Za-z0-9_\.]*)	gsub
string
ipairs
_a_	type
_body_
tostring
ipairs	getn
attributes	body
table	type
addCustomVar
string
pairs~
Installer/Bundle[0]
Bundle
Installer
message
ApiExpansionError
addExecError
traceback
xpcall
processAPIExpansion
processAPIEnvironment
CustomParameter
Feature
Options
ProductBinary
options
msioptions
ProductName
ProductEula
Options
SourceFile
Destination
Action
ThankYou
SkinFile
attributes
SkipAllPosition
silent
SkipAllType
silent
ThankYouUrl
CarrotIcon
DisplayName
CancelUrl
PartnerTrackingUrl
error_store
^env[.:](.*)
DebugTrace
_G	json
net_utils
require
pairs	moon
require
__class
tablel
__parent
__class
table?
__class
tableQ
gmatch
^%s*(.-)%s*$
matchI
gmatch
coroutine+
coroutinei
gmatch
tostring
recursion(
string
 ] >> 
tostring
upvaluejoin	_ENV
getupvalue
getupvalue
select
get_options
debug_posmap	dump
split	trim
reversed
get_line
get_closest_line
pos_to_line	moon
getfenv
setfenv
is_object
unpack
concat
!getBundles is not supported!
error\
updateBundleMeta
getBundle
invokeForRespF
getBundles
install_details
require5
getNumBundles
invokeForResp
updateBundleMeta
getBundle
getNumBundles
commitBundle
invokeForResp
insert
FILE_COMMIT_FIELD
BUNDLE_COMMIT_FIELDS
ipairs	File
bundleIndex1
childError	callO
getPluginsDir
invokeForRespQ
getDownloadsDir
invokeForResp;
getInstallTargetDir
invokeForResp9
getInstallInOrder
invokeForResp:
expandNsisVars
invokeForResp@
shouldDoFileTriggers
invokeForResp=
shouldProcessFile
invokeForResp>
evalFeatureOptions
invokeForResp8
shellExecute
invokeForResp3
/	gsub
string2
addVariable	call;
addTrackingParameter	callP
getSkinOptions
invokeForRespd
tostring
Dummy Called with %s
ErrorPrint
FILE_COMMIT_FIELD
BUNDLE_COMMIT_FIELDS
processXpi
processFileExtract
getSkinOptions
addTrackingParameter
addVariable
normalizePath
shellExecute
evalFeatureOptions
shouldProcessFile
shouldDoFileTriggers
expandNsisVars
getInstallInOrder
getInstallTargetDir
getDownloadsDir
getPluginsDir
childError
commitBundle
withBundles
getNumBundles
rawBundle
getBundle
getBundles
DebugPrint
loggerFor
logging
bundle_def
callback_proxy
require
string
maybeError
sizeof
ReadFile
DWORD[1]
char[?]
PIPE_READMODE_MESSAGE
PIPE_TYPE_MESSAGE
PIPE_WAIT
PIPE_READMODE_BYTE
PIPE_TYPE_BYTE
FILE_FLAG_OVERLAPPED
tonumber
PIPE_ACCESS_DUPLEX
PIPE_ACCESS_OUTBOUND
PIPE_ACCESS_INBOUND
string	type
CloseHandle
maybeError
INVALID_HANDLE_VALUE
timeout
CreateNamedPipeA
outputBuffer
inputBuffer
maxInstances
unpack
maybeError
SetNamedPipeHandleState
DWORD[1]
PIPE_NOWAIT
PIPE_WAIT
tostring
Unsupported Pipe Mode '%s'
format
string
PIPE_READMODE_BYTE
PIPE_READMODE_MESSAGE
maybeError
WaitNamedPipeA
tonumber
GetFileSize	addr
mapping	file
FILE_MAP_READ
MapViewOfFile
mapping_name
PAGE_READONLY
mapping_protect
CreateFileMappingA
CloseHandle
maybeError
INVALID_HANDLE_VALUE
FILE_ATTRIBUTE_NORMAL
OPEN_EXISTING
FILE_SHARE_WRITE
FILE_SHARE_READ
FILE_SHARE_DELETE
sharing
GENERIC_READ
access
CreateFileA
unpack
table	type
CloseHandle
maybeError
INVALID_HANDLE_VALUE
FILE_ATTRIBUTE_NORMAL
OPEN_EXISTING
GENERIC_WRITE
GENERIC_READ
CreateFileAs
maybeError
ConnectNamedPipe
maybeError
string
WriteFile
DWORD[1]
tostring
string
SUCCESS
GetLastError
sizeof
ReadFile
DWORD[1]
char[?]
MORE_DATA
readMessage
writeMessage
connectPipe
openPipe
mapFile
waitPipe
updatePipeMode
createPipe
readFileSource
SUCCESS
NOT_CONNECTED
WAIT_TIMEOUT
MORE_DATA
NO_DATA
static const int PAGE_READONLY=0x02,
SEC_IMAGE_NO_EXECUTE=0x11000000;
HANDLE __stdcall CreateFileMappingA(
    HANDLE hFile,
    void * lpAttributes,
    DWORD flProtect,
    DWORD dwMaximumSizeHigh,
    DWORD dwMaximumSizeLow,
    const char * lpName
static const int FILE_MAP_COPY = 0x0001;
static const int FILE_MAP_WRITE = 0x0002;
static const int FILE_MAP_READ = 0x0004;
static const int FILE_MAP_EXECUTE = 0x0020;
void * __stdcall MapViewOfFile(
HANDLE hFileMappingObject,
DWORD dwDesiredAccess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
DWORD dwNumberOfBytesToMap
DWORD __stdcall GetFileSize(HANDLE fle,DWORD * hiWord);
// Define the Security Quality of Service bits to be passed
// into CreateFile
// Define the dwOpenMode values for CreateNamedPipe
static const int PIPE_ACCESS_INBOUND=0x00000001;
static const int PIPE_ACCESS_OUTBOUND=0x00000002;
static const int PIPE_ACCESS_DUPLEX=0x00000003;
// Define the Named Pipe End flags for GetNamedPipeInfo
static const int PIPE_CLIENT_END=0x00000000;
static const int PIPE_SERVER_END=0x00000001;
// Define the dwPipeMode values for CreateNamedPipe
static const int PIPE_WAIT=0x00000000;
static const int PIPE_NOWAIT=0x00000001;
static const int PIPE_READMODE_BYTE=0x00000000;
static const int PIPE_READMODE_MESSAGE=0x00000002;
static const int PIPE_TYPE_BYTE=0x00000000;
static const int PIPE_TYPE_MESSAGE=0x00000004;
static const int PIPE_ACCEPT_REMOTE_CLIENTS=0x00000000;
static const int PIPE_REJECT_REMOTE_CLIENTS=0x00000008;
// Define the well known values for CreateNamedPipe nMaxInstances
static const int PIPE_UNLIMITED_INSTANCES    =255;
HANDLE __stdcall CreateNamedPipeA(
    LPCTSTR lpName,
    DWORD dwOpenMode,
    DWORD dwPipeMode,
    DWORD nMaxInstances,
    DWORD nOutBufferSize,
    DWORD nInBufferSize,
    DWORD nDefaultTimeOut,
    LPVOID lpSecurityAttributes
BOOL __stdcall ConnectNamedPipe(
   HANDLE hNamedPipe,
   LPVOID lpOverlapped
BOOL __stdcall DisconnectNamedPipe(
  HANDLE hNamedPipe
BOOL __stdcall WaitNamedPipeA(
  LPCTSTR lpNamedPipeName,
  DWORD nTimeOut
BOOL __stdcall ReadFile(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPVOID lpOverlapped
static const int FILE_SHARE_DELETE=0x00000004,
FILE_SHARE_READ=0x00000001,
FILE_SHARE_WRITE=0x00000002;
static const int CREATE_ALWAYS=2,
CREATE_NEW=1,
OPEN_ALWAYS=4,
OPEN_EXISTING=3,
TRUNCATE_EXISTING=5;
static const int FILE_ATTRIBUTE_ARCHIVE=0x20,
FILE_ATTRIBUTE_ENCRYPTED=0x4000,
FILE_ATTRIBUTE_HIDDEN=0x2,
FILE_ATTRIBUTE_NORMAL=0x80,
FILE_ATTRIBUTE_OFFLINE=0x1000,
FILE_ATTRIBUTE_READONLY=0x1,
FILE_ATTRIBUTE_SYSTEM=0x3,
FILE_ATTRIBUTE_TEMPORARY=0x100,
FILE_FLAG_OVERLAPPED=0x40000000,
FILE_FLAG_WRITE_THROUGH=0x80000000,
FILE_FLAG_NO_BUFFERING=0x20000000,
FILE_FLAG_DELETE_ON_CLOSE=0x04000000,
FILE_FLAG_SEQUENTIAL_SCAN=0x08000000,
FILE_FLAG_RANDOM_ACCESS=0x10000000,
FILE_FLAG_POSIX_SEMANTICS=0x0100000;
HANDLE __stdcall CreateFileA(
   LPCTSTR lpFileName,
   DWORD dwDesiredAccess,
   DWORD dwShareMode,
   void *lpSecurityAttributes,
   DWORD dwCreationDisposition,
   DWORD dwFlagsAndAttributes,
   HANDLE hTemplateFile
BOOL __stdcall WriteFile(
   HANDLE hFile,
   LPCVOID lpBuffer,
   DWORD nNumberOfBytesToWrite,
   LPDWORD lpNumberOfBytesWritten,
   void * /*LPOVERLAPPED*/ lpOverlapped
BOOL __stdcall CloseHandle(
HANDLE hObject
BOOL __stdcall SetNamedPipeHandleState(
    HANDLE hNamedPipe,
    LPDWORD lpMode,
    LPDWORD lpMaxCollectionCount,
    LPDWORD lpCollectDataTimeout
	cdef	NULL
kernel32.dll
kernel32
wininet.core
wininet.defs
require
preserveForm
number	type
_body_
insert
forceArray
preserveForm
number
string	type
processPreserved
namedTable
encode
function
userdata	type
PlainJsonMeta
__tojson
bootstrap.json_utils
loggerFor
logging	json
require
'Unable to get console buffer info!
GetConsoleScreenBufferInfo
CONSOLE_SCREEN_BUFFER_INFO
SetConsoleTextAttribute
wAttributes
tostring
Print ERROR!
initialtime
timing
require
w	open
io5=require('bootstrap.output').setupDebugFile(...)
callInState
Logging
stateName0
CONFIG
Master Opened @ 
-	INFO
CONFIG
%x %X%p	date
Cant load log file!:
wb	open
Opening Master log 
Rel2AbsPath
bootstrap.fs
require
log-file
debug.log
/debug.log
tostring
RUN_DIR
no-console
logfile
setStartupInfo
setCliOptions
setupDebugFile
printOut
CONSOLE NOT AVAILABLE!
writeMessage	WARN	INFO
FG_INTENSITY
FG_BLUE
bor	GOOD
FG_GREEN
FG_RED
STD_ERROR_HANDLE
STD_OUTPUT_HANDLE
GetStdHandle
BG_BLUE
FG_BLUE
FG_INTENSITY
FG_RED
BG_GREEN
BG_RED
BG_INTENSITY
FG_GREEN
typedef short SHORT;
typedef struct _COORD {
    SHORT X;
    SHORT Y;
} COORD, *PCOORD;
typedef struct _SMALL_RECT {
    SHORT Left;
    SHORT Top;
    SHORT Right;
    SHORT Bottom;
} SMALL_RECT, *PSMALL_RECT;
typedef struct _CONSOLE_SCREEN_BUFFER_INFO {
    COORD dwSize;
    COORD dwCursorPosition;
    WORD  wAttributes;
    SMALL_RECT srWindow;
    COORD dwMaximumWindowSize;
} CONSOLE_SCREEN_BUFFER_INFO, *PCONSOLE_SCREEN_BUFFER_INFO;
static const int STD_INPUT_HANDLE =(DWORD)-10;
static const int STD_OUTPUT_HANDLE = (DWORD)-11;
static const int STD_ERROR_HANDLE = (DWORD)-12;
HANDLE __stdcall GetStdHandle(
  DWORD nStdHandle
    BOOL __stdcall SetConsoleTextAttribute(
        HANDLE hConsoleOutput,
   WORD wAttributes
BOOL  __stdcall GetConsoleScreenBufferInfo(
  HANDLE hConsoleOutput,
  PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
state_names
luabridge.nsis
wininet.io
kernel32	load
require
Chrome
FireFox	find
string
-Software\Classes\http\shell\open\command
progidRSoftware\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice	HKCU
ReadRegStr
.	find
string
unpack
ReadRegStr
ipairsa
CurrentVersion%SOFTWARE\Mozilla\Mozilla Firefox	HKLM
ReadRegStr
pvJSoftware\Google\Update\Clients\{4DC8B4CA-1BDA-483e-B5FA-D3C12E15B62D}
ReadRegStr
	HKLM	HKCU
ipairs
dotnet_version
is_elevated
uac_info
tonumber
EnableLUA>SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System	HKLM
ReadRegStr
uac_enabled
build_number
minor_version
major_version
windows
winver
require
chrome_version_string
ff_version_string
ie_version_string
default_browser
default_exe
browser
wininet.wintypes
require
vm_details_version
addTrackingParameter
tostring
Using Latest Details:%s
Version
vm_details
maybeLoadRemoteDefinitionsR
%Hardware\Description\System\BIOS	HKLM
ReadRegStrM
 Hardware\Description\System	HKLM
ReadRegStr
string
DefaultVMPatterns
ipairsk
BiosFields
ipairsm
SystemFields
ipairs
insert
table	find
tostring$Checking Service Entry %s -> %s
ReadRegStr
%s::%s VmGuestServicePatternFields
format
string
ipairs
VmGuestServices
pairs&SYSTEM\CurrentControlSet\services
vm_processes
vm_services_list
vm_services
vm_system
vm_bios
isGuestOs
readSystemValue
readBiosValue
No Latest Details:%s
tracking
remote_loader
vm_details
requires
    typedef struct tagPROCESSENTRY32 {
        DWORD     dwSize;
        DWORD     cntUsage;
        DWORD     th32ProcessID;
        ULONG_PTR th32DefaultHeapID;
        DWORD     th32ModuleID;
        DWORD     cntThreads;
        DWORD     th32ParentProcessID;
        LONG      pcPriClassBase;
        DWORD     dwFlags;
        TCHAR     szExeFile[MAX_PATH];
    } PROCESSENTRY32, *PPROCESSENTRY32,*LPPROCESSENTRY32;
    HANDLE __stdcall CreateToolhelp32Snapshot(
    DWORD dwFlags,
    DWORD th32ProcessID
    );
    BOOL __stdcall Process32First(
    HANDLE hSnapshot,
    LPPROCESSENTRY32 lppe
    );
    BOOL Process32Next(
    HANDLE hSnapshot,
    LPPROCESSENTRY32 lppe
    );
    BOOL CloseHandle(
    HANDLE hObject
    );
        typedef unsigned long DWORD;
        typedef long BOOL;
        typedef void* HANDLE;
        typedef intptr_t		LONG_PTR;
        typedef uintptr_t		UINT_PTR;
        typedef uintptr_t		ULONG_PTR;
        typedef char			TCHAR;
        	cdef
kernel32	load
require7
isGuestOs
vm_tester
requireQ
vm_tester
require
readBiosValue
readBiosValue
isGuestOs
vm_tester
preload
package
surveyEnvironment
	HKLM)Software\Microsoft\Internet Explorer	IVer
	HKLM)Software\Microsoft\Internet Explorer
Version
	HKLM)Software\Microsoft\Internet Explorer
svcVersion
DebugTrace
DebugPrintF
ErrorPrint
survey_environment
loggerFor
values_mr
logging
luabridge.registry
bootstrap
require
browser_map_version
addTrackingParameter'Using Latest BrowserMap Version:%s
DebugPrintF
tostring
Version
browser_map_latest
require
ReadRegStr
registry;Software\Microsoft\Windows\CurrentVersion\App Paths\%s
format
string
	HKCU	HKLM
ipairs
string
format
string	open
ShellExecute
$custom.source_browser
expandNsisVars
openThanks
opera.exe
iexplore.exe
Internet Explorer
chrome.exe
Google
firefox.exe
Mozilla
Version
definitions
GuiInit
require
```hhh
xppwpp
debug.pdb
KERNEL32.DLL
comdlg32.dll
GDI32.dll
msvcrt.dll
ole32.dll
SHELL32.dll
USER32.dll
GetVersionExA
GetProcessHeaps
SetMailslotInfo
LocalFree
HeapReAlloc
CancelWaitableTimer
GetMailslotInfo
BindIoCompletionCallback
FormatMessageA
UnhandledExceptionFilter
GetStartupInfoA
InterlockedCompareExchange
InterlockedExchange
RtlUnwind
GetProcessIoCounters
GetSystemTimeAsFileTime
GetCurrentThreadId
GetTickCount
QueryPerformanceCounter
SetUnhandledExceptionFilter
WaitForSingleObject
CloseHandle
MapViewOfFile
CreateFileMappingA
CreateFileA
lstrcmpiA
GetLastError
GetProcAddress
MultiByteToWideChar
GetFileAttributesA
GetVersion
OutputDebugStringA
lstrcpynA
ExitProcess
GetModuleFileNameA
FreeLibrary
DeleteFileA
SetEnvironmentVariableA
DuplicateHandle
GetCurrentProcess
GetCurrentProcessId
GetEnvironmentVariableA
GetExitCodeProcess
TerminateProcess
ResumeThread
CreateProcessA
GetCommandLineA
LoadLibraryA
FlushFileBuffers
WriteFile
ReadConsoleA
WriteConsoleA
GetStdHandle
GetModuleHandleA
SetCurrentDirectoryA
CreateDirectoryA
ExpandEnvironmentStringsA
GetCurrentDirectoryA
GetFullPathNameA
SetErrorMode
CreateNamedPipeA
PeekNamedPipe
HeapCreate
AssignProcessToJobObject
EnterCriticalSection
IsProcessInJob
GetSaveFileNameA
CommDlgExtendedError
GetOpenFileNameA
PathToRegion
CreateFontA
CreateFontIndirectA
CreateBitmap
SelectObject
EnumObjects
DeleteObject
PolyPolyline
_time64
_snprintf
realloc
_pgmptr
__argc
__argv
memmove
_ismbblead
__getmainargs
_cexit
_XcptFilter
_acmdln
_initterm
memset
__setusermatherr
__p__commode
__p__fmode
__set_app_type
?terminate@@YAXXZ
_controlfp
_amsg_exit
malloc
memcpy
OleInitialize
CoCreateInstance
CoTaskMemFree
CoInitializeEx
SHGetPathFromIDListA
SHFileOperationA
ShellExecuteExA
SHGetDataFromIDListA
SHBrowseForFolderA
DrawTextW
DispatchMessageA
TranslateMessage
PostMessageA
RegisterClassA
SendMessageW
BeginPaint
EndPaint
ShowWindow
DrawTextA
GetMessageA
SendMessageA
CreateWindowExA
UserHandleGrantAccess
GetGuiResources
GetWindowLongA
[ZmQ<&Lpr
SZs`4|
i.idnX
o3U"{}
rT"mZEh60
"^V5	X
B|sNTyG
Vu2oG<
8dqN%nl
F4	g'I
nu5R1/
v'|kv;
//Setup a generic error handler.
window.onerror=function(msg,uri,line){
    uri=uri || "???";
    line=line || "--";
    msg = msg || "<NO MESSAGE>";
    error_log("JS-ERROR:[onerror]" + uri + ":" + line + ":" + msg);
    error_log("Caller:" + (arguments.callee && arguments.callee.caller)) 
    if(DEBUG_MODE){
        alert("Exception(Global):"+ msg);
    try{
    console.log("ERROR",msg,url,line);
    }catch(_){
    return true;
document.onreadystatechange=function(e){
    if(document.readyState == "complete"){
        try{
            window.external.onAppSkinReady()
        }catch(e){
        }
var isWindow=function(elt){
    if(elt === window) return true;
    if(elt && elt.document==window.document) return true;
    if(typeof(elt) === "object") return elt == window;
    return false;
var ExceptionWrap=function(f,tag){
    return function(a,b,c,d,e){
        try{
            return f.call(this,a,b,c,d,e)
        }catch(e){
            if(DEBUG_MODE){
                alert("Exception:" + e.message );
            }
            issueCommand("logging/debug","Exception:" + (tag || "-") +  e.message)
        }
        return null;
var debug_log=function(x){
    if(typeof(issueCommand) ==='undefined'){
        if(console && console.log) console.log(x);
        return;
    } 
    issueCommand("logging/debug",x);
var error_log=function(x,msg){
    if(typeof(issueCommand) ==='undefined'){
        if(console && console.log) console.log(x);
        return;
    } 
    x=x || {};
    var caller_name=error_log.caller && error_log.caller.name;
    issueCommand("logging/error",x + "|realmsg=" +  x.message + "|msg=" + (msg || "") + "|caller="  + caller_name)
var debug_trace=function(x){
    if(typeof(issueCommand) ==='undefined'){
        if(console && console.log) console.log(x);
        return;
    } 
    issueCommand("logging/trace",x);
var appNumber=0;
var BundleData;
var _idCache={}
var AppData;
var EnvData;
var FirstBundle=0;
var CurrentBundle=0;
var SkinData={};
var customFeatures=0;
var footerHeight=63;
var DEBUG_MODE=false;
var activeEula=null; // The active Eula window
/** @constant
 * @type {number}
var STATE_INSTALLING=2,
/**@constant 
 * @type{number}*/STATE_OFFERING=1,
/**@constant
 * @type{number}*/STATE_COMPLETE=3,
/**@constant
 * @type{number}*/STATE_CANCEL=4,
/**@constant
 * @type{number}*/STATE_LOADING=0,
/**@constant
 * @type{number}*/STATE_UNINSTALL=5;
var state2String=function(st){
    switch(st){
        case 0: return "loading";
        case 1: return "offer";
        case 2: return "install";
        case 3: return "complete";
        case 4: return "cancel";
        case 5: return "uninstall";
    return "unknown"
METRIC_SEQUENCE="metrics"
var hasKo=typeof(window.ko) !== 'undefined';
 * This is an implementation of CommandHandler
 * The command handler class implements
 * the conversation between the bm model and the page level 
 * host.
var EmbeddedCommandHandler=function(){
EmbeddedCommandHandler.prototype = {
    /**
     * log some text out.
     */
    debugLog:function(msg){
        issueCommand("logging/debug",msg)
 * The host interface is  a namespace of calles actually referenced by the 
 * external entity that will be running this javascript code
 * it contains global functions that can be called by it to 
 * pass information and configure the installer state.
 * @namespace HostInterface
 * Load Knockout based model for installer.
 * This code initializes a few knockoutjs extensions too
function loadKoModel(){
    //Special Knockout Methods
    /**
     * @namespace KO
     */
    /**
     * @namespace KO.Subscribable
     */
    if(!ko.subscribable.fn.latched){
        /**
         * Modifier to knockout computed observable that produces a new observable that doenst
         * changes only when the actual computed value changes.
         * @memberof! KO.Subscribable
         * @function latched
         * @instance
         */
        ko.subscribable.fn.latched=function(){
            var value=ko.observable(this());
            this.subscribe(function(x){
                value(x);
            })
            value.equalityComparer = function(a,b){
                return  ko.observable.fn.equalityComparer(a,b) ||  a===b;
            }
            return value;
        }
    //observable that needs to be explicitly commited.
    if(!ko.subscribable.fn.committable){
        ko.subscribable.fn.committable=function(){
            var value=ko.observable(this()),
            lastUpdate=null,
            currentUpdate=new Date().getTime(),
            nextValue=null;
            this.subscribe(function(x){
                nextValue=x;
                lastUpdate = new Date().getTime()
            });
            //Commit function
            value.commit=function(){
                if(nextValue !== value()){
                    value(nextValue);
                    debug_log("--- COMMIT ---");
                }
            }
            value.raw=this
            return value;
        }
    /**
     * @namespace KO.bindingHandlers
     */
    /**
     * Binding handler that hides elments without removing the.
     * THis is useful for iframes where removing the iframe implies a network 
     * roundtrup when it comes back
     * @memberof! KO.bindingHandlers
     * @name visibility
     */
    ko.bindingHandlers['visibility']={
        init:function(){
        },
        update:function(element,valueAccessor,allBindingsAccessor){
            var $this=$(element),
            visibility=ko.utils.unwrapObservable(valueAccessor()),
            newval=visibility?"visible":"hidden";
            $this.css("visibility",newval);
        }
    };
            
    /**
     * Binding handle that annotates a button
     * this is useful for skins that will use the button control service.
     * @memberof! KO.bindingHandlers
     * @name button
     */
    ko.bindingHandlers["button"]= {
        init:function(){},
        update:function(element,valueAccessor,allBindingAccessors){
            var name=ko.utils.unwrapObservable(valueAccessor()),
            value=false;
            if(name.length){
                value=ko.utils.unwrapObservable(name[1]);
                name=name[0];
            }else {
                value=true
            }
            if(window.model && window.model.buttonVisibility){
                try{
                    var data=ko.utils.unwrapObservable(window.model.buttonVisibility),
                    marked=data[name];
                    value= value && marked !== true;
                    debug_log("New Value for "+ name + " -> " + value)
                }catch(e){
                    error_log(e,"bindingHandlers.button")
                }
            }
            var isCurrentlyVisible = !(element.style.display == "none");
            if (value && !isCurrentlyVisible)
                element.style.display = "";
            else if ((!value) && isCurrentlyVisible)
            element.style.display = "none";
        }
    /**
     * Binding Handler that writes to the observable specified the height of 
     * element it is bound to.
     * The height is read in a function triggered via setTimeout
     * @name heightOf
     * @memberof! KO.bindingHandlers
     * 
     */
    ko.bindingHandlers['heightOf'] = {
        init: function(){
        },
        update: function(element,valueAccessor,allBindingAccessors){
            var val=valueAccessor(); 
            window.setTimeout(function(){
                var elt=$(element);
                val(elt.is(":visible")?elt.outerHeight():0)
            },100)
        }
    var _xmlTextAccessor=function(name){
        return function(){
            return this.bundle[name] && this.bundle[name]._body_
        }
    var _xmlAttrAccessor=function(name){
        return function(){
            var a=this.node._a_;
            if(!a) return null;
            return a[name]
        }
    var Bundle=window.Bundle=function(src){
        if(isWindow(this)) return new Bundle(src);
        this.bundle=src || {}; 
        this.features=ko.computed({read:function(){
                var self=this.bundle;
                return $.map(this.bundle.Feature||[],function(feat,index){
                    if(feat.isDirective || feat.isHidden) return [];
                    return new Feature(self,index);
                });
        },owner:this,deferEvaluation:true});
        return this;
    Bundle.prototype={
        productName:_xmlTextAccessor("ProductName"),
        customCss:_xmlTextAccessor("CustomCss"),
        feature:function(idx){
            return  new Feature(this.bundle,idx);
        }
    };
    /**
     * Model for Feature $index in the Bundle $bundle;
     */
    var Feature=window.Feature=function($bundle,$index){
        if(isWindow(this)) return new Feature($bundle,$index);
        this.node=$bundle.Feature[$index]; 
        this.checked=window.model.featureState($index,$bundle)
    };
    Feature.prototype = {
        name:_xmlAttrAccessor("Name")
    };
    /**
     * An Observable is a function and object
     * @typedef {function} Observable
     *
     * A Observable array is a function that produces an array
     * @typedef {function} ObservableArray
     */
    /**
     * @description
     * Creates an Install Model.
     * Structure.
     * ------
     * Install model is a top level knockoutjs model 
     * that houses all the installation state information.
     * It is updated by the installation host  and can be bound to a UI
     * to represent the installation
     * @class InstallModel
     * @global
     * @constructor
     * @this InstallModel
     */
    var InstallModel=function(){
        var self=this;
        /**
         * zero based index of current bundle index 
         */
        this.CurrentBundle=ko.observable(0);
        this.CurrentSlot = ko.observable(0);
        try{
            this.ds=window.external.getDataStore("com.tr.InstallModel");
        }catch(e){
            debug_log("Cannot get to the data store:" +  e);
        }
        /**
         * Entries in this array may be null indicating that a product 
         * tested out of the installer and should not be shown and really is 
         * no longer 
         * @type {object[]}
         *
         */
        this.BundleData=ko.observableArray([]);
        /**
         * Application Data. Json representation of the Whole installer xml
         * @type {object}
         */
        this.AppData=ko.observable({});
        /**
         * Skin Data.
         * Json of the options.json file from  the skin this exe was built with 
         * or is running right now.
         * @type {object}
         */
        this.SkinData=ko.observable({}); 
        /**
         * Internal Observables
         * These are used when the  host makes changes to the model
         * in a way that is non neccesary kosher with the knockoutjs dependency management system.
         * @private
         */
        this._internalUpdate=ko.observable(0);
        this._internalMetricUpdate=ko.observable(0);
        /**
         * Does this installer have a singleProgressBar 
         * @type boolean
         */
        this.singleProgressBar=ko.computed({
                owner:this ,
                read:function(){
                    this.AppData(); //Dependency
                    return hasSingleProgressBar()
                },
                deferEvaluation:true 
        });
        /**
         * Observable array of all the bundles that the user should see.
         * These are bundle that have tested out of the Bm.
         * @type Bundle[] 
         */
        this.VisibleBundles=ko.computed({
                read:function(){
                    this._internalUpdate(); //establish a dependency
                    return $.grep(self.BundleData(),function(v,k){
                        return v!=null && v._willDisplay_ == 1;
                    });
                },owner:this
        });
        /**
         * Observable array of all the bundles the user has chose to install
         * @type Bundle[]
         */
        this.InstallingBundles=ko.computed({
                read:function(){
                    this._internalUpdate(); //establish a dependency
                    return $.grep(self.BundleData(),function(v,k){
                        return v!=null && v._willInstall_== 1;
                    });
                },owner:this
        });
            
        /**
         * Observable array of all the bundles that have actually been installed.
         * This collection is NOT fluid.
         * It is updated whenever the installer transitions from one major state to another :
         * ---
         *      Install -> Complete,
         *      Install -> Cancel,
         *      Cancel  -> Install,
         */
        this.InstalledBundles=ko.computed({
                read:function(){
                    this._internalUpdate(); //establish a dependency
                    return $.grep(self.BundleData(),function(v,k){
                        return v!= null && v._installed_ == 1;
                    });
                },owner:this
        });
        /**
         * Computed observable representing the actual current Bundle.
         * this is the bundle that should be shown unless you know what you are doing.
         *
         * @type {Bundle}
         */
        this.currentBundleData=ko.computed(function(){
            if(self.BundleData().length == 0) return null;
            return self.BundleData()[self.CurrentBundle()];
        });
        /**
         * This property is a shorthand and contains the value of the local 
         * equivalent of the Url to the ProductEula for the current Eula.
         * 
         * *NOTICE*
         *
         * In actual practice this should be passed throug something like the 
         * latched function to ensure that it doesnt superfluously change.
         * @see KO.Subscribable.latched
         * @type {string}
         */
        this.productEulaUrl=ko.computed(function(){
            var data=self.currentBundleData();
            //alert("Current Bundle :" + self.CurrentBundle() + " -> " +
            //     self.currentBundleData());
            if(!data) return "";
            return data.ProductEula._body_;
        });
        /**
         * Bundle object for the lead product. In general this is the Primary 
         * associated with the Install but does not have to be.
         * @type {Bundle}
         */
        this.leadProduct=ko.computed(function(){
            if(self.VisibleBundles().length == 0) return null;
            return self.VisibleBundles()[0];
        });
        /** 
         * Is the current Bundle the lead bundle ?
         * @type {boolean}
         */
        this.isLeadProduct=ko.computed({read:function(){
                return this.leadProduct() == this.currentBundleData()
        },owner:this,deferEvaluation:true});
        /**
         * Current Installer State
         * @type {number}
         */
        this.state=ko.observable(STATE_LOADING)
        /**
         * Does the current installer state present EULA of some sort?
         * @type {boolean}
         */
        this.stateHasEula = ko.computed({read:function(){
                switch(this.state()){
                case STATE_LOADING:
                case STATE_OFFERING:
                    return true;
                }
                return false;
        },deferEvaluation:true,owner:this});
        /*this.state=ko.computed({read:this._state,
         write:this._state}).extend({throttle:50});;*/
        /**
         * For the built-in step count this is the number
         * of steps the installer will show after the 
         * offers are complete.
         * @type number
         */
        this.postOfferSteps=ko.observable(2); //Install and  Complete page.
        /**
         * Has the currently setup Eula been loaded.
         * This has to be manually wired by having {@link onEulaLoaded}
         * called when the iframe containing the Eula is loaded.
         */
        this.eulaLoaded=ko.observable(false);
        /**
         * has the user chose to install this product.
         * This is used with the skin level acceptDecline control.
         * installThisOne  will have the value "yes" if the user has NOT 
         * decided to install a product or no or has decided to install it 
         * it will contain the value "no" if the user has implicitly declined
         * to install it.  (Tyupically with radio button in an offer screen)
         * When the accept button is clicked the actual state of the product is based on 
         * this variables value.
         * @type {string}
         */
        this.installThisOne=ko.observable("yes");
        /**
         * Does this installer support the pause function?
         */
        this.canPause=ko.observable(false);
        /**
         * Is the installer state currently paused.
         */
        this.isPaused=ko.observable(false);
        this.isOffer=ko.computed(function(){return self.state() == STATE_OFFERING; });
        this.isInstalling=ko.computed(function(){return self.state() == STATE_INSTALLING; });
        this.isComplete=ko.computed(function(){return self.state() == STATE_COMPLETE; });
        this.isCancel=ko.computed(function(){return self.state() == STATE_CANCEL; });
        this.isLoading=ko.computed(function(){return self.state() ==STATE_LOADING; });
        this.isInstallNow = ko.computed(function(){
            return self.isComplete();
        });
        //isDlcomOpen -> 
        //for download.com a lead product with a single <File/> entry 
        //with Extract at Installation will trigger the open action.
        this.isDlcomOpen = ko.computed({read:function(){
                if(!this.isComplete()) return false;
                try{
                    var primary=this.leadProduct();
                    //Non blank product binary then no dice.
                    if(primary.ProductBinary._body_ != "") return false;
                    if(primary.File.length != 1 ) return false;
                    //If the action is Extract at installation
                    if(primary.File[0]._a_.Action.toLowerCase() == "Extract at Installation".toLowerCase()){
                        return true;
                    }
                }catch(_){
                    return false;
                }
                return false;
        },owner:this,deferEvaluation:true });
        //Should the "Show" button be used instead of the Install Now  button
        this.isDlcomShow= ko.computed({read:function(){
                if(!this.isComplete()) return false;
                try{
                    var primary=this.leadProduct();
                    //Non blank product binary then no dice.
                    if(primary.ProductBinary._body_ != "") return false;
                    if(primary.File.length != 1 ) return false;
                    //If the action is Copy at installation
                    if(primary.File[0]._a_.Action.toLowerCase() == "Copy at Installation".toLowerCase()){
                        return true;
                    }
                }catch(_){
                    return false;
                }
                return false;
        },owner:this,deferEvaluation:true });
        this.optInStyle = ko.computed(function(){
        });
        this.isPrimary=ko.computed(function(){
            var app=self.currentBundleData();
            if(!app) return false;
            //alert("is Primary - " + app.isPrimary);
            return app.isPrimary;
        });
        this.carrotIcon=ko.computed({read:function(){
                var appData=this.AppData();
                if(appData.CarrotIcon && AppData.CarrotIcon._body_){
                    return appData.CarrotIcon._body_;
                }
                return null;
        },deferEvaluation:true,owner:this});
        this.customCss=ko.computed(function(){
            var bundle=self.currentBundleData();
            var css=(bundle && bundle.CustomCss && bundle.CustomCss._body_) || "";
            //if(css.length > 0 ) alert(css);
            return css;
        });
        this.customCss.subscribe(function(){
            $(".eula-holder").attr("style",self.customCss())
        });
        //Has custom Features
        this.hasCustomFeatures=ko.observable(false);
        this.CurrentBundle.subscribe(function(x){
            self.eulaLoaded(false);
            self.hasCustomFeatures(false);
            var bundle=self.BundleData()[x];
            if(bundle ==null) return; //Skip the nulls
            /*alert("Would|" + bundle.bundleIndex + "|install|"  + self.CurrentBundle() + "| => " +  bundle._wouldInstall_);
             while(true){
             var x= window.prompt("What should I run")
             if(x == "stop") break;
             try{
             alert(">" + eval(x))
        }catch(e){
        }
        }*/
        switch(bundle._wouldInstall_){
        case -1:
        case  1: self.installThisOne("yes"); break;
        default:
            self.installThisOne("no");
            break;
        }
        });
            
            
        this.numSteps=ko.computed(function(){
            var max=1000,appData=self.AppData();
            if(appData && appData.MaxOffers ){
                max=parseInt(appData.MaxOffers._body_) || 1000;
            }
            max=max+1;
            return Math.min(self.VisibleBundles().length,max) +self.postOfferSteps();
        });
        this.installPageNumber=ko.computed(function(){
            return self.numSteps()-1;
        });
        //Updated 10/3/2013
        this.currentStep=ko.computed(function(){
            var idx=0,page=0,
            visible=self.VisibleBundles();
            len=visible.length,current=self.currentBundleData();
            for(idx =0;idx<len;++idx){
                var bundle=visible[idx];
                if(current ==  bundle){
                    page=page;
                    break;
                }
                if(!bundle.categoryUsed){
                    page=page+1;
                }
            }
            idx=page;
            //var idx=$.inArray(self.currentBundleData(),self.VisibleBundles());
            var num=self.numSteps();
            //Complete is last step
            if(self.isComplete()) return num;
            //Installing is second to last step
            if(self.isInstalling()) return  self.installPageNumber();
            //Other step are index of current bundle
            return idx+1;
        });
        this.applicationTitle=this.productName=ko.computed(function(){
            if(self.leadProduct() == null) return "";
            return self.leadProduct().ProductName._body_;
        });
        this.currentProductName=ko.computed(function(){
            var b=this.currentBundleData();
            if(!b) return "";
            return b.ProductName._body_;
        },this);
        this.startTime = ko.observable();
        /** Bytes to Download 
         * @type {number}
         */
        this.toDownload = ko.observable(1);
        /** 
         * Bytes downloads so far 
         * @type {number}
         **/
        this.downloaded = ko.observable(0);
        /** Index into the big downloads step. 
         * @type {number} 
         **/
        this.dlLastBigStep = ko.observable(0);
        /**
         * The download steps we have seen.
         * This serves as a cache and contains a single
         * integer entry for each download step we have seen.
         * @type {object}
         */
        this.dlStepsSeen= {};
        /**
         * The actual number of top level installation steps.
         * @type {number}
         */
        this.dlNumBigSteps =ko.computed(function(){
            return self.AppData().TotalInstallSteps || 0;
        });
        /**
         * Zero based index of the last bundle we got progress
         * information for.
         * @type {number}
         */
        this.dlLastBundleIdx=ko.observable();
        /**
         * Bundle Object for the last Bundle we got download information for.
         * @type {Bundle}
         */
        this.dlLastBundle = ko.computed({owner:this,
                read:function(){
                    try {
                        var ret=Bundle(this.BundleData()[this.dlLastBundleIdx()]);
                        return ret;
                    }catch(_){ 
                    return Bundle({});
                    }
        },deferEvaluation:true});
        /**
         * Name of the last bundle we got download progress for.
         * THis is useful for installers where there is only a single
         * line of progress information.
         * @type {string}
         */
        this.dlLastBundleName = ko.computed({
                owner:this,
                read:function(){  return this.dlLastBundle().productName(); },
                deferEvaluation:true
        })
        /**
         * The global implementation of a  StatusProvider interface 
         * @type {StatusProvider}
         */
        this.globalProvider=null;
        /**
         * The last installation action tracked.
         * e.g. Installing, Downloading , Waiting.
         * @type {string}
         */
        this.dlLastActivity = ko.computed({
                owner:this,deferEvaluation:true,
                read:function(){
                    try{
                        var provider=this.globalProvider || new StatusProvider(this.VisibleBundles()[0]);
                        this.globalProvider=provider;
                        return provider.activity();
                    }catch(_){
                        return null;
                    }
                }
        });
        /**
         * A string  containing the actual %-age of install progress
         * that has occured.
         * this value includes the % sign.
         * @type {string}
         */
        this.downloadProgress= ko.computed(function(){
            var pcnt=self.downloaded()/(self.toDownload()+1)*100;
            if(self.dlNumBigSteps() > 0  && ! self.AppData().TotalDownloadSize ){
                //If there is big step information
                //We will break each big step into a large segment
                //and fill the progress of it using the download progress information
                var pcntPerStep= 100/self.dlNumBigSteps();
                pcnt=(pcntPerStep * (self.dlLastBigStep()-1)) + ((pcnt/100) * pcntPerStep);
            }
            var str=Math.min(100,Math.max(0,pcnt.toFixed(2))) + "%";
            return str;
        });
        /** 
         * Total bytes to download in megabytes 
         * @type {number}
         */
        this.toDownloadMb=ko.computed(function(){
            return toMB(self.toDownload());
        });
        /**
         * Total bytes to download as a string with variable units based on rules
         * @type {string}
         */
        this.toDownloadHuman=ko.computed(function(){
            return toHuman(self.toDownload());
        });
        /**
         * Total bytes downloaded in megabytes
         * @type {string}
         */
        this.downloadedMb=ko.computed(function(){
            return toMB(self.downloaded());
        });
        /**
         * Total bytes downloaded as a string converted with 
         * human friendly variable units
         * @type {string}
         *
         */
        this.downloadedHuman=ko.computed(function(){
            return toHuman(self.downloaded());
        });
        /**
         * Download rate in bytes per second 
         * @type {number}
         */
        this.downloadRateRaw=ko.computed(function(){
            if(self.startTime() == null && self.downloaded() > 1){
                self.startTime(new Date());
            }
            if(self.startTime() == null) return;
            var secDiff=new Date().getTime() -  self.startTime().getTime();
            secDiff=secDiff/1000
            return self.downloaded()/secDiff;
        });
        /**
         * Download rate formated in megabytes
         * @type {string}
         */
        this.downloadRate=ko.computed({owner:this,
                read:function(){
                    return toMB(this.downloadRateRaw()) + "MB/s"
                } 
        });
        
        /**
         * Download rate formatted in variable units based on size.
         * @type {string}
         */
        this.downloadRateHuman=ko.computed({owner:this ,
                read:function(){
                    return  toHuman(this.downloadRateRaw()) + "/s";
                }
        });
        this._sequence=0; //metric sequence
        /**
         * Whether to show the metrics 
         * This is used in the UI to implemente a metrics view page
         * @type {boolean}
         */
        this.showMetrics=ko.observable(false);//Default is to hide metrics 
        /**
         * Installation progress metric information
         * @todo Document this format.
         */
        this.metrics=ko.computed({read:function(){
                this._internalMetricUpdate(); //establish a dependency
                return getInstallMetrics();
        },owner:this,deferEvaluation:true});
        /**
         * Object that contains true for buttons that should not be shown
         */
        this.buttonVisibility=ko.observable({});
        var processCustomParameters=function(b){
                    var c={};
                    try{
                        var data=b.CustomParameter;
                        for(var x in data) {
                            var node=data[x];
                            c[node._a_.Name]=node._body_;
                        }
                        return c;
                    }catch(_){
                    }
                    return c;
        } 
        /**
         * Retrieve custom paramter section of the current bundle.
         * This observable normalizes the value so that it is 
         * a Plain object with name and value pairs rather than
         * the JSON-XML format
         * @type {object}
         */
        this.customParameters=ko.computed({
                owner:this,
                read:function(){
                    return processCustomParameters(this.currentBundleData())
        },deferEvaluation:true });
        this.leadCustomParameters=ko.computed({
                owner:this,
                read:function(){
                    return processCustomParameters(this.leadProduct());
        },deferEvaluation:true});
        /**
         * DO NOT USE this.
         * It is logically incorrect
         * It is specifically only really or download.com.
         * Should used {@link InstallModel#stateHasEula}
         */
        this.haveIframe=ko.computed({owner:this,
                read:function(){
                    return !this.isLeadProduct() && this.stateHasEula()
        },deferEvaluation:true}).extend({throttle:50});
        /**
         * UI property contains a  collection of various values
         * that can be used for updating the UI that are evaluated at the same time
         * so as to have consistent values .
         * This value is throttled so using it may result in some delay in the updating of the UI
         * but they will all have consistent values relative to each other.
         * it contains the following fields:
         *   - isLeadProduct :(boolean) Is the current product the lead product 
         *   - productEulaUrl : (string) The url for the eula of the current product.
         *   - customParameters : (object) The custom paramater data for the current product.
         *   - isPrimary : (boolean) Whether the current product is a primary product
         *   - isLoading : (boolean) Whether the current product is loading
         *   - isOffer  : (boolean) Whether the current state is an offer screen
         *   - hasEula : (booelan) Whether the current state has a Eula.
         *    
         *
         *
         * @type {object}
         */
        this.ui=ko.computed({owner:this,
                read:function(){
                    var ret={}
                    ret.isLeadProduct=this.isLeadProduct();
                    ret.productEulaUrl=this.productEulaUrl();
                    ret.customParameters = this.customParameters();
                    ret.isPrimary = this.isPrimary()
                    ret.isLoading = this.isLoading()
                    ret.isOffer = this.isOffer()
                    ret.hasEula= this.stateHasEula();
                    return ret;
        },deferEvaluation:true}).committable()
        this.progressCache=ko.observable({});
        this.isUninstaller=ko.computed(function(){
            return this.state() ==  STATE_UNINSTALL;
        },this);
        /**
         * Whether the SkipAll should be shown on the installer.
         * @type {boolean}
         */
        this.showSkipAll=ko.computed({
                read:function(){
                   // debug_log("Update SKipall:" + this.isOffer());
                    this._internalUpdate();//Internal Update Linkage
                    if(!this.isOffer()) return false;
                    var appData=this.AppData(),
                    bundle=this.currentBundleData(),
                    skipAllPosition=(appData.SkipAllPosition && appData.SkipAllPosition._body_),
                    skipAllVisible=false;
                    if(skipAllPosition && skipAllPosition.length>0){
                        skipAllVisible=showSkipAll(skipAllPosition,bundle)
                    }
                    //alert("SkipAll -> " + skipAllPosition + "/" + skipAllVisible + "/" + bundle.advertiserIndex )
                    return skipAllVisible;
                },
                owner:this,
                deferEvaluation:true
        });
        /**
         * Whether the Skin has a MultiProgress flag.
         * Technically speaking this value is a misnomer as the ConsolidateProgress
         * feature shouldbe used for this sort of things
         * *NOTICE:* this should really not be used
         */
        this.multiProgress=ko.computed({read: function(){
                var ret=this.SkinData().multi_progress == true;
                return ret;
        },owner:this,deferEvaluation:true });
        /**
         * Whether this installer state has a feature bar.
         * @type {boolean}
         * 
         */
        this.hasFeatureBar=ko.computed({read:function(){
                return this.currentBundleData() && this.eulaLoaded() && !this.hasCustomFeatures();
        },owner:this})
        
        if(this.ds){
            var ds=this.ds;
            //IF we have a data_store we will set the current slot and state 
            this.CurrentSlot.subscribe(function(x){ ds.setItem("currentSlot",x); })
            this.state.subscribe(function(x){ ds.setItem("currentState",state2String(x)); })
        }    
    window.InstallModel=InstallModel;
    $.extend(InstallModel.prototype,
        /** @lends InstallModel */
        {
            internalUpdate:function(){
                this._internalUpdate(this._internalUpdate()+1);
            },
            /**
             * Triggered by host containing the install status
             * of a specific bundle.
             * @param {number} idx Bundle Index (One based!). This is a virtual Index that depends on the singleProgress Bar/Progress consolidation
             * @param {string} status Status string (this is a key into the status table)
             * @param {number} originalIdx The index of the actual bundle  (One Based)
             */
            updateInstallLine:function(idx,status,originalIdx){
                var bundle=this.BundleData()[originalIdx -1];
                if(bundle == null){ 
                    return;
                }
                var key="_"  + (bundle.bundleIndex-1),
                cache=this.progressCache();
                this.dlLastBundleIdx(originalIdx-1);
                provider= cache[key] || this.globalProvider,
                params=INSTALL_DATA[status];
                if(!provider){ 
                    debug_log("No provider");
                    return;
                }
                switch(status){
                case "Downloaded":
                    if(provider){
                        log("Done -> " + originalIdx);
                        provider.activity("Downloaded");
                        provider.done(true);
                    }
                    break;
                default:
                    if(params){
                        provider.activity(params[0]);
                    }
                }
            },
            /**
             * Triggered by host to pass detailed download information
             * about a specific Step of a specific bundle. 
             * The parameters stepIdx can be used to actually indicate what is being
             * downloaded. Each "resource" has a stepIdx associated with it.
             * @param {number} idx Bundle Index
             * @param {number} min Bytes of data downloaded so far
             * @param {number} max Total number of bytes to download 
             * @param {number} stepIdx The actual step index. 
             * @param {boolean} canPause can the download be paused
             */
            updateProgress:function(idx,min,max,stepIdx,canPause){
                var bundle=this.BundleData()[idx-1];
                if(bundle == null) return;
                if(stepIdx ==  bundle.InstallStepIdx
                  || stepIdx == -1){
                    bundle.downloaded=min;
                    bundle.toDownload=max;
                }
                if(stepIdx >0){
                    this.dlLastBigStep(stepIdx);
                    this.dlStepsSeen["_" + stepIdx] = 1
                }
                //Process all the files
                $.each(bundle.File,function(_,f){
                    //If we have seen this step.
                    if(f.InstallStepIdx == stepIdx){
                        f.downloaded=min;
                        f.toDownload=max;
                        return false;
                    }
                });
                this.updateTotals();
                this.canPause(canPause==1);
            },
            updateDownloadRate:function(){
            },
            /**
             * Recompute overall install progress based on the states 
             * of the individual downloa progresses.
             * This updates {@link InstallModel#downloaded} and  {@link InstallModel#toDownload}
             */
            updateTotals:function(){
                var _min=0,_max=1;
                var self=this;
                $.each(this.InstallingBundles(),function(_,v){
                    var _initial=_min,_initialMax=_max;
                    _last=v._lastmindownload || 0;
                    _min = _min + (this.downloaded || 0)
                    _max = _max + (this.toDownload  || 1) ;
                    $.each(v.File,function(_,f){
                        if(f.downloaded) _min = _min + f.downloaded;
                        if(f.toDownload) _max = _max + f.toDownload;
                    });
                    //log("Updated -> " + [_min,_max,_initial,_last,v._downloadUpdate].join(","))
                    var dled=_min-_initial,
                    dlmax=(_max-_initialMax)
                    if(_min != _initial){ //Nothing changed for thos.
                        //Something changed
                        if (dled != _last ){
                            //log("Download Update");
                            var key="_"  + (v.bundleIndex-1),cache= self.progressCache(), 
                            provider= cache[key];
                            if(provider){
                                provider.downloaded(dled);
                                if(v.TotalBundleBytes){
                                    provider.toDownload(v.TotalBundleBytes);
                                }else provider.toDownload(dlmax);
                            }
                        }else {
                            //log("Unchanged");
                        }
                    }
                    v._lastmindownload=dled;
                });
                if(this.AppData().TotalDownloadSize) {
                    this.toDownload(this.AppData().TotalDownloadSize);
                }else this.toDownload(_max);
                this.downloaded(_min);
            },
            /**
             * Trigger Pause in the Host
             */
            pauseDownload:function(){
                issueCommand("install/pause");
            },
            /**
             * Trigger resume in the host
             */
            resumeDownload:function(){
                issueCommand("install/resume");
            },
            metricModeHandle:function(_,e){
                e=$.event.fix(e);
                if(!DEBUG_MODE) return;
                var _char=String.fromCharCode(e.keyCode);
                if(METRIC_SEQUENCE.charAt(this._sequence) == _char ){
                    this._sequence=this._sequence+1;
                }else{
                    this._sequence=0;
                }
                if(this._sequence ==  METRIC_SEQUENCE.length){
                    this._sequence=0;
                    this._internalMetricUpdate(this._internalMetricUpdate()+1);
                    this.showMetrics(true);
                }
            },
            /** Get the product name from a JSON-XML value
             * @arg {Bundle} x JSON-XML reprentation of a bundle
             */
            getProductName:function(x){
                try{
                    return x.ProductName._body_;
                }catch(_){
                    return "";
                }
            },
            showProgressDetails:function(){return true; },
            /**
             * Actualy perform Skip All action
             */
            doSkipAll:doSkipAll,
            /**
             * Whether this has a skip all function
             */
            hasSkipAll:ko.computed({
                    read:function(){
                        //Is skip all enabled
                        return hasSkipAll()
                    },deferEvaluation:true
            }), 
            /**
             * Return an observable that tracks the state of a  specific feature for a bundle.
             * This observable is writable  and can be bound to the UI.
             * @param {string|number} id  The feature id or a number specifying the index of the feature in thelist
             * @param {Bundle} _bundle The bundle object. If this is blank the current Bundle is used.
             */
            featureState:function(id,_bundle){
            var bundle=_bundle || this.currentBundleData();
            if(bundle == null) return false;
            //debug_log("State " + id + " for Bundle " + bundle.bundleIndex);
            var feature=null,feat=null;
            var featureIndex=null;
            if(typeof(id) === 'number'){
                featureIndex=id
                feat=feature=bundle.Feature[id]
            }else{
                for(var x in bundle.Feature){
                    var feat=bundle.Feature[x];
                    if(feat && feat._a_ && feat._a_.id == id){
                        feature=feat;
                        featureIndex=x;
                        break;
                    }
                }
                if(!feat) return false;
            }
            if (!feat._observable){
                feat._observable= ko.observable(feat._a_.InitialState == "checked");
                feat._observable.subscribe(function(x){
                    var newstate=feat._a_.InitialState=x?"checked":"unchecked";
                    issueCommand("bundle/featureState",[bundle.bundleIndex-1,featureIndex,newstate].join("|"));
                });
            }
            return feat._observable;
            },
            /** Launch the thanks Popup in the installer */
            doThanks:function(){
                //thanks for the App
                issueCommand("app/thanks","");
            },
            /** 
             * Transmit the tracking data in the installer :
             * 
             * *NOTICE* this will transmit the tracking information that has 
             * been collected so far. It means anything that hasnt been tracked will
             * NOT be sent later.
             */
            doTrack:function(){
                issueCommand("app/track","");
            },
            doPartnerTrack:function(){
                issueCommand("app/partnertrack","");
            },
            minimizeWindow:function(){
                issueCommand("window/minimize","");
            },
            restoreWindow:function(){
                issueCommand("window/restore","");
            },
            /**
             * Return an observable that evaluates to the 
             * Enviroment/Entry named {name}
             * @param {name} String name of the environment entry
             */
            environmentParameter:function(name){
                return ko.computed({read:function(){
                        this.internalUpdate();
                        var app=this.AppData(),
                        entries=app && app.Environment && app.Environment.Entry;
                        if(!entries) return null;
                        var elt=$.grep(entries,function(v){
                            if(!v) return false;
                            var _name=v && v._a_ && v._a_.name;
                            return _name == name;
                        });
                        if(elt && elt.length >0) return elt[0]._body_
                },owner:this,deferEvaluation:true})
            }
    })
    window.model = new InstallModel();
        /**
         * Button Control Service.
         */
         var ButtonControl=function(){
         }
         ButtonControl.prototype={
             hideButton:function(name){
                 var data=window.model.buttonVisibility;
                 data()[name]=true;
                 data($.extend({},data()));
             },
             showButton:function(name){
                 var data=window.model.buttonVisibility;
                 var obj=data() 
                 delete obj[name];
                 data($.extend({},obj))
             },doAccept:function(){
                 navButtonClick("accept");
             },doDecline:function(){
                 navButtonClick("decline");
             },doBack:function(){
                 navButtonClick("back");
             },doRaw:function(name){
                 navButtonClick(raw);
             }
         };
         addService("common.ButtonControl",new ButtonControl());
 * @class StatusProvider
 * Simple status provider class provides information about the prepare status of a bundle.
 * Specifically what was the last activity that occurred on that bundle 
 * relating to the install state.
 * @param {Bundle} bundle The bundle object in question
var  StatusProvider=function(bundle){
    /**
     * The bundle object
     * @type {Bundle}
     */
    this.bundle=bundle;
    /**
     * Whether the install is complete.
     * @type {boolean}
     */
    this.done=ko.observable(this.bundle._prepareStatus_ == 'success');
    /**
     * The last install activity
     * @type {string}
     */
    this.activity=ko.observable(getStatus(this.bundle));
 * @class ProgressProvider
 * Function that will return the ProgressProvider interface for a
 * specific Bundle object.
 * This interface represents the install progress information for a bundle
 * and should be used when writing templates that represent progress
 * as it provides a nice submodel  that can be used as the top level model in the 
 * template.
 * This Function is technically a constructor and a lookup function that will
 * construct or retrieve a new object when called with without the new keyword.
 * @param {number} idx the bundle index (Zero based)
 * @param {Bundle[]} blist a list of bundles.
 * @augments StatusProvider
var ProgressProvider=function(idx,blist){
    if(isWindow(this)){
        var bundle=blist &&  blist[idx];
        var key="_" + ((bundle &&  bundle.bundleIndex-1) ||  idx),
        progressCache=window.model.progressCache();
        if(typeof progressCache[key] === 'undefined'){
            debug_log("Progress Provider for " + key + " created");
            progressCache[key]=new ProgressProvider(idx,blist);
        }
        return progressCache[key];
    //log("Provider Cache [" + idx  + "]");
    var $root=window.model;
    StatusProvider.call(this,blist[idx]);
    this.changed=ko.observable(0);
    /**
     * Data download so far in  bytes
     * @type {number}
     */
    this.downloaded=ko.observable(0);
    /**
     * Total amount of data to download in bytes
     * @type {number}
     */
    this.toDownload=ko.observable(1);
    //log("Prepare Status for " + idx + " -> " + this.bundle._prepareStatus_ );
    /** 
     * Time when the install started.
     */
    this.startTime=ko.observable();
    var self=this;
  /*  this.bundle._downloadUpdate=function(min,max){
        log("Download Update :" + min  + " -> " + max);
        self.downloaded(min);
        self.toDownload(max||1);
    }*/
    /**
     * Is progress paused
     * @type {boolean}
     */
    this.isPaused= $root.isPaused;
    /**
     * Can progress be paused.
     * @type {boolean}
     */
    this.canPause= ko.computed({owner:this,
            read:function(){
                return this.downloaded()>0 && $root.canPause() && !this.done();
            }
    });
    /**
     * The actual download progress as a  percentage.
     * THis value is somewhat sanitized in that it will return 100% when done
     * @type {string}
     */
    this.downloadProgress=ko.computed({owner:this,
            read:function(){
                this.done();this.downloaded();this.toDownload();
                if(this.done()) return "100%";
                if(this.downloaded() == 0) return "0%";
                var pcnt=this.downloaded()/(this.toDownload()+1)*100;
                var str=Math.min(100,Math.max(0,pcnt.toFixed(2))) + "%";
                log("DownloadProgress:" + this.bundle.ProductName._body_  + " -> " + str);
                return str;
            }
    });
    this.showProgressDetails=ko.computed({owner:this ,
            read:function(){
                return this.downloaded() >0 &&  !this.done();
                //return this.downloaded() >0 && this.downloaded() < this.toDownload();
            }
    });
    /**
     * Human friendly {@link ProgressProvider#downloaded} value in automatically selected units.
     * @type {string}
     */
    this.downloadedHuman=ko.computed({owner:this,
            read:function(){
                var ret=toHuman(this.downloaded());
                log("Downloaded -> " + ret);
                return ret;
            }
    });
    /**
     * Human friendly {@link ProgressProvider@toDownload} value in automatically
     * selected units 
     * @type {string}
     */
    this.toDownloadHuman=ko.computed({owner:this,
            read:function(){
                return toHuman(this.toDownload());
            }
    });
    /**
     * Raw download rate in bytes per second.
     * @type {number}
     */
    this.downloadRateRaw=ko.computed({owner:this,
            read:function(){
                if(this.startTime() == null && this.downloaded() > 1){
                    this.startTime(new Date());
                }
                if(this.startTime() == null) return;
                var secDiff=new Date().getTime() -  this.startTime().getTime();
                secDiff=secDiff/1000
                return this.downloaded()/secDiff;
            }
    });
    /**
     * Human friendly {@link ProgressProvider#downloadRateRaw} in 
     * automatically specified units
     * @type {string}
     */
    this.downloadRateHuman=ko.computed({owner:this ,
            read:function(){
                return  toHuman(this.downloadRateRaw()) + "/s";
            }
    });
 * Set the index of the first Bundle to be show 
 * @param {number} index Bundle Index (Zero BaseD)
function setFirstBundle(idx){
    if(typeof idx != "undefined"){
        FirstBundle=idx;
 * Set the index of the CurrentBundle from the Host!
 * @param {number} idx Current Bundle Index (Zero based);:
 * @param {number} realIdx Current Bundle Index 
function setCurrentBundle(idx,realIdx){
    window.CurrentBundle=CurrentBundle=idx;
    if(window.external){
        if(realIdx) issueCommand("bundle/Current",realIdx);
        else issueCommand("bundle/Current",idx);
    if(hasKo) model.CurrentBundle(idx);
 * Callback function from host that passed in the array of bundels
 * Set the bundle data.
 * Remember bundles that will not be shown may have a  single null value in the 
 * array where they used to be.
 * @param {Bundle[]} data Array contain the bundle data
 * @memberof! HostInterface
function setBundleData(data){
    BundleData=data;
    _idCache={}
    if(hasKo) window.model.BundleData(data);
 * Callback function from host that passes a single budnles data
 * to be updated
 * @param {Bundle} data Object containing a single bundles data
 * @memberof! HostInterface
function updateBundleData(data){
    var idx=data.bundleIndex;
    var localIdx=getClientIndex(idx);
    BundleData[localIdx]=data
    if(hasKo) {
        window.model.BundleData.splice(localIdx,1,data);
 * Callback function from host that passes the environment data
 * to in
 * @param {object} data  
 * @memberof! HostInterface
function setEnvData(data){
    EnvData=data
 * Callback function from host that passes in the application data.
 * @param {object} data The installation Data in the JSON-XML format.
 * @memberof! HostInterface
function setAppData(data){
    AppData=data;
    //Carrot product has an icon
    window.model.AppData(data);
    window.model.progressCache({});
 * Callback invoked by host to  pass in skin data.
 * @arg {string} data Raw json object that contains the skin options.json file.
 * @memberof! HostInterface
function setSkinData(data){
    SkinData = data;
        window.model.SkinData(data);
 * callback invoked by host to indicate that the installer is paused.
 * Default behaviour is to update window.model.
 * @arg {boolean} isPaused  What is the pause state of the install host.
 * @memberof! HostInterface
function setPauseState(isPaused){
    window.model.isPaused(isPaused==1);
 * Function to extract a specific custom parameter form a bundle.
 * This is here because the JSON/XML format is straightforward but can be tricky when 
 * bits of data are missing.
 * @param {Bundle} bundle Bundle Object
 * @param {string} name Name of the custom parameter
var getCustomParameter=function(bundle,name){
    try{
        var found=null;
        $.each(bundle.CustomParameter,function(){
            if(!this._a_) return ;
            if(this._a_.Name == name){
                found =this._body_;
                return false;
            }
        });
        return found;
    }catch(_){
        return null;
 * Return if a bundle requires a click to proceed.
 * This feature implies 
 * @param {Bundle} bundle Bundle object to check the require-click flag
function requiresClick(bundle){
    return getCustomParameter(bundle,"requires-click") == "true"
 * Configuration functiont that provides bundle captions for specific install lines.
 * function is expected to return a string
 * @callback 
 * @param {Bundle} bundle The bundle object.
var captionFunction=function(bundle){
    return bundle.ProductName._body_ || "Unknown"
function setCaptionFunction(x){
    captionFunction=x;
function getInstallMetrics(){
    var ret=issueCommand("install/metrics")
    try { 
        var resp=eval("(" + ret + ")"); 
        if(resp.entries) resp.entries.sort(function(x,y){
            if(x.start != y.start) return x.start - y.start;
            return x.end-y.end;
        });
        return resp
    }catch(_){
        return { "initial": 0 , entries: [] }
 * Check to see if the bundle should be hidden
function isBundleHidden(bundle){
    if(bundle._willDisplay_ == 0) return true;
    if(bundle.categoryUsed) return true;
    if(overMaxOffers(bundle)) return true;
    return false;
function isHiddenContinuation(currentBundle,idx){
    try{
    var prev=BundleData[idx-1];
    if(prev ==null) return false;
    if(!currentBundle.isContinuation) return false; //Only work for continuations
    if(prev._willInstall_ == 1) return false; //Show if Prior is to be installled
    return true; // if its a continaution and the prior screen will NOT be installed we need to hide it
    }catch(_){
        error_log(null,"Bundle[" + idx + "] Error Processing Continuation:" + e.message); 
    return false;
 * Explicitly commit some changes to the ui
function commitUi(){
    if(window.model) window.model.ui.commit();
//Load the offer screen for a specific bundle
function offerBundle(idx,dir,check){
    updateBodyClass("offer"); 
    dir=dir||1;
    var bundle=BundleData[idx]
    var skipBundle=function(overMax){ 
        //Skip the bundle we are currently on.
        if(dir ==1) {
            nextBundle(false,idx);
        } else if(CurrentBundle>0){
            //If for some reason we cant get the previous bundle  t
            prevBundle(idx)
        }
    //A Null bundle then we skip to the next one
    if(bundle == null){
        return skipBundle();
    //Check if we are over max Offers
    if(overMaxOffers(bundle)){
        return skipBundle(true);
    if(check){
        var ret=issueCommand("bundle/getProdState",bundle.bundleIndex-1);
        try{
            var resp=eval("(" + ret + ")"); 
            //Copy over fields
            $.each(["_willDisplay_","_willInstall_","isConsolidated","consolidated","advertiserIndex","categoryUsed"],function(){
                if(typeof resp[this] != "undefined") {
                    bundle[this]=resp[this];
                }
            });
            window.model.internalUpdate();
        }catch(e){
            error_log(e,ret);
        }
    //Bundle is not to be shown then to offer it 
    //is to transition to the next bundle
    //Changes here will relate to the step count for the bundle so check out 
    //@{window.model.currentStep}
    if(bundle._willDisplay_==0 
        || isHiddenContinuation(bundle,idx) 
    /*|| bundle.categoryUsed*/){
        return skipBundle(); 
    var shown=parseInt(issueCommand("bundle/preOffer",bundle.bundleIndex));
    if(window.model && window.model.force){
        shown=true;
    if(!shown && window.model){
        model.state(STATE_LOADING);
        return;
    model.state(STATE_OFFERING);
    if(!bundle.isContinuation){
        addOfferView(bundle) //Add this bundel to the viewed offer map
    activeEula=null;//clear the eula
    setCurrentBundle(idx,bundle.bundleIndex-1);
    resetCustomFeatures();
    //Update the current Slot
    window.model.CurrentSlot(window.model.CurrentSlot() +  dir)
 * Add offer View
 * @param bundle the bundle taht is being shown
 var addOfferView,overMaxOffers;
 (function() {
         var _offerBundles={};
         var numOffers=0;
         addOfferView=function(bundle){
             //Invoke the offer handler.
             issueCommand("bundle/offer",bundle.bundleIndex);
             if( typeof _offerBundles[bundle.bundleIndex] === 'undefined'){
                 numOffers=numOffers+1;
                 debug_trace("Num Offers -> " + numOffers);
             }
             _offerBundles[bundle.bundleIndex]=true
         };
         /**
          * Return if the bundle was over the max number of bundles.
          * @param bundle {Bundle Object} optional speficic bundle to check.
          */
         overMaxOffers=function(bundle){
             var maxOffers=parseInt(AppData && AppData.MaxOffers && AppData.MaxOffers._body_)
             debug_trace("Num Offers -> " + numOffers + "(MaxOffers:" + maxOffers + ")");
             if(!maxOffers) return false;
             //debug_log("Max offers -> " + maxOffers);
             //if we pass in a bundle and it is a bundle that has been shown then honor MaxOffers
             if(bundle && _offerBundles[bundle.bundleIndex]){
                 return false;
             }
             //Continuations will no be tested agains overmax
             //If we ar eover max previous bundle will fail 
             //and isHiddenContinuation will catch them
             if(bundle && bundle.isContinuation){
                 return false;
             }
             return numOffers > maxOffers;
         }
 })();
function resetCustomFeatures(){
    try {
        issueCommand("bundle/resetCustomFeatures","");
    }catch(E){
* Called from a SUb Eula that has checkboxes embedded
function setupCustomFeatures(subdoc){
    issueCommand("bundle/customFeatures","");
// Called from the nested EULA iframe when the feature element is clicked.
// <input type='checkbox' > is expected to have name='the designated feeature name'
function onFeatureChange(checkbox){
    var elt=$(checkbox);
    var name=elt.attr("name");
    var checked=elt.is(":checked");
    var bundle=BundleData[CurrentBundle];
    for(var x in bundle.Feature){
        var feat=bundle.Feature[x];
        if(feat._a_.id.toLowerCase()==name.toLowerCase()){
            var newState=feat._a_.InitialState=checked?"checked":"unchecked";
            //lower case string. comparison
            issueCommand("bundle/featureState",[bundle.bundleIndex-1,x,newState].join("|"));
            break;
        }
window.onFeatureChange=onFeatureChange;
function hasCustomFeatures(){
    try{
        return issueCommand("bundle/customFeatures?","") === "1";
    }catch(e){
    return false;
window.hasCustomFeatures=hasCustomFeatures;
function onEulaError(){
    alert("Failed to load the eula!");
 * @callback
 * Callback function to be triggered when an Iframe containing a Eula is loaded
 * This function will actually update window.model with this info 
function onEulaLoaded(){
    window.model.eulaLoaded(true);
    issueCommand("window/innerloaded",$("#frameEula").attr("src"));
    try{
        var doc=$(window.event.srcElement)[0];
        var newdoc=unwrapWindow(doc.contentWindow);//unwrapWindow(doc)
        //quickRepl({event:window.event.srcElement,unwrapped:unwrapped,doc:newdoc});
        //This is case sensitive  but new doc  is an instance 
        //of IWebBrowser2
        bindDocumentEvents(newdoc.Document);
        var win=newdoc.Document.parentWindow;
        //debug_log("binding Events");
        //quickRepl({target:newdoc});
        activeEula=newdoc;//Store the active Eula
        var setInstallModel=getEulaCallback("setInstallModel");
        setInstallModel && setInstallModel(window.model);
    }catch(e){
        error_log(e,"Bind Iframe Events");
 * GEt the eula level callback called XYZ
function getEulaCallback(name){
    try {
        if(activeEula == null) return;
        return activeEula.Document.parentWindow[name];
    }catch(e){
        error_log(e,"eula has callback fail!")
//Go to the Next Bundle.
function nextBundle(accepted,tgtBundle){
    var _CurrentBundle=tgtBundle || CurrentBundle;
    var bundle=BundleData[_CurrentBundle];
    var bIdx=bundle.bundleIndex-1;
    if(bundle!=null){ // For Bundles that were skipped we wont pass the information over.
        var featureFlags=[]
        //If the features are handled from within the eula then 
        //we will not collect them from this frame.
        //clicks will be tracked by onFeatureChange.
        if(!hasCustomFeatures()){ //Then transfer over the feature state.
            for(var x in bundle.Feature){
                var elt=$("#Feature_" + x);
                //Make sure we only update features we control
                if(elt.length>0){
                    var checked=elt.is(":checked");
                    var newState=bundle.Feature[x]._a_.InitialState=checked?"checked":"unchecked";
                    if(checked) featureFlags.push(bundle.Feature[x]._a_.Options);
                    issueCommand("bundle/featureState",[bIdx,x,newState].join("|"));
                }
            }
        }else{
            //Have custom features so we need to reload the features array from 
            //the Lua side before wbe put the flags together.
            bundle.Feature=eval(issueCommand("bundle/features",bIdx))
        }
        //Sync the bundle state on the Lua Side.
        if(bundle.isConsolidated){
            //Consolidated bundles state is controlled by something else
            debug_log("Bundle[" + bundle.bundleIndex + "] is consolidated"); 
        }else{
            setBundleSlot(bundle.bundleIndex,window.model.CurrentSlot());
            bundle._willInstall_=accepted?1:0;
           var ret=issueCommand("bundle/setPro
dState+",bIdx,bundle._willInstall_,
                    (bundle._willInstall_==1?"accept":(!isBundleHidden(bundle)?"decline":"hidden")),
                    "false",
                    overMaxOffers(bundle));
            try{
                var resp=eval(ret); 
                for(var i=0;i< resp.length;++i){
                    var b=BundleData[i],newval=resp[i];
                    b._willInstall_ = newval._willInstall_;
                    b._willDisplay_ = newval._willDisplay_
                }
                // We arent calling window.model.internalUpdate() because our call to offerBundle will do that
                // The general assumption here is bundle [x] will not cause changes to bundle[n] for  n<x;
            }catch(e){
            }
            setBundleSlot(bundle.bundleIndex,window.model.CurrentSlot());
            try{
                var frame=$("#frameEula"),
                callback=(bundle._willInstall_?"onAccept":"onDecline"),
                newdoc=unwrapWindow(frame[0].contentWindow);
                var win=newdoc.Document.parentWindow;
                var toCall=win[callback];
                if(toCall)  toCall();
                //toCall=["frameEula",bundle.ProductEula._body_,"(function(){ if(window." + callback + ") window." + callback + "(); })()" ].join("\x01");
            }catch(_){
                error_log(_,"Error calling onAccept/onDecline callback");
            }
        }
        /*
         Due to the Abnormal Window messaging issue.s
         I cannot safely compiute featureOptions here.
         This is because the actual feature confirmation  actions 
         that are run from the eula iframe get evaluated after the next page loads.
         This is okay becayse the order is still preserved.
         for(var x in bundle.Feature){
         var f=bundle.Feature[x];
         if(f._a_.InitialState == "checked") 
         featureFlags.push(f._a_.Options);
    issueCommand("bundle/featureOptions",[CurrentBundle,featureFlags.join(" ")].join("\x01"))*/
    //bundle.state=accepted?"accept"
    if(_CurrentBundle+1 == BundleData.length){
        //Update the Lua Side State.
        issueCommand("nav/install");
    }else{
        //Move to the Next Offer
        offerBundle(_CurrentBundle+1,1,true);
function prevBundle(tgtBundle){
    _CurrentBundle=tgtBundle|| CurrentBundle
    if(_CurrentBundle ==FirstBundle) return;
    offerBundle(_CurrentBundle-1,-1);
function navAcceptClick(){
    var cmd=$("#accept-button").attr("navCommand");
    navButtonClick(cmd);
function stopBubble(e){
    if(!e) return;
    e.cancelBubble=true;
    e.returnValue=false;
//handle a skip all click
function doSkipAll(allOffers){
    var bundle=BundleData[CurrentBundle];
    //Dont check CurrentBundle because 
    //it is not true that the primary product will be bundle IDX=0
    if(bundle){
        if(bundle.isPrimary){
            issueCommand("bundle/setProdState+",bundle.bundleIndex-1,1, "accept","skipall");
            setBundleSlot(bundle.bundleIndex,window.model.CurrentSlot())
        }
    issueCommand("nav/skipall",allOffers?"true":"false"); 
//Navigation button handlers
function navButtonClick(which,e){
    e=e||window.event;
    if(e) stopBubble(e);
    try{
        var eulaHandler=getEulaCallback("onSkinButtonClick");
        if(eulaHandler){
            var handled=eulaHandler(which,window.model);
            if(handled ===  true) return;
        }
    }catch(e){ 
    error_log(e,"EulaHandler Failure");
    if(which == "accept"){
        //We are using knockout so this stuf
        //
        nextBundle(model.isPrimary() || model.installThisOne() == "yes"); 
        commitUi();
    }else if(which == "decline"){
        nextBundle(false);
        commitUi();
    }else if(which == "back"){
        prevBundle();
        commitUi();
    }else{
        issueCommand("nav/" + which);
function windowButtonClick(which,e){
    var e=e||window.event;
    if(e) stopBubble(e);
    issueCommand("window/" + which);
    //alert(which);
 * Get a specific service
 * @param {string} name The name of the service
function getService(name)  {
    try {
        return (window._external ||  window.external).getService(name);
    }catch(e){
        return null;
function addService(name,data){
    try{
        return (window._external||window.external).addService(name,data);
    }catch(e){
        error_log(e,"addService");
function unwrapWindow(wnd){
    try{
        return (window._external||window.external).unwrapWindow(wnd);
    }catch(e){
        error_log(e,"unwrapWindow");
function window2Document(wnd){
    try{
        return (window._external||window.external).window2Document(wnd);
    }catch(e){
        error_log(e,"window2Document");
//Issue a command to the Parent
function issueCommand(name,d1,d2,d3,d4,d5,d6,d7,d8,d9,d10){
    try{
        var issue
        var ext=(window._external || window.external);
        switch(arguments.length){
            case 1: return  ext.issueCommand(name);
            case 2: return  ext.issueCommand(name,d1);
            case 3: return  ext.issueCommand(name,d1,d2);
            case 4: return  ext.issueCommand(name,d1,d2,d3);
            case 5: return  ext.issueCommand(name,d1,d2,d3,d4);
            case 6: return  ext.issueCommand(name,d1,d2,d3,d4,d5);
            case 7: return  ext.issueCommand(name,d1,d2,d3,d4,d5,d6);
            case 8: return  ext.issueCommand(name,d1,d2,d3,d4,d5,d6,d7);
            case 9: return  ext.issueCommand(name,d1,d2,d3,d4,d5,d6,d7,d8);
            case 10: return  ext.issueCommand(name,d1,d2,d3,d4,d5,d6,d7,d8,d9);
            default: 
                     error_log("Issue Command too many arguments!");
                     return null;
        }
    }catch(e){
function setupDocumentEvents(){
    bindDocumentEvents(document)
    //Bind the Esc key to cancel
    $(document).keypress(function(e){
        if(e.keyCode == 27 ){
            navButtonClick("cancel");
        }
    });
    $("#accept-button").keydown(function(e){
        var code = (e.keyCode ? e.keyCode : e.which);
        //alert("KEY PRESSED:" + code);
        if(code == 13) { //Enter keycode
            if(BundleData){
                var bundle=BundleData[CurrentBundle];
                if(requiresClick(bundle)){
                    e.preventDefault();
                    //Prevent all other even handlers from firing
                    e.stopImmediatePropagation();
                    return ;
                }
            }
        }
    });
function bindDocumentEvents(doc){
    $(doc).keydown(function(e){
        var code = (e.keyCode ? e.keyCode : e.which);
        //alert("KEY PRESSED:" + code);
        if(code == 13) { //Enter keycode
        e.preventDefault(); //Docuyment keydown is prevented all the time
            if(BundleData){
                var bundle=BundleData[CurrentBundle];
                if(requiresClick(bundle)){
                    return ;
                }
            }
            var $tgt=$(e.target);
            //If the target had an onclick then let it be
            if($tgt.attr("onclick")){
                $tgt.click();
                return;
            }
            if(  $tgt.attr("href")){
                return;
            }
            $("#accept-button").click();
            //Do something
        }else if (code == 8 || code  == 46){
            e.preventDefault();
        }
    });
function setupDragHandler(){
    $("body").mousedown(function(e){
        var target=$(e.target);
        //Some elements cant initiate a drag
        if(target.attr("href")) return;//Links dont start drags
        if(target.closest(".nodrag").length >0 ) return;
        if(e.which ==1){
            issueCommand("window/begin_drag");
        }
        //debugger
    });
//Get the status of a download
var getStatus=function(bundle){
    if(bundle._installed_ == 1) return "Installed";
    return "Waiting";
var progressCaption=function(bundle){
    return bundle.ProductName._body_
function setProgressCaptionFunction(func){
    progressCaption=func;
 * Function invoked by host to trigger the installaion process.
 * This function moves the {@link InstallModel} into the Install state.
 * @memberof! HostInterface
function beginInstall(){
    activeEula=null;
    model.state(STATE_INSTALLING);
    setupCustomFeatures(); //This will hide the features and such.
 * Launch A url in the users default browser.
 * @param {string} url The url to open
function launchUrl(url){
    try{
        issueCommand("open/url",url);
    }catch(_){
 * Javascript event handler to be associated with Hrefs
 * to trigger urls to be open in the system default browser.
function openExternalUrl(){
    var e = (arguments.length ==1)?arguments[0]:arguments[1];
    var $this=$(e.target),
    href=$this.attr("href");
    //PRevent Default and then launch the url
    e.preventDefault();
    launchUrl(href);
 * Urls that open out of the installer are marked.
function setupLaunchUrl(){
    $("body a.external-url[href]").click(openExternalUrl);
//Delayed Refresh of theui
function delayedRefresh(){
    window.setTimeout(function(){
        issueCommand("window/refresh","");
    },20); 
function updateBodyClass(clazz){
    $("body").removeClass("offer install cancel complete").addClass(clazz);
 * Trigger from host to move installer into cancel state
 * @memberof! HostInterface
function beginCancel(){
    activeEula=null;
    model.state(STATE_CANCEL);
    setupCustomFeatures();
    delayedRefresh();
 * Callback triggered by Host to move the installer into the complete state.
 * @memberof! HostInterface
function beginComplete(){
    model.state(STATE_COMPLETE);
    delayedRefresh();
 * String Name,CSS CLASS, oscillating, technically fully downloaded?
var INSTALL_DATA= {
    Installed:["INSTALLED","installed",0 ,true],
    "Download Error":["FAILED","download-error",0,true ],
    "Downloading":["Downloading...","downloading",0,false],
    "Installing":["Installing...","installing",1,true],
    "Waiting":["Waiting...","waiting",0,false]
INSTALL_DATA["Downloaded"]=INSTALL_DATA["Downloading"];
INSTALL_DATA["Download Failed"]=INSTALL_DATA["Download Error"];
* Given and instal item cell remove all the other classes and add a new one
function updateInstallClass(elt,newclass){
    for(var x in INSTALL_DATA){
        var clazz=INSTALL_DATA[x][1];
        elt.removeClass(clazz);
    elt.addClass(newclass);
    return elt;
 * Callback triggered by host to pass installation status of a single bundle.
 * @see InstallModel#updateInstall
 * @memberof! HostInterface
function updateInstallLine(idx,status,originalIdx){
    idx=getClientIndex(idx)+1;
    originalIdx=getClientIndex(originalIdx)+1;
    var params=INSTALL_DATA[status];
    window.model.updateInstallLine(idx,status,originalIdx);
function setupOscillatorTimer(){
    if(isUninstaller()) return;
    setInterval(updateOscillators,100);
//Callback Function to update oscilating Progress entries.
function updateOscillators(){
    $(".install-progress-bar.oscillating .install-progress-inner").each(function(){
        var elt=$(this);
        var current=$(this).attr("osc_pos") || 0;
        current=current*1;//convert to integer
        var len=$(this).parent().innerWidth()-50;
        // 0->len == positive, len ->2*len == negative;
        current=current +10;
        var pos= current % (len*2);
        if(pos >len){
            pos =(2*len) -pos;
        }
        $(this).css("left",pos + "px");
        $(this).attr("osc_pos",current);
    });
*  Setup Oscillating Progress
function setupOscillating(idx,osc){
    var elt=$("#divInstall" + idx);
    if(osc){
        $(".install-progress-bar",elt).addClass("oscillating");
        $(".install-progress-inner",elt).css("width","50px");
    }else{
        $(".install-progress-bar",elt).removeClass("oscillating")
        $(".install-progress-inner",elt).css("width","0px");
        $(".install-progress-inner",elt).css("left","0px");
function singleProgressCalc(idx,min,max,stepIdx){
    var ret={min:min,max:max};
    try{
        var steps=AppData.TotalSteps || 0;
        //If there is a total download lets get it.
        if(AppData.TotalDownloadSize){
            ret.max=AppData.TotalDownloadSize;
            //We need to compute Min by adding min to the mins of the prior products.
            ret.min=0
            for(var i=0;i<BundleData.length;++i){
                var b=BundleData[i];
                if(b ==null) continue;
                if(i == (idx-1)){
                    ret.min=ret.min+min;
                }else if(b._installed_ == 1 || b._fullydownloaded_ ){
                    ret.min = ret.min + (b.TotalBundleBytes || 0);
                }
            }
        }
        if(steps > 0  && !AppData.TotalDownloadSize){
            var pcntPerStep=100/steps;
            ret.max=100; //Force max to 0-100 scale'
            //Calculate min as percent of steps + percent of substep
            ret.min=(pcntPerStep * (steps -1)) + ((min/max) * pcntPerStep);
        }
    }catch(_){
        error_log(_,"SingleProgressCalc");
    return ret;
//Convert a Javascript vundle index into a local bundle index
function getClientIndex(idx){
    try{
        var cached=_idCache[idx]
        if(typeof(cached) === 'undefined'){
            var found=false;
            $.each( BundleData,function(k,v){
                if(idx == this.bundleIndex){
                    cached=k;
                    found=true;
                    return false;
                }
            })
            if(found){
                _idCache[idx]=cached;
            }
        }
        return cached;
    }catch(e){
        error_log(e,"getClientIndex");
    return idx;
//update installation progress
function updateInstallProgress(idx,min,max,stepIdx,canPause){
    idx=getClientIndex(idx)+1;
    try{
        window.model.updateProgress(idx,min,max,stepIdx,canPause);
    }catch(e){
        error_log(e,"updateInstallProgress");
 * Set the slot for the bundle 
 * @param {number} bundleIndex The bundle index
 * @param {number} slotId The Identifier for the slot
 var setBundleSlot=function(bundleIndex,slotId){
     issueCommand("bundle/setBundleSlot",bundleIndex,slotId)
 * Convert value to megabytes
 * @param {number} val Value in bytes
function toMB(val){
    return (val /(1024*1024) ).toFixed(1);
 * Convert value to friendliest most space efficient byte interpretation.
 * - Less than megabyte is represented in KB
 * - Everything else is represented in MB
 *   @param {number} val Megabytes
function toHuman(val){
    try{
        if(isNaN(val)) return "-";
        if(!isFinite(val)) return "-"
        var MEGABYTE= 1024*1024;
        if(val < MEGABYTE) return (val / 1024).toFixed(1) + "K"
            return (val/MEGABYTE).toFixed(1) + "MB"
    }catch(_){
        return "???";
* Enable the Debug Mode.
var debugDone=false;
function enableDebug(){
    if(debugDone) return;
    DEBUG_MODE=true;
    $("body").keypress(function(e){
        if(e.which == "r".charCodeAt(0)){
            delayedRefresh(); 
        }
    });
    if(window.ko){
        var watchField=function(name){
            return function(x){
                if(typeof(x) == "object"){
                    x=$.param(x)
                }
                issueCommand("debug/log","StateVar[" + name + "] -> " + x);
            }
        }
        if(window.model){
            $.each( ["state","isLeadProduct","isOffer","productEulaUrl","ui"],function(){
                window.model[this].subscribe(watchField(this));
            })
        }
    debugDone=true;
 * Determine whether the installer has a SingleProgressBar
function hasSingleProgressBar(){
    var newval=issueCommand("app/SingleProgressBar?") === true;
    log ("has Single Progress => " + newval);
    return newval;
 * Determine wheter the installer has the variation name
 * @param {string} name Name of variation
function hasVariation(name){
    return issueCommand("app/hasVariation?",name) === true;
 * Determin whether the installer has a skipAll
var hasSkipAll=function(){
    return  hasVariation("skip-all");
 * Determin whether the skip all button should be show for the currentBundle
 * @param {string} position one of the skip all positions  Primary|FirstAdvertiser|AllAdvertisers|AllOffers
 * @param {Bundle} currentBundle  A full bundle object
var showSkipAll=function(position,currentBundle){
    switch(position){
    case "Primary":
        return currentBundle.isPrimary
    case "FirstAdvertiser":
        return currentBundle.advertiserIndex == 1
    case "AllAdvertisers":
        return !currentBundle.isPrimary;
    case "AllOffers":
        return true
    return false;
function log(x){
    issueCommand("debug/log",x.toString());
 * Set the message in the cancel popup that the host shows
 * @param {string} msg Message
function setCancelMessage(msg){
    issueCommand("cancel/message",msg)
//UNINSTALL CODE!!!
 * Load KnockoutJs  
 * This exists so that skin html can script loading knockoit instead
 * of declaring a script tag
function loadKnockout(callback){
    if(!window.ko){
        var script=document.createElement('script');
        script.src="res/knockout.js";
        var head=document.getElementsByTagName('head')[0],
        done=false;
        script.onload=script.onreadystatechange = function(){
            if ( !done && (!this.readyState
                    || this.readyState == 'loaded'
                    || this.readyState == 'complete') ) {
                try{
                    done=true;
                    script.onload = script.onreadystatechange = null;
                    loadKoModel();
                    hasKo=true;
                    head.removeChild(script);
                    callback()
                }catch(e){
                    console_log(e,true);
                }
                    }
        };
        head.appendChild(script);
    }else callback()
var UninstallRecord=function(data,bundle){
    this.data=data;
    this.bundle=bundle;
    this.uninstall=ko.observable(false);
    this.state = ko.observable(0);
$.extend(UninstallRecord.prototype,{
        name:function(){
            try {
                return  this.data.display_name || this.bundle.ProductName._body_;
            }catch(_){
                return "";
            }
        },
        id:function(){
            return this.data.id;
        },
        stateString: function(){
            switch(this.state()){
            case -1: return "Not Found"
            case 0: if (!this.uninstall() ) return "Unchanged"
                return "Waiting"
            case 1: return "Uninstalling ..." 
            case 2: return "Uninstalled ..."
            default:
                return "-"
            }
        }
var startUninstall=ExceptionWrap(function(){
    issueCommand("app/data");
    //Move to Uninstall State
    uninstAttribs=window.model.AppData().Uninstaller && window.model.AppData().Uninstaller._a_;
    window.model.applicationTitle= ko.computed(function(){
        return (uninstAttribs && uninstAttribs.name) ||  (this.productName() +  " Uninstaller");
    },window.model);
    window.model.Uninstallers=ko.computed({read:function(){
            var bundles=this.BundleData();
            return ko.observableArray($.map(this.AppData().uninstallers || [],function(v,k){
                return new UninstallRecord(v,bundles[v.bundleIndex-1]);
            }));
    },owner:window.model,deferEvaluation:true});
    $.extend(window.InstallModel.prototype,{
            launchUninstaller:function(record){
                //TODO :Implement
                issueCommand("nav/uninstall",record.data.id);
            },
            completeUninstaller:function(){
                //To begin the uninstall
                //Uninstall is complete.
                issueCommand("nav/uninstall-complete");
                return 
            },
            hasProducts:function(){
                return this.Uninstallers()().length > 0;
            },findUninstallRecord:function(id){
                var res=$.grep(this.Uninstallers()(),function(v,idx){
                    return id==v.id();
                });
                return  (res.length  > 0) ?res[0]:null;
            },removeUninstaller: function(id){
                //Remove all the uninstallers matching that id
                ////Remove all the uninstallers matching that id
                this.Uninstallers().remove(function(item){
                    return item.id() == id;
                });
            }
    window.model.uninstallSteps=[1,2,3];
    window.model.uninstallStep=ko.observable(1);
    window.model.uninstallTotalSteps=3;
    window.model.state(STATE_UNINSTALL);
    ko.cleanNode(document)
    ko.applyBindings(window.model);
function isUninstaller(){
    return  false;// issueCommand("app/isUninstaller?",name) == "true";
function pickInstallFolder(title,action){
    action=action|| ""
    return issueCommand("app/pickfolder",title,action);
var startingUninstalls=function(){
    window.model.uninstallStep(2)
var uninstallFailed=ExceptionWrap(function(id){
    var record=window.model.findUninstallRecord(id);
var uninstallClosed=ExceptionWrap(function(id){
    var record=window.model.findUninstallRecord(id);
    if(record) record.state(0);
var uninstallComplete=ExceptionWrap(function(id){
    var record=window.model.findUninstallRecord(id);
    if(record){
        record.state(2);
        //REmove the uninstaller that just completed
        window.model.removeUninstaller(id);
var uninstallStarting=ExceptionWrap(function(id){
    var record=window.model.findUninstallRecord(id);
    if(record) record.state(1);
var uninstallFinish=function(){
    window.model.uninstallStep(3);
/*================================================*/
$(setupDragHandler);
$(setupLaunchUrl);
$(setupDocumentEvents);
//Load Knockout if available 
loadKoModel();
$(setupOscillatorTimer);
function quickRepl(data){
   var last="",result=null;
   var lastError;
   do {
      
       if(last != "" ){
           try{
               result=eval(last);
           }catch(e) {
               lastErorr=e;
               result="" + e.message
           }
           debug_log(result)
       }
       last=window.prompt("Enter code (Type 'exit' to quit):" + result,last);
   } while(last != null)
// Knockout JavaScript library v2.1.0
// (c) Steven Sanderson - http://knockoutjs.com/
// License: MIT (http://www.opensource.org/licenses/mit-license.php)
(function(window,document,navigator,undefined){
var DEBUG=true;
!function(factory) {
    // Support three module loading scenarios
    if (typeof require === 'function' && typeof exports === 'object' && typeof module === 'object') {
        // [1] CommonJS/Node.js
        var target = module['exports'] || exports; // module.exports is for Node.js
        factory(target);
    } else if (typeof define === 'function' && define['amd']) {
        // [2] AMD anonymous module
        define(['exports'], factory);
    } else {
        // [3] No module loader (plain <script> tag) - put directly in global namespace
        factory(window['ko'] = {});
}(function(koExports){
// Internally, all KO objects are attached to koExports (even the non-exported ones whose names will be minified by the closure compiler).
// In the future, the following "ko" variable may be made distinct from "koExports" so that private objects are not externally reachable.
var ko = typeof koExports !== 'undefined' ? koExports : {};
// Google Closure Compiler helpers (used only to make the minified file smaller)
ko.exportSymbol = function(koPath, object) {
	var tokens = koPath.split(".");
	// In the future, "ko" may become distinct from "koExports" (so that non-exported objects are not reachable)
	// At that point, "target" would be set to: (typeof koExports !== "undefined" ? koExports : ko)
	var target = ko;
	for (var i = 0; i < tokens.length - 1; i++)
		target = target[tokens[i]];
	target[tokens[tokens.length - 1]] = object;
ko.exportProperty = function(owner, publicName, object) {
  owner[publicName] = object;
ko.version = "2.1.0";
ko.exportSymbol('version', ko.version);
ko.utils = new (function () {
    var stringTrimRegex = /^(\s|\u00A0)+|(\s|\u00A0)+$/g;
    // Represent the known event types in a compact way, then at runtime transform it into a hash with event name as key (for fast lookup)
    var knownEvents = {}, knownEventTypesByEventName = {};
    var keyEventTypeName = /Firefox\/2/i.test(navigator.userAgent) ? 'KeyboardEvent' : 'UIEvents';
    knownEvents[keyEventTypeName] = ['keyup', 'keydown', 'keypress'];
    knownEvents['MouseEvents'] = ['click', 'dblclick', 'mousedown', 'mouseup', 'mousemove', 'mouseover', 'mouseout', 'mouseenter', 'mouseleave'];
    for (var eventType in knownEvents) {
        var knownEventsForType = knownEvents[eventType];
        if (knownEventsForType.length) {
            for (var i = 0, j = knownEventsForType.length; i < j; i++)
                knownEventTypesByEventName[knownEventsForType[i]] = eventType;
        }
    var eventsThatMustBeRegisteredUsingAttachEvent = { 'propertychange': true }; // Workaround for an IE9 issue - https://github.com/SteveSanderson/knockout/issues/406
    // Detect IE versions for bug workarounds (uses IE conditionals, not UA string, for robustness)
    var ieVersion = (function() {
        var version = 3, div = document.createElement('div'), iElems = div.getElementsByTagName('i');
        // Keep constructing conditional HTML blocks until we hit one that resolves to an empty fragment
        while (
            div.innerHTML = '<!--[if gt IE ' + (++version) + ']><i></i><![endif]-->',
            iElems[0]
        );
        return version > 4 ? version : undefined;
    }());
    var isIe6 = ieVersion === 6,
        isIe7 = ieVersion === 7;
    function isClickOnCheckableElement(element, eventType) {
        if ((ko.utils.tagNameLower(element) !== "input") || !element.type) return false;
        if (eventType.toLowerCase() != "click") return false;
        var inputType = element.type;
        return (inputType == "checkbox") || (inputType == "radio");
    return {
        fieldsIncludedWithJsonPost: ['authenticity_token', /^__RequestVerificationToken(_.*)?$/],
        arrayForEach: function (array, action) {
            for (var i = 0, j = array.length; i < j; i++)
                action(array[i]);
        },
        arrayIndexOf: function (array, item) {
            if (typeof Array.prototype.indexOf == "function")
                return Array.prototype.indexOf.call(array, item);
            for (var i = 0, j = array.length; i < j; i++)
                if (array[i] === item)
                    return i;
            return -1;
        },
        arrayFirst: function (array, predicate, predicateOwner) {
            for (var i = 0, j = array.length; i < j; i++)
                if (predicate.call(predicateOwner, array[i]))
                    return array[i];
            return null;
        },
        arrayRemoveItem: function (array, itemToRemove) {
            var index = ko.utils.arrayIndexOf(array, itemToRemove);
            if (index >= 0)
                array.splice(index, 1);
        },
        arrayGetDistinctValues: function (array) {
            array = array || [];
            var result = [];
            for (var i = 0, j = array.length; i < j; i++) {
                if (ko.utils.arrayIndexOf(result, array[i]) < 0)
                    result.push(array[i]);
            }
            return result;
        },
        arrayMap: function (array, mapping) {
            array = array || [];
            var result = [];
            for (var i = 0, j = array.length; i < j; i++)
                result.push(mapping(array[i]));
            return result;
        },
        arrayFilter: function (array, predicate) {
            array = array || [];
            var result = [];
            for (var i = 0, j = array.length; i < j; i++)
                if (predicate(array[i]))
                    result.push(array[i]);
            return result;
        },
        arrayPushAll: function (array, valuesToPush) {
            if (valuesToPush instanceof Array)
                array.push.apply(array, valuesToPush);
            else
                for (var i = 0, j = valuesToPush.length; i < j; i++)
                    array.push(valuesToPush[i]);
            return array;
        },
        extend: function (target, source) {
            if (source) {
                for(var prop in source) {
                    if(source.hasOwnProperty(prop)) {
                        target[prop] = source[prop];
                    }
                }
            }
            return target;
        },
        emptyDomNode: function (domNode) {
            while (domNode.firstChild) {
                ko.removeNode(domNode.firstChild);
            }
        },
        moveCleanedNodesToContainerElement: function(nodes) {
            // Ensure it's a real array, as we're about to reparent the nodes and
            // we don't want the underlying collection to change while we're doing that.
            var nodesArray = ko.utils.makeArray(nodes);
            var container = document.createElement('div');
            for (var i = 0, j = nodesArray.length; i < j; i++) {
                ko.cleanNode(nodesArray[i]);
                container.appendChild(nodesArray[i]);
            }
            return container;
        },
        setDomNodeChildren: function (domNode, childNodes) {
            ko.utils.emptyDomNode(domNode);
            if (childNodes) {
                for (var i = 0, j = childNodes.length; i < j; i++)
                    domNode.appendChild(childNodes[i]);
            }
        },
        replaceDomNodes: function (nodeToReplaceOrNodeArray, newNodesArray) {
            var nodesToReplaceArray = nodeToReplaceOrNodeArray.nodeType ? [nodeToReplaceOrNodeArray] : nodeToReplaceOrNodeArray;
            if (nodesToReplaceArray.length > 0) {
                var insertionPoint = nodesToReplaceArray[0];
                var parent = insertionPoint.parentNode;
                for (var i = 0, j = newNodesArray.length; i < j; i++)
                    parent.insertBefore(newNodesArray[i], insertionPoint);
                for (var i = 0, j = nodesToReplaceArray.length; i < j; i++) {
                    ko.removeNode(nodesToReplaceArray[i]);
                }
            }
        },
        setOptionNodeSelectionState: function (optionNode, isSelected) {
            // IE6 sometimes throws "unknown error" if you try to write to .selected directly, whereas Firefox struggles with setAttribute. Pick one based on browser.
            if (navigator.userAgent.indexOf("MSIE 6") >= 0)
                optionNode.setAttribute("selected", isSelected);
            else
                optionNode.selected = isSelected;
        },
        stringTrim: function (string) {
            return (string || "").replace(stringTrimRegex, "");
        },
        stringTokenize: function (string, delimiter) {
            var result = [];
            var tokens = (string || "").split(delimiter);
            for (var i = 0, j = tokens.length; i < j; i++) {
                var trimmed = ko.utils.stringTrim(tokens[i]);
                if (trimmed !== "")
                    result.push(trimmed);
            }
            return result;
        },
        stringStartsWith: function (string, startsWith) {
            string = string || "";
            if (startsWith.length > string.length)
                return false;
            return string.substring(0, startsWith.length) === startsWith;
        },
        buildEvalWithinScopeFunction: function (expression, scopeLevels) {
            // Build the source for a function that evaluates "expression"
            // For each scope variable, add an extra level of "with" nesting
            // Example result: with(sc[1]) { with(sc[0]) { return (expression) } }
            var functionBody = "return (" + expression + ")";
            for (var i = 0; i < scopeLevels; i++) {
                functionBody = "with(sc[" + i + "]) { " + functionBody + " } ";
            }
            return new Function("sc", functionBody);
        },
        domNodeIsContainedBy: function (node, containedByNode) {
            if (containedByNode.compareDocumentPosition)
                return (containedByNode.compareDocumentPosition(node) & 16) == 16;
            while (node != null) {
                if (node == containedByNode)
                    return true;
                node = node.parentNode;
            }
            return false;
        },
        domNodeIsAttachedToDocument: function (node) {
            return ko.utils.domNodeIsContainedBy(node, node.ownerDocument);
        },
        tagNameLower: function(element) {
            // For HTML elements, tagName will always be upper case; for XHTML elements, it'll be lower case.
            // Possible future optimization: If we know it's an element from an XHTML document (not HTML),
            // we don't need to do the .toLowerCase() as it will always be lower case anyway.
            return element && element.tagName && element.tagName.toLowerCase();
        },
        registerEventHandler: function (element, eventType, handler) {
            var mustUseAttachEvent = ieVersion && eventsThatMustBeRegisteredUsingAttachEvent[eventType];
            if (!mustUseAttachEvent && typeof jQuery != "undefined") {
                if (isClickOnCheckableElement(element, eventType)) {
                    // For click events on checkboxes, jQuery interferes with the event handling in an awkward way:
                    // it toggles the element checked state *after* the click event handlers run, whereas native
                    // click events toggle the checked state *before* the event handler.
                    // Fix this by intecepting the handler and applying the correct checkedness before it runs.
                    var originalHandler = handler;
                    handler = function(event, eventData) {
                        var jQuerySuppliedCheckedState = this.checked;
                        if (eventData)
                            this.checked = eventData.checkedStateBeforeEvent !== true;
                        originalHandler.call(this, event);
                        this.checked = jQuerySuppliedCheckedState; // Restore the state jQuery applied
                    };
                }
                jQuery(element)['bind'](eventType, handler);
            } else if (!mustUseAttachEvent && typeof element.addEventListener == "function")
                element.addEventListener(eventType, handler, false);
            else if (typeof element.attachEvent != "undefined")
                element.attachEvent("on" + eventType, function (event) {
                    handler.call(element, event);
                });
            else
                throw new Error("Browser doesn't support addEventListener or attachEvent");
        },
        triggerEvent: function (element, eventType) {
            if (!(element && element.nodeType))
                throw new Error("element must be a DOM node when calling triggerEvent");
            if (typeof jQuery != "undefined") {
                var eventData = [];
                if (isClickOnCheckableElement(element, eventType)) {
                    // Work around the jQuery "click events on checkboxes" issue described above by storing the original checked state before triggering the handler
                    eventData.push({ checkedStateBeforeEvent: element.checked });
                }
                jQuery(element)['trigger'](eventType, eventData);
            } else if (typeof document.createEvent == "function") {
                if (typeof element.dispatchEvent == "function") {
                    var eventCategory = knownEventTypesByEventName[eventType] || "HTMLEvents";
                    var event = document.createEvent(eventCategory);
                    event.initEvent(eventType, true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, element);
                    element.dispatchEvent(event);
                }
                else
                    throw new Error("The supplied element doesn't support dispatchEvent");
            } else if (typeof element.fireEvent != "undefined") {
                // Unlike other browsers, IE doesn't change the checked state of checkboxes/radiobuttons when you trigger their "click" event
                // so to make it consistent, we'll do it manually here
                if (isClickOnCheckableElement(element, eventType))
                    element.checked = element.checked !== true;
                element.fireEvent("on" + eventType);
            }
            else
                throw new Error("Browser doesn't support triggering events");
        },
        unwrapObservable: function (value) {
            return ko.isObservable(value) ? value() : value;
        },
        toggleDomNodeCssClass: function (node, className, shouldHaveClass) {
            var currentClassNames = (node.className || "").split(/\s+/);
            var hasClass = ko.utils.arrayIndexOf(currentClassNames, className) >= 0;
            if (shouldHaveClass && !hasClass) {
                node.className += (currentClassNames[0] ? " " : "") + className;
            } else if (hasClass && !shouldHaveClass) {
                var newClassName = "";
                for (var i = 0; i < currentClassNames.length; i++)
                    if (currentClassNames[i] != className)
                        newClassName += currentClassNames[i] + " ";
                node.className = ko.utils.stringTrim(newClassName);
            }
        },
        setTextContent: function(element, textContent) {
            var value = ko.utils.unwrapObservable(textContent);
            if ((value === null) || (value === undefined))
                value = "";
            'innerText' in element ? element.innerText = value
                                   : element.textContent = value;
            if (ieVersion >= 9) {
                // Believe it or not, this actually fixes an IE9 rendering bug
                // (See https://github.com/SteveSanderson/knockout/issues/209)
                element.style.display = element.style.display;
            }
        },
        ensureSelectElementIsRenderedCorrectly: function(selectElement) {
            // Workaround for IE9 rendering bug - it doesn't reliably display all the text in dynamically-added select boxes unless you force it to re-render by updating the width.
            // (See https://github.com/SteveSanderson/knockout/issues/312, http://stackoverflow.com/questions/5908494/select-only-shows-first-char-of-selected-option)
            if (ieVersion >= 9) {
                var originalWidth = selectElement.style.width;
                selectElement.style.width = 0;
                selectElement.style.width = originalWidth;
            }
        },
        range: function (min, max) {
            min = ko.utils.unwrapObservable(min);
            max = ko.utils.unwrapObservable(max);
            var result = [];
            for (var i = min; i <= max; i++)
                result.push(i);
            return result;
        },
        makeArray: function(arrayLikeObject) {
            var result = [];
            for (var i = 0, j = arrayLikeObject.length; i < j; i++) {
                result.push(arrayLikeObject[i]);
            };
            return result;
        },
        isIe6 : isIe6,
        isIe7 : isIe7,
        ieVersion : ieVersion,
        getFormFields: function(form, fieldName) {
            var fields = ko.utils.makeArray(form.getElementsByTagName("input")).concat(ko.utils.makeArray(form.getElementsByTagName("textarea")));
            var isMatchingField = (typeof fieldName == 'string')
                ? function(field) { return field.name === fieldName }
                : function(field) { return fieldName.test(field.name) }; // Treat fieldName as regex or object containing predicate
            var matches = [];
            for (var i = fields.length - 1; i >= 0; i--) {
                if (isMatchingField(fields[i]))
                    matches.push(fields[i]);
            };
            return matches;
        },
        parseJson: function (jsonString) {
            if (typeof jsonString == "string") {
                jsonString = ko.utils.stringTrim(jsonString);
                if (jsonString) {
                    if (window.JSON && window.JSON.parse) // Use native parsing where available
                        return window.JSON.parse(jsonString);
                    return (new Function("return " + jsonString))(); // Fallback on less safe parsing for older browsers
                }
            }
            return null;
        },
        stringifyJson: function (data, replacer, space) {   // replacer and space are optional
            if ((typeof JSON == "undefined") || (typeof JSON.stringify == "undefined"))
                throw new Error("Cannot find JSON.stringify(). Some browsers (e.g., IE < 8) don't support it natively, but you can overcome this by adding a script reference to json2.js, downloadable from http://www.json.org/json2.js");
            return JSON.stringify(ko.utils.unwrapObservable(data), replacer, space);
        },
        postJson: function (urlOrForm, data, options) {
            options = options || {};
            var params = options['params'] || {};
            var includeFields = options['includeFields'] || this.fieldsIncludedWithJsonPost;
            var url = urlOrForm;
            // If we were given a form, use its 'action' URL and pick out any requested field values
            if((typeof urlOrForm == 'object') && (ko.utils.tagNameLower(urlOrForm) === "form")) {
                var originalForm = urlOrForm;
                url = originalForm.action;
                for (var i = includeFields.length - 1; i >= 0; i--) {
                    var fields = ko.utils.getFormFields(originalForm, includeFields[i]);
                    for (var j = fields.length - 1; j >= 0; j--)
                        params[fields[j].name] = fields[j].value;
                }
            }
            data = ko.utils.unwrapObservable(data);
            var form = document.createElement("form");
            form.style.display = "none";
            form.action = url;
            form.method = "post";
            for (var key in data) {
                var input = document.createElement("input");
                input.name = key;
                input.value = ko.utils.stringifyJson(ko.utils.unwrapObservable(data[key]));
                form.appendChild(input);
            }
            for (var key in params) {
                var input = document.createElement("input");
                input.name = key;
                input.value = params[key];
                form.appendChild(input);
            }
            document.body.appendChild(form);
            options['submitter'] ? options['submitter'](form) : form.submit();
            setTimeout(function () { form.parentNode.removeChild(form); }, 0);
        }
ko.exportSymbol('utils', ko.utils);
ko.exportSymbol('utils.arrayForEach', ko.utils.arrayForEach);
ko.exportSymbol('utils.arrayFirst', ko.utils.arrayFirst);
ko.exportSymbol('utils.arrayFilter', ko.utils.arrayFilter);
ko.exportSymbol('utils.arrayGetDistinctValues', ko.utils.arrayGetDistinctValues);
ko.exportSymbol('utils.arrayIndexOf', ko.utils.arrayIndexOf);
ko.exportSymbol('utils.arrayMap', ko.utils.arrayMap);
ko.exportSymbol('utils.arrayPushAll', ko.utils.arrayPushAll);
ko.exportSymbol('utils.arrayRemoveItem', ko.utils.arrayRemoveItem);
ko.exportSymbol('utils.extend', ko.utils.extend);
ko.exportSymbol('utils.fieldsIncludedWithJsonPost', ko.utils.fieldsIncludedWithJsonPost);
ko.exportSymbol('utils.getFormFields', ko.utils.getFormFields);
ko.exportSymbol('utils.postJson', ko.utils.postJson);
ko.exportSymbol('utils.parseJson', ko.utils.parseJson);
ko.exportSymbol('utils.registerEventHandler', ko.utils.registerEventHandler);
ko.exportSymbol('utils.stringifyJson', ko.utils.stringifyJson);
ko.exportSymbol('utils.range', ko.utils.range);
ko.exportSymbol('utils.toggleDomNodeCssClass', ko.utils.toggleDomNodeCssClass);
ko.exportSymbol('utils.triggerEvent', ko.utils.triggerEvent);
ko.exportSymbol('utils.unwrapObservable', ko.utils.unwrapObservable);
if (!Function.prototype['bind']) {
    // Function.prototype.bind is a standard part of ECMAScript 5th Edition (December 2009, http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf)
    // In case the browser doesn't implement it natively, provide a JavaScript implementation. This implementation is based on the one in prototype.js
    Function.prototype['bind'] = function (object) {
        var originalFunction = this, args = Array.prototype.slice.call(arguments), object = args.shift();
        return function () {
            return originalFunction.apply(object, args.concat(Array.prototype.slice.call(arguments)));
        };
    };
ko.utils.domData = new (function () {
    var uniqueId = 0;
    var dataStoreKeyExpandoPropertyName = "__ko__" + (new Date).getTime();
    var dataStore = {};
    return {
        get: function (node, key) {
            var allDataForNode = ko.utils.domData.getAll(node, false);
            return allDataForNode === undefined ? undefined : allDataForNode[key];
        },
        set: function (node, key, value) {
            if (value === undefined) {
                // Make sure we don't actually create a new domData key if we are actually deleting a value
                if (ko.utils.domData.getAll(node, false) === undefined)
                    return;
            }
            var allDataForNode = ko.utils.domData.getAll(node, true);
            allDataForNode[key] = value;
        },
        getAll: function (node, createIfNotFound) {
            var dataStoreKey = node[dataStoreKeyExpandoPropertyName];
            var hasExistingDataStore = dataStoreKey && (dataStoreKey !== "null");
            if (!hasExistingDataStore) {
                if (!createIfNotFound)
                    return undefined;
                dataStoreKey = node[dataStoreKeyExpandoPropertyName] = "ko" + uniqueId++;
                dataStore[dataStoreKey] = {};
            }
            return dataStore[dataStoreKey];
        },
        clear: function (node) {
            var dataStoreKey = node[dataStoreKeyExpandoPropertyName];
            if (dataStoreKey) {
                delete dataStore[dataStoreKey];
                node[dataStoreKeyExpandoPropertyName] = null;
            }
        }
ko.exportSymbol('utils.domData', ko.utils.domData);
ko.exportSymbol('utils.domData.clear', ko.utils.domData.clear); // Exporting only so specs can clear up after themselves fully
ko.utils.domNodeDisposal = new (function () {
    var domDataKey = "__ko_domNodeDisposal__" + (new Date).getTime();
    var cleanableNodeTypes = { 1: true, 8: true, 9: true };       // Element, Comment, Document
    var cleanableNodeTypesWithDescendants = { 1: true, 9: true }; // Element, Document
    function getDisposeCallbacksCollection(node, createIfNotFound) {
        var allDisposeCallbacks = ko.utils.domData.get(node, domDataKey);
        if ((allDisposeCallbacks === undefined) && createIfNotFound) {
            allDisposeCallbacks = [];
            ko.utils.domData.set(node, domDataKey, allDisposeCallbacks);
        }
        return allDisposeCallbacks;
    function destroyCallbacksCollection(node) {
        ko.utils.domData.set(node, domDataKey, undefined);
    function cleanSingleNode(node) {
        // Run all the dispose callbacks
        var callbacks = getDisposeCallbacksCollection(node, false);
        if (callbacks) {
            callbacks = callbacks.slice(0); // Clone, as the array may be modified during iteration (typically, callbacks will remove themselves)
            for (var i = 0; i < callbacks.length; i++)
                callbacks[i](node);
        }
        // Also erase the DOM data
        ko.utils.domData.clear(node);
        // Special support for jQuery here because it's so commonly used.
        // Many jQuery plugins (including jquery.tmpl) store data using jQuery's equivalent of domData
        // so notify it to tear down any resources associated with the node & descendants here.
        if ((typeof jQuery == "function") && (typeof jQuery['cleanData'] == "function"))
            jQuery['cleanData']([node]);
        // Also clear any immediate-child comment nodes, as these wouldn't have been found by
        // node.getElementsByTagName("*") in cleanNode() (comment nodes aren't elements)
        if (cleanableNodeTypesWithDescendants[node.nodeType])
            cleanImmediateCommentTypeChildren(node);
    function cleanImmediateCommentTypeChildren(nodeWithChildren) {
        var child, nextChild = nodeWithChildren.firstChild;
        while (child = nextChild) {
            nextChild = child.nextSibling;
            if (child.nodeType === 8)
                cleanSingleNode(child);
        }
    return {
        addDisposeCallback : function(node, callback) {
            if (typeof callback != "function")
                throw new Error("Callback must be a function");
            getDisposeCallbacksCollection(node, true).push(callback);
        },
        removeDisposeCallback : function(node, callback) {
            var callbacksCollection = getDisposeCallbacksCollection(node, false);
            if (callbacksCollection) {
                ko.utils.arrayRemoveItem(callbacksCollection, callback);
                if (callbacksCollection.length == 0)
                    destroyCallbacksCollection(node);
            }
        },
        cleanNode : function(node) {
            // First clean this node, where applicable
            if (cleanableNodeTypes[node.nodeType]) {
                cleanSingleNode(node);
                // ... then its descendants, where applicable
                if (cleanableNodeTypesWithDescendants[node.nodeType]) {
                    // Clone the descendants list in case it changes during iteration
                    var descendants = [];
                    ko.utils.arrayPushAll(descendants, node.getElementsByTagName("*"));
                    for (var i = 0, j = descendants.length; i < j; i++)
                        cleanSingleNode(descendants[i]);
                }
            }
        },
        removeNode : function(node) {
            ko.cleanNode(node);
            if (node.parentNode)
                node.parentNode.removeChild(node);
        }
ko.cleanNode = ko.utils.domNodeDisposal.cleanNode; // Shorthand name for convenience
ko.removeNode = ko.utils.domNodeDisposal.removeNode; // Shorthand name for convenience
ko.exportSymbol('cleanNode', ko.cleanNode);
ko.exportSymbol('removeNode', ko.removeNode);
ko.exportSymbol('utils.domNodeDisposal', ko.utils.domNodeDisposal);
ko.exportSymbol('utils.domNodeDisposal.addDisposeCallback', ko.utils.domNodeDisposal.addDisposeCallback);
ko.exportSymbol('utils.domNodeDisposal.removeDisposeCallback', ko.utils.domNodeDisposal.removeDisposeCallback);
(function () {
    var leadingCommentRegex = /^(\s*)<!--(.*?)-->/;
    function simpleHtmlParse(html) {
        // Based on jQuery's "clean" function, but only accounting for table-related elements.
        // If you have referenced jQuery, this won't be used anyway - KO will use jQuery's "clean" function directly
        // Note that there's still an issue in IE < 9 whereby it will discard comment nodes that are the first child of
        // a descendant node. For example: "<div><!-- mycomment -->abc</div>" will get parsed as "<div>abc</div>"
        // This won't affect anyone who has referenced jQuery, and there's always the workaround of inserting a dummy node
        // (possibly a text node) in front of the comment. So, KO does not attempt to workaround this IE issue automatically at present.
        // Trim whitespace, otherwise indexOf won't work as expected
        var tags = ko.utils.stringTrim(html).toLowerCase(), div = document.createElement("div");
        // Finds the first match from the left column, and returns the corresponding "wrap" data from the right column
        var wrap = tags.match(/^<(thead|tbody|tfoot)/)              && [1, "<table>", "</table>"] ||
                   !tags.indexOf("<tr")                             && [2, "<table><tbody>", "</tbody></table>"] ||
                   (!tags.indexOf("<td") || !tags.indexOf("<th"))   && [3, "<table><tbody><tr>", "</tr></tbody></table>"] ||
                   /* anything else */                                 [0, "", ""];
        // Go to html and back, then peel off extra wrappers
        // Note that we always prefix with some dummy text, because otherwise, IE<9 will strip out leading comment nodes in descendants. Total madness.
        var markup = "ignored<div>" + wrap[1] + html + wrap[2] + "</div>";
        if (typeof window['innerShiv'] == "function") {
            div.appendChild(window['innerShiv'](markup));
        } else {
            div.innerHTML = markup;
        }
        // Move to the right depth
        while (wrap[0]--)
            div = div.lastChild;
        return ko.utils.makeArray(div.lastChild.childNodes);
    function jQueryHtmlParse(html) {
        var elems = jQuery['clean']([html]);
        // As of jQuery 1.7.1, jQuery parses the HTML by appending it to some dummy parent nodes held in an in-memory document fragment.
        // Unfortunately, it never clears the dummy parent nodes from the document fragment, so it leaks memory over time.
        // Fix this by finding the top-most dummy parent element, and detaching it from its owner fragment.
        if (elems && elems[0]) {
            // Find the top-most parent element that's a direct child of a document fragment
            var elem = elems[0];
            while (elem.parentNode && elem.parentNode.nodeType !== 11 /* i.e., DocumentFragment */)
                elem = elem.parentNode;
            // ... then detach it
            if (elem.parentNode)
                elem.parentNode.removeChild(elem);
        }
        return elems;
    ko.utils.parseHtmlFragment = function(html) {
        return typeof jQuery != 'undefined' ? jQueryHtmlParse(html)   // As below, benefit from jQuery's optimisations where possible
                                            : simpleHtmlParse(html);  // ... otherwise, this simple logic will do in most common cases.
    };
    ko.utils.setHtml = function(node, html) {
        ko.utils.emptyDomNode(node);
        if ((html !== null) && (html !== undefined)) {
            if (typeof html != 'string')
                html = html.toString();
            // jQuery contains a lot of sophisticated code to parse arbitrary HTML fragments,
            // for example <tr> elements which are not normally allowed to exist on their own.
            // If you've referenced jQuery we'll use that rather than duplicating its code.
            if (typeof jQuery != 'undefined') {
                jQuery(node)['html'](html);
            } else {
                // ... otherwise, use KO's own parsing logic.
                var parsedNodes = ko.utils.parseHtmlFragment(html);
                for (var i = 0; i < parsedNodes.length; i++)
                    node.appendChild(parsedNodes[i]);
            }
        }
    };
ko.exportSymbol('utils.parseHtmlFragment', ko.utils.parseHtmlFragment);
ko.exportSymbol('utils.setHtml', ko.utils.setHtml);
ko.memoization = (function () {
    var memos = {};
    function randomMax8HexChars() {
        return (((1 + Math.random()) * 0x100000000) | 0).toString(16).substring(1);
    function generateRandomId() {
        return randomMax8HexChars() + randomMax8HexChars();
    function findMemoNodes(rootNode, appendToArray) {
        if (!rootNode)
            return;
        if (rootNode.nodeType == 8) {
            var memoId = ko.memoization.parseMemoText(rootNode.nodeValue);
            if (memoId != null)
                appendToArray.push({ domNode: rootNode, memoId: memoId });
        } else if (rootNode.nodeType == 1) {
            for (var i = 0, childNodes = rootNode.childNodes, j = childNodes.length; i < j; i++)
                findMemoNodes(childNodes[i], appendToArray);
        }
    return {
        memoize: function (callback) {
            if (typeof callback != "function")
                throw new Error("You can only pass a function to ko.memoization.memoize()");
            var memoId = generateRandomId();
            memos[memoId] = callback;
            return "<!--[ko_memo:" + memoId + "]-->";
        },
        unmemoize: function (memoId, callbackParams) {
            var callback = memos[memoId];
            if (callback === undefined)
                throw new Error("Couldn't find any memo with ID " + memoId + ". Perhaps it's already been unmemoized.");
            try {
                callback.apply(null, callbackParams || []);
                return true;
            }
            finally { delete memos[memoId]; }
        },
        unmemoizeDomNodeAndDescendants: function (domNode, extraCallbackParamsArray) {
            var memos = [];
            findMemoNodes(domNode, memos);
            for (var i = 0, j = memos.length; i < j; i++) {
                var node = memos[i].domNode;
                var combinedParams = [node];
                if (extraCallbackParamsArray)
                    ko.utils.arrayPushAll(combinedParams, extraCallbackParamsArray);
                ko.memoization.unmemoize(memos[i].memoId, combinedParams);
                node.nodeValue = ""; // Neuter this node so we don't try to unmemoize it again
                if (node.parentNode)
                    node.parentNode.removeChild(node); // If possible, erase it totally (not always possible - someone else might just hold a reference to it then call unmemoizeDomNodeAndDescendants again)
            }
        },
        parseMemoText: function (memoText) {
            var match = memoText.match(/^\[ko_memo\:(.*?)\]$/);
            return match ? match[1] : null;
        }
    };
ko.exportSymbol('memoization', ko.memoization);
ko.exportSymbol('memoization.memoize', ko.memoization.memoize);
ko.exportSymbol('memoization.unmemoize', ko.memoization.unmemoize);
ko.exportSymbol('memoization.parseMemoText', ko.memoization.parseMemoText);
ko.exportSymbol('memoization.unmemoizeDomNodeAndDescendants', ko.memoization.unmemoizeDomNodeAndDescendants);
ko.extenders = {
    'throttle': function(target, timeout) {
        // Throttling means two things:
        // (1) For dependent observables, we throttle *evaluations* so that, no matter how fast its dependencies
        //     notify updates, the target doesn't re-evaluate (and hence doesn't notify) faster than a certain rate
        target['throttleEvaluation'] = timeout;
        // (2) For writable targets (observables, or writable dependent observables), we throttle *writes*
        //     so the target cannot change value synchronously or faster than a certain rate
        var writeTimeoutInstance = null;
        return ko.dependentObservable({
            'read': target,
            'write': function(value) {
                clearTimeout(writeTimeoutInstance);
                writeTimeoutInstance = setTimeout(function() {
                    target(value);
                }, timeout);
            }
        });
    },
    'notify': function(target, notifyWhen) {
        target["equalityComparer"] = notifyWhen == "always"
            ? function() { return false } // Treat all values as not equal
            : ko.observable["fn"]["equalityComparer"];
        return target;
function applyExtenders(requestedExtenders) {
    var target = this;
    if (requestedExtenders) {
        for (var key in requestedExtenders) {
            var extenderHandler = ko.extenders[key];
            if (typeof extenderHandler == 'function') {
                target = extenderHandler(target, requestedExtenders[key]);
            }
        }
    return target;
ko.exportSymbol('extenders', ko.extenders);
ko.subscription = function (target, callback, disposeCallback) {
    this.target = target;
    this.callback = callback;
    this.disposeCallback = disposeCallback;
    ko.exportProperty(this, 'dispose', this.dispose);
ko.subscription.prototype.dispose = function () {
    this.isDisposed = true;
    this.disposeCallback();
ko.subscribable = function () {
    this._subscriptions = {};
    ko.utils.extend(this, ko.subscribable['fn']);
    ko.exportProperty(this, 'subscribe', this.subscribe);
    ko.exportProperty(this, 'extend', this.extend);
    ko.exportProperty(this, 'getSubscriptionsCount', this.getSubscriptionsCount);
var defaultEvent = "change";
ko.subscribable['fn'] = {
    subscribe: function (callback, callbackTarget, event) {
        event = event || defaultEvent;
        var boundCallback = callbackTarget ? callback.bind(callbackTarget) : callback;
        var subscription = new ko.subscription(this, boundCallback, function () {
            ko.utils.arrayRemoveItem(this._subscriptions[event], subscription);
        }.bind(this));
        if (!this._subscriptions[event])
            this._subscriptions[event] = [];
        this._subscriptions[event].push(subscription);
        return subscription;
    },
    "notifySubscribers": function (valueToNotify, event) {
        event = event || defaultEvent;
        if (this._subscriptions[event]) {
            ko.utils.arrayForEach(this._subscriptions[event].slice(0), function (subscription) {
                // In case a subscription was disposed during the arrayForEach cycle, check
                // for isDisposed on each subscription before invoking its callback
                if (subscription && (subscription.isDisposed !== true))
                    subscription.callback(valueToNotify);
            });
        }
    },
    getSubscriptionsCount: function () {
        var total = 0;
        for (var eventName in this._subscriptions) {
            if (this._subscriptions.hasOwnProperty(eventName))
                total += this._subscriptions[eventName].length;
        }
        return total;
    },
    extend: applyExtenders
ko.isSubscribable = function (instance) {
    return typeof instance.subscribe == "function" && typeof instance["notifySubscribers"] == "function";
ko.exportSymbol('subscribable', ko.subscribable);
ko.exportSymbol('isSubscribable', ko.isSubscribable);
ko.dependencyDetection = (function () {
    var _frames = [];
    return {
        begin: function (callback) {
            _frames.push({ callback: callback, distinctDependencies:[] });
        },
        end: function () {
            _frames.pop();
        },
        registerDependency: function (subscribable) {
            if (!ko.isSubscribable(subscribable))
                throw new Error("Only subscribable things can act as dependencies");
            if (_frames.length > 0) {
                var topFrame = _frames[_frames.length - 1];
                if (ko.utils.arrayIndexOf(topFrame.distinctDependencies, subscribable) >= 0)
                    return;
                topFrame.distinctDependencies.push(subscribable);
                topFrame.callback(subscribable);
            }
        }
    };
var primitiveTypes = { 'undefined':true, 'boolean':true, 'number':true, 'string':true };
ko.observable = function (initialValue) {
    var _latestValue = initialValue;
    function observable() {
        if (arguments.length > 0) {
            // Write
            // Ignore writes if the value hasn't changed
            if ((!observable['equalityComparer']) || !observable['equalityComparer'](_latestValue, arguments[0])) {
                observable.valueWillMutate();
                _latestValue = arguments[0];
                if (DEBUG) observable._latestValue = _latestValue;
                observable.valueHasMutated();
            }
            return this; // Permits chained assignments
        }
        else {
            // Read
            ko.dependencyDetection.registerDependency(observable); // The caller only needs to be notified of changes if they did a "read" operation
            return _latestValue;
        }
    if (DEBUG) observable._latestValue = _latestValue;
    ko.subscribable.call(observable);
    observable.valueHasMutated = function () { observable["notifySubscribers"](_latestValue); }
    observable.valueWillMutate = function () { observable["notifySubscribers"](_latestValue, "beforeChange"); }
    ko.utils.extend(observable, ko.observable['fn']);
    ko.exportProperty(observable, "valueHasMutated", observable.valueHasMutated);
    ko.exportProperty(observable, "valueWillMutate", observable.valueWillMutate);
    return observable;
ko.observable['fn'] = {
    "equalityComparer": function valuesArePrimitiveAndEqual(a, b) {
        var oldValueIsPrimitive = (a === null) || (typeof(a) in primitiveTypes);
        return oldValueIsPrimitive ? (a === b) : false;
var protoProperty = ko.observable.protoProperty = "__ko_proto__";
ko.observable['fn'][protoProperty] = ko.observable;
ko.hasPrototype = function(instance, prototype) {
    if ((instance === null) || (instance === undefined) || (instance[protoProperty] === undefined)) return false;
    if (instance[protoProperty] === prototype) return true;
    return ko.hasPrototype(instance[protoProperty], prototype); // Walk the prototype chain
ko.isObservable = function (instance) {
    return ko.hasPrototype(instance, ko.observable);
ko.isWriteableObservable = function (instance) {
    // Observable
    if ((typeof instance == "function") && instance[protoProperty] === ko.observable)
        return true;
    // Writeable dependent observable
    if ((typeof instance == "function") && (instance[protoProperty] === ko.dependentObservable) && (instance.hasWriteFunction))
        return true;
    // Anything else
    return false;
ko.exportSymbol('observable', ko.observable);
ko.exportSymbol('isObservable', ko.isObservable);
ko.exportSymbol('isWriteableObservable', ko.isWriteableObservable);
ko.observableArray = function (initialValues) {
    if (arguments.length == 0) {
        // Zero-parameter constructor initializes to empty array
        initialValues = [];
    if ((initialValues !== null) && (initialValues !== undefined) && !('length' in initialValues))
        throw new Error("The argument passed when initializing an observable array must be an array, or null, or undefined.");
    var result = ko.observable(initialValues);
    ko.utils.extend(result, ko.observableArray['fn']);
    return result;
ko.observableArray['fn'] = {
    'remove': function (valueOrPredicate) {
        var underlyingArray = this();
        var removedValues = [];
        var predicate = typeof valueOrPredicate == "function" ? valueOrPredicate : function (value) { return value === valueOrPredicate; };
        for (var i = 0; i < underlyingArray.length; i++) {
            var value = underlyingArray[i];
            if (predicate(value)) {
                if (removedValues.length === 0) {
                    this.valueWillMutate();
                }
                removedValues.push(value);
                underlyingArray.splice(i, 1);
                i--;
            }
        }
        if (removedValues.length) {
            this.valueHasMutated();
        }
        return removedValues;
    },
    'removeAll': function (arrayOfValues) {
        // If you passed zero args, we remove everything
        if (arrayOfValues === undefined) {
            var underlyingArray = this();
            var allValues = underlyingArray.slice(0);
            this.valueWillMutate();
            underlyingArray.splice(0, underlyingArray.length);
            this.valueHasMutated();
            return allValues;
        }
        // If you passed an arg, we interpret it as an array of entries to remove
        if (!arrayOfValues)
            return [];
        return this['remove'](function (value) {
            return ko.utils.arrayIndexOf(arrayOfValues, value) >= 0;
        });
    },
    'destroy': function (valueOrPredicate) {
        var underlyingArray = this();
        var predicate = typeof valueOrPredicate == "function" ? valueOrPredicate : function (value) { return value === valueOrPredicate; };
        this.valueWillMutate();
        for (var i = underlyingArray.length - 1; i >= 0; i--) {
            var value = underlyingArray[i];
            if (predicate(value))
                underlyingArray[i]["_destroy"] = true;
        }
        this.valueHasMutated();
    },
    'destroyAll': function (arrayOfValues) {
        // If you passed zero args, we destroy everything
        if (arrayOfValues === undefined)
            return this['destroy'](function() { return true });
        // If you passed an arg, we interpret it as an array of entries to destroy
        if (!arrayOfValues)
            return [];
        return this['destroy'](function (value) {
            return ko.utils.arrayIndexOf(arrayOfValues, value) >= 0;
        });
    },
    'indexOf': function (item) {
        var underlyingArray = this();
        return ko.utils.arrayIndexOf(underlyingArray, item);
    },
    'replace': function(oldItem, newItem) {
        var index = this['indexOf'](oldItem);
        if (index >= 0) {
            this.valueWillMutate();
            this()[index] = newItem;
            this.valueHasMutated();
        }
// Populate ko.observableArray.fn with read/write functions from native arrays
ko.utils.arrayForEach(["pop", "push", "reverse", "shift", "sort", "splice", "unshift"], function (methodName) {
    ko.observableArray['fn'][methodName] = function () {
        var underlyingArray = this();
        this.valueWillMutate();
        var methodCallResult = underlyingArray[methodName].apply(underlyingArray, arguments);
        this.valueHasMutated();
        return methodCallResult;
    };
// Populate ko.observableArray.fn with read-only functions from native arrays
ko.utils.arrayForEach(["slice"], function (methodName) {
    ko.observableArray['fn'][methodName] = function () {
        var underlyingArray = this();
        return underlyingArray[methodName].apply(underlyingArray, arguments);
    };
ko.exportSymbol('observableArray', ko.observableArray);
ko.dependentObservable = function (evaluatorFunctionOrOptions, evaluatorFunctionTarget, options) {
    var _latestValue,
        _hasBeenEvaluated = false,
        _isBeingEvaluated = false,
        readFunction = evaluatorFunctionOrOptions;
    if (readFunction && typeof readFunction == "object") {
        // Single-parameter syntax - everything is on this "options" param
        options = readFunction;
        readFunction = options["read"];
    } else {
        // Multi-parameter syntax - construct the options according to the params passed
        options = options || {};
        if (!readFunction)
            readFunction = options["read"];
    // By here, "options" is always non-null
    if (typeof readFunction != "function")
        throw new Error("Pass a function that returns the value of the ko.computed");
    var writeFunction = options["write"];
    if (!evaluatorFunctionTarget)
        evaluatorFunctionTarget = options["owner"];
    var _subscriptionsToDependencies = [];
    function disposeAllSubscriptionsToDependencies() {
        ko.utils.arrayForEach(_subscriptionsToDependencies, function (subscription) {
            subscription.dispose();
        });
        _subscriptionsToDependencies = [];
    var dispose = disposeAllSubscriptionsToDependencies;
    // Build "disposeWhenNodeIsRemoved" and "disposeWhenNodeIsRemovedCallback" option values
    // (Note: "disposeWhenNodeIsRemoved" option both proactively disposes as soon as the node is removed using ko.removeNode(),
    // plus adds a "disposeWhen" callback that, on each evaluation, disposes if the node was removed by some other means.)
    var disposeWhenNodeIsRemoved = (typeof options["disposeWhenNodeIsRemoved"] == "object") ? options["disposeWhenNodeIsRemoved"] : null;
    var disposeWhen = options["disposeWhen"] || function() { return false; };
    if (disposeWhenNodeIsRemoved) {
        dispose = function() {
            ko.utils.domNodeDisposal.removeDisposeCallback(disposeWhenNodeIsRemoved, arguments.callee);
            disposeAllSubscriptionsToDependencies();
        };
        ko.utils.domNodeDisposal.addDisposeCallback(disposeWhenNodeIsRemoved, dispose);
        var existingDisposeWhenFunction = disposeWhen;
        disposeWhen = function () {
            return !ko.utils.domNodeIsAttachedToDocument(disposeWhenNodeIsRemoved) || existingDisposeWhenFunction();
        }
    var evaluationTimeoutInstance = null;
    function evaluatePossiblyAsync() {
        var throttleEvaluationTimeout = dependentObservable['throttleEvaluation'];
        if (throttleEvaluationTimeout && throttleEvaluationTimeout >= 0) {
            clearTimeout(evaluationTimeoutInstance);
            evaluationTimeoutInstance = setTimeout(evaluateImmediate, throttleEvaluationTimeout);
        } else
            evaluateImmediate();
    function evaluateImmediate() {
        if (_isBeingEvaluated) {
            // If the evaluation of a ko.computed causes side effects, it's possible that it will trigger its own re-evaluation.
            // This is not desirable (it's hard for a developer to realise a chain of dependencies might cause this, and they almost
            // certainly didn't intend infinite re-evaluations). So, for predictability, we simply prevent ko.computeds from causing
            // their own re-evaluation. Further discussion at https://github.com/SteveSanderson/knockout/pull/387
            return;
        }
        // Don't dispose on first evaluation, because the "disposeWhen" callback might
        // e.g., dispose when the associated DOM element isn't in the doc, and it's not
        // going to be in the doc until *after* the first evaluation
        if (_hasBeenEvaluated && disposeWhen()) {
            dispose();
            return;
        }
        _isBeingEvaluated = true;
        try {
            // Initially, we assume that none of the subscriptions are still being used (i.e., all are candidates for disposal).
            // Then, during evaluation, we cross off any that are in fact still being used.
            var disposalCandidates = ko.utils.arrayMap(_subscriptionsToDependencies, function(item) {return item.target;});
            ko.dependencyDetection.begin(function(subscribable) {
                var inOld;
                if ((inOld = ko.utils.arrayIndexOf(disposalCandidates, subscribable)) >= 0)
                    disposalCandidates[inOld] = undefined; // Don't want to dispose this subscription, as it's still being used
                else
                    _subscriptionsToDependencies.push(subscribable.subscribe(evaluatePossiblyAsync)); // Brand new subscription - add it
            });
            var newValue = readFunction.call(evaluatorFunctionTarget);
            // For each subscription no longer being used, remove it from the active subscriptions list and dispose it
            for (var i = disposalCandidates.length - 1; i >= 0; i--) {
                if (disposalCandidates[i])
                    _subscriptionsToDependencies.splice(i, 1)[0].dispose();
            }
            _hasBeenEvaluated = true;
            dependentObservable["notifySubscribers"](_latestValue, "beforeChange");
            _latestValue = newValue;
            if (DEBUG) dependentObservable._latestValue = _latestValue;
        } finally {
            ko.dependencyDetection.end();
        }
        dependentObservable["notifySubscribers"](_latestValue);
        _isBeingEvaluated = false;
    function dependentObservable() {
        if (arguments.length > 0) {
            set.apply(dependentObservable, arguments);
        } else {
            return get();
        }
    function set() {
        if (typeof writeFunction === "function") {
            // Writing a value
            writeFunction.apply(evaluatorFunctionTarget, arguments);
        } else {
            throw new Error("Cannot write a value to a ko.computed unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.");
        }
    function get() {
        // Reading the value
        if (!_hasBeenEvaluated)
            evaluateImmediate();
        ko.dependencyDetection.registerDependency(dependentObservable);
        return _latestValue;
    dependentObservable.getDependenciesCount = function () { return _subscriptionsToDependencies.length; };
    dependentObservable.hasWriteFunction = typeof options["write"] === "function";
    dependentObservable.dispose = function () { dispose(); };
    ko.subscribable.call(dependentObservable);
    ko.utils.extend(dependentObservable, ko.dependentObservable['fn']);
    if (options['deferEvaluation'] !== true)
        evaluateImmediate();
    ko.exportProperty(dependentObservable, 'dispose', dependentObservable.dispose);
    ko.exportProperty(dependentObservable, 'getDependenciesCount', dependentObservable.getDependenciesCount);
    return dependentObservable;
ko.isComputed = function(instance) {
    return ko.hasPrototype(instance, ko.dependentObservable);
var protoProp = ko.observable.protoProperty; // == "__ko_proto__"
ko.dependentObservable[protoProp] = ko.observable;
ko.dependentObservable['fn'] = {};
ko.dependentObservable['fn'][protoProp] = ko.dependentObservable;
ko.exportSymbol('dependentObservable', ko.dependentObservable);
ko.exportSymbol('computed', ko.dependentObservable); // Make "ko.computed" an alias for "ko.dependentObservable"
ko.exportSymbol('isComputed', ko.isComputed);
(function() {
    var maxNestedObservableDepth = 10; // Escape the (unlikely) pathalogical case where an observable's current value is itself (or similar reference cycle)
    ko.toJS = function(rootObject) {
        if (arguments.length == 0)
            throw new Error("When calling ko.toJS, pass the object you want to convert.");
        // We just unwrap everything at every level in the object graph
        return mapJsObjectGraph(rootObject, function(valueToMap) {
            // Loop because an observable's value might in turn be another observable wrapper
            for (var i = 0; ko.isObservable(valueToMap) && (i < maxNestedObservableDepth); i++)
                valueToMap = valueToMap();
            return valueToMap;
        });
    };
    ko.toJSON = function(rootObject, replacer, space) {     // replacer and space are optional
        var plainJavaScriptObject = ko.toJS(rootObject);
        return ko.utils.stringifyJson(plainJavaScriptObject, replacer, space);
    };
    function mapJsObjectGraph(rootObject, mapInputCallback, visitedObjects) {
        visitedObjects = visitedObjects || new objectLookup();
        rootObject = mapInputCallback(rootObject);
        var canHaveProperties = (typeof rootObject == "object") && (rootObject !== null) && (rootObject !== undefined) && (!(rootObject instanceof Date));
        if (!canHaveProperties)
            return rootObject;
        var outputProperties = rootObject instanceof Array ? [] : {};
        visitedObjects.save(rootObject, outputProperties);
        visitPropertiesOrArrayEntries(rootObject, function(indexer) {
            var propertyValue = mapInputCallback(rootObject[indexer]);
            switch (typeof propertyValue) {
                case "boolean":
                case "number":
                case "string":
                case "function":
                    outputProperties[indexer] = propertyValue;
                    break;
                case "object":
                case "undefined":
                    var previouslyMappedValue = visitedObjects.get(propertyValue);
                    outputProperties[indexer] = (previouslyMappedValue !== undefined)
                        ? previouslyMappedValue
                        : mapJsObjectGraph(propertyValue, mapInputCallback, visitedObjects);
                    break;
            }
        });
        return outputProperties;
    function visitPropertiesOrArrayEntries(rootObject, visitorCallback) {
        if (rootObject instanceof Array) {
            for (var i = 0; i < rootObject.length; i++)
                visitorCallback(i);
            // For arrays, also respect toJSON property for custom mappings (fixes #278)
            if (typeof rootObject['toJSON'] == 'function')
                visitorCallback('toJSON');
        } else {
            for (var propertyName in rootObject)
                visitorCallback(propertyName);
        }
    };
    function objectLookup() {
        var keys = [];
        var values = [];
        this.save = function(key, value) {
            var existingIndex = ko.utils.arrayIndexOf(keys, key);
            if (existingIndex >= 0)
                values[existingIndex] = value;
            else {
                keys.push(key);
                values.push(value);
            }
        };
        this.get = function(key) {
            var existingIndex = ko.utils.arrayIndexOf(keys, key);
            return (existingIndex >= 0) ? values[existingIndex] : undefined;
        };
    };
ko.exportSymbol('toJS', ko.toJS);
ko.exportSymbol('toJSON', ko.toJSON);
(function () {
    var hasDomDataExpandoProperty = '__ko__hasDomDataOptionValue__';
    // Normally, SELECT elements and their OPTIONs can only take value of type 'string' (because the values
    // are stored on DOM attributes). ko.selectExtensions provides a way for SELECTs/OPTIONs to have values
    // that are arbitrary objects. This is very convenient when implementing things like cascading dropdowns.
    ko.selectExtensions = {
        readValue : function(element) {
            switch (ko.utils.tagNameLower(element)) {
                case 'option':
                    if (element[hasDomDataExpandoProperty] === true)
                        return ko.utils.domData.get(element, ko.bindingHandlers.options.optionValueDomDataKey);
                    return element.getAttribute("value");
                case 'select':
                    return element.selectedIndex >= 0 ? ko.selectExtensions.readValue(element.options[element.selectedIndex]) : undefined;
                default:
                    return element.value;
            }
        },
        writeValue: function(element, value) {
            switch (ko.utils.tagNameLower(element)) {
                case 'option':
                    switch(typeof value) {
                        case "string":
                            ko.utils.domData.set(element, ko.bindingHandlers.options.optionValueDomDataKey, undefined);
                            if (hasDomDataExpandoProperty in element) { // IE <= 8 throws errors if you delete non-existent properties from a DOM node
                                delete element[hasDomDataExpandoProperty];
                            }
                            element.value = value;
                            break;
                        default:
                            // Store arbitrary object using DomData
                            ko.utils.domData.set(element, ko.bindingHandlers.options.optionValueDomDataKey, value);
                            element[hasDomDataExpandoProperty] = true;
                            // Special treatment of numbers is just for backward compatibility. KO 1.2.1 wrote numerical values to element.value.
                            element.value = typeof value === "number" ? value : "";
                            break;
                    }
                    break;
                case 'select':
                    for (var i = element.options.length - 1; i >= 0; i--) {
                        if (ko.selectExtensions.readValue(element.options[i]) == value) {
                            element.selectedIndex = i;
                            break;
                        }
                    }
                    break;
                default:
                    if ((value === null) || (value === undefined))
                        value = "";
                    element.value = value;
                    break;
            }
        }
    };
ko.exportSymbol('selectExtensions', ko.selectExtensions);
ko.exportSymbol('selectExtensions.readValue', ko.selectExtensions.readValue);
ko.exportSymbol('selectExtensions.writeValue', ko.selectExtensions.writeValue);
ko.jsonExpressionRewriting = (function () {
    var restoreCapturedTokensRegex = /\@ko_token_(\d+)\@/g;
    var javaScriptAssignmentTarget = /^[\_$a-z][\_$a-z0-9]*(\[.*?\])*(\.[\_$a-z][\_$a-z0-9]*(\[.*?\])*)*$/i;
    var javaScriptReservedWords = ["true", "false"];
    function restoreTokens(string, tokens) {
        var prevValue = null;
        while (string != prevValue) { // Keep restoring tokens until it no longer makes a difference (they may be nested)
            prevValue = string;
            string = string.replace(restoreCapturedTokensRegex, function (match, tokenIndex) {
                return tokens[tokenIndex];
            });
        }
        return string;
    function isWriteableValue(expression) {
        if (ko.utils.arrayIndexOf(javaScriptReservedWords, ko.utils.stringTrim(expression).toLowerCase()) >= 0)
            return false;
        return expression.match(javaScriptAssignmentTarget) !== null;
    function ensureQuoted(key) {
        var trimmedKey = ko.utils.stringTrim(key);
        switch (trimmedKey.length && trimmedKey.charAt(0)) {
            case "'":
            case '"':
                return key;
            default:
                return "'" + trimmedKey + "'";
        }
    return {
        bindingRewriteValidators: [],
        parseObjectLiteral: function(objectLiteralString) {
            // A full tokeniser+lexer would add too much weight to this library, so here's a simple parser
            // that is sufficient just to split an object literal string into a set of top-level key-value pairs
            var str = ko.utils.stringTrim(objectLiteralString);
            if (str.length < 3)
                return [];
            if (str.charAt(0) === "{")// Ignore any braces surrounding the whole object literal
                str = str.substring(1, str.length - 1);
            // Pull out any string literals and regex literals
            var tokens = [];
            var tokenStart = null, tokenEndChar;
            for (var position = 0; position < str.length; position++) {
                var c = str.charAt(position);
                if (tokenStart === null) {
                    switch (c) {
                        case '"':
                        case "'":
                        case "/":
                            tokenStart = position;
                            tokenEndChar = c;
                            break;
                    }
                } else if ((c == tokenEndChar) && (str.charAt(position - 1) !== "\\")) {
                    var token = str.substring(tokenStart, position + 1);
                    tokens.push(token);
                    var replacement = "@ko_token_" + (tokens.length - 1) + "@";
                    str = str.substring(0, tokenStart) + replacement + str.substring(position + 1);
                    position -= 
(token.length - replacement.length);
                    tokenStart = null;
                }
            }
            // Next pull out balanced paren, brace, and bracket blocks
            tokenStart = null;
            tokenEndChar = null;
            var tokenDepth = 0, tokenStartChar = null;
            for (var position = 0; position < str.length; position++) {
                var c = str.charAt(position);
                if (tokenStart === null) {
                    switch (c) {
                        case "{": tokenStart = position; tokenStartChar = c;
                                  tokenEndChar = "}";
                                  break;
                        case "(": tokenStart = position; tokenStartChar = c;
                                  tokenEndChar = ")";
                                  break;
                        case "[": tokenStart = position; tokenStartChar = c;
                                  tokenEndChar = "]";
                                  break;
                    }
                }
                if (c === tokenStartChar)
                    tokenDepth++;
                else if (c === tokenEndChar) {
                    tokenDepth--;
                    if (tokenDepth === 0) {
                        var token = str.substring(tokenStart, position + 1);
                        tokens.push(token);
                        var replacement = "@ko_token_" + (tokens.length - 1) + "@";
                        str = str.substring(0, tokenStart) + replacement + str.substring(position + 1);
                        position -= (token.length - replacement.length);
                        tokenStart = null;
                    }
                }
            }
            // Now we can safely split on commas to get the key/value pairs
            var result = [];
            var keyValuePairs = str.split(",");
            for (var i = 0, j = keyValuePairs.length; i < j; i++) {
                var pair = keyValuePairs[i];
                var colonPos = pair.indexOf(":");
                if ((colonPos > 0) && (colonPos < pair.length - 1)) {
                    var key = pair.substring(0, colonPos);
                    var value = pair.substring(colonPos + 1);
                    result.push({ 'key': restoreTokens(key, tokens), 'value': restoreTokens(value, tokens) });
                } else {
                    result.push({ 'unknown': restoreTokens(pair, tokens) });
                }
            }
            return result;
        },
        insertPropertyAccessorsIntoJson: function (objectLiteralStringOrKeyValueArray) {
            var keyValueArray = typeof objectLiteralStringOrKeyValueArray === "string"
                ? ko.jsonExpressionRewriting.parseObjectLiteral(objectLiteralStringOrKeyValueArray)
                : objectLiteralStringOrKeyValueArray;
            var resultStrings = [], propertyAccessorResultStrings = [];
            var keyValueEntry;
            for (var i = 0; keyValueEntry = keyValueArray[i]; i++) {
                if (resultStrings.length > 0)
                    resultStrings.push(",");
                if (keyValueEntry['key']) {
                    var quotedKey = ensureQuoted(keyValueEntry['key']), val = keyValueEntry['value'];
                    resultStrings.push(quotedKey);
                    resultStrings.push(":");
                    resultStrings.push(val);
                    if (isWriteableValue(ko.utils.stringTrim(val))) {
                        if (propertyAccessorResultStrings.length > 0)
                            propertyAccessorResultStrings.push(", ");
                        propertyAccessorResultStrings.push(quotedKey + " : function(__ko_value) { " + val + " = __ko_value; }");
                    }
                } else if (keyValueEntry['unknown']) {
                    resultStrings.push(keyValueEntry['unknown']);
                }
            }
            var combinedResult = resultStrings.join("");
            if (propertyAccessorResultStrings.length > 0) {
                var allPropertyAccessors = propertyAccessorResultStrings.join("");
                combinedResult = combinedResult + ", '_ko_property_writers' : { " + allPropertyAccessors + " } ";
            }
            return combinedResult;
        },
        keyValueArrayContainsKey: function(keyValueArray, key) {
            for (var i = 0; i < keyValueArray.length; i++)
                if (ko.utils.stringTrim(keyValueArray[i]['key']) == key)
                    return true;
            return false;
        },
        // Internal, private KO utility for updating model properties from within bindings
        // property:            If the property being updated is (or might be) an observable, pass it here
        //                      If it turns out to be a writable observable, it will be written to directly
        // allBindingsAccessor: All bindings in the current execution context.
        //                      This will be searched for a '_ko_property_writers' property in case you're writing to a non-observable
        // key:                 The key identifying the property to be written. Example: for { hasFocus: myValue }, write to 'myValue' by specifying the key 'hasFocus'
        // value:               The value to be written
        // checkIfDifferent:    If true, and if the property being written is a writable observable, the value will only be written if
        //                      it is !== existing value on that writable observable
        writeValueToProperty: function(property, allBindingsAccessor, key, value, checkIfDifferent) {
            if (!property || !ko.isWriteableObservable(property)) {
                var propWriters = allBindingsAccessor()['_ko_property_writers'];
                if (propWriters && propWriters[key])
                    propWriters[key](value);
            } else if (!checkIfDifferent || property() !== value) {
                property(value);
            }
        }
    };
ko.exportSymbol('jsonExpressionRewriting', ko.jsonExpressionRewriting);
ko.exportSymbol('jsonExpressionRewriting.bindingRewriteValidators', ko.jsonExpressionRewriting.bindingRewriteValidators);
ko.exportSymbol('jsonExpressionRewriting.parseObjectLiteral', ko.jsonExpressionRewriting.parseObjectLiteral);
ko.exportSymbol('jsonExpressionRewriting.insertPropertyAccessorsIntoJson', ko.jsonExpressionRewriting.insertPropertyAccessorsIntoJson);
(function() {
    // "Virtual elements" is an abstraction on top of the usual DOM API which understands the notion that comment nodes
    // may be used to represent hierarchy (in addition to the DOM's natural hierarchy).
    // If you call the DOM-manipulating functions on ko.virtualElements, you will be able to read and write the state
    // of that virtual hierarchy
    //
    // The point of all this is to support containerless templates (e.g., <!-- ko foreach:someCollection -->blah<!-- /ko -->)
    // without having to scatter special cases all over the binding and templating code.
    // IE 9 cannot reliably read the "nodeValue" property of a comment node (see https://github.com/SteveSanderson/knockout/issues/186)
    // but it does give them a nonstandard alternative property called "text" that it can read reliably. Other browsers don't have that property.
    // So, use node.text where available, and node.nodeValue elsewhere
    var commentNodesHaveTextProperty = document.createComment("test").text === "<!--test-->";
    var startCommentRegex = commentNodesHaveTextProperty ? /^<!--\s*ko\s+(.*\:.*)\s*-->$/ : /^\s*ko\s+(.*\:.*)\s*$/;
    var endCommentRegex =   commentNodesHaveTextProperty ? /^<!--\s*\/ko\s*-->$/ : /^\s*\/ko\s*$/;
    var htmlTagsWithOptionallyClosingChildren = { 'ul': true, 'ol': true };
    function isStartComment(node) {
        return (node.nodeType == 8) && (commentNodesHaveTextProperty ? node.text : node.nodeValue).match(startCommentRegex);
    function isEndComment(node) {
        return (node.nodeType == 8) && (commentNodesHaveTextProperty ? node.text : node.nodeValue).match(endCommentRegex);
    function getVirtualChildren(startComment, allowUnbalanced) {
        var currentNode = startComment;
        var depth = 1;
        var children = [];
        while (currentNode = currentNode.nextSibling) {
            if (isEndComment(currentNode)) {
                depth--;
                if (depth === 0)
                    return children;
            }
            children.push(currentNode);
            if (isStartComment(currentNode))
                depth++;
        }
        if (!allowUnbalanced)
            throw new Error("Cannot find closing comment tag to match: " + startComment.nodeValue);
        return null;
    function getMatchingEndComment(startComment, allowUnbalanced) {
        var allVirtualChildren = getVirtualChildren(startComment, allowUnbalanced);
        if (allVirtualChildren) {
            if (allVirtualChildren.length > 0)
                return allVirtualChildren[allVirtualChildren.length - 1].nextSibling;
            return startComment.nextSibling;
        } else
            return null; // Must have no matching end comment, and allowUnbalanced is true
    function getUnbalancedChildTags(node) {
        // e.g., from <div>OK</div><!-- ko blah --><span>Another</span>, returns: <!-- ko blah --><span>Another</span>
        //       from <div>OK</div><!-- /ko --><!-- /ko -->,             returns: <!-- /ko --><!-- /ko -->
        var childNode = node.firstChild, captureRemaining = null;
        if (childNode) {
            do {
                if (captureRemaining)                   // We already hit an unbalanced node and are now just scooping up all subsequent nodes
                    captureRemaining.push(childNode);
                else if (isStartComment(childNode)) {
                    var matchingEndComment = getMatchingEndComment(childNode, /* allowUnbalanced: */ true);
                    if (matchingEndComment)             // It's a balanced tag, so skip immediately to the end of this virtual set
                        childNode = matchingEndComment;
                    else
                        captureRemaining = [childNode]; // It's unbalanced, so start capturing from this point
                } else if (isEndComment(childNode)) {
                    captureRemaining = [childNode];     // It's unbalanced (if it wasn't, we'd have skipped over it already), so start capturing
                }
            } while (childNode = childNode.nextSibling);
        }
        return captureRemaining;
    ko.virtualElements = {
        allowedBindings: {},
        childNodes: function(node) {
            return isStartComment(node) ? getVirtualChildren(node) : node.childNodes;
        },
        emptyNode: function(node) {
            if (!isStartComment(node))
                ko.utils.emptyDomNode(node);
            else {
                var virtualChildren = ko.virtualElements.childNodes(node);
                for (var i = 0, j = virtualChildren.length; i < j; i++)
                    ko.removeNode(virtualChildren[i]);
            }
        },
        setDomNodeChildren: function(node, childNodes) {
            if (!isStartComment(node))
                ko.utils.setDomNodeChildren(node, childNodes);
            else {
                ko.virtualElements.emptyNode(node);
                var endCommentNode = node.nextSibling; // Must be the next sibling, as we just emptied the children
                for (var i = 0, j = childNodes.length; i < j; i++)
                    endCommentNode.parentNode.insertBefore(childNodes[i], endCommentNode);
            }
        },
        prepend: function(containerNode, nodeToPrepend) {
            if (!isStartComment(containerNode)) {
                if (containerNode.firstChild)
                    containerNode.insertBefore(nodeToPrepend, containerNode.firstChild);
                else
                    containerNode.appendChild(nodeToPrepend);
            } else {
                // Start comments must always have a parent and at least one following sibling (the end comment)
                containerNode.parentNode.insertBefore(nodeToPrepend, containerNode.nextSibling);
            }
        },
        insertAfter: function(containerNode, nodeToInsert, insertAfterNode) {
            if (!isStartComment(containerNode)) {
                // Insert after insertion point
                if (insertAfterNode.nextSibling)
                    containerNode.insertBefore(nodeToInsert, insertAfterNode.nextSibling);
                else
                    containerNode.appendChild(nodeToInsert);
            } else {
                // Children of start comments must always have a parent and at least one following sibling (the end comment)
                containerNode.parentNode.insertBefore(nodeToInsert, insertAfterNode.nextSibling);
            }
        },
        firstChild: function(node) {
            if (!isStartComment(node))
                return node.firstChild;
            if (!node.nextSibling || isEndComment(node.nextSibling))
                return null;
            return node.nextSibling;
        },
        nextSibling: function(node) {
            if (isStartComment(node))
                node = getMatchingEndComment(node);
            if (node.nextSibling && isEndComment(node.nextSibling))
                return null;
            return node.nextSibling;
        },
        virtualNodeBindingValue: function(node) {
            var regexMatch = isStartComment(node);
            return regexMatch ? regexMatch[1] : null;
        },
        normaliseVirtualElementDomStructure: function(elementVerified) {
            // Workaround for https://github.com/SteveSanderson/knockout/issues/155
            // (IE <= 8 or IE 9 quirks mode parses your HTML weirdly, treating closing </li> tags as if they don't exist, thereby moving comment nodes
            // that are direct descendants of <ul> into the preceding <li>)
            if (!htmlTagsWithOptionallyClosingChildren[ko.utils.tagNameLower(elementVerified)])
                return;
            // Scan immediate children to see if they contain unbalanced comment tags. If they do, those comment tags
            // must be intended to appear *after* that child, so move them there.
            var childNode = elementVerified.firstChild;
            if (childNode) {
                do {
                    if (childNode.nodeType === 1) {
                        var unbalancedTags = getUnbalancedChildTags(childNode);
                        if (unbalancedTags) {
                            // Fix up the DOM by moving the unbalanced tags to where they most likely were intended to be placed - *after* the child
                            var nodeToInsertBefore = childNode.nextSibling;
                            for (var i = 0; i < unbalancedTags.length; i++) {
                                if (nodeToInsertBefore)
                                    elementVerified.insertBefore(unbalancedTags[i], nodeToInsertBefore);
                                else
                                    elementVerified.appendChild(unbalancedTags[i]);
                            }
                        }
                    }
                } while (childNode = childNode.nextSibling);
            }
        }
    };
ko.exportSymbol('virtualElements', ko.virtualElements);
ko.exportSymbol('virtualElements.allowedBindings', ko.virtualElements.allowedBindings);
ko.exportSymbol('virtualElements.emptyNode', ko.virtualElements.emptyNode);
//ko.exportSymbol('virtualElements.firstChild', ko.virtualElements.firstChild);     // firstChild is not minified
ko.exportSymbol('virtualElements.insertAfter', ko.virtualElements.insertAfter);
//ko.exportSymbol('virtualElements.nextSibling', ko.virtualElements.nextSibling);   // nextSibling is not minified
ko.exportSymbol('virtualElements.prepend', ko.virtualElements.prepend);
ko.exportSymbol('virtualElements.setDomNodeChildren', ko.virtualElements.setDomNodeChildren);
(function() {
    var defaultBindingAttributeName = "data-bind";
    ko.bindingProvider = function() {
        this.bindingCache = {};
    };
    ko.utils.extend(ko.bindingProvider.prototype, {
        'nodeHasBindings': function(node) {
            switch (node.nodeType) {
                case 1: return node.getAttribute(defaultBindingAttributeName) != null;   // Element
                case 8: return ko.virtualElements.virtualNodeBindingValue(node) != null; // Comment node
                default: return false;
            }
        },
        'getBindings': function(node, bindingContext) {
            var bindingsString = this['getBindingsString'](node, bindingContext);
            return bindingsString ? this['parseBindingsString'](bindingsString, bindingContext) : null;
        },
        // The following function is only used internally by this default provider.
        // It's not part of the interface definition for a general binding provider.
        'getBindingsString': function(node, bindingContext) {
            switch (node.nodeType) {
                case 1: return node.getAttribute(defaultBindingAttributeName);   // Element
                case 8: return ko.virtualElements.virtualNodeBindingValue(node); // Comment node
                default: return null;
            }
        },
        // The following function is only used internally by this default provider.
        // It's not part of the interface definition for a general binding provider.
        'parseBindingsString': function(bindingsString, bindingContext) {
            try {
                var viewModel = bindingContext['$data'],
                    scopes = (typeof viewModel == 'object' && viewModel != null) ? [viewModel, bindingContext] : [bindingContext],
                    bindingFunction = createBindingsStringEvaluatorViaCache(bindingsString, scopes.length, this.bindingCache);
                return bindingFunction(scopes);
            } catch (ex) {
                throw new Error("Unable to parse bindings.\nMessage: " + ex.message + ";\nBindings value: " + bindingsString);
            }
        }
    });
    ko.bindingProvider['instance'] = new ko.bindingProvider();
    function createBindingsStringEvaluatorViaCache(bindingsString, scopesCount, cache) {
        var cacheKey = scopesCount + '_' + bindingsString;
        return cache[cacheKey]
            || (cache[cacheKey] = createBindingsStringEvaluator(bindingsString, scopesCount));
    function createBindingsStringEvaluator(bindingsString, scopesCount) {
        var rewrittenBindings = " { " + ko.jsonExpressionRewriting.insertPropertyAccessorsIntoJson(bindingsString) + " } ";
        return ko.utils.buildEvalWithinScopeFunction(rewrittenBindings, scopesCount);
ko.exportSymbol('bindingProvider', ko.bindingProvider);
(function () {
    ko.bindingHandlers = {};
    ko.bindingContext = function(dataItem, parentBindingContext) {
        if (parentBindingContext) {
            ko.utils.extend(this, parentBindingContext); // Inherit $root and any custom properties
            this['$parentContext'] = parentBindingContext;
            this['$parent'] = parentBindingContext['$data'];
            this['$parents'] = (parentBindingContext['$parents'] || []).slice(0);
            this['$parents'].unshift(this['$parent']);
        } else {
            this['$parents'] = [];
            this['$root'] = dataItem;
        }
        this['$data'] = dataItem;
    ko.bindingContext.prototype['createChildContext'] = function (dataItem) {
        return new ko.bindingContext(dataItem, this);
    };
    ko.bindingContext.prototype['extend'] = function(properties) {
        var clone = ko.utils.extend(new ko.bindingContext(), this);
        return ko.utils.extend(clone, properties);
    };
    function validateThatBindingIsAllowedForVirtualElements(bindingName) {
        var validator = ko.virtualElements.allowedBindings[bindingName];
        if (!validator)
            throw new Error("The binding '" + bindingName + "' cannot be used with virtual elements")
    function applyBindingsToDescendantsInternal (viewModel, elementOrVirtualElement, bindingContextsMayDifferFromDomParentElement) {
        var currentChild, nextInQueue = ko.virtualElements.firstChild(elementOrVirtualElement);
        while (currentChild = nextInQueue) {
            // Keep a record of the next child *before* applying bindings, in case the binding removes the current child from its position
            nextInQueue = ko.virtualElements.nextSibling(currentChild);
            applyBindingsToNodeAndDescendantsInternal(viewModel, currentChild, bindingContextsMayDifferFromDomParentElement);
        }
    function applyBindingsToNodeAndDescendantsInternal (viewModel, nodeVerified, bindingContextMayDifferFromDomParentElement) {
        var shouldBindDescendants = true;
        // Perf optimisation: Apply bindings only if...
        // (1) We need to store the binding context on this node (because it may differ from the DOM parent node's binding context)
        //     Note that we can't store binding contexts on non-elements (e.g., text nodes), as IE doesn't allow expando properties for those
        // (2) It might have bindings (e.g., it has a data-bind attribute, or it's a marker for a containerless template)
        var isElement = (nodeVerified.nodeType === 1);
        if (isElement) // Workaround IE <= 8 HTML parsing weirdness
            ko.virtualElements.normaliseVirtualElementDomStructure(nodeVerified);
        var shouldApplyBindings = (isElement && bindingContextMayDifferFromDomParentElement)             // Case (1)
                               || ko.bindingProvider['instance']['nodeHasBindings'](nodeVerified);       // Case (2)
        if (shouldApplyBindings)
            shouldBindDescendants = applyBindingsToNodeInternal(nodeVerified, null, viewModel, bindingContextMayDifferFromDomParentElement).shouldBindDescendants;
        if (shouldBindDescendants) {
            // We're recursing automatically into (real or virtual) child nodes without changing binding contexts. So,
            //  * For children of a *real* element, the binding context is certainly the same as on their DOM .parentNode,
            //    hence bindingContextsMayDifferFromDomParentElement is false
            //  * For children of a *virtual* element, we can't be sure. Evaluating .parentNode on those children may
            //    skip over any number of intermediate virtual elements, any of which might define a custom binding context,
            //    hence bindingContextsMayDifferFromDomParentElement is true
            applyBindingsToDescendantsInternal(viewModel, nodeVerified, /* bindingContextsMayDifferFromDomParentElement: */ !isElement);
        }
    function applyBindingsToNodeInternal (node, bindings, viewModelOrBindingContext, bindingContextMayDifferFromDomParentElement) {
        // Need to be sure that inits are only run once, and updates never run until all the inits have been run
        var initPhase = 0; // 0 = before all inits, 1 = during inits, 2 = after all inits
        // Each time the dependentObservable is evaluated (after data changes),
        // the binding attribute is reparsed so that it can pick out the correct
        // model properties in the context of the changed data.
        // DOM event callbacks need to be able to access this changed data,
        // so we need a single parsedBindings variable (shared by all callbacks
        // associated with this node's bindings) that all the closures can access.
        var parsedBindings;
        function makeValueAccessor(bindingKey) {
            return function () { return parsedBindings[bindingKey] }
        }
        function parsedBindingsAccessor() {
            return parsedBindings;
        }
        var bindingHandlerThatControlsDescendantBindings;
        ko.dependentObservable(
            function () {
                // Ensure we have a nonnull binding context to work with
                var bindingContextInstance = viewModelOrBindingContext && (viewModelOrBindingContext instanceof ko.bindingContext)
                    ? viewModelOrBindingContext
                    : new ko.bindingContext(ko.utils.unwrapObservable(viewModelOrBindingContext));
                var viewModel = bindingContextInstance['$data'];
                // Optimization: Don't store the binding context on this node if it's definitely the same as on node.parentNode, because
                // we can easily recover it just by scanning up the node's ancestors in the DOM
                // (note: here, parent node means "real DOM parent" not "virtual parent", as there's no O(1) way to find the virtual parent)
                if (bindingContextMayDifferFromDomParentElement)
                    ko.storedBindingContextForNode(node, bindingContextInstance);
                // Use evaluatedBindings if given, otherwise fall back on asking the bindings provider to give us some bindings
                var evaluatedBindings = (typeof bindings == "function") ? bindings() : bindings;
                parsedBindings = evaluatedBindings || ko.bindingProvider['instance']['getBindings'](node, bindingContextInstance);
                if (parsedBindings) {
                    // First run all the inits, so bindings can register for notification on changes
                    if (initPhase === 0) {
                        initPhase = 1;
                        for (var bindingKey in parsedBindings) {
                            var binding = ko.bindingHandlers[bindingKey];
                            if (binding && node.nodeType === 8)
                                validateThatBindingIsAllowedForVirtualElements(bindingKey);
                            if (binding && typeof binding["init"] == "function") {
                                var handlerInitFn = binding["init"];
                                var initResult = handlerInitFn(node, makeValueAccessor(bindingKey), parsedBindingsAccessor, viewModel, bindingContextInstance);
                                // If this binding handler claims to control descendant bindings, make a note of this
                                if (initResult && initResult['controlsDescendantBindings']) {
                                    if (bindingHandlerThatControlsDescendantBindings !== undefined)
                                        throw new Error("Multiple bindings (" + bindingHandlerThatControlsDescendantBindings + " and " + bindingKey + ") are trying to control descendant bindings of the same element. You cannot use these bindings together on the same element.");
                                    bindingHandlerThatControlsDescendantBindings = bindingKey;
                                }
                            }
                        }
                        initPhase = 2;
                    }
                    // ... then run all the updates, which might trigger changes even on the first evaluation
                    if (initPhase === 2) {
                        for (var bindingKey in parsedBindings) {
                            var binding = ko.bindingHandlers[bindingKey];
                            if (binding && typeof binding["update"] == "function") {
                                var handlerUpdateFn = binding["update"];
                                handlerUpdateFn(node, makeValueAccessor(bindingKey), parsedBindingsAccessor, viewModel, bindingContextInstance);
                            }
                        }
                    }
                }
            },
            null,
            { 'disposeWhenNodeIsRemoved' : node }
        );
        return {
            shouldBindDescendants: bindingHandlerThatControlsDescendantBindings === undefined
        };
    };
    var storedBindingContextDomDataKey = "__ko_bindingContext__";
    ko.storedBindingContextForNode = function (node, bindingContext) {
        if (arguments.length == 2)
            ko.utils.domData.set(node, storedBindingContextDomDataKey, bindingContext);
        else
            return ko.utils.domData.get(node, storedBindingContextDomDataKey);
    ko.applyBindingsToNode = function (node, bindings, viewModel) {
        if (node.nodeType === 1) // If it's an element, workaround IE <= 8 HTML parsing weirdness
            ko.virtualElements.normaliseVirtualElementDomStructure(node);
        return applyBindingsToNodeInternal(node, bindings, viewModel, true);
    };
    ko.applyBindingsToDescendants = function(viewModel, rootNode) {
        if (rootNode.nodeType === 1 || rootNode.nodeType === 8)
            applyBindingsToDescendantsInternal(viewModel, rootNode, true);
    };
    ko.applyBindings = function (viewModel, rootNode) {
        if (rootNode && (rootNode.nodeType !== 1) && (rootNode.nodeType !== 8))
            throw new Error("ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node");
        rootNode = rootNode || window.document.body; // Make "rootNode" parameter optional
        applyBindingsToNodeAndDescendantsInternal(viewModel, rootNode, true);
    };
    // Retrieving binding context from arbitrary nodes
    ko.contextFor = function(node) {
        // We can only do something meaningful for elements and comment nodes (in particular, not text nodes, as IE can't store domdata for them)
        switch (node.nodeType) {
            case 1:
            case 8:
                var context = ko.storedBindingContextForNode(node);
                if (context) return context;
                if (node.parentNode) return ko.contextFor(node.parentNode);
                break;
        }
        return undefined;
    };
    ko.dataFor = function(node) {
        var context = ko.contextFor(node);
        return context ? context['$data'] : undefined;
    };
    ko.exportSymbol('bindingHandlers', ko.bindingHandlers);
    ko.exportSymbol('applyBindings', ko.applyBindings);
    ko.exportSymbol('applyBindingsToDescendants', ko.applyBindingsToDescendants);
    ko.exportSymbol('applyBindingsToNode', ko.applyBindingsToNode);
    ko.exportSymbol('contextFor', ko.contextFor);
    ko.exportSymbol('dataFor', ko.dataFor);
// For certain common events (currently just 'click'), allow a simplified data-binding syntax
// e.g. click:handler instead of the usual full-length event:{click:handler}
var eventHandlersWithShortcuts = ['click'];
ko.utils.arrayForEach(eventHandlersWithShortcuts, function(eventName) {
    ko.bindingHandlers[eventName] = {
        'init': function(element, valueAccessor, allBindingsAccessor, viewModel) {
            var newValueAccessor = function () {
                var result = {};
                result[eventName] = valueAccessor();
                return result;
            };
            return ko.bindingHandlers['event']['init'].call(this, element, newValueAccessor, allBindingsAccessor, viewModel);
        }
ko.bindingHandlers['event'] = {
    'init' : function (element, valueAccessor, allBindingsAccessor, viewModel) {
        var eventsToHandle = valueAccessor() || {};
        for(var eventNameOutsideClosure in eventsToHandle) {
            (function() {
                var eventName = eventNameOutsideClosure; // Separate variable to be captured by event handler closure
                if (typeof eventName == "string") {
                    ko.utils.registerEventHandler(element, eventName, function (event) {
                        var handlerReturnValue;
                        var handlerFunction = valueAccessor()[eventName];
                        if (!handlerFunction)
                            return;
                        var allBindings = allBindingsAccessor();
                        try {
                            // Take all the event args, and prefix with the viewmodel
                            var argsForHandler = ko.utils.makeArray(arguments);
                            argsForHandler.unshift(viewModel);
                            handlerReturnValue = handlerFunction.apply(viewModel, argsForHandler);
                        } finally {
                            if (handlerReturnValue !== true) { // Normally we want to prevent default action. Developer can override this be explicitly returning true.
                                if (event.preventDefault)
                                    event.preventDefault();
                                else
                                    event.returnValue = false;
                            }
                        }
                        var bub
ble = allBindings[eventName + 'Bubble'] !== false;
                        if (!bubble) {
                            event.cancelBubble = true;
                            if (event.stopPropagation)
                                event.stopPropagation();
                        }
                    });
                }
            })();
        }
ko.bindingHandlers['submit'] = {
    'init': function (element, valueAccessor, allBindingsAccessor, viewModel) {
        if (typeof valueAccessor() != "function")
            throw new Error("The value for a submit binding must be a function");
        ko.utils.registerEventHandler(element, "submit", function (event) {
            var handlerReturnValue;
            var value = valueAccessor();
            try { handlerReturnValue = value.call(viewModel, element); }
            finally {
                if (handlerReturnValue !== true) { // Normally we want to prevent default action. Developer can override this be explicitly returning true.
                    if (event.preventDefault)
                        event.preventDefault();
                    else
                        event.returnValue = false;
                }
            }
        });
ko.bindingHandlers['visible'] = {
    'update': function (element, valueAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor());
        var isCurrentlyVisible = !(element.style.display == "none");
        if (value && !isCurrentlyVisible)
            element.style.display = "";
        else if ((!value) && isCurrentlyVisible)
            element.style.display = "none";
ko.bindingHandlers['enable'] = {
    'update': function (element, valueAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor());
        if (value && element.disabled)
            element.removeAttribute("disabled");
        else if ((!value) && (!element.disabled))
            element.disabled = true;
ko.bindingHandlers['disable'] = {
    'update': function (element, valueAccessor) {
        ko.bindingHandlers['enable']['update'](element, function() { return !ko.utils.unwrapObservable(valueAccessor()) });
function ensureDropdownSelectionIsConsistentWithModelValue(element, modelValue, preferModelValue) {
    if (preferModelValue) {
        if (modelValue !== ko.selectExtensions.readValue(element))
            ko.selectExtensions.writeValue(element, modelValue);
    // No matter which direction we're syncing in, we want the end result to be equality between dropdown value and model value.
    // If they aren't equal, either we prefer the dropdown value, or the model value couldn't be represented, so either way,
    // change the model value to match the dropdown.
    if (modelValue !== ko.selectExtensions.readValue(element))
        ko.utils.triggerEvent(element, "change");
ko.bindingHandlers['value'] = {
    'init': function (element, valueAccessor, allBindingsAccessor) {
        // Always catch "change" event; possibly other events too if asked
        var eventsToCatch = ["change"];
        var requestedEventsToCatch = allBindingsAccessor()["valueUpdate"];
        if (requestedEventsToCatch) {
            if (typeof requestedEventsToCatch == "string") // Allow both individual event names, and arrays of event names
                requestedEventsToCatch = [requestedEventsToCatch];
            ko.utils.arrayPushAll(eventsToCatch, requestedEventsToCatch);
            eventsToCatch = ko.utils.arrayGetDistinctValues(eventsToCatch);
        }
        var valueUpdateHandler = function() {
            var modelValue = valueAccessor();
            var elementValue = ko.selectExtensions.readValue(element);
            ko.jsonExpressionRewriting.writeValueToProperty(modelValue, allBindingsAccessor, 'value', elementValue, /* checkIfDifferent: */ true);
        }
        // Workaround for https://github.com/SteveSanderson/knockout/issues/122
        // IE doesn't fire "change" events on textboxes if the user selects a value from its autocomplete list
        var ieAutoCompleteHackNeeded = ko.utils.ieVersion && element.tagName.toLowerCase() == "input" && element.type == "text"
                                       && element.autocomplete != "off" && (!element.form || element.form.autocomplete != "off");
        if (ieAutoCompleteHackNeeded && ko.utils.arrayIndexOf(eventsToCatch, "propertychange") == -1) {
            var propertyChangedFired = false;
            ko.utils.registerEventHandler(element, "propertychange", function () { propertyChangedFired = true });
            ko.utils.registerEventHandler(element, "blur", function() {
                if (propertyChangedFired) {
                    propertyChangedFired = false;
                    valueUpdateHandler();
                }
            });
        }
        ko.utils.arrayForEach(eventsToCatch, function(eventName) {
            // The syntax "after<eventname>" means "run the handler asynchronously after the event"
            // This is useful, for example, to catch "keydown" events after the browser has updated the control
            // (otherwise, ko.selectExtensions.readValue(this) will receive the control's value *before* the key event)
            var handler = valueUpdateHandler;
            if (ko.utils.stringStartsWith(eventName, "after")) {
                handler = function() { setTimeout(valueUpdateHandler, 0) };
                eventName = eventName.substring("after".length);
            }
            ko.utils.registerEventHandler(element, eventName, handler);
        });
    },
    'update': function (element, valueAccessor) {
        var valueIsSelectOption = ko.utils.tagNameLower(element) === "select";
        var newValue = ko.utils.unwrapObservable(valueAccessor());
        var elementValue = ko.selectExtensions.readValue(element);
        var valueHasChanged = (newValue != elementValue);
        // JavaScript's 0 == "" behavious is unfortunate here as it prevents writing 0 to an empty text box (loose equality suggests the values are the same).
        // We don't want to do a strict equality comparison as that is more confusing for developers in certain cases, so we specifically special case 0 != "" here.
        if ((newValue === 0) && (elementValue !== 0) && (elementValue !== "0"))
            valueHasChanged = true;
        if (valueHasChanged) {
            var applyValueAction = function () { ko.selectExtensions.writeValue(element, newValue); };
            applyValueAction();
            // Workaround for IE6 bug: It won't reliably apply values to SELECT nodes during the same execution thread
            // right after you've changed the set of OPTION nodes on it. So for that node type, we'll schedule a second thread
            // to apply the value as well.
            var alsoApplyAsynchronously = valueIsSelectOption;
            if (alsoApplyAsynchronously)
                setTimeout(applyValueAction, 0);
        }
        // If you try to set a model value that can't be represented in an already-populated dropdown, reject that change,
        // because you're not allowed to have a model value that disagrees with a visible UI selection.
        if (valueIsSelectOption && (element.length > 0))
            ensureDropdownSelectionIsConsistentWithModelValue(element, newValue, /* preferModelValue */ false);
ko.bindingHandlers['options'] = {
    'update': function (element, valueAccessor, allBindingsAccessor) {
        if (ko.utils.tagNameLower(element) !== "select")
            throw new Error("options binding applies only to SELECT elements");
        var selectWasPreviouslyEmpty = element.length == 0;
        var previousSelectedValues = ko.utils.arrayMap(ko.utils.arrayFilter(element.childNodes, function (node) {
            return node.tagName && (ko.utils.tagNameLower(node) === "option") && node.selected;
        }), function (node) {
            return ko.selectExtensions.readValue(node) || node.innerText || node.textContent;
        });
        var previousScrollTop = element.scrollTop;
        var value = ko.utils.unwrapObservable(valueAccessor());
        var selectedValue = element.value;
        // Remove all existing <option>s.
        // Need to use .remove() rather than .removeChild() for <option>s otherwise IE behaves oddly (https://github.com/SteveSanderson/knockout/issues/134)
        while (element.length > 0) {
            ko.cleanNode(element.options[0]);
            element.remove(0);
        }
        if (value) {
            var allBindings = allBindingsAccessor();
            if (typeof value.length != "number")
                value = [value];
            if (allBindings['optionsCaption']) {
                var option = document.createElement("option");
                ko.utils.setHtml(option, allBindings['optionsCaption']);
                ko.selectExtensions.writeValue(option, undefined);
                element.appendChild(option);
            }
            for (var i = 0, j = value.length; i < j; i++) {
                var option = document.createElement("option");
                // Apply a value to the option element
                var optionValue = typeof allBindings['optionsValue'] == "string" ? value[i][allBindings['optionsValue']] : value[i];
                optionValue = ko.utils.unwrapObservable(optionValue);
                ko.selectExtensions.writeValue(option, optionValue);
                // Apply some text to the option element
                var optionsTextValue = allBindings['optionsText'];
                var optionText;
                if (typeof optionsTextValue == "function")
                    optionText = optionsTextValue(value[i]); // Given a function; run it against the data value
                else if (typeof optionsTextValue == "string")
                    optionText = value[i][optionsTextValue]; // Given a string; treat it as a property name on the data value
                else
                    optionText = optionValue;				 // Given no optionsText arg; use the data value itself
                if ((optionText === null) || (optionText === undefined))
                    optionText = "";
                ko.utils.setTextContent(option, optionText);
                element.appendChild(option);
            }
            // IE6 doesn't like us to assign selection to OPTION nodes before they're added to the document.
            // That's why we first added them without selection. Now it's time to set the selection.
            var newOptions = element.getElementsByTagName("option");
            var countSelectionsRetained = 0;
            for (var i = 0, j = newOptions.length; i < j; i++) {
                if (ko.utils.arrayIndexOf(previousSelectedValues, ko.selectExtensions.readValue(newOptions[i])) >= 0) {
                    ko.utils.setOptionNodeSelectionState(newOptions[i], true);
                    countSelectionsRetained++;
                }
            }
            element.scrollTop = previousScrollTop;
            if (selectWasPreviouslyEmpty && ('value' in allBindings)) {
                // Ensure consistency between model value and selected option.
                // If the dropdown is being populated for the first time here (or was otherwise previously empty),
                // the dropdown selection state is meaningless, so we preserve the model value.
                ensureDropdownSelectionIsConsistentWithModelValue(element, ko.utils.unwrapObservable(allBindings['value']), /* preferModelValue */ true);
            }
            // Workaround for IE9 bug
            ko.utils.ensureSelectElementIsRenderedCorrectly(element);
        }
ko.bindingHandlers['options'].optionValueDomDataKey = '__ko.optionValueDomData__';
ko.bindingHandlers['selectedOptions'] = {
    getSelectedValuesFromSelectNode: function (selectNode) {
        var result = [];
        var nodes = selectNode.childNodes;
        for (var i = 0, j = nodes.length; i < j; i++) {
            var node = nodes[i], tagName = ko.utils.tagNameLower(node);
            if (tagName == "option" && node.selected)
                result.push(ko.selectExtensions.readValue(node));
            else if (tagName == "optgroup") {
                var selectedValuesFromOptGroup = ko.bindingHandlers['selectedOptions'].getSelectedValuesFromSelectNode(node);
                Array.prototype.splice.apply(result, [result.length, 0].concat(selectedValuesFromOptGroup)); // Add new entries to existing 'result' instance
            }
        }
        return result;
    },
    'init': function (element, valueAccessor, allBindingsAccessor) {
        ko.utils.registerEventHandler(element, "change", function () {
            var value = valueAccessor();
            var valueToWrite = ko.bindingHandlers['selectedOptions'].getSelectedValuesFromSelectNode(this);
            ko.jsonExpressionRewriting.writeValueToProperty(value, allBindingsAccessor, 'value', valueToWrite);
        });
    },
    'update': function (element, valueAccessor) {
        if (ko.utils.tagNameLower(element) != "select")
            throw new Error("values binding applies only to SELECT elements");
        var newValue = ko.utils.unwrapObservable(valueAccessor());
        if (newValue && typeof newValue.length == "number") {
            var nodes = element.childNodes;
            for (var i = 0, j = nodes.length; i < j; i++) {
                var node = nodes[i];
                if (ko.utils.tagNameLower(node) === "option")
                    ko.utils.setOptionNodeSelectionState(node, ko.utils.arrayIndexOf(newValue, ko.selectExtensions.readValue(node)) >= 0);
            }
        }
ko.bindingHandlers['text'] = {
    'update': function (element, valueAccessor) {
        ko.utils.setTextContent(element, valueAccessor());
ko.bindingHandlers['html'] = {
    'init': function() {
        // Prevent binding on the dynamically-injected HTML (as developers are unlikely to expect that, and it has security implications)
        return { 'controlsDescendantBindings': true };
    },
    'update': function (element, valueAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor());
        ko.utils.setHtml(element, value);
ko.bindingHandlers['css'] = {
    'update': function (element, valueAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor() || {});
        for (var className in value) {
            if (typeof className == "string") {
                var shouldHaveClass = ko.utils.unwrapObservable(value[className]);
                ko.utils.toggleDomNodeCssClass(element, className, shouldHaveClass);
            }
        }
ko.bindingHandlers['style'] = {
    'update': function (element, valueAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor() || {});
        for (var styleName in value) {
            if (typeof styleName == "string") {
                var styleValue = ko.utils.unwrapObservable(value[styleName]);
                element.style[styleName] = styleValue || ""; // Empty string removes the value, whereas null/undefined have no effect
            }
        }
ko.bindingHandlers['uniqueName'] = {
    'init': function (element, valueAccessor) {
        if (valueAccessor()) {
            element.name = "ko_unique_" + (++ko.bindingHandlers['uniqueName'].currentIndex);
            // Workaround IE 6/7 issue
            // - https://github.com/SteveSanderson/knockout/issues/197
            // - http://www.matts411.com/post/setting_the_name_attribute_in_ie_dom/
            if (ko.utils.isIe6 || ko.utils.isIe7)
                element.mergeAttributes(document.createElement("<input name='" + element.name + "'/>"), false);
        }
ko.bindingHandlers['uniqueName'].currentIndex = 0;
ko.bindingHandlers['checked'] = {
    'init': function (element, valueAccessor, allBindingsAccessor) {
        var updateHandler = function() {
            var valueToWrite;
            if (element.type == "checkbox") {
                valueToWrite = element.checked;
            } else if ((element.type == "radio") && (element.checked)) {
                valueToWrite = element.value;
            } else {
                return; // "checked" binding only responds to checkboxes and selected radio buttons
            }
            var modelValue = valueAccessor();
            if ((element.type == "checkbox") && (ko.utils.unwrapObservable(modelValue) instanceof Array)) {
                // For checkboxes bound to an array, we add/remove the checkbox value to that array
                // This works for both observable and non-observable arrays
                var existingEntryIndex = ko.utils.arrayIndexOf(ko.utils.unwrapObservable(modelValue), element.value);
                if (element.checked && (existingEntryIndex < 0))
                    modelValue.push(element.value);
                else if ((!element.checked) && (existingEntryIndex >= 0))
                    modelValue.splice(existingEntryIndex, 1);
            } else {
                ko.jsonExpressionRewriting.writeValueToProperty(modelValue, allBindingsAccessor, 'checked', valueToWrite, true);
            }
        };
        ko.utils.registerEventHandler(element, "click", updateHandler);
        // IE 6 won't allow radio buttons to be selected unless they have a name
        if ((element.type == "radio") && !element.name)
            ko.bindingHandlers['uniqueName']['init'](element, function() { return true });
    },
    'update': function (element, valueAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor());
        if (element.type == "checkbox") {
            if (value instanceof Array) {
                // When bound to an array, the checkbox being checked represents its value being present in that array
                element.checked = ko.utils.arrayIndexOf(value, element.value) >= 0;
            } else {
                // When bound to anything other value (not an array), the checkbox being checked represents the value being trueish
                element.checked = value;
            }
        } else if (element.type == "radio") {
            element.checked = (element.value == value);
        }
var attrHtmlToJavascriptMap = { 'class': 'className', 'for': 'htmlFor' };
ko.bindingHandlers['attr'] = {
    'update': function(element, valueAccessor, allBindingsAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor()) || {};
        for (var attrName in value) {
            if (typeof attrName == "string") {
                var attrValue = ko.utils.unwrapObservable(value[attrName]);
                // To cover cases like "attr: { checked:someProp }", we want to remove the attribute entirely
                // when someProp is a "no value"-like value (strictly null, false, or undefined)
                // (because the absence of the "checked" attr is how to mark an element as not checked, etc.)
                var toRemove = (attrValue === false) || (attrValue === null) || (attrValue === undefined);
                if (toRemove)
                    element.removeAttribute(attrName);
                // In IE <= 7 and IE8 Quirks Mode, you have to use the Javascript property name instead of the
                // HTML attribute name for certain attributes. IE8 Standards Mode supports the correct behavior,
                // but instead of figuring out the mode, we'll just set the attribute through the Javascript
                // property for IE <= 8.
                if (ko.utils.ieVersion <= 8 && attrName in attrHtmlToJavascriptMap) {
                    attrName = attrHtmlToJavascriptMap[attrName];
                    if (toRemove)
                        element.removeAttribute(attrName);
                    else
                        element[attrName] = attrValue;
                } else if (!toRemove) {
                    element.setAttribute(attrName, attrValue.toString());
                }
            }
        }
ko.bindingHandlers['hasfocus'] = {
    'init': function(element, valueAccessor, allBindingsAccessor) {
        var writeValue = function(valueToWrite) {
            var modelValue = valueAccessor();
            ko.jsonExpressionRewriting.writeValueToProperty(modelValue, allBindingsAccessor, 'hasfocus', valueToWrite, true);
        };
        ko.utils.registerEventHandler(element, "focus", function() { writeValue(true) });
        ko.utils.registerEventHandler(element, "focusin", function() { writeValue(true) }); // For IE
        ko.utils.registerEventHandler(element, "blur",  function() { writeValue(false) });
        ko.utils.registerEventHandler(element, "focusout",  function() { writeValue(false) }); // For IE
    },
    'update': function(element, valueAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor());
        value ? element.focus() : element.blur();
        ko.utils.triggerEvent(element, value ? "focusin" : "focusout"); // For IE, which doesn't reliably fire "focus" or "blur" events synchronously
// "with: someExpression" is equivalent to "template: { if: someExpression, data: someExpression }"
ko.bindingHandlers['with'] = {
    makeTemplateValueAccessor: function(valueAccessor) {
        return function() { var value = valueAccessor(); return { 'if': value, 'data': value, 'templateEngine': ko.nativeTemplateEngine.instance } };
    },
    'init': function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        return ko.bindingHandlers['template']['init'](element, ko.bindingHandlers['with'].makeTemplateValueAccessor(valueAccessor));
    },
    'update': function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        return ko.bindingHandlers['template']['update'](element, ko.bindingHandlers['with'].makeTemplateValueAccessor(valueAccessor), allBindingsAccessor, viewModel, bindingContext);
ko.jsonExpressionRewriting.bindingRewriteValidators['with'] = false; // Can't rewrite control flow bindings
ko.virtualElements.allowedBindings['with'] = true;
// "if: someExpression" is equivalent to "template: { if: someExpression }"
ko.bindingHandlers['if'] = {
    makeTemplateValueAccessor: function(valueAccessor) {
        return function() { return { 'if': valueAccessor(), 'templateEngine': ko.nativeTemplateEngine.instance } };
    },
    'init': function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        return ko.bindingHandlers['template']['init'](element, ko.bindingHandlers['if'].makeTemplateValueAccessor(valueAccessor));
    },
    'update': function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        return ko.bindingHandlers['template']['update'](element, ko.bindingHandlers['if'].makeTemplateValueAccessor(valueAccessor), allBindingsAccessor, viewModel, bindingContext);
ko.jsonExpressionRewriting.bindingRewriteValidators['if'] = false; // Can't rewrite control flow bindings
ko.virtualElements.allowedBindings['if'] = true;
// "ifnot: someExpression" is equivalent to "template: { ifnot: someExpression }"
ko.bindingHandlers['ifnot'] = {
    makeTemplateValueAccessor: function(valueAccessor) {
        return function() { return { 'ifnot': valueAccessor(), 'templateEngine': ko.nativeTemplateEngine.instance } };
    },
    'init': function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        return ko.bindingHandlers['template']['init'](element, ko.bindingHandlers['ifnot'].makeTemplateValueAccessor(valueAccessor));
    },
    'update': function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        return ko.bindingHandlers['template']['update'](element, ko.bindingHandlers['ifnot'].makeTemplateValueAccessor(valueAccessor), allBindingsAccessor, viewModel, bindingContext);
ko.jsonExpressionRewriting.bindingRewriteValidators['ifnot'] = false; // Can't rewrite control flow bindings
ko.virtualElements.allowedBindings['ifnot'] = true;
// "foreach: someExpression" is equivalent to "template: { foreach: someExpression }"
// "foreach: { data: someExpression, afterAdd: myfn }" is equivalent to "template: { foreach: someExpression, afterAdd: myfn }"
ko.bindingHandlers['foreach'] = {
    makeTemplateValueAccessor: function(valueAccessor) {
        return function() {
            var bindingValue = ko.utils.unwrapObservable(valueAccessor());
            // If bindingValue is the array, just pass it on its own
            if ((!bindingValue) || typeof bindingValue.length == "number")
                return { 'foreach': bindingValue, 'templateEngine': ko.nativeTemplateEngine.instance };
            // If bindingValue.data is the array, preserve all relevant options
            return {
                'foreach': bindingValue['data'],
                'includeDestroyed': bindingValue['includeDestroyed'],
                'afterAdd': bindingValue['afterAdd'],
                'beforeRemove': bindingValue['beforeRemove'],
                'afterRender': bindingValue['afterRender'],
                'templateEngine': ko.nativeTemplateEngine.instance
            };
        };
    },
    'init': function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        return ko.bindingHandlers['template']['init'](element, ko.bindingHandlers['foreach'].makeTemplateValueAccessor(valueAccessor));
    },
    'update': function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        return ko.bindingHandlers['template']['update'](element, ko.bindingHandlers['foreach'].makeTemplateValueAccessor(valueAccessor), allBindingsAccessor, viewModel, bindingContext);
ko.jsonExpressionRewriting.bindingRewriteValidators['foreach'] = false; // Can't rewrite control flow bindings
ko.virtualElements.allowedBindings['foreach'] = true;
// If you want to make a custom template engine,
// [1] Inherit from this class (like ko.nativeTemplateEngine does)
// [2] Override 'renderTemplateSource', supplying a function with this signature:
//        function (templateSource, bindingContext, options) {
//            // - templateSource.text() is the text of the template you should render
//            // - bindingContext.$data is the data you should pass into the template
//            //   - you might also want to make bindingContext.$parent, bindingContext.$parents,
//            //     and bindingContext.$root available in the template too
//            // - options gives you access to any other properties set on "data-bind: { template: options }"
//            //
//            // Return value: an array of DOM nodes
//        }
// [3] Override 'createJavaScriptEvaluatorBlock', supplying a function with this signature:
//        function (script) {
//            // Return value: Whatever syntax means "Evaluate the JavaScript statement 'script' and output the result"
//            //               For example, the jquery.tmpl template engine converts 'someScript' to '${ someScript }'
//        }
//     This is only necessary if you want to allow data-bind attributes to reference arbitrary template variables.
//     If you don't want to allow that, you can set the property 'allowTemplateRewriting' to false (like ko.nativeTemplateEngine does)
//     and then you don't need to override 'createJavaScriptEvaluatorBlock'.
ko.templateEngine = function () { };
ko.templateEngine.prototype['renderTemplateSource'] = function (templateSource, bindingContext, options) {
    throw new Error("Override renderTemplateSource");
ko.templateEngine.prototype['createJavaScriptEvaluatorBlock'] = function (script) {
    throw new Error("Override createJavaScriptEvaluatorBlock");
ko.templateEngine.prototype['makeTemplateSource'] = function(template, templateDocument) {
    // Named template
    if (typeof template == "string") {
        templateDocument = templateDocument || document;
        var elem = templateDocument.getElementById(template);
        if (!elem)
            throw new Error("Cannot find template with ID " + template);
        return new ko.templateSources.domElement(elem);
    } else if ((template.nodeType == 1) || (template.nodeType == 8)) {
        // Anonymous template
        return new ko.templateSources.anonymousTemplate(template);
    } else
        throw new Error("Unknown template type: " + template);
ko.templateEngine.prototype['renderTemplate'] = function (template, bindingContext, options, templateDocument) {
    var templateSource = this['makeTemplateSource'](template, templateDocument);
    return this['renderTemplateSource'](templateSource, bindingContext, options);
ko.templateEngine.prototype['isTemplateRewritten'] = function (template, templateDocument) {
    // Skip rewriting if requested
    if (this['allowTemplateRewriting'] === false)
        return true;
    // Perf optimisation - see below
    var templateIsInExternalDocument = templateDocument && templateDocument != document;
    if (!templateIsInExternalDocument && this.knownRewrittenTemplates && this.knownRewrittenTemplates[template])
        return true;
    return this['makeTemplateSource'](template, templateDocument)['data']("isRewritten");
ko.templateEngine.prototype['rewriteTemplate'] = function (template, rewriterCallback, templateDocument) {
    var templateSource = this['makeTemplateSource'](template, templateDocument);
    var rewritten = rewriterCallback(templateSource['text']());
    templateSource['text'](rewritten);
    templateSource['data']("isRewritten", true);
    // Perf optimisation - for named templates, track which ones have been rewritten so we can
    // answer 'isTemplateRewritten' *without* having to use getElementById (which is slow on IE < 8)
    //
    // Note that we only cache the status for templates in the main document, because caching on a per-doc
    // basis complicates the implementation excessively. In a future version of KO, we will likely remove
    // this 'isRewritten' cache entirely anyway, because the benefit is extremely minor and only applies
    // to rewritable templates, which are pretty much deprecated since KO 2.0.
    var templateIsInExternalDocument = templateDocument && templateDocument != document;
    if (!templateIsInExternalDocument && typeof template == "string") {
        this.knownRewrittenTemplates = this.knownRewrittenTemplates || {};
        this.knownRewrittenTemplates[template] = true;
ko.exportSymbol('templateEngine', ko.templateEngine);
ko.templateRewriting = (function () {
    var memoizeDataBindingAttributeSyntaxRegex = /(<[a-z]+\d*(\s+(?!data-bind=)[a-z0-9\-]+(=(\"[^\"]*\"|\'[^\']*\'))?)*\s+)data-bind=(["'])([\s\S]*?)\5/gi;
    var memoizeVirtualContainerBindingSyntaxRegex = /<!--\s*ko\b\s*([\s\S]*?)\s*-->/g;
    function validateDataBindValuesForRewriting(keyValueArray) {
        var allValidators = ko.jsonExpressionRewriting.bindingRewriteValidators;
        for (var i = 0; i < keyValueArray.length; i++) {
            var key = keyValueArray[i]['key'];
            if (allValidators.hasOwnProperty(key)) {
                var validator = allValidators[key];
                if (typeof validator === "function") {
                    var possibleErrorMessage = validator(keyValueArray[i]['value']);
                    if (possibleErrorMessage)
                        throw new Error(possibleErrorMessage);
                } else if (!validator) {
                    throw new Error("This template engine does not support the '" + key + "' binding within its templates");
                }
            }
        }
    function constructMemoizedTagReplacement(dataBindAttributeValue, tagToRetain, templateEngine) {
        var dataBindKeyValueArray = ko.jsonExpressionRewriting.parseObjectLiteral(dataBindAttributeValue);
        validateDataBindValuesForRewriting(dataBindKeyValueArray);
        var rewrittenDataBindAttributeValue = ko.jsonExpressionRewriting.insertPropertyAccessorsIntoJson(dataBindKeyValueArray);
        // For no obvious reason, Opera fails to evaluate rewrittenDataBindAttributeValue unless it's wrapped in an additional
        // anonymous function, even though Opera's built-in debugger can evaluate it anyway. No other browser requires this
        // extra indirection.
        var applyBindingsToNextSiblingScript = "ko.templateRewriting.applyMemoizedBindingsToNextSibling(function() { \
            return (function() { return { " + rewrittenDataBindAttributeValue + " } })() \
        })";
        return templateEngine['createJavaScriptEvaluatorBlock'](applyBindingsToNextSiblingScript) + tagToRetain;
    return {
        ensureTemplateIsRewritte
n: function (template, templateEngine, templateDocument) {
            if (!templateEngine['isTemplateRewritten'](template, templateDocument))
                templateEngine['rewriteTemplate'](template, function (htmlString) {
                    return ko.templateRewriting.memoizeBindingAttributeSyntax(htmlString, templateEngine);
                }, templateDocument);
        },
        memoizeBindingAttributeSyntax: function (htmlString, templateEngine) {
            return htmlString.replace(memoizeDataBindingAttributeSyntaxRegex, function () {
                return constructMemoizedTagReplacement(/* dataBindAttributeValue: */ arguments[6], /* tagToRetain: */ arguments[1], templateEngine);
            }).replace(memoizeVirtualContainerBindingSyntaxRegex, function() {
                return constructMemoizedTagReplacement(/* dataBindAttributeValue: */ arguments[1], /* tagToRetain: */ "<!-- ko -->", templateEngine);
            });
        },
        applyMemoizedBindingsToNextSibling: function (bindings) {
            return ko.memoization.memoize(function (domNode, bindingContext) {
                if (domNode.nextSibling)
                    ko.applyBindingsToNode(domNode.nextSibling, bindings, bindingContext);
            });
        }
ko.exportSymbol('templateRewriting', ko.templateRewriting);
ko.exportSymbol('templateRewriting.applyMemoizedBindingsToNextSibling', ko.templateRewriting.applyMemoizedBindingsToNextSibling); // Exported only because it has to be referenced by string lookup from within rewritten template
(function() {
    // A template source represents a read/write way of accessing a template. This is to eliminate the need for template loading/saving
    // logic to be duplicated in every template engine (and means they can all work with anonymous templates, etc.)
    //
    // Two are provided by default:
    //  1. ko.templateSources.domElement       - reads/writes the text content of an arbitrary DOM element
    //  2. ko.templateSources.anonymousElement - uses ko.utils.domData to read/write text *associated* with the DOM element, but
    //                                           without reading/writing the actual element text content, since it will be overwritten
    //                                           with the rendered template output.
    // You can implement your own template source if you want to fetch/store templates somewhere other than in DOM elements.
    // Template sources need to have the following functions:
    //   text() 			- returns the template text from your storage location
    //   text(value)		- writes the supplied template text to your storage location
    //   data(key)			- reads values stored using data(key, value) - see below
    //   data(key, value)	- associates "value" with this template and the key "key". Is used to store information like "isRewritten".
    //
    // Optionally, template sources can also have the following functions:
    //   nodes()            - returns a DOM element containing the nodes of this template, where available
    //   nodes(value)       - writes the given DOM element to your storage location
    // If a DOM element is available for a given template source, template engines are encouraged to use it in preference over text()
    // for improved speed. However, all templateSources must supply text() even if they don't supply nodes().
    //
    // Once you've implemented a templateSource, make your template engine use it by subclassing whatever template engine you were
    // using and overriding "makeTemplateSource" to return an instance of your custom template source.
    ko.templateSources = {};
    // ---- ko.templateSources.domElement -----
    ko.templateSources.domElement = function(element) {
        this.domElement = element;
    ko.templateSources.domElement.prototype['text'] = function(/* valueToWrite */) {
        var tagNameLower = ko.utils.tagNameLower(this.domElement),
            elemContentsProperty = tagNameLower === "script" ? "text"
                                 : tagNameLower === "textarea" ? "value"
                                 : "innerHTML";
        if (arguments.length == 0) {
            return this.domElement[elemContentsProperty];
        } else {
            var valueToWrite = arguments[0];
            if (elemContentsProperty === "innerHTML")
                ko.utils.setHtml(this.domElement, valueToWrite);
            else
                this.domElement[elemContentsProperty] = valueToWrite;
        }
    };
    ko.templateSources.domElement.prototype['data'] = function(key /*, valueToWrite */) {
        if (arguments.length === 1) {
            return ko.utils.domData.get(this.domElement, "templateSourceData_" + key);
        } else {
            ko.utils.domData.set(this.domElement, "templateSourceData_" + key, arguments[1]);
        }
    };
    // ---- ko.templateSources.anonymousTemplate -----
    // Anonymous templates are normally saved/retrieved as DOM nodes through "nodes".
    // For compatibility, you can also read "text"; it will be serialized from the nodes on demand.
    // Writing to "text" is still supported, but then the template data will not be available as DOM nodes.
    var anonymousTemplatesDomDataKey = "__ko_anon_template__";
    ko.templateSources.anonymousTemplate = function(element) {
        this.domElement = element;
    ko.templateSources.anonymousTemplate.prototype = new ko.templateSources.domElement();
    ko.templateSources.anonymousTemplate.prototype['text'] = function(/* valueToWrite */) {
        if (arguments.length == 0) {
            var templateData = ko.utils.domData.get(this.domElement, anonymousTemplatesDomDataKey) || {};
            if (templateData.textData === undefined && templateData.containerData)
                templateData.textData = templateData.containerData.innerHTML;
            return templateData.textData;
        } else {
            var valueToWrite = arguments[0];
            ko.utils.domData.set(this.domElement, anonymousTemplatesDomDataKey, {textData: valueToWrite});
        }
    };
    ko.templateSources.domElement.prototype['nodes'] = function(/* valueToWrite */) {
        if (arguments.length == 0) {
            var templateData = ko.utils.domData.get(this.domElement, anonymousTemplatesDomDataKey) || {};
            return templateData.containerData;
        } else {
            var valueToWrite = arguments[0];
            ko.utils.domData.set(this.domElement, anonymousTemplatesDomDataKey, {containerData: valueToWrite});
        }
    };
    ko.exportSymbol('templateSources', ko.templateSources);
    ko.exportSymbol('templateSources.domElement', ko.templateSources.domElement);
    ko.exportSymbol('templateSources.anonymousTemplate', ko.templateSources.anonymousTemplate);
(function () {
    var _templateEngine;
    ko.setTemplateEngine = function (templateEngine) {
        if ((templateEngine != undefined) && !(templateEngine instanceof ko.templateEngine))
            throw new Error("templateEngine must inherit from ko.templateEngine");
        _templateEngine = templateEngine;
    function invokeForEachNodeOrCommentInContinuousRange(firstNode, lastNode, action) {
        var node, nextInQueue = firstNode, firstOutOfRangeNode = ko.virtualElements.nextSibling(lastNode);
        while (nextInQueue && ((node = nextInQueue) !== firstOutOfRangeNode)) {
            nextInQueue = ko.virtualElements.nextSibling(node);
            if (node.nodeType === 1 || node.nodeType === 8)
                action(node);
        }
    function activateBindingsOnContinuousNodeArray(continuousNodeArray, bindingContext) {
        // To be used on any nodes that have been rendered by a template and have been inserted into some parent element
        // Walks through continuousNodeArray (which *must* be continuous, i.e., an uninterrupted sequence of sibling nodes, because
        // the algorithm for walking them relies on this), and for each top-level item in the virtual-element sense,
        // (1) Does a regular "applyBindings" to associate bindingContext with this node and to activate any non-memoized bindings
        // (2) Unmemoizes any memos in the DOM subtree (e.g., to activate bindings that had been memoized during template rewriting)
        if (continuousNodeArray.length) {
            var firstNode = continuousNodeArray[0], lastNode = continuousNodeArray[continuousNodeArray.length - 1];
            // Need to applyBindings *before* unmemoziation, because unmemoization might introduce extra nodes (that we don't want to re-bind)
            // whereas a regular applyBindings won't introduce new memoized nodes
            invokeForEachNodeOrCommentInContinuousRange(firstNode, lastNode, function(node) {
                ko.applyBindings(bindingContext, node);
            });
            invokeForEachNodeOrCommentInContinuousRange(firstNode, lastNode, function(node) {
                ko.memoization.unmemoizeDomNodeAndDescendants(node, [bindingContext]);
            });
        }
    function getFirstNodeFromPossibleArray(nodeOrNodeArray) {
        return nodeOrNodeArray.nodeType ? nodeOrNodeArray
                                        : nodeOrNodeArray.length > 0 ? nodeOrNodeArray[0]
                                        : null;
    function executeTemplate(targetNodeOrNodeArray, renderMode, template, bindingContext, options) {
        options = options || {};
        var firstTargetNode = targetNodeOrNodeArray && getFirstNodeFromPossibleArray(targetNodeOrNodeArray);
        var templateDocument = firstTargetNode && firstTargetNode.ownerDocument;
        var templateEngineToUse = (options['templateEngine'] || _templateEngine);
        ko.templateRewriting.ensureTemplateIsRewritten(template, templateEngineToUse, templateDocument);
        var renderedNodesArray = templateEngineToUse['renderTemplate'](template, bindingContext, options, templateDocument);
        // Loosely check result is an array of DOM nodes
        if ((typeof renderedNodesArray.length != "number") || (renderedNodesArray.length > 0 && typeof renderedNodesArray[0].nodeType != "number"))
            throw new Error("Template engine must return an array of DOM nodes");
        var haveAddedNodesToParent = false;
        switch (renderMode) {
            case "replaceChildren":
                ko.virtualElements.setDomNodeChildren(targetNodeOrNodeArray, renderedNodesArray);
                haveAddedNodesToParent = true;
                break;
            case "replaceNode":
                ko.utils.replaceDomNodes(targetNodeOrNodeArray, renderedNodesArray);
                haveAddedNodesToParent = true;
                break;
            case "ignoreTargetNode": break;
            default:
                throw new Error("Unknown renderMode: " + renderMode);
        }
        if (haveAddedNodesToParent) {
            activateBindingsOnContinuousNodeArray(renderedNodesArray, bindingContext);
            if (options['afterRender'])
                options['afterRender'](renderedNodesArray, bindingContext['$data']);
        }
        return renderedNodesArray;
    ko.renderTemplate = function (template, dataOrBindingContext, options, targetNodeOrNodeArray, renderMode) {
        options = options || {};
        if ((options['templateEngine'] || _templateEngine) == undefined)
            throw new Error("Set a template engine before calling renderTemplate");
        renderMode = renderMode || "replaceChildren";
        if (targetNodeOrNodeArray) {
            var firstTargetNode = getFirstNodeFromPossibleArray(targetNodeOrNodeArray);
            var whenToDispose = function () { return (!firstTargetNode) || !ko.utils.domNodeIsAttachedToDocument(firstTargetNode); }; // Passive disposal (on next evaluation)
            var activelyDisposeWhenNodeIsRemoved = (firstTargetNode && renderMode == "replaceNode") ? firstTargetNode.parentNode : firstTargetNode;
            return ko.dependentObservable( // So the DOM is automatically updated when any dependency changes
                function () {
                    // Ensure we've got a proper binding context to work with
                    var bindingContext = (dataOrBindingContext && (dataOrBindingContext instanceof ko.bindingContext))
                        ? dataOrBindingContext
                        : new ko.bindingContext(ko.utils.unwrapObservable(dataOrBindingContext));
                    // Support selecting template as a function of the data being rendered
                    var templateName = typeof(template) == 'function' ? template(bindingContext['$data']) : template;
                    var renderedNodesArray = executeTemplate(targetNodeOrNodeArray, renderMode, templateName, bindingContext, options);
                    if (renderMode == "replaceNode") {
                        targetNodeOrNodeArray = renderedNodesArray;
                        firstTargetNode = getFirstNodeFromPossibleArray(targetNodeOrNodeArray);
                    }
                },
                null,
                { 'disposeWhen': whenToDispose, 'disposeWhenNodeIsRemoved': activelyDisposeWhenNodeIsRemoved }
            );
        } else {
            // We don't yet have a DOM node to evaluate, so use a memo and render the template later when there is a DOM node
            return ko.memoization.memoize(function (domNode) {
                ko.renderTemplate(template, dataOrBindingContext, options, domNode, "replaceNode");
            });
        }
    };
    ko.renderTemplateForEach = function (template, arrayOrObservableArray, options, targetNode, parentBindingContext) {
        // Since setDomNodeChildrenFromArrayMapping always calls executeTemplateForArrayItem and then
        // activateBindingsCallback for added items, we can store the binding context in the former to use in the latter.
        var arrayItemContext;
        // This will be called by setDomNodeChildrenFromArrayMapping to get the nodes to add to targetNode
        var executeTemplateForArrayItem = function (arrayValue, index) {
            // Support selecting template as a function of the data being rendered
            var templateName = typeof(template) == 'function' ? template(arrayValue) : template;
            arrayItemContext = parentBindingContext['createChildContext'](ko.utils.unwrapObservable(arrayValue));
            arrayItemContext['$index'] = index;
            return executeTemplate(null, "ignoreTargetNode", templateName, arrayItemContext, options);
        }
        // This will be called whenever setDomNodeChildrenFromArrayMapping has added nodes to targetNode
        var activateBindingsCallback = function(arrayValue, addedNodesArray, index) {
            activateBindingsOnContinuousNodeArray(addedNodesArray, arrayItemContext);
            if (options['afterRender'])
                options['afterRender'](addedNodesArray, arrayValue);
        };
        return ko.dependentObservable(function () {
            var unwrappedArray = ko.utils.unwrapObservable(arrayOrObservableArray) || [];
            if (typeof unwrappedArray.length == "undefined") // Coerce single value into array
                unwrappedArray = [unwrappedArray];
            // Filter out any entries marked as destroyed
            var filteredArray = ko.utils.arrayFilter(unwrappedArray, function(item) {
                return options['includeDestroyed'] || item === undefined || item === null || !ko.utils.unwrapObservable(item['_destroy']);
            });
            ko.utils.setDomNodeChildrenFromArrayMapping(targetNode, filteredArray, executeTemplateForArrayItem, options, activateBindingsCallback);
        }, null, { 'disposeWhenNodeIsRemoved': targetNode });
    };
    var templateSubscriptionDomDataKey = '__ko__templateSubscriptionDomDataKey__';
    function disposeOldSubscriptionAndStoreNewOne(element, newSubscription) {
        var oldSubscription = ko.utils.domData.get(element, templateSubscriptionDomDataKey);
        if (oldSubscription && (typeof(oldSubscription.dispose) == 'function'))
            oldSubscription.dispose();
        ko.utils.domData.set(element, templateSubscriptionDomDataKey, newSubscription);
    ko.bindingHandlers['template'] = {
        'init': function(element, valueAccessor) {
            // Support anonymous templates
            var bindingValue = ko.utils.unwrapObservable(valueAccessor());
            if ((typeof bindingValue != "string") && (!bindingValue['name']) && (element.nodeType == 1 || element.nodeType == 8)) {
                // It's an anonymous template - store the element contents, then clear the element
                var templateNodes = element.nodeType == 1 ? element.childNodes : ko.virtualElements.childNodes(element),
                    container = ko.utils.moveCleanedNodesToContainerElement(templateNodes); // This also removes the nodes from their current parent
                new ko.templateSources.anonymousTemplate(element)['nodes'](container);
            }
            return { 'controlsDescendantBindings': true };
        },
        'update': function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
            var bindingValue = ko.utils.unwrapObservable(valueAccessor());
            var templateName;
            var shouldDisplay = true;
            if (typeof bindingValue == "string") {
                templateName = bindingValue;
            } else {
                templateName = bindingValue['name'];
                // Support "if"/"ifnot" conditions
                if ('if' in bindingValue)
                    shouldDisplay = shouldDisplay && ko.utils.unwrapObservable(bindingValue['if']);
                if ('ifnot' in bindingValue)
                    shouldDisplay = shouldDisplay && !ko.utils.unwrapObservable(bindingValue['ifnot']);
            }
            var templateSubscription = null;
            if ((typeof bindingValue === 'object') && ('foreach' in bindingValue)) { // Note: can't use 'in' operator on strings
                // Render once for each data point (treating data set as empty if shouldDisplay==false)
                var dataArray = (shouldDisplay && bindingValue['foreach']) || [];
                templateSubscription = ko.renderTemplateForEach(templateName || element, dataArray, /* options: */ bindingValue, element, bindingContext);
            } else {
                if (shouldDisplay) {
                    // Render once for this single data point (or use the viewModel if no data was provided)
                    var innerBindingContext = (typeof bindingValue == 'object') && ('data' in bindingValue)
                        ? bindingContext['createChildContext'](ko.utils.unwrapObservable(bindingValue['data'])) // Given an explitit 'data' value, we create a child binding context for it
                        : bindingContext;                                                                       // Given no explicit 'data' value, we retain the same binding context
                    templateSubscription = ko.renderTemplate(templateName || element, innerBindingContext, /* options: */ bindingValue, element);
                } else
                    ko.virtualElements.emptyNode(element);
            }
            // It only makes sense to have a single template subscription per element (otherwise which one should have its output displayed?)
            disposeOldSubscriptionAndStoreNewOne(element, templateSubscription);
        }
    };
    // Anonymous templates can't be rewritten. Give a nice error message if you try to do it.
    ko.jsonExpressionRewriting.bindingRewriteValidators['template'] = function(bindingValue) {
        var parsedBindingValue = ko.jsonExpressionRewriting.parseObjectLiteral(bindingValue);
        if ((parsedBindingValue.length == 1) && parsedBindingValue[0]['unknown'])
            return null; // It looks like a string literal, not an object literal, so treat it as a named template (which is allowed for rewriting)
        if (ko.jsonExpressionRewriting.keyValueArrayContainsKey(parsedBindingValue, "name"))
            return null; // Named templates can be rewritten, so return "no error"
        return "This template engine does not support anonymous templates nested within its templates";
    };
    ko.virtualElements.allowedBindings['template'] = true;
ko.exportSymbol('setTemplateEngine', ko.setTemplateEngine);
ko.exportSymbol('renderTemplate', ko.renderTemplate);
(function () {
    // Simple calculation based on Levenshtein distance.
    function calculateEditDistanceMatrix(oldArray, newArray, maxAllowedDistance) {
        var distances = [];
        for (var i = 0; i <= newArray.length; i++)
            distances[i] = [];
        // Top row - transform old array into empty array via deletions
        for (var i = 0, j = Math.min(oldArray.length, maxAllowedDistance); i <= j; i++)
            distances[0][i] = i;
        // Left row - transform empty array into new array via additions
        for (var i = 1, j = Math.min(newArray.length, maxAllowedDistance); i <= j; i++) {
            distances[i][0] = i;
        }
        // Fill out the body of the array
        var oldIndex, oldIndexMax = oldArray.length, newIndex, newIndexMax = newArray.length;
        var distanceViaAddition, distanceViaDeletion;
        for (oldIndex = 1; oldIndex <= oldIndexMax; oldIndex++) {
            var newIndexMinForRow = Math.max(1, oldIndex - maxAllowedDistance);
            var newIndexMaxForRow = Math.min(newIndexMax, oldIndex + maxAllowedDistance);
            for (newIndex = newIndexMinForRow; newIndex <= newIndexMaxForRow; newIndex++) {
                if (oldArray[oldIndex - 1] === newArray[newIndex - 1])
                    distances[newIndex][oldIndex] = distances[newIndex - 1][oldIndex - 1];
                else {
                    var northDistance = distances[newIndex - 1][oldIndex] === undefined ? Number.MAX_VALUE : distances[newIndex - 1][oldIndex] + 1;
                    var westDistance = distances[newIndex][oldIndex - 1] === undefined ? Number.MAX_VALUE : distances[newIndex][oldIndex - 1] + 1;
                    distances[newIndex][oldIndex] = Math.min(northDistance, westDistance);
                }
            }
        }
        return distances;
    function findEditScriptFromEditDistanceMatrix(editDistanceMatrix, oldArray, newArray) {
        var oldIndex = oldArray.length;
        var newIndex = newArray.length;
        var editScript = [];
        var maxDistance = editDistanceMatrix[newIndex][oldIndex];
        if (maxDistance === undefined)
            return null; // maxAllowedDistance must be too small
        while ((oldIndex > 0) || (newIndex > 0)) {
            var me = editDistanceMatrix[newIndex][oldIndex];
            var distanceViaAdd = (newIndex > 0) ? editDistanceMatrix[newIndex - 1][oldIndex] : maxDistance + 1;
            var distanceViaDelete = (oldIndex > 0) ? editDistanceMatrix[newIndex][oldIndex - 1] : maxDistance + 1;
            var distanceViaRetain = (newIndex > 0) && (oldIndex > 0) ? editDistanceMatrix[newIndex - 1][oldIndex - 1] : maxDistance + 1;
            if ((distanceViaAdd === undefined) || (distanceViaAdd < me - 1)) distanceViaAdd = maxDistance + 1;
            if ((distanceViaDelete === undefined) || (distanceViaDelete < me - 1)) distanceViaDelete = maxDistance + 1;
            if (distanceViaRetain < me - 1) distanceViaRetain = maxDistance + 1;
            if ((distanceViaAdd <= distanceViaDelete) && (distanceViaAdd < distanceViaRetain)) {
                editScript.push({ status: "added", value: newArray[newIndex - 1] });
                newIndex--;
            } else if ((distanceViaDelete < distanceViaAdd) && (distanceViaDelete < distanceViaRetain)) {
                editScript.push({ status: "deleted", value: oldArray[oldIndex - 1] });
                oldIndex--;
            } else {
                editScript.push({ status: "retained", value: oldArray[oldIndex - 1] });
                newIndex--;
                oldIndex--;
            }
        }
        return editScript.reverse();
    ko.utils.compareArrays = function (oldArray, newArray, maxEditsToConsider) {
        if (maxEditsToConsider === undefined) {
            return ko.utils.compareArrays(oldArray, newArray, 1)                 // First consider likely case where there is at most one edit (very fast)
                || ko.utils.compareArrays(oldArray, newArray, 10)                // If that fails, account for a fair number of changes while still being fast
                || ko.utils.compareArrays(oldArray, newArray, Number.MAX_VALUE); // Ultimately give the right answer, even though it may take a long time
        } else {
            oldArray = oldArray || [];
            newArray = newArray || [];
            var editDistanceMatrix = calculateEditDistanceMatrix(oldArray, newArray, maxEditsToConsider);
            return findEditScriptFromEditDistanceMatrix(editDistanceMatrix, oldArray, newArray);
        }
    };
ko.exportSymbol('utils.compareArrays', ko.utils.compareArrays);
(function () {
    // Objective:
    // * Given an input array, a container DOM node, and a function from array elements to arrays of DOM nodes,
    //   map the array elements to arrays of DOM nodes, concatenate together all these arrays, and use them to populate the container DOM node
    // * Next time we're given the same combination of things (with the array possibly having mutated), update the container DOM node
    //   so that its children is again the concatenation of the mappings of the array elements, but don't re-map any array elements that we
    //   previously mapped - retain those nodes, and just insert/delete other ones
    // "callbackAfterAddingNodes" will be invoked after any "mapping"-generated nodes are inserted into the container node
    // You can use this, for example, to activate bindings on those nodes.
    function fixUpVirtualElements(contiguousNodeArray) {
        // Ensures that contiguousNodeArray really *is* an array of contiguous siblings, even if some of the interior
        // ones have changed since your array was first built (e.g., because your array contains virtual elements, and
        // their virtual children changed when binding was applied to them).
        // This is needed so that we can reliably remove or update the nodes corresponding to a given array item
        if (contiguousNodeArray.length > 2) {
            // Build up the actual new contiguous node set
            var current = contiguousNodeArray[0], last = contiguousNodeArray[contiguousNodeArray.length - 1], newContiguousSet = [current];
            while (current !== last) {
                current = current.nextSibling;
                if (!current) // Won't happen, except if the developer has manually removed some DOM elements (then we're in an undefined scenario)
                    return;
                newContiguousSet.push(current);
            }
            // ... then mutate the input array to match this.
            // (The following line replaces the contents of contiguousNodeArray with newContiguousSet)
            Array.prototype.splice.apply(contiguousNodeArray, [0, contiguousNodeArray.length].concat(newContiguousSet));
        }
    function mapNodeAndRefreshWhenChanged(containerNode, mapping, valueToMap, callbackAfterAddingNodes, index) {
        // Map this array value inside a dependentObservable so we re-map when any dependency changes
        var mappedNodes = [];
        var dependentObservable = ko.dependentObservable(function() {
            var newMappedNodes = mapping(valueToMap, index) || [];
            // On subsequent evaluations, just replace the previously-inserted DOM nodes
            if (mappedNodes.length > 0) {
                fixUpVirtualElements(mappedNodes);
                ko.utils.replaceDomNodes(mappedNodes, newMappedNodes);
                if (callbackAfterAddingNodes)
                    callbackAfterAddingNodes(valueToMap, newMappedNodes);
            }
            // Replace the contents of the mappedNodes array, thereby updating the record
            // of which nodes would be deleted if valueToMap was itself later removed
            mappedNodes.splice(0, mappedNodes.length);
            ko.utils.arrayPushAll(mappedNodes, newMappedNodes);
        }, null, { 'disposeWhenNodeIsRemoved': containerNode, 'disposeWhen': function() { return (mappedNodes.length == 0) || !ko.utils.domNodeIsAttachedToDocument(mappedNodes[0]) } });
        return { mappedNodes : mappedNodes, dependentObservable : dependentObservable };
    var lastMappingResultDomDataKey = "setDomNodeChildrenFromArrayMapping_lastMappingResult";
    ko.utils.setDomNodeChildrenFromArrayMapping = function (domNode, array, mapping, options, callbackAfterAddingNodes) {
        // Compare the provided array against the previous one
        array = array || [];
        options = options || {};
        var isFirstExecution = ko.utils.domData.get(domNode, lastMappingResultDomDataKey) === undefined;
        var lastMappingResult = ko.utils.domData.get(domNode, lastMappingResultDomDataKey) || [];
        var lastArray = ko.utils.arrayMap(lastMappingResult, function (x) { return x.arrayEntry; });
        var editScript = ko.utils.compareArrays(lastArray, array);
        // Build the new mapping result
        var newMappingResult = [];
        var lastMappingResultIndex = 0;
        var nodesToDelete = [];
        var newMappingResultIndex = 0;
        var nodesAdded = [];
        var insertAfterNode = null;
        for (var i = 0, j = editScript.length; i < j; i++) {
            switch (editScript[i].status) {
                case "retained":
                    // Just keep the information - don't touch the nodes
                    var dataToRetain = lastMappingResult[lastMappingResultIndex];
                    dataToRetain.indexObservable(newMappingResultIndex);
                    newMappingResultIndex = newMappingResult.push(dataToRetain);
                    if (dataToRetain.domNodes.length > 0)
                        insertAfterNode = dataToRetain.domNodes[dataToRetain.domNodes.length - 1];
                    lastMappingResultIndex++;
                    break;
                case "deleted":
                    // Stop tracking changes to the mapping for these nodes
                    lastMappingResult[lastMappingResultIndex].dependentObservable.dispose();
                    // Queue these nodes for later removal
                    fixUpVirtualElements(lastMappingResult[lastMappingResultIndex].domNodes);
                    ko.utils.arrayForEach(lastMappingResult[lastMappingResultIndex].domNodes, function (node) {
                        nodesToDelete.push({
                          element: node,
                          index: i,
                          value: editScript[i].value
                        });
                        insertAfterNode = node;
                    });
                    lastMappingResultIndex++;
                    break;
                case "added":
                    var valueToMap = editScript[i].value;
                    var indexObservable = ko.observable(newMappingResultIndex);
                    var mapData = mapNodeAndRefreshWhenChanged(domNode, mapping, valueToMap, callbackAfterAddingNodes, indexObservable);
                    var mappedNodes = mapData.mappedNodes;
                    // On the first evaluation, insert the nodes at the current insertion point
                    newMappingResultIndex = newMappingResult.push({
                        arrayEntry: editScript[i].value,
                        domNodes: mappedNodes,
                        dependentObservable: mapData.dependentObservable,
                        indexObservable: indexObservable
                    });
                    for (var nodeIndex = 0, nodeIndexMax = mappedNodes.length; nodeIndex < nodeIndexMax; nodeIndex++) {
                        var node = mappedNodes[nodeIndex];
                        nodesAdded.push({
                          element: node,
                          index: i,
                          value: editScript[i].value
                        });
                        if (insertAfterNode == null) {
                            // Insert "node" (the newly-created node) as domNode's first child
                            ko.virtualElements.prepend(domNode, node);
                        } else {
                            // Insert "node" into "domNode" immediately after "insertAfterNode"
                            ko.virtualElements.insertAfter
(domNode, node, insertAfterNode);
                        }
                        insertAfterNode = node;
                    }
                    if (callbackAfterAddingNodes)
                        callbackAfterAddingNodes(valueToMap, mappedNodes, indexObservable);
                    break;
            }
        }
        ko.utils.arrayForEach(nodesToDelete, function (node) { ko.cleanNode(node.element) });
        var invokedBeforeRemoveCallback = false;
        if (!isFirstExecution) {
            if (options['afterAdd']) {
                for (var i = 0; i < nodesAdded.length; i++)
                    options['afterAdd'](nodesAdded[i].element, nodesAdded[i].index, nodesAdded[i].value);
            }
            if (options['beforeRemove']) {
                for (var i = 0; i < nodesToDelete.length; i++)
                    options['beforeRemove'](nodesToDelete[i].element, nodesToDelete[i].index, nodesToDelete[i].value);
                invokedBeforeRemoveCallback = true;
            }
        }
        if (!invokedBeforeRemoveCallback && nodesToDelete.length) {
            for (var i = 0; i < nodesToDelete.length; i++) {
                var element = nodesToDelete[i].element;
                if (element.parentNode)
                    element.parentNode.removeChild(element);
            }
        }
        // Store a copy of the array items we just considered so we can difference it next time
        ko.utils.domData.set(domNode, lastMappingResultDomDataKey, newMappingResult);
ko.exportSymbol('utils.setDomNodeChildrenFromArrayMapping', ko.utils.setDomNodeChildrenFromArrayMapping);
ko.nativeTemplateEngine = function () {
    this['allowTemplateRewriting'] = false;
ko.nativeTemplateEngine.prototype = new ko.templateEngine();
ko.nativeTemplateEngine.prototype['renderTemplateSource'] = function (templateSource, bindingContext, options) {
    var useNodesIfAvailable = !(ko.utils.ieVersion < 9), // IE<9 cloneNode doesn't work properly
        templateNodesFunc = useNodesIfAvailable ? templateSource['nodes'] : null,
        templateNodes = templateNodesFunc ? templateSource['nodes']() : null;
    if (templateNodes) {
        return ko.utils.makeArray(templateNodes.cloneNode(true).childNodes);
    } else {
        var templateText = templateSource['text']();
        return ko.utils.parseHtmlFragment(templateText);
ko.nativeTemplateEngine.instance = new ko.nativeTemplateEngine();
ko.setTemplateEngine(ko.nativeTemplateEngine.instance);
ko.exportSymbol('nativeTemplateEngine', ko.nativeTemplateEngine);
(function() {
    ko.jqueryTmplTemplateEngine = function () {
        // Detect which version of jquery-tmpl you're using. Unfortunately jquery-tmpl
        // doesn't expose a version number, so we have to infer it.
        // Note that as of Knockout 1.3, we only support jQuery.tmpl 1.0.0pre and later,
        // which KO internally refers to as version "2", so older versions are no longer detected.
        var jQueryTmplVersion = this.jQueryTmplVersion = (function() {
            if ((typeof(jQuery) == "undefined") || !(jQuery['tmpl']))
                return 0;
            // Since it exposes no official version number, we use our own numbering system. To be updated as jquery-tmpl evolves.
            try {
                if (jQuery['tmpl']['tag']['tmpl']['open'].toString().indexOf('__') >= 0) {
                    // Since 1.0.0pre, custom tags should append markup to an array called "__"
                    return 2; // Final version of jquery.tmpl
                }
            } catch(ex) { /* Apparently not the version we were looking for */ }
            return 1; // Any older version that we don't support
        })();
        function ensureHasReferencedJQueryTemplates() {
            if (jQueryTmplVersion < 2)
                throw new Error("Your version of jQuery.tmpl is too old. Please upgrade to jQuery.tmpl 1.0.0pre or later.");
        }
        function executeTemplate(compiledTemplate, data, jQueryTemplateOptions) {
            return jQuery['tmpl'](compiledTemplate, data, jQueryTemplateOptions);
        }
        this['renderTemplateSource'] = function(templateSource, bindingContext, options) {
            options = options || {};
            ensureHasReferencedJQueryTemplates();
            // Ensure we have stored a precompiled version of this template (don't want to reparse on every render)
            var precompiled = templateSource['data']('precompiled');
            if (!precompiled) {
                var templateText = templateSource['text']() || "";
                // Wrap in "with($whatever.koBindingContext) { ... }"
                templateText = "{{ko_with $item.koBindingContext}}" + templateText + "{{/ko_with}}";
                precompiled = jQuery['template'](null, templateText);
                templateSource['data']('precompiled', precompiled);
            }
            var data = [bindingContext['$data']]; // Prewrap the data in an array to stop jquery.tmpl from trying to unwrap any arrays
            var jQueryTemplateOptions = jQuery['extend']({ 'koBindingContext': bindingContext }, options['templateOptions']);
            var resultNodes = executeTemplate(precompiled, data, jQueryTemplateOptions);
            resultNodes['appendTo'](document.createElement("div")); // Using "appendTo" forces jQuery/jQuery.tmpl to perform necessary cleanup work
            jQuery['fragments'] = {}; // Clear jQuery's fragment cache to avoid a memory leak after a large number of template renders
            return resultNodes;
        };
        this['createJavaScriptEvaluatorBlock'] = function(script) {
            return "{{ko_code ((function() { return " + script + " })()) }}";
        };
        this['addTemplate'] = function(templateName, templateMarkup) {
            document.write("<script type='text/html' id='" + templateName + "'>" + templateMarkup + "</script>");
        };
        if (jQueryTmplVersion > 0) {
            jQuery['tmpl']['tag']['ko_code'] = {
                open: "__.push($1 || '');"
            };
            jQuery['tmpl']['tag']['ko_with'] = {
                open: "with($1) {",
                close: "} "
            };
        }
    };
    ko.jqueryTmplTemplateEngine.prototype = new ko.templateEngine();
    // Use this one by default *only if jquery.tmpl is referenced*
    var jqueryTmplTemplateEngineInstance = new ko.jqueryTmplTemplateEngine();
    if (jqueryTmplTemplateEngineInstance.jQueryTmplVersion > 0)
        ko.setTemplateEngine(jqueryTmplTemplateEngineInstance);
    ko.exportSymbol('jqueryTmplTemplateEngine', ko.jqueryTmplTemplateEngine);
})(window,document,navigator);
 * jQuery JavaScript Library v1.4.2
 * http://jquery.com/
 * Copyright 2010, John Resig
 * Dual licensed under the MIT or GPL Version 2 licenses.
 * http://jquery.org/license
 * Includes Sizzle.js
 * http://sizzlejs.com/
 * Copyright 2010, The Dojo Foundation
 * Released under the MIT, BSD, and GPL Licenses.
 * Date: Sat Feb 13 22:33:48 2010 -0500
(function( window, undefined ) {
// Define a local copy of jQuery
var jQuery = function( selector, context ) {
		// The jQuery object is actually just the init constructor 'enhanced'
		return new jQuery.fn.init( selector, context );
	// Map over jQuery in case of overwrite
	_jQuery = window.jQuery,
	// Map over the $ in case of overwrite
	_$ = window.$,
	// Use the correct document accordingly with window argument (sandbox)
	document = window.document,
	// A central reference to the root jQuery(document)
	rootjQuery,
	// A simple way to check for HTML strings or ID strings
	// (both of which we optimize for)
	quickExpr = /^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,
	// Is it a simple selector
	isSimple = /^.[^:#\[\.,]*$/,
	// Check if a string has a non-whitespace character in it
	rnotwhite = /\S/,
	// Used for trimming whitespace
	rtrim = /^(\s|\u00A0)+|(\s|\u00A0)+$/g,
	// Match a standalone tag
	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
	// Keep a UserAgent string for use with jQuery.browser
	userAgent = navigator.userAgent,
	// For matching the engine and version of the browser
	browserMatch,
	// Has the ready events already been bound?
	readyBound = false,
	// The functions to execute on DOM ready
	readyList = [],
	// The ready event handler
	DOMContentLoaded,
	// Save a reference to some core methods
	toString = Object.prototype.toString,
	hasOwnProperty = Object.prototype.hasOwnProperty,
	push = Array.prototype.push,
	slice = Array.prototype.slice,
	indexOf = Array.prototype.indexOf;
jQuery.fn = jQuery.prototype = {
	init: function( selector, context ) {
		var match, elem, ret, doc;
		// Handle $(""), $(null), or $(undefined)
		if ( !selector ) {
			return this;
		// Handle $(DOMElement)
		if ( selector.nodeType ) {
			this.context = this[0] = selector;
			this.length = 1;
			return this;
		// The body element only exists once, optimize finding it
		if ( selector === "body" && !context ) {
			this.context = document;
			this[0] = document.body;
			this.selector = "body";
			this.length = 1;
			return this;
		// Handle HTML strings
		if ( typeof selector === "string" ) {
			// Are we dealing with HTML string or an ID?
			match = quickExpr.exec( selector );
			// Verify a match, and that no context was specified for #id
			if ( match && (match[1] || !context) ) {
				// HANDLE: $(html) -> $(array)
				if ( match[1] ) {
					doc = (context ? context.ownerDocument || context : document);
					// If a single string is passed in and it's a single tag
					// just do a createElement and skip the rest
					ret = rsingleTag.exec( selector );
					if ( ret ) {
						if ( jQuery.isPlainObject( context ) ) {
							selector = [ document.createElement( ret[1] ) ];
							jQuery.fn.attr.call( selector, context, true );
						} else {
							selector = [ doc.createElement( ret[1] ) ];
						}
					} else {
						ret = buildFragment( [ match[1] ], [ doc ] );
						selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes;
					}
					return jQuery.merge( this, selector );
				// HANDLE: $("#id")
				} else {
					elem = document.getElementById( match[2] );
					if ( elem ) {
						// Handle the case where IE and Opera return items
						// by name instead of ID
						if ( elem.id !== match[2] ) {
							return rootjQuery.find( selector );
						}
						// Otherwise, we inject the element directly into the jQuery object
						this.length = 1;
						this[0] = elem;
					}
					this.context = document;
					this.selector = selector;
					return this;
			// HANDLE: $("TAG")
			} else if ( !context && /^\w+$/.test( selector ) ) {
				this.selector = selector;
				this.context = document;
				selector = document.getElementsByTagName( selector );
				return jQuery.merge( this, selector );
			// HANDLE: $(expr, $(...))
			} else if ( !context || context.jquery ) {
				return (context || rootjQuery).find( selector );
			// HANDLE: $(expr, context)
			// (which is just equivalent to: $(context).find(expr)
			} else {
				return jQuery( context ).find( selector );
		// HANDLE: $(function)
		// Shortcut for document ready
		} else if ( jQuery.isFunction( selector ) ) {
			return rootjQuery.ready( selector );
		if (selector.selector !== undefined) {
			this.selector = selector.selector;
			this.context = selector.context;
		return jQuery.makeArray( selector, this );
	// Start with an empty selector
	selector: "",
	// The current version of jQuery being used
	jquery: "1.4.2",
	// The default length of a jQuery object is 0
	length: 0,
	// The number of elements contained in the matched element set
	size: function() {
		return this.length;
	toArray: function() {
		return slice.call( this, 0 );
	// Get the Nth element in the matched element set OR
	// Get the whole matched element set as a clean array
	get: function( num ) {
		return num == null ?
			// Return a 'clean' array
			this.toArray() :
			// Return just the object
			( num < 0 ? this.slice(num)[ 0 ] : this[ num ] );
	// Take an array of elements and push it onto the stack
	// (returning the new matched element set)
	pushStack: function( elems, name, selector ) {
		// Build a new jQuery matched element set
		var ret = jQuery();
		if ( jQuery.isArray( elems ) ) {
			push.apply( ret, elems );
		} else {
			jQuery.merge( ret, elems );
		// Add the old object onto the stack (as a reference)
		ret.prevObject = this;
		ret.context = this.context;
		if ( name === "find" ) {
			ret.selector = this.selector + (this.selector ? " " : "") + selector;
		} else if ( name ) {
			ret.selector = this.selector + "." + name + "(" + selector + ")";
		// Return the newly-formed element set
		return ret;
	// Execute a callback for every element in the matched set.
	// (You can seed the arguments with an array of args, but this is
	// only used internally.)
	each: function( callback, args ) {
		return jQuery.each( this, callback, args );
	ready: function( fn ) {
		// Attach the listeners
		jQuery.bindReady();
		// If the DOM is already ready
		if ( jQuery.isReady ) {
			// Execute the function immediately
			fn.call( document, jQuery );
		// Otherwise, remember the function for later
		} else if ( readyList ) {
			// Add the function to the wait list
			readyList.push( fn );
		return this;
	eq: function( i ) {
		return i === -1 ?
			this.slice( i ) :
			this.slice( i, +i + 1 );
	first: function() {
		return this.eq( 0 );
	last: function() {
		return this.eq( -1 );
	slice: function() {
		return this.pushStack( slice.apply( this, arguments ),
			"slice", slice.call(arguments).join(",") );
	map: function( callback ) {
		return this.pushStack( jQuery.map(this, function( elem, i ) {
			return callback.call( elem, i, elem );
		}));
	end: function() {
		return this.prevObject || jQuery(null);
	// For internal use only.
	// Behaves like an Array's method, not like a jQuery method.
	push: push,
	sort: [].sort,
	splice: [].splice
// Give the init function the jQuery prototype for later instantiation
jQuery.fn.init.prototype = jQuery.fn;
jQuery.extend = jQuery.fn.extend = function() {
	// copy reference to target object
	var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy;
	// Handle a deep copy situation
	if ( typeof target === "boolean" ) {
		deep = target;
		target = arguments[1] || {};
		// skip the boolean and the target
		i = 2;
	// Handle case when target is a string or something (possible in deep copy)
	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
		target = {};
	// extend jQuery itself if only one argument is passed
	if ( length === i ) {
		target = this;
		--i;
	for ( ; i < length; i++ ) {
		// Only deal with non-null/undefined values
		if ( (options = arguments[ i ]) != null ) {
			// Extend the base object
			for ( name in options ) {
				src = target[ name ];
				copy = options[ name ];
				// Prevent never-ending loop
				if ( target === copy ) {
					continue;
				// Recurse if we're merging object literal values or arrays
				if ( deep && copy && ( jQuery.isPlainObject(copy) || jQuery.isArray(copy) ) ) {
					var clone = src && ( jQuery.isPlainObject(src) || jQuery.isArray(src) ) ? src
						: jQuery.isArray(copy) ? [] : {};
					// Never move original objects, clone them
					target[ name ] = jQuery.extend( deep, clone, copy );
				// Don't bring in undefined values
				} else if ( copy !== undefined ) {
					target[ name ] = copy;
	// Return the modified object
	return target;
jQuery.extend({
	noConflict: function( deep ) {
		window.$ = _$;
		if ( deep ) {
			window.jQuery = _jQuery;
		return jQuery;
	// Is the DOM ready to be used? Set to true once it occurs.
	isReady: false,
	// Handle when the DOM is ready
	ready: function() {
		// Make sure that the DOM is not already loaded
		if ( !jQuery.isReady ) {
			// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
			if ( !document.body ) {
				return setTimeout( jQuery.ready, 13 );
			// Remember that the DOM is ready
			jQuery.isReady = true;
			// If there are functions bound, to execute
			if ( readyList ) {
				// Execute all of them
				var fn, i = 0;
				while ( (fn = readyList[ i++ ]) ) {
					fn.call( document, jQuery );
				// Reset the list of functions
				readyList = null;
			// Trigger any bound ready events
			if ( jQuery.fn.triggerHandler ) {
				jQuery( document ).triggerHandler( "ready" );
	bindReady: function() {
		if ( readyBound ) {
			return;
		readyBound = true;
		// Catch cases where $(document).ready() is called after the
		// browser event has already occurred.
		if ( document.readyState === "complete" ) {
			return jQuery.ready();
		// Mozilla, Opera and webkit nightlies currently support this event
		if ( document.addEventListener ) {
			// Use the handy event callback
			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
			// A fallback to window.onload, that will always work
			window.addEventListener( "load", jQuery.ready, false );
		// If IE event model is used
		} else if ( document.attachEvent ) {
			// ensure firing before onload,
			// maybe late but safe also for iframes
			document.attachEvent("onreadystatechange", DOMContentLoaded);
			// A fallback to window.onload, that will always work
			window.attachEvent( "onload", jQuery.ready );
			// If IE and not a frame
			// continually check to see if the document is ready
			var toplevel = false;
			try {
				toplevel = window.frameElement == null;
			} catch(e) {}
			if ( document.documentElement.doScroll && toplevel ) {
				doScrollCheck();
	// See test/unit/core.js for details concerning isFunction.
	// Since version 1.3, DOM methods and functions like alert
	// aren't supported. They return false on IE (#2968).
	isFunction: function( obj ) {
		return toString.call(obj) === "[object Function]";
	isArray: function( obj ) {
		return toString.call(obj) === "[object Array]";
	isPlainObject: function( obj ) {
		// Must be an Object.
		// Because of IE, we also have to check the presence of the constructor property.
		// Make sure that DOM nodes and window objects don't pass through, as well
		if ( !obj || toString.call(obj) !== "[object Object]" || obj.nodeType || obj.setInterval ) {
			return false;
		// Not own constructor property must be Object
		if ( obj.constructor
			&& !hasOwnProperty.call(obj, "constructor")
			&& !hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf") ) {
			return false;
		// Own properties are enumerated firstly, so to speed up,
		// if last one is own, then all properties are own.
		var key;
		for ( key in obj ) {}
		return key === undefined || hasOwnProperty.call( obj, key );
	isEmptyObject: function( obj ) {
		for ( var name in obj ) {
			return false;
		return true;
	error: function( msg ) {
		throw msg;
	parseJSON: function( data ) {
		if ( typeof data !== "string" || !data ) {
			return null;
		// Make sure leading/trailing whitespace is removed (IE can't handle it)
		data = jQuery.trim( data );
		// Make sure the incoming data is actual JSON
		// Logic borrowed from http://json.org/json2.js
		if ( /^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
			.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]")
			.replace(/(?:^|:|,)(?:\s*\[)+/g, "")) ) {
			// Try to use the native JSON parser first
			return window.JSON && window.JSON.parse ?
				window.JSON.parse( data ) :
				(new Function("return " + data))();
		} else {
			jQuery.error( "Invalid JSON: " + data );
	noop: function() {},
	// Evalulates a script in a global context
	globalEval: function( data ) {
		if ( data && rnotwhite.test(data) ) {
			// Inspired by code by Andrea Giammarchi
			// http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
			var head = document.getElementsByTagName("head")[0] || document.documentElement,
				script = document.createElement("script");
			script.type = "text/javascript";
			if ( jQuery.support.scriptEval ) {
				script.appendChild( document.createTextNode( data ) );
			} else {
				script.text = data;
			// Use insertBefore instead of appendChild to circumvent an IE6 bug.
			// This arises when a base node is used (#2709).
			head.insertBefore( script, head.firstChild );
			head.removeChild( script );
	nodeName: function( elem, name ) {
		return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
	// args is for internal usage only
	each: function( object, callback, args ) {
		var name, i = 0,
			length = object.length,
			isObj = length === undefined || jQuery.isFunction(object);
		if ( args ) {
			if ( isObj ) {
				for ( name in object ) {
					if ( callback.apply( object[ name ], args ) === false ) {
						break;
					}
			} else {
				for ( ; i < length; ) {
					if ( callback.apply( object[ i++ ], args ) === false ) {
						break;
					}
		// A special, fast, case for the most common use of each
		} else {
			if ( isObj ) {
				for ( name in object ) {
					if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
						break;
					}
			} else {
				for ( var value = object[0];
					i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {}
		return object;
	trim: function( text ) {
		return (text || "").replace( rtrim, "" );
	// results is for internal usage only
	makeArray: function( array, results ) {
		var ret = results || [];
		if ( array != null ) {
			// The window, strings (and functions) also have 'length'
			// The extra typeof function check is to prevent crashes
			// in Safari 2 (See: #3039)
			if ( array.length == null || typeof array === "string" || jQuery.isFunction(array) || (typeof array !== "function" && array.setInterval) ) {
				push.call( ret, array );
			} else {
				jQuery.merge( ret, array );
		return ret;
	inArray: function( elem, array ) {
		if ( array.indexOf ) {
			return array.indexOf( elem );
		for ( var i = 0, length = array.length; i < length; i++ ) {
			if ( array[ i ] === elem ) {
				return i;
		return -1;
	merge: function( first, second ) {
		var i = first.length, j = 0;
		if ( typeof second.length === "number" ) {
			for ( var l = second.length; j < l; j++ ) {
				first[ i++ ] = second[ j ];
		} else {
			while ( second[j] !== undefined ) {
				first[ i++ ] = second[ j++ ];
		first.length = i;
		return first;
	grep: function( elems, callback, inv ) {
		var ret = [];
		// Go through the array, only saving the items
		// that pass the validator function
		for ( var i = 0, length = elems.length; i < length; i++ ) {
			if ( !inv !== !callback( elems[ i ], i ) ) {
				ret.push( elems[ i ] );
		return ret;
	// arg is for internal usage only
	map: function( elems, callback, arg ) {
		var ret = [], value;
		// Go through the array, translating each of the items to their
		// new value (or values).
		for ( var i = 0, length = elems.length; i < length; i++ ) {
			value = callback( elems[ i ], i, arg );
			if ( value != null ) {
				ret[ ret.length ] = value;
		return ret.concat.apply( [], ret );
	// A global GUID counter for objects
	guid: 1,
	proxy: function( fn, proxy, thisObject ) {
		if ( arguments.length === 2 ) {
			if ( typeof proxy === "string" ) {
				thisObject = fn;
				fn = thisObject[ proxy ];
				proxy = undefined;
			} else if ( proxy && !jQuery.isFunction( proxy ) ) {
				thisObject = proxy;
				proxy = undefined;
		if ( !proxy && fn ) {
			proxy = function() {
				return fn.apply( thisObject || this, arguments );
		// Set the guid of unique handler to the same of original handler, so it can be removed
		if ( fn ) {
			proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
		// So proxy can be declared as an argument
		return proxy;
	// Use of jQuery.browser is frowned upon.
	// More details: http://docs.jquery.com/Utilities/jQuery.browser
	uaMatch: function( ua ) {
		ua = ua.toLowerCase();
		var match = /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
			/(opera)(?:.*version)?[ \/]([\w.]+)/.exec( ua ) ||
			/(msie) ([\w.]+)/.exec( ua ) ||
			!/compatible/.test( ua ) && /(mozilla)(?:.*? rv:([\w.]+))?/.exec( ua ) ||
		  	[];
		return { browser: match[1] || "", version: match[2] || "0" };
	browser: {}
browserMatch = jQuery.uaMatch( userAgent );
if ( browserMatch.browser ) {
	jQuery.browser[ browserMatch.browser ] = true;
	jQuery.browser.version = browserMatch.version;
// Deprecated, use jQuery.browser.webkit instead
if ( jQuery.browser.webkit ) {
	jQuery.browser.safari = true;
if ( indexOf ) {
	jQuery.inArray = function( elem, array ) {
		return indexOf.call( array, elem );
// All jQuery objects should point back to these
rootjQuery = jQuery(document);
// Cleanup functions for the document ready method
if ( document.addEventListener ) {
	DOMContentLoaded = function() {
		document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
		jQuery.ready();
} else if ( document.attachEvent ) {
	DOMContentLoaded = function() {
		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
		if ( document.readyState === "complete" ) {
			document.detachEvent( "onreadystatechange", DOMContentLoaded );
			jQuery.ready();
// The DOM ready check for Internet Explorer
function doScrollCheck() {
	if ( jQuery.isReady ) {
		return;
	try {
		// If IE is used, use the trick by Diego Perini
		// http://javascript.nwbox.com/IEContentLoaded/
		document.documentElement.doScroll("left");
	} catch( error ) {
		setTimeout( doScrollCheck, 1 );
		return;
	// and execute any waiting functions
	jQuery.ready();
function evalScript( i, elem ) {
	if ( elem.src ) {
		jQuery.ajax({
			url: elem.src,
			async: false,
			dataType: "script"
	} else {
		jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
	if ( elem.parentNode ) {
		elem.parentNode.removeChild( elem );
// Mutifunctional method to get and set values to a collection
// The value/s can be optionally by executed if its a function
function access( elems, key, value, exec, fn, pass ) {
	var length = elems.length;
	// Setting many attributes
	if ( typeof key === "object" ) {
		for ( var k in key ) {
			access( elems, k, key[k], exec, fn, value );
		return elems;
	// Setting one attribute
	if ( value !== undefined ) {
		// Optionally, function values get executed if exec is true
		exec = !pass && exec && jQuery.isFunction(value);
		for ( var i = 0; i < length; i++ ) {
			fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
		return elems;
	// Getting an attribute
	return length ? fn( elems[0], key ) : undefined;
function now() {
	return (new Date).getTime();
(function() {
	jQuery.support = {};
	var root = document.documentElement,
		script = document.createElement("script"),
		div = document.createElement("div"),
		id = "script" + now();
	div.style.display = "none";
	div.innerHTML = "   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
	var all = div.getElementsByTagName("*"),
		a = div.getElementsByTagName("a")[0];
	// Can't get basic test support
	if ( !all || !all.length || !a ) {
		return;
	jQuery.support = {
		// IE strips leading whitespace when .innerHTML is used
		leadingWhitespace: div.firstChild.nodeType === 3,
		// Make sure that tbody elements aren't automatically inserted
		// IE will insert them into empty tables
		tbody: !div.getElementsByTagName("tbody").length,
		// Make sure that link elements get serialized correctly by innerHTML
		// This requires a wrapper element in IE
		htmlSerialize: !!div.getElementsByTagName("link").length,
		// Get the style information from getAttribute
		// (IE uses .cssText insted)
		style: /red/.test( a.getAttribute("style") ),
		// Make sure that URLs aren't manipulated
		// (IE normalizes it by default)
		hrefNormalized: a.getAttribute("href") === "/a",
		// Make sure that element opacity exists
		// (IE uses filter instead)
		// Use a regex to work around a WebKit issue. See #5145
		opacity: /^0.55$/.test( a.style.opacity ),
		// Verify style float existence
		// (IE uses styleFloat instead of cssFloat)
		cssFloat: !!a.style.cssFloat,
		// Make sure that if no value is specified for a checkbox
		// that it defaults to "on".
		// (WebKit defaults to "" instead)
		checkOn: div.getElementsByTagName("input")[0].value === "on",
		// Make sure that a selected-by-default option has a working selected property.
		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
		optSelected: document.createElement("select").appendChild( document.createElement("option") ).selected,
		parentNode: div.removeChild( div.appendChild( document.createElement("div") ) ).parentNode === null,
		// Will be defined later
		deleteExpando: true,
		checkClone: false,
		scriptEval: false,
		noCloneEvent: true,
		boxModel: null
	script.type = "text/javascript";
	try {
		script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
	} catch(e) {}
	root.insertBefore( script, root.firstChild );
	// Make sure that the execution of code works by injecting a script
	// tag with appendChild/createTextNode
	// (IE doesn't support this, fails, and uses .text instead)
	if ( window[ id ] ) {
		jQuery.support.scriptEval = true;
		delete window[ id ];
	// Test to see if it's possible to delete an expando from an element
	// Fails in Internet Explorer
	try {
		delete script.test;
	} catch(e) {
		jQuery.support.deleteExpando = false;
	root.removeChild( script );
	if ( div.attachEvent && div.fireEvent ) {
		div.attachEvent("onclick", function click() {
			// Cloning a node shouldn't copy over any
			// bound event handlers (IE does this)
			jQuery.support.noCloneEvent = false;
			div.detachEvent("onclick", click);
		div.cloneNode(true).fireEvent("onclick");
	div = document.createElement("div");
	div.innerHTML = "<input type='radio' name='radiotest' checked='checked'/>";
	var fragment = document.createDocumentFragment();
	fragment.appendChild( div.firstChild );
	// WebKit doesn't clone checked state correctly in fragments
	jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked;
	// Figure out if the W3C box model works as expected
	// document.body must exist before we can do this
	jQuery(function() {
		var div = document.createElement("div");
		div.style.width = div.style.paddingLeft = "1px";
		document.body.appendChild( div );
		jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
		document.body.removeChild( div ).style.display = 'none';
		div = null;
	// Technique from Juriy Zaytsev
	// http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
	var eventSupported = function( eventName ) { 
		var el = document.createElement("div"); 
		eventName = "on" + eventName; 
		var isSupported = (eventName in el); 
		if ( !isSupported ) { 
			el.setAttribute(eventName, "return;"); 
			isSupported = typeof el[eventName] === "function"; 
		el = null; 
		return isSupported; 
	jQuery.support.submitBubbles = eventSupported("submit");
	jQuery.support.changeBubbles = eventSupported("change");
	// release memory in IE
	root = script = div = all = a = null;
jQuery.props = {
	"for": "htmlFor",
	"class": "className",
	readonly: "readOnly",
	maxlength: "maxLength",
	cellspacing: "cellSpacing",
	rowspan: "rowSpan",
	colspan: "colSpan",
	tabindex: "tabIndex",
	usemap: "useMap",
	frameborder: "frameBorder"
var expando = "jQuery" + now(), uuid = 0, windowData = {};
jQuery.extend({
	cache: {},
	expando:expando,
	// The following elements throw uncatchable exceptions if you
	// attempt to add expando properties to them.
	noData: {
		"embed": true,
		"object": true,
		"applet": true
	data: function( elem, name, data ) {
		if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
			return;
		elem = elem == window ?
			windowData :
			elem;
		var id = elem[ expando ], cache = jQuery.cache, thisCache;
		if ( !id && typeof name === "string" && data === undefined ) {
			return null;
		// Compute a unique ID for the element
		if ( !id ) { 
			id = ++uuid;
		// Avoid generating a new cache unless none exists and we
		// want to manipulate it.
		if ( typeof name === "object" ) {
			elem[ expando ] = id;
			thisCache = cache[ id ] = jQuery.extend(true, {}, name);
		} else if ( !cache[ id ] ) {
			elem[ expando ] = id;
			cache[ id ] = {};
		thisCache = cache[ id ];
		// Prevent overriding the named cache with undefined values
		if ( data !== undefined ) {
			thisCache[ name ] = data;
		return typeof name === "string" ? thisCache[ name ] : thisCache;
	removeData: function( elem, name ) {
		if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
			return;
		elem = elem == window ?
			windowData :
			elem;
		var id = elem[ expando ], cache = jQuery.cache, thisCache = cache[ id ];
		// If we want to remove a specific section of the element's data
		if ( name ) {
			if ( thisCache ) {
				// Remove the section of cache data
				delete thisCache[ name ];
				// If we've removed all the data, remove the element's cache
				if ( jQuery.isEmptyObject(thisCache) ) {
					jQuery.removeData( elem );
		// Otherwise, we want to remove all of the element's data
		} else {
			if ( jQuery.support.deleteExpando ) {
				delete elem[ jQuery.expando ];
			} else if ( elem.removeAttribute ) {
				elem.removeAttribute( jQuery.expando );
			// Completely remove the data cache
			delete cache[ id ];
jQuery.fn.extend({
	data: function( key, value ) {
		if ( typeof key === "undefined" && this.length ) {
			return jQuery.data( this[0] );
		} else if ( typeof key === "object" ) {
			return this.each(function() {
				jQuery.data( this, key );
			});
		var parts = key.split(".");
		parts[1] = parts[1] ? "." + parts[1] : "";
		if ( value === undefined ) {
			var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
			if ( data === undefined && this.length ) {
				data = jQuery.data( this[0], key );
			return data === undefined && parts[1] ?
				this.data( parts[0] ) :
				data;
		} else {
			return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function() {
				jQuery.data( this, key, value );
			});
	removeData: function( key ) {
		return this.each(function() {
			jQuery.removeData( this, key );
jQuery.extend({
	queue: function( elem, type, data ) {
		if ( !elem ) {
			return;
		type = (type || "fx") + "queue";
		var q = jQuery.data( elem, type );
		// Speed up dequeue by getting out quickly if this is just a lookup
		if ( !data ) {
			return q || [];
		if ( !q || jQuery.isArray(data) ) {
			q = jQuery.data( elem, type, jQuery.makeArray(data) );
		} else {
			q.push( data );
		return q;
	dequeue: function( elem, type ) {
		type = type || "fx";
		var queue = jQuery.queue( elem, type ), fn = queue.shift();
		// If the fx queue is dequeued, always remove the progress sentinel
		if ( fn === "inprogress" ) {
			fn = queue.shift();
		if ( fn ) {
			// Add a progress sentinel to prevent the fx queue from being
			// automatically dequeued
			if ( type === "fx" ) {
				queue.unshift("inprogress");
			fn.call(elem, function() {
				jQuery.dequeue(elem, type);
			});
jQuery.fn.extend({
	queue: function( type, data ) {
		if ( typeof type !== "string" ) {
			data = type;
			type = "fx";
		if ( data === undefined ) {
			return jQuery.queue( this[0], type );
		return this.each(function( i, elem ) {
			var queue = jQuery.queue( this, type, data );
			if ( type === "fx" && queue[0] !== "inprogress" ) {
				jQuery.dequeue( this, type );
	dequeue: function( type ) {
		return this.each(function() {
			jQuery.dequeue( this, type );
	// Based off of the plugin by Clint Helfers, with permission.
	// http://blindsignals.com/index.php/2009/07/jquery-delay/
	delay: function( time, type ) {
		time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
		type = type || "fx";
		return this.queue( type, function() {
			var elem = this;
			setTimeout(function() {
				jQuery.dequeue( elem, type );
			}, time );
	clearQueue: function( type ) {
		return this.queue( type || "fx", [] );
var rclass = /[\n\t]/g,
	rspace = /\s+/,
	rreturn = /\r/g,
	rspecialurl = /href|src|style/,
	rtype = /(button|input)/i,
	rfocusable = /(button|input|object|select|textarea)/i,
	rclickable = /^(a|area)$/i,
	rradiocheck = /radio|checkbox/;
jQuery.fn.extend({
	attr: function( name, value ) {
		return access( this, name, value, true, jQuery.attr );
	removeAttr: function( name, fn ) {
		return this.each(function(){
			jQuery.attr( this, name, "" );
			if ( this.nodeType === 1 ) {
				this.removeAttribute( name );
	addClass: function( value ) {
		if ( jQuery.isFunction(value) ) {
			return this.each(function(i) {
				var self = jQuery(this);
				self.addClass( value.call(this, i, self.attr("class")) );
			});
		if ( value && typeof value === "string" ) {
			var classNames = (value || "").split( rspace );
			for ( var i = 0, l = this.length; i < l; i++ ) {
				var elem = this[i];
				if ( elem.nodeType === 1 ) {
					if ( !elem.className ) {
						elem.className = value;
					} else {
						var className = " " + elem.className + " ", setClass = elem.className;
						for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
							if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
								setClass += " " + classNames[c];
							}
						}
						elem.className = jQuery.trim( setClass );
					}
		return this;
	removeClass: function( value ) {
		if ( jQuery.isFunction(value) ) {
			return this.each(function(i) {
				var self = jQuery(this);
				self.removeClass( value.call(this, i, self.attr("class")) );
			});
		if ( (value && typeof value === "string") || value === undefined ) {
			var classNames = (value || "").split(rspace);
			for ( var i = 0, l = this.length; i < l; i++ ) {
				var elem = this[i];
				if ( elem.nodeType === 1 && elem.className ) {
					if ( value ) {
						var className = (" " + elem.className + " ").replace(rclass, " ");
						for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
							className = className.replace(" " + classNames[c] + " ", " ");
						}
						elem.className = jQuery.trim( className );
					} else {
						elem.className = "";
					}
		return this;
	toggleClass: function( value, stateVal ) {
		var type = typeof value, isBool = typeof stateVal === "boolean";
		if ( jQuery.isFunction( value ) ) {
			return this.each(function(i) {
				var self = jQuery(this);
				self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
			});
		return this.each(function() {
			if ( type === "string" ) {
				// toggle individual class names
				var className, i = 0, self = jQuery(this),
					state = stateVal,
					classNames = value.split( rspace );
				while ( (className = classNames[ i++ ]) ) {
					// check each className given, space seperated list
					state = isBool ? state : !self.hasClass( className );
					self[ state ? "addClass" : "removeClass" ]( className );
			} else if ( type === "undefined" || type === "boolean" ) {
				if ( this.className ) {
					// store className if set
					jQuery.data( this, "__className__", this.className );
				// toggle whole className
				this.className = this.className || value === false ? "" : jQuery.data( this, "__className__" ) || "";
	hasClass: function( selector ) {
		var className = " " + selector + " ";
		for ( var i = 0, l = this.length; i < l; i++ ) {
			if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
				return true;
		return false;
	val: function( value ) {
		if ( value === undefined ) {
			var elem = this[0];
			if ( elem ) {
				if ( jQuery.nodeName( elem, "option" ) ) {
					return (elem.attributes.value || {}).specified ? elem.value : elem.text;
				// We need to handle select boxes special
				if ( jQuery.nodeName( elem, "select" ) ) {
					var index = elem.selectedIndex,
						values = [],
						options = elem.options,
						one = elem.type === "select-one";
					// Nothing was selected
					if ( index < 0 ) {
						return null;
					}
					// Loop through all the selected options
					for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
						var option = options[ i ];
						if ( option.selected ) {
							// Get the specifc value for the option
							value = jQuery(option).val();
							// We don't need an array for one selects
							if ( one ) {
								return value;
							}
							// Multi-Selects return an array
							values.push( value );
						}
					}
					return values;
				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
				if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) {
					return elem.getAttribute("value") === null ? "on" : elem.value;
				// Everything else, we just grab the value
				return (elem.value || "").replace(rreturn, "");
			return undefined;
		var isFunction = jQuery.isFunction(value);
		return this.each(function(i) {
			var self = jQuery(this), val = value;
			if ( this.nodeType !== 1 ) {
				return;
			if ( isFunction ) {
				val = value.call(this, i, self.val());
			// Typecast each time if the value is a Function and the appended
			// value is therefore different each time.
			if ( typeof val === "number" ) {
				val += "";
			if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) {
				this.checked = jQuery.inArray( self.val(), val ) >= 0;
			} else if ( jQuery.nodeName( this, "select" ) ) {
				var values = jQuery.makeArray(val);
				jQuery( "option", this ).each(function() {
					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
				});
				if ( !values.length ) {
					this.selectedIndex = -1;
			} else {
				this.value = val;
jQuery.extend({
	attrFn: {
		val: true,
		css: true,
		html: true,
		text: true,
		data: true,
		width: true,
		height: true,
		offset: true
	attr: function( elem, name, value, pass ) {
		// don't set attributes on text and comment nodes
		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
			return undefined;
		if ( pass && name in jQuery.attrFn ) {
			return jQuery(elem)[name](value);
		var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ),
			// Whether we are setting (or getting)
			set = value !== undefined;
		// Try to normalize/fix the name
		name = notxml && jQuery.props[ name ] || name;
		// Only do all the following if this is a node (faster for style)
		if ( elem.nodeType === 1 ) {
			// These attributes require special treatment
			var special = rspecialurl.test( name );
			// Safari mis-reports the default selected property of an option
			// Accessing the parent's selectedIndex property fixes it
			if ( name === "selected" && !jQuery.support.optSelected ) {
				var parent = elem.parentNode;
				if ( parent ) {
					parent.selectedIndex;
					// Make sure that it also works with optgroups, see #5701
					if ( parent.parentNode ) {
						parent.parentNode.selectedIndex;
					}
			// If applicable, access the attribute via the DOM 0 way
			if ( name in elem && notxml && !special ) {
				if ( set ) {
					// We can't allow the type property to be changed (since it causes problems in IE)
					if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) {
						jQuery.error( "type property can't be changed" );
					}
					elem[ name ] = value;
				// browsers index elements by id/name on forms, give priority to attributes.
				if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) {
					return elem.getAttributeNode( name ).nodeValue;
				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
				if ( name === "tabIndex" ) {
					var attributeNode = elem.getAttributeNode( "tabIndex" );
					return attributeNode && attributeNode.specified ?
						attributeNode.value :
						rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
							0 :
							undefined;
				return elem[ name ];
			if ( !jQuery.support.style && notxml && name === "style" ) {
				if ( set ) {
					elem.style.cssText = "" + value;
				return elem.style.cssText;
			if ( set ) {
				// convert the value to a string (all browsers do this but IE) see #1070
				elem.setAttribute( name, "" + value );
			var attr = !jQuery.support.hrefNormalized && notxml && special ?
					// Some attributes require a special call on IE
					elem.getAttribute( name, 2 ) :
					elem.getAttribute( name );
			// Non-existent attributes return null, we normalize to undefined
			return attr === null ? undefined : attr;
		// elem is actually elem.style ... set the style
		// Using attr for specific style information is now deprecated. Use style instead.
		return jQuery.style( elem, name, value );
var rnamespaces = /\.(.*)$/,
	fcleanup = function( nm ) {
		return nm.replace(/[^\w\s\.\|`]/g, function( ch ) {
			return "\\" + ch;
 * A number of helper functions used for managing events.
 * Many of the ideas behind this code originated from
 * Dean Edwards' addEvent library.
jQuery.event = {
	// Bind an event to an element
	// Original by Dean Edwards
	add: function( elem, types, handler, data ) {
		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
			return;
		// For whatever reason, IE has trouble passing the window object
		// around, causing it to be cloned in the process
		if ( elem.setInterval && ( elem !== window && !elem.frameElement ) ) {
			elem = window;
		var handleObjIn, handleObj;
		if ( handler.handler ) {
			handleObjIn = handler;
			handler = handleObjIn.handler;
		// Make sure that the function being executed has a unique ID
		if ( !handler.guid ) {
			handler.guid = jQuery.guid++;
		// Init the element's event structure
		var elemData = jQuery.data( elem );
		// If no elemData is found then we must be trying to bind to one of the
		// banned noData elements
		if ( !elemData ) {
			return;
		var events = elemData.events = elemData.events || {},
			eventHandle = elemData.handle, eventHandle;
		if ( !eventHandle ) {
			elemData.handle = eventHandle = function() {
				// Handle the second event of a trigger and when
				// an event is called after a page has unloaded
				return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
					jQuery.event.handle.apply( eventHandle.elem, arguments ) :
					undefined;
		// Add elem as a property of the handle function
		// This is to prevent a memory leak with non-native events in IE.
		eventHandle.elem = elem;
		// Handle multiple events separated by a space
		// jQuery(...).bind("mouseover mouseout", fn);
		types = types.split(" ");
		var type, i = 0, namespaces;
		while ( (type = types[ i++ ]) ) {
			handleObj = handleObjIn ?
				jQuery.extend({}, handleObjIn) :
				{ handler: handler, data: data };
			// Namespaced event handlers
			if ( type.indexOf(".") > -1 ) {
				namespaces = type.split(".");
				type = namespaces.shift();
				handleObj.namespace = namespaces.slice(0).sort().join(".");
			} else {
				namespaces = [];
				handleObj.namespace = "";
			handleObj.type = type;
			handleObj.guid = handler.guid;
			// Get the current list of functions bound to this event
			var handlers = events[ type ],
				special = jQuery.event.special[ type ] || {};
			// Init the event handler queue
			if ( !handlers ) {
				handlers = events[ type ] = [];
				// Check for a special event handler
				// Only use addEventListener/attachEvent if the special
				// events handler returns false
				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
					// Bind the global event handler to the element
					if ( elem.addEventListener ) {
						elem.addEventListener( type, eventHandle, false );
					} else if ( elem.attachEvent ) {
						elem.attachEvent( "on" + type, eventHandle );
					}
			if ( special.add ) { 
				special.add.call( elem, handleObj ); 
				if ( !handleObj.handler.guid ) {
					handleObj.handler.guid = handler.guid;
			// Add the function to the element's handler list
			handlers.push( handleObj );
			// Keep track of which events have been used, for global triggering
			jQuery.event.global[ type ] = true;
		// Nullify elem to prevent memory leaks in IE
		elem = null;
	global: {},
	// Detach an event or set of events from an element
	remove: function( elem, types, handler, pos ) {
		// don't do events on text and comment nodes
		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
			return;
		var ret, type, fn, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
			elemData = jQuery.data( elem ),
			events = elemData && elemData.events;
		if ( !elemData || !events ) {
			return;
		// types is actually an event object here
		if ( types && types.type ) {
			handler = types.handler;
			types = types.type;
		// Unbind all events for the element
		if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
			types = types || "";
			for ( type in events ) {
				jQuery.event.remove( elem, type + types );
			return;
		// Handle multiple events separated by a space
		// jQuery(...).unbind("mouseover mouseout", fn);
		types = types.split(" ");
		while ( (type = types[ i++ ]) ) {
			origType = type;
			handleObj = null;
			all = type.indexOf(".") < 0;
			namespaces = [];
			if ( !all ) {
				// Namespaced event handlers
				namespaces = type.split(".");
				type = namespaces.shift();
				namespace = new RegExp("(^|\\.)" + 
					jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)")
			eventType = events[ type ];
			if ( !eventType ) {
				continue;
			if ( !handler ) {
				for ( var j = 0; j < eventType.length; j++ ) {
					handleObj = eventType[ j ];
					if ( all || namespace.test( handleObj.namespace ) ) {
						jQuery.event.remove( elem, origType, handleObj.handler, j );
						eventType.splice( j--, 1 );
					}
				continue;
			special = jQuery.event.special[ type ] || {};
			for ( var j = pos || 0; j < eventType.length; j++ ) {
				handleObj = eventType[ j ];
				if ( handler.guid === handleObj.guid ) {
					// remove the given handler for the given type
					if ( all || namespace.test( handleObj.namespace ) ) {
						if ( pos == null ) {
							eventType.splice( j--, 1 );
						}
						if ( special.remove ) {
							special.remove.call( elem, handleObj );
						}
					}
					if ( pos != null ) {
						break;
					}
			// remove generic event handler if no more handlers exist
			if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
				if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
					removeEvent( elem, type, elemData.handle );
				ret = null;
				delete events[ type ];
		// Remove the expando if it's no longer used
		if ( jQuery.isEmptyObject( events ) ) {
			var handle = elemData.handle;
			if ( handle ) {
				handle.elem = null;
			delete elemData.events;
			delete elemData.handle;
			if ( jQuery.isEmptyObject( elemData ) ) {
				jQuery.removeData( elem );
	// bubbling is internal
	trigger: function( event, data, elem /*, bubbling */ ) {
		// Event object or event type
		var type = event.type || event,
			bubbling = arguments[3];
		if ( !bubbling ) {
			event = typeof event === "object" ?
				// jQuery.Event object
				event[expando] ? event :
				// Object literal
				jQuery.extend( jQuery.Event(type), event ) :
				// Just the event type (string)
				jQuery.Event(type);
			if ( type.indexOf("!") >= 0 ) {
				event.type = type = type.slice(0, -1);
				event.exclusive = true;
			// Handle a global trigger
			if ( !elem ) {
				// Don't bubble custom events when global (to avoid too much overhead)
				event.stopPropagation();
				// Only trigger if we've ever bound an event for it
				if ( jQuery.event.global[ type ] ) {
					jQuery.each( jQuery.cache, function() {
						if ( this.events && this.events[type] ) {
							jQuery.event.trigger( event, data, this.handle.elem );
						}
					});
			// Handle triggering a single element
			// don't do events on text and comment nodes
			if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
				return undefined;
			// Clean up in case it is reused
			event.result = undefined;
			event.target = elem;
			// Clone the incoming data, if any
			data = jQuery.makeArray( data );
			data.unshift( event );
		event.currentTarget = elem;
		// Trigger the event, it is assumed that "handle" is a function
		var handle = jQuery.data( elem, "handle" );
		if ( handle ) {
			handle.apply( elem, data );
		var parent = elem.parentNode || elem.ownerDocument;
		// Trigger an inline bound script
		try {
			if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) {
				if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) {
					event.result = false;
		// prevent IE from throwing an error for some elements with some event types, see #3533
		} catch (e) {}
		if ( !event.isPropagationStopped() && parent ) {
			jQuery.event.trigger( event, data, parent, true );
		} else if ( !event.isDefaultPrevented() ) {
			var target = event.target, old,
				isClick = jQuery.nodeName(target, "a") && type === "click",
				special = jQuery.event.special[ type ] || {};
			if ( (!special._default || special._default.call( elem, event ) === false) && 
				!isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) {
				try {
					if ( target[ type ] ) {
						// Make sure that we don't accidentally re-trigger the onFOO events
						old = target[ "on" + type ];
						if ( old ) {
							target[ "on" + type ] = null;
						}
						jQuery.event.triggered = true;
						target[ type ]();
					}
				// prevent IE from throwing an error for some elements with some event types, see #3533
				} catch (e) {}
				if ( old ) {
					target[ "on" + type ] = old;
				jQuery.event.triggered = false;
	handle: function( event ) {
		var all, handlers, namespaces, namespace, events;
		event = arguments[0] = jQuery.event.fix( event || window.event );
		event.currentTarget = this;
		// Namespaced event handlers
		all = event.type.indexOf(".") < 0 && !event.exclusive;
		if ( !all ) {
			namespaces = event.type.split(".");
			event.type = namespaces.shift();
			namespace = new RegExp("(^|\\.)" + namespaces.slice(0).sort().join("\\.(?:.*\\.)?") + "(\\.|$)");
		var events = jQuery.data(this, "events"), handlers = events[ event.type ];
		if ( events && handlers ) {
			// Clone the handlers to prevent manipulation
			handlers = handlers.slice(0);
			for ( var j = 0, l = handlers.length; j < l; j++ ) {
				var handleObj = handlers[ j ];
				// Filter the functions by class
				if ( all || namespace.test( handleObj.namespace ) ) {
					// Pass in a reference to the handler function itself
					// So that we can later remove it
					event.handler = handleObj.handler;
					event.data = handleObj.data;
					event.handleObj = handleObj;
					var ret = handleObj.handler.apply( this, arguments );
					if ( ret !== undefined ) {
						event.result = ret;
						if ( ret === false ) {
							event.preventDefault();
							event.stopPropagation();
						}
					}
					if ( event.isImmediatePropagationStopped() ) {
						break;
					}
		return event.result;
	props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
	fix: function( event ) {
		if ( event[ expando ] ) {
			return event;
		// store a copy of the original event object
		// and "clone" to set read-only properties
		var originalEvent = event;
		event = jQuery.Event( originalEvent );
		for ( var i = this.props.length, prop; i; ) {
			prop = this.props[ --i ];
			event[ prop ] = originalEvent[ prop ];
		// Fix target property, if necessary
		if ( !event.target ) {
			event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
		// check if target is a textnode (safari)
		if ( event.target.nodeType === 3 ) {
			event.target = event.target.parentNode;
		// Add relatedTarget, if necessary
		if ( !event.relatedTarget && event.fromElement ) {
			event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
		// Calculate pageX/Y if missing and clientX/Y available
		if ( event.pageX == null && event.clientX != null ) {
			var doc = document.documentElement, body = document.body;
			event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
			event.pageY = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);
		// Add which for key events
		if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) ) {
			event.which = event.charCode || event.keyCode;
		// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
		if ( !event.metaKey && event.ctrlKey ) {
			event.metaKey = event.ctrlKey;
		// Add which for click: 1 === left; 2 === middle; 3 === right
		// Note: button is not normalized, so don't use it
		if ( !event.which && event.button !== undefined ) {
			event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
		return event;
	// Deprecated, use jQuery.guid instead
	guid: 1E8,
	// Deprecated, use jQuery.proxy instead
	proxy: jQuery.proxy,
	special: {
		ready: {
			// Make sure the ready event is setup
			setup: jQuery.bindReady,
			teardown: jQuery.noop
		live: {
			add: function( handleObj ) {
				jQuery.event.add( this, handleObj.origType, jQuery.extend({}, handleObj, {handler: liveHandler}) ); 
			remove: function( handleObj ) {
				var remove = true,
					type = handleObj.origType.replace(rnamespaces, "");
				jQuery.each( jQuery.data(this, "events").live || [], function() {
					if ( type === this.origType.replace(rnamespaces, "") ) {
						remove = false;
						return false;
					}
				});
				if ( remove ) {
					jQuery.event.remove( this, handleObj.origType, liveHandler );
		beforeunload: {
			setup: function( data, namespaces, eventHandle ) {
				// We only want to do this special case on windows
				if ( this.setInterval ) {
					this.onbeforeunload = eventHandle;
				return false;
			teardown: function( namespaces, eventHandle ) {
				if ( this.onbeforeunload === eventHandle ) {
					this.onbeforeunload = null;
var removeEvent = document.removeEventListener ?
	function( elem, type, handle ) {
		elem.removeEventListener( type, handle, false );
	function( elem, type, handle ) {
		elem.detachEvent( "on" + type, handle );
jQuery.Event = function( src ) {
	// Allow instantiation without the 'new' keyword
	if ( !this.preventDefault ) {
		return new jQuery.Event( src );
	// Event object
	if ( src && src.type ) {
		this.originalEvent = src;
		this.type = src.type;
	// Event type
	} else {
		this.type = src;
	// timeStamp is buggy for some events on Firefox(#3843)
	// So we won't rely on the native value
	this.timeStamp = now();
	// Mark it as fixed
	this[ expando ] = true;
function returnFalse() {
	return false;
function returnTrue() {
	return true;
// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
jQuery.Event.prototype = {
	preventDefault: function() {
		this.isDefaultPrevented = returnTrue;
		var e = this.originalEvent;
		if ( !e ) {
			return;
		// if preventDefault exists run it on the original event
		if ( e.preventDefault ) {
			e.preventDefault();
		// otherwise set the returnValue property of the original event to false (IE)
		e.returnValue = false;
	stopPropagation: function() {
		this.isPropagationStopped = returnTrue;
		var e = this.originalEvent;
		if ( !e ) {
			return;
		// if stopPropagation exists run it on the original event
		if ( e.stopPropagation ) {
			e.stopPropagation();
		// otherwise set the cancelBubble property of the original event to true (IE)
		e.cancelBubble = true;
	stopImmediatePropagation: function() {
		this.isImmediatePropagationStopped = returnTrue;
		this.stopPropagation();
	isDefaultPrevented: returnFalse,
	isPropagationStopped: returnFalse,
	isImmediatePropagationStopped: returnFalse
// Checks if an event happened on an element within another element
// Used in jQuery.event.special.mouseenter and mouseleave handlers
var withinElement = function( event ) {
	// Check if mouse(over|out) are still within the same parent element
	var parent = event.relatedTarget;
	// Firefox sometimes assigns relatedTarget a XUL element
	// which we cannot access the parentNode property of
	try {
		// Traverse up the tree
		while ( parent && parent !== this ) {
			parent = parent.parentNode;
		if ( parent !== this ) {
			// set the correct event type
			event.type = event.data;
			// handle event if we actually just moused on to a non sub-element
			jQuery.event.handle.apply( this, arguments );
	// assuming we've left the element since we most likely mousedover a xul element
	} catch(e) { }
// In case of event delegation, we only need to rename the event.type,
// liveHandler will take care of the rest.
delegate = function( event ) {
	event.type = event.data;
	jQuery.event.handle.apply( this, arguments );
// Create mouseenter and mouseleave events
jQuery.each({
	mouseenter: "mouseover",
	mouseleave: "mouseout"
}, function( orig, fix ) {
	jQuery.event.special[ orig ] = {
		setup: function( data ) {
			jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
		teardown: function( data ) {
			jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
// submit delegation
if ( !jQuery.support.submitBubbles ) {
	jQuery.event.special.submit = {
		setup: function( data, namespaces ) {
			if ( this.nodeName.toLowerCase() !== "form" ) {
				jQuery.event.add(this, "click.specialSubmit", function( e ) {
					var elem = e.target, type = elem.type;
					if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
						return trigger( "submit", this, arguments );
					}
				});
				jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
					var elem = e.target, type = elem.type;
					if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
						return trigger( "submit", this, arguments );
					}
				});
			} else {
				return false;
		teardown: function( namespaces ) {
			jQuery.event.remove( this, ".specialSubmit" );
// change delegation, happens here so we have bind.
if ( !jQuery.support.changeBubbles ) {
	var formElems = /textarea|input|select/i,
	changeFilters,
	getVal = function( elem ) {
		var type = elem.type, val = elem.value;
		if ( type === "radio" || type === "checkbox" ) {
			val = elem.checked;
		} else if ( type === "select-multiple" ) {
			val = elem.selectedIndex > -1 ?
				jQuery.map( elem.options, function( elem ) {
					return elem.selected;
				}).join("-") :
				"";
		} else if ( elem.nodeName.toLowerCase() === "select" ) {
			val = elem.selectedIndex;
		return val;
	testChange = function testChange( e ) {
		var elem = e.target, data, val;
		if ( !formElems.test( elem.nodeName ) || elem.readOnly ) {
			return;
		data = jQuery.data( elem, "_change_data" );
		val = getVal(elem);
		// the current data will be also retrieved by beforeactivate
		if ( e.type !== "focusout" || elem.type !== "radio" ) {
			jQuery.data( elem, "_change_data", val );
		if ( data === undefined || val === data ) {
			return;
		if ( data != null || val ) {
			e.type = "change";
			return jQuery.event.trigger( e, arguments[1], elem );
	jQuery.event.special.change = {
		filters: {
			focusout: testChange, 
			click: function( e ) {
				var elem = e.target, type = elem.type;
				if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) {
					return testChange.call( this, e );
			// Change has to be called before submit
			// Keydown will be called before keypress, which is used in submit-event delegation
			keydown: function( e ) {
				var elem = e.target, type = elem.type;
				if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") ||
					(e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
					type === "select-multiple" ) {
					return testChange.call( this, e );
			// Beforeactivate happens also before the previous element is blurred
			// with this event you can't trigger a change event, but you can store
			// information/focus[in] is not needed anymore
			beforeactivate: function( e ) {
				var elem = e.target;
				jQuery.data( elem, "_change_data", getVal(elem) );
		setup: function( data, namespaces ) {
			if ( this.type === "file" ) {
				return false;
			for ( var type in changeFilters ) {
				jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
			return formElems.test( this.nodeName );
		teardown: function( namespaces ) {
			jQuery.event.remove( this, ".specialChange" );
			return formElems.test( this.nodeName );
	changeFilters = jQuery.event.special.change.filters;
function trigger( type, elem, args ) {
	args[0].type = type;
	return jQuery.event.handle.apply( elem, args );
// Create "bubbling" focus and blur events
if ( document.addEventListener ) {
	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
		jQuery.event.special[ fix ] = {
			setup: function() {
				this.addEventListener( orig, handler, true );
			}, 
			teardown: function() { 
				this.removeEventListener( orig, handler, true );
		function handler( e ) { 
			e = jQuery.event.fix( e );
			e.type = fix;
			return jQuery.event.handle.call( this, e );
jQuery.each(["bind", "one"], function( i, name ) {
	jQuery.fn[ name ] = function( type, data, fn ) {
		// Handle object literals
		if ( typeof type === "object" ) {
			for ( var key in type ) {
				this[ name ](key, data, type[key], fn);
			return this;
		if ( jQuery.isFunction( data ) ) {
			fn = data;
			data = undefined;
		var handler = name === "one" ? jQuery.proxy( fn, function( event ) {
			jQuery( this ).unbind( event, handler );
			return fn.apply( this, arguments );
		}) : fn;
		if ( type === "unload" && name !== "one" ) {
			this.one( type, data, fn );
		} else {
			for ( var i = 0, l = this.length; i < l; i++ ) {
				jQuery.event.add( this[i], type, handler, data );
		return this;
jQuery.fn.extend({
	unbind: function( type, fn ) {
		// Handle object literals
		if ( typeof type === "object" && !type.preventDefault ) {
			for ( var key in type ) {
				this.unbind(key, type[key]);
		} else {
			for ( var i = 0, l = this.length; i < l; i++ ) {
				jQuery.event.remove( this[i], type, fn );
		return this;
	delegate: function( selector, types, data, fn ) {
		return this.live( types, data, fn, selector );
	undelegate: function( selector, types, fn ) {
		if ( arguments.length === 0 ) {
				return this.unbind( "live" );
		} else {
			return this.die( types, null, fn, selector );
	trigger: function( type, data ) {
		return this.each(function() {
			jQuery.event.trigger( type, data, this );
	triggerHandler: function( type, data ) {
		if ( this[0] ) {
			var event = jQuery.Event( type );
			event.preventDefault();
			event.stopPropagation();
			jQuery.event.trigger( event, data, this[0] );
			return event.result;
	toggle: function( fn ) {
		// Save reference to arguments for access in closure
		var args = arguments, i = 1;
		// link all the functions, so any of them can unbind this click handler
		while ( i < args.length ) {
			jQuery.proxy( fn, args[ i++ ] );
		return this.click( jQuery.proxy( fn, function( event ) {
			// Figure out which function to execute
			var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
			jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );
			// Make sure that clicks stop
			event.preventDefault();
			// and execute the function
			return args[ lastToggle ].apply( this, arguments ) || false;
		}));
	hover: function( fnOver, fnOut ) {
		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
var liveMap = {
	focus: "focusin",
	blur: "focusout",
	mouseenter: "mouseover",
	mouseleave: "mouseout"
jQuery.each(["live", "die"], function( i, name ) {
	jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
		var type, i = 0, match, namespaces, preType,
			selector = origSelector || this.selector,
			context = origSelector ? this : jQuery( this.context );
		if ( jQuery.isFunction( data ) ) {
			fn = data;
			data = undefined;
		types = (types || "").split(" ");
		while ( (type = types[ i++ ]) != null ) {
			match = rnamespaces.exec( type );
			namespaces = "";
			if ( match )  {
				namespaces = match[0];
				type = type.replace( rnamespaces, "" );
			if ( type === "hover" ) {
				types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
				continue;
			preType = type;
			if ( type === "focus" || type === "blur" ) {
				types.push( liveMap[ type ] + namespaces );
				type = type + namespaces;
			} else {
				type = (liveMap[ type ] || type) + namespaces;
			if ( name === "live" ) {
				// bind live handler
				context.each(function(){
					jQuery.event.add( this, liveConvert( type, selector ),
						{ data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
				});
			} else {
				// unbind live handler
				context.unbind( liveConvert( type, selector ), fn );
		return this;
function liveHandler( event ) {
	var stop, elems = [], selectors = [], args = arguments,
		related, match, handleObj, elem, j, i, l, data,
		events = jQuery.data( this, "events" );
	// Make sure we avoid non-left-click bubbling in Firefox (#3861)
	if ( event.live
Fired === this || !events || !events.live || event.button && event.type === "click" ) {
		return;
	event.liveFired = this;
	var live = events.live.slice(0);
	for ( j = 0; j < live.length; j++ ) {
		handleObj = live[j];
		if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
			selectors.push( handleObj.selector );
		} else {
			live.splice( j--, 1 );
	match = jQuery( event.target ).closest( selectors, event.currentTarget );
	for ( i = 0, l = match.length; i < l; i++ ) {
		for ( j = 0; j < live.length; j++ ) {
			handleObj = live[j];
			if ( match[i].selector === handleObj.selector ) {
				elem = match[i].elem;
				related = null;
				// Those two events require additional checking
				if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
					related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
				if ( !related || related !== elem ) {
					elems.push({ elem: elem, handleObj: handleObj });
	for ( i = 0, l = elems.length; i < l; i++ ) {
		match = elems[i];
		event.currentTarget = match.elem;
		event.data = match.handleObj.data;
		event.handleObj = match.handleObj;
		if ( match.handleObj.origHandler.apply( match.elem, args ) === false ) {
			stop = false;
			break;
	return stop;
function liveConvert( type, selector ) {
	return "live." + (type && type !== "*" ? type + "." : "") + selector.replace(/\./g, "`").replace(/ /g, "&");
jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
	"change select submit keydown keypress keyup error").split(" "), function( i, name ) {
	// Handle event binding
	jQuery.fn[ name ] = function( fn ) {
		return fn ? this.bind( name, fn ) : this.trigger( name );
	if ( jQuery.attrFn ) {
		jQuery.attrFn[ name ] = true;
// Prevent memory leaks in IE
// Window isn't included so as not to unbind existing unload events
// More info:
//  - http://isaacschlueter.com/2006/10/msie-memory-leaks/
if ( window.attachEvent && !window.addEventListener ) {
	window.attachEvent("onunload", function() {
		for ( var id in jQuery.cache ) {
			if ( jQuery.cache[ id ].handle ) {
				// Try/Catch is to handle iframes being unloaded, see #4280
				try {
					jQuery.event.remove( jQuery.cache[ id ].handle.elem );
				} catch(e) {}
 * Sizzle CSS Selector Engine - v1.0
 *  Copyright 2009, The Dojo Foundation
 *  Released under the MIT, BSD, and GPL Licenses.
 *  More information: http://sizzlejs.com/
(function(){
var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
	done = 0,
	toString = Object.prototype.toString,
	hasDuplicate = false,
	baseHasDuplicate = true;
// Here we check if the JavaScript engine is using some sort of
// optimization where it does not always call our comparision
// function. If that is the case, discard the hasDuplicate value.
//   Thus far that includes Google Chrome.
[0, 0].sort(function(){
	baseHasDuplicate = false;
	return 0;
var Sizzle = function(selector, context, results, seed) {
	results = results || [];
	var origContext = context = context || document;
	if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
		return [];
	if ( !selector || typeof selector !== "string" ) {
		return results;
	var parts = [], m, set, checkSet, extra, prune = true, contextXML = isXML(context),
		soFar = selector;
	// Reset the position of the chunker regexp (start from head)
	while ( (chunker.exec(""), m = chunker.exec(soFar)) !== null ) {
		soFar = m[3];
		parts.push( m[1] );
		if ( m[2] ) {
			extra = m[3];
			break;
	if ( parts.length > 1 && origPOS.exec( selector ) ) {
		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
			set = posProcess( parts[0] + parts[1], context );
		} else {
			set = Expr.relative[ parts[0] ] ?
				[ context ] :
				Sizzle( parts.shift(), context );
			while ( parts.length ) {
				selector = parts.shift();
				if ( Expr.relative[ selector ] ) {
					selector += parts.shift();
				set = posProcess( selector, set );
	} else {
		// Take a shortcut and set the context if the root selector is an ID
		// (but not if it'll be faster if the inner selector is an ID)
		if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
				Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
			var ret = Sizzle.find( parts.shift(), context, contextXML );
			context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0];
		if ( context ) {
			var ret = seed ?
				{ expr: parts.pop(), set: makeArray(seed) } :
				Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
			set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set;
			if ( parts.length > 0 ) {
				checkSet = makeArray(set);
			} else {
				prune = false;
			while ( parts.length ) {
				var cur = parts.pop(), pop = cur;
				if ( !Expr.relative[ cur ] ) {
					cur = "";
				} else {
					pop = parts.pop();
				if ( pop == null ) {
					pop = context;
				Expr.relative[ cur ]( checkSet, pop, contextXML );
		} else {
			checkSet = parts = [];
	if ( !checkSet ) {
		checkSet = set;
	if ( !checkSet ) {
		Sizzle.error( cur || selector );
	if ( toString.call(checkSet) === "[object Array]" ) {
		if ( !prune ) {
			results.push.apply( results, checkSet );
		} else if ( context && context.nodeType === 1 ) {
			for ( var i = 0; checkSet[i] != null; i++ ) {
				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
					results.push( set[i] );
		} else {
			for ( var i = 0; checkSet[i] != null; i++ ) {
				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
					results.push( set[i] );
	} else {
		makeArray( checkSet, results );
	if ( extra ) {
		Sizzle( extra, origContext, results, seed );
		Sizzle.uniqueSort( results );
	return results;
Sizzle.uniqueSort = function(results){
	if ( sortOrder ) {
		hasDuplicate = baseHasDuplicate;
		results.sort(sortOrder);
		if ( hasDuplicate ) {
			for ( var i = 1; i < results.length; i++ ) {
				if ( results[i] === results[i-1] ) {
					results.splice(i--, 1);
	return results;
Sizzle.matches = function(expr, set){
	return Sizzle(expr, null, null, set);
Sizzle.find = function(expr, context, isXML){
	var set, match;
	if ( !expr ) {
		return [];
	for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
		var type = Expr.order[i], match;
		if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
			var left = match[1];
			match.splice(1,1);
			if ( left.substr( left.length - 1 ) !== "\\" ) {
				match[1] = (match[1] || "").replace(/\\/g, "");
				set = Expr.find[ type ]( match, context, isXML );
				if ( set != null ) {
					expr = expr.replace( Expr.match[ type ], "" );
					break;
	if ( !set ) {
		set = context.getElementsByTagName("*");
	return {set: set, expr: expr};
Sizzle.filter = function(expr, set, inplace, not){
	var old = expr, result = [], curLoop = set, match, anyFound,
		isXMLFilter = set && set[0] && isXML(set[0]);
	while ( expr && set.length ) {
		for ( var type in Expr.filter ) {
			if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
				var filter = Expr.filter[ type ], found, item, left = match[1];
				anyFound = false;
				match.splice(1,1);
				if ( left.substr( left.length - 1 ) === "\\" ) {
					continue;
				if ( curLoop === result ) {
					result = [];
				if ( Expr.preFilter[ type ] ) {
					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
					if ( !match ) {
						anyFound = found = true;
					} else if ( match === true ) {
						continue;
					}
				if ( match ) {
					for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
						if ( item ) {
							found = filter( item, match, i, curLoop );
							var pass = not ^ !!found;
							if ( inplace && found != null ) {
								if ( pass ) {
									anyFound = true;
								} else {
									curLoop[i] = false;
								}
							} else if ( pass ) {
								result.push( item );
								anyFound = true;
							}
						}
					}
				if ( found !== undefined ) {
					if ( !inplace ) {
						curLoop = result;
					}
					expr = expr.replace( Expr.match[ type ], "" );
					if ( !anyFound ) {
						return [];
					}
					break;
		// Improper expression
		if ( expr === old ) {
			if ( anyFound == null ) {
				Sizzle.error( expr );
			} else {
				break;
		old = expr;
	return curLoop;
Sizzle.error = function( msg ) {
	throw "Syntax error, unrecognized expression: " + msg;
var Expr = Sizzle.selectors = {
	order: [ "ID", "NAME", "TAG" ],
	match: {
		ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
		CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,
		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
		TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,
		CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,
		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,
		PSEUDO: /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
	leftMatch: {},
	attrMap: {
		"class": "className",
		"for": "htmlFor"
	attrHandle: {
		href: function(elem){
			return elem.getAttribute("href");
	relative: {
		"+": function(checkSet, part){
			var isPartStr = typeof part === "string",
				isTag = isPartStr && !/\W/.test(part),
				isPartStrNotTag = isPartStr && !isTag;
			if ( isTag ) {
				part = part.toLowerCase();
			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
				if ( (elem = checkSet[i]) ) {
					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
					checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
						elem || false :
						elem === part;
			if ( isPartStrNotTag ) {
				Sizzle.filter( part, checkSet, true );
		">": function(checkSet, part){
			var isPartStr = typeof part === "string";
			if ( isPartStr && !/\W/.test(part) ) {
				part = part.toLowerCase();
				for ( var i = 0, l = checkSet.length; i < l; i++ ) {
					var elem = checkSet[i];
					if ( elem ) {
						var parent = elem.parentNode;
						checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
					}
			} else {
				for ( var i = 0, l = checkSet.length; i < l; i++ ) {
					var elem = checkSet[i];
					if ( elem ) {
						checkSet[i] = isPartStr ?
							elem.parentNode :
							elem.parentNode === part;
					}
				if ( isPartStr ) {
					Sizzle.filter( part, checkSet, true );
		"": function(checkSet, part, isXML){
			var doneName = done++, checkFn = dirCheck;
			if ( typeof part === "string" && !/\W/.test(part) ) {
				var nodeCheck = part = part.toLowerCase();
				checkFn = dirNodeCheck;
			checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
		"~": function(checkSet, part, isXML){
			var doneName = done++, checkFn = dirCheck;
			if ( typeof part === "string" && !/\W/.test(part) ) {
				var nodeCheck = part = part.toLowerCase();
				checkFn = dirNodeCheck;
			checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
	find: {
		ID: function(match, context, isXML){
			if ( typeof context.getElementById !== "undefined" && !isXML ) {
				var m = context.getElementById(match[1]);
				return m ? [m] : [];
		NAME: function(match, context){
			if ( typeof context.getElementsByName !== "undefined" ) {
				var ret = [], results = context.getElementsByName(match[1]);
				for ( var i = 0, l = results.length; i < l; i++ ) {
					if ( results[i].getAttribute("name") === match[1] ) {
						ret.push( results[i] );
					}
				return ret.length === 0 ? null : ret;
		TAG: function(match, context){
			return context.getElementsByTagName(match[1]);
	preFilter: {
		CLASS: function(match, curLoop, inplace, result, not, isXML){
			match = " " + match[1].replace(/\\/g, "") + " ";
			if ( isXML ) {
				return match;
			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
				if ( elem ) {
					if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n]/g, " ").indexOf(match) >= 0) ) {
						if ( !inplace ) {
							result.push( elem );
						}
					} else if ( inplace ) {
						curLoop[i] = false;
					}
			return false;
		ID: function(match){
			return match[1].replace(/\\/g, "");
		TAG: function(match, curLoop){
			return match[1].toLowerCase();
		CHILD: function(match){
			if ( match[1] === "nth" ) {
				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
				var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
					match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
				// calculate the numbers (first)n+(last) including if they are negative
				match[2] = (test[1] + (test[2] || 1)) - 0;
				match[3] = test[3] - 0;
			// TODO: Move to normal caching system
			match[0] = done++;
			return match;
		ATTR: function(match, curLoop, inplace, result, not, isXML){
			var name = match[1].replace(/\\/g, "");
			if ( !isXML && Expr.attrMap[name] ) {
				match[1] = Expr.attrMap[name];
			if ( match[2] === "~=" ) {
				match[4] = " " + match[4] + " ";
			return match;
		PSEUDO: function(match, curLoop, inplace, result, not){
			if ( match[1] === "not" ) {
				// If we're dealing with a complex expression, or a simple one
				if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
					match[3] = Sizzle(match[3], null, null, curLoop);
				} else {
					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
					if ( !inplace ) {
						result.push.apply( result, ret );
					}
					return false;
			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
				return true;
			return match;
		POS: function(match){
			match.unshift( true );
			return match;
	filters: {
		enabled: function(elem){
			return elem.disabled === false && elem.type !== "hidden";
		disabled: function(elem){
			return elem.disabled === true;
		checked: function(elem){
			return elem.checked === true;
		selected: function(elem){
			// Accessing this property makes selected-by-default
			// options in Safari work properly
			elem.parentNode.selectedIndex;
			return elem.selected === true;
		parent: function(elem){
			return !!elem.firstChild;
		empty: function(elem){
			return !elem.firstChild;
		has: function(elem, i, match){
			return !!Sizzle( match[3], elem ).length;
		header: function(elem){
			return /h\d/i.test( elem.nodeName );
		text: function(elem){
			return "text" === elem.type;
		radio: function(elem){
			return "radio" === elem.type;
		checkbox: function(elem){
			return "checkbox" === elem.type;
		file: function(elem){
			return "file" === elem.type;
		password: function(elem){
			return "password" === elem.type;
		submit: function(elem){
			return "submit" === elem.type;
		image: function(elem){
			return "image" === elem.type;
		reset: function(elem){
			return "reset" === elem.type;
		button: function(elem){
			return "button" === elem.type || elem.nodeName.toLowerCase() === "button";
		input: function(elem){
			return /input|select|textarea|button/i.test(elem.nodeName);
	setFilters: {
		first: function(elem, i){
			return i === 0;
		last: function(elem, i, match, array){
			return i === array.length - 1;
		even: function(elem, i){
			return i % 2 === 0;
		odd: function(elem, i){
			return i % 2 === 1;
		lt: function(elem, i, match){
			return i < match[3] - 0;
		gt: function(elem, i, match){
			return i > match[3] - 0;
		nth: function(elem, i, match){
			return match[3] - 0 === i;
		eq: function(elem, i, match){
			return match[3] - 0 === i;
	filter: {
		PSEUDO: function(elem, match, i, array){
			var name = match[1], filter = Expr.filters[ name ];
			if ( filter ) {
				return filter( elem, i, match, array );
			} else if ( name === "contains" ) {
				return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
			} else if ( name === "not" ) {
				var not = match[3];
				for ( var i = 0, l = not.length; i < l; i++ ) {
					if ( not[i] === elem ) {
						return false;
					}
				return true;
			} else {
				Sizzle.error( "Syntax error, unrecognized expression: " + name );
		CHILD: function(elem, match){
			var type = match[1], node = elem;
			switch (type) {
				case 'only':
				case 'first':
					while ( (node = node.previousSibling) )	 {
						if ( node.nodeType === 1 ) { 
							return false; 
						}
					}
					if ( type === "first" ) { 
						return true; 
					}
					node = elem;
				case 'last':
					while ( (node = node.nextSibling) )	 {
						if ( node.nodeType === 1 ) { 
							return false; 
						}
					}
					return true;
				case 'nth':
					var first = match[2], last = match[3];
					if ( first === 1 && last === 0 ) {
						return true;
					}
					var doneName = match[0],
						parent = elem.parentNode;
					if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
						var count = 0;
						for ( node = parent.firstChild; node; node = node.nextSibling ) {
							if ( node.nodeType === 1 ) {
								node.nodeIndex = ++count;
							}
						} 
						parent.sizcache = doneName;
					}
					var diff = elem.nodeIndex - last;
					if ( first === 0 ) {
						return diff === 0;
					} else {
						return ( diff % first === 0 && diff / first >= 0 );
					}
		ID: function(elem, match){
			return elem.nodeType === 1 && elem.getAttribute("id") === match;
		TAG: function(elem, match){
			return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
		CLASS: function(elem, match){
			return (" " + (elem.className || elem.getAttribute("class")) + " ")
				.indexOf( match ) > -1;
		ATTR: function(elem, match){
			var name = match[1],
				result = Expr.attrHandle[ name ] ?
					Expr.attrHandle[ name ]( elem ) :
					elem[ name ] != null ?
						elem[ name ] :
						elem.getAttribute( name ),
				value = result + "",
				type = match[2],
				check = match[4];
			return result == null ?
				type === "!=" :
				type === "=" ?
				value === check :
				type === "*=" ?
				value.indexOf(check) >= 0 :
				type === "~=" ?
				(" " + value + " ").indexOf(check) >= 0 :
				!check ?
				value && result !== false :
				type === "!=" ?
				value !== check :
				type === "^=" ?
				value.indexOf(check) === 0 :
				type === "$=" ?
				value.substr(value.length - check.length) === check :
				type === "|=" ?
				value === check || value.substr(0, check.length + 1) === check + "-" :
				false;
		POS: function(elem, match, i, array){
			var name = match[2], filter = Expr.setFilters[ name ];
			if ( filter ) {
				return filter( elem, i, match, array );
var origPOS = Expr.match.POS;
for ( var type in Expr.match ) {
	Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
	Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, function(all, num){
		return "\\" + (num - 0 + 1);
var makeArray = function(array, results) {
	array = Array.prototype.slice.call( array, 0 );
	if ( results ) {
		results.push.apply( results, array );
		return results;
	return array;
// Perform a simple check to determine if the browser is capable of
// converting a NodeList to an array using builtin methods.
// Also verifies that the returned array holds DOM nodes
// (which is not the case in the Blackberry browser)
	Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
// Provide a fallback method if it does not work
} catch(e){
	makeArray = function(array, results) {
		var ret = results || [];
		if ( toString.call(array) === "[object Array]" ) {
			Array.prototype.push.apply( ret, array );
		} else {
			if ( typeof array.length === "number" ) {
				for ( var i = 0, l = array.length; i < l; i++ ) {
					ret.push( array[i] );
			} else {
				for ( var i = 0; array[i]; i++ ) {
					ret.push( array[i] );
		return ret;
var sortOrder;
if ( document.documentElement.compareDocumentPosition ) {
	sortOrder = function( a, b ) {
		if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
			if ( a == b ) {
				hasDuplicate = true;
			return a.compareDocumentPosition ? -1 : 1;
		var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
		if ( ret === 0 ) {
			hasDuplicate = true;
		return ret;
} else if ( "sourceIndex" in document.documentElement ) {
	sortOrder = function( a, b ) {
		if ( !a.sourceIndex || !b.sourceIndex ) {
			if ( a == b ) {
				hasDuplicate = true;
			return a.sourceIndex ? -1 : 1;
		var ret = a.sourceIndex - b.sourceIndex;
		if ( ret === 0 ) {
			hasDuplicate = true;
		return ret;
} else if ( document.createRange ) {
	sortOrder = function( a, b ) {
		if ( !a.ownerDocument || !b.ownerDocument ) {
			if ( a == b ) {
				hasDuplicate = true;
			return a.ownerDocument ? -1 : 1;
		var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
		aRange.setStart(a, 0);
		aRange.setEnd(a, 0);
		bRange.setStart(b, 0);
		bRange.setEnd(b, 0);
		var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
		if ( ret === 0 ) {
			hasDuplicate = true;
		return ret;
// Utility function for retreiving the text value of an array of DOM nodes
function getText( elems ) {
	var ret = "", elem;
	for ( var i = 0; elems[i]; i++ ) {
		elem = elems[i];
		// Get the text from text nodes and CDATA nodes
		if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
			ret += elem.nodeValue;
		// Traverse everything else, except comment nodes
		} else if ( elem.nodeType !== 8 ) {
			ret += getText( elem.childNodes );
	return ret;
// Check to see if the browser returns elements by name when
// querying by getElementById (and provide a workaround)
(function(){
	// We're going to inject a fake input element with a specified name
	var form = document.createElement("div"),
		id = "script" + (new Date).getTime();
	form.innerHTML = "<a name='" + id + "'/>";
	// Inject it into the root element, check its status, and remove it quickly
	var root = document.documentElement;
	root.insertBefore( form, root.firstChild );
	// The workaround has to do additional checks after a getElementById
	// Which slows things down for other browsers (hence the branching)
	if ( document.getElementById( id ) ) {
		Expr.find.ID = function(match, context, isXML){
			if ( typeof context.getElementById !== "undefined" && !isXML ) {
				var m = context.getElementById(match[1]);
				return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
		Expr.filter.ID = function(elem, match){
			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
			return elem.nodeType === 1 && node && node.nodeValue === match;
	root.removeChild( form );
	root = form = null; // release memory in IE
(function(){
	// Check to see if the browser returns only elements
	// when doing getElementsByTagName("*")
	// Create a fake element
	var div = document.createElement("div");
	div.appendChild( document.createComment("") );
	// Make sure no comments are found
	if ( div.getElementsByTagName("*").length > 0 ) {
		Expr.find.TAG = function(match, context){
			var results = context.getElementsByTagName(match[1]);
			// Filter out possible comments
			if ( match[1] === "*" ) {
				var tmp = [];
				for ( var i = 0; results[i]; i++ ) {
					if ( results[i].nodeType === 1 ) {
						tmp.push( results[i] );
					}
				results = tmp;
			return results;
	// Check to see if an attribute returns normalized href attributes
	div.innerHTML = "<a href='#'></a>";
	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
			div.firstChild.getAttribute("href") !== "#" ) {
		Expr.attrHandle.href = function(elem){
			return elem.getAttribute("href", 2);
	div = null; // release memory in IE
if ( document.querySelectorAll ) {
	(function(){
		var oldSizzle = Sizzle, div = document.createElement("div");
		div.innerHTML = "<p class='TEST'></p>";
		// Safari can't handle uppercase or unicode characters when
		// in quirks mode.
		if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
			return;
		Sizzle = function(query, context, extra, seed){
			context = context || document;
			// Only use querySelectorAll on non-XML documents
			// (ID selectors don't work in non-HTML documents)
			if ( !seed && context.nodeType === 9 && !isXML(context) ) {
				try {
					return makeArray( context.querySelectorAll(query), extra );
				} catch(e){}
			return oldSizzle(query, context, extra, seed);
		for ( var prop in oldSizzle ) {
			Sizzle[ prop ] = oldSizzle[ prop ];
		div = null; // release memory in IE
	})();
(function(){
	var div = document.createElement("div");
	div.innerHTML = "<div class='test e'></div><div class='test'></div>";
	// Opera can't find a second classname (in 9.6)
	// Also, make sure that getElementsByClassName actually exists
	if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
		return;
	// Safari caches class attributes, doesn't catch changes (in 3.2)
	div.lastChild.className = "e";
	if ( div.getElementsByClassName("e").length === 1 ) {
		return;
	Expr.order.splice(1, 0, "CLASS");
	Expr.find.CLASS = function(match, context, isXML) {
		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
			return context.getElementsByClassName(match[1]);
	div = null; // release memory in IE
function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
		var elem = checkSet[i];
		if ( elem ) {
			elem = elem[dir];
			var match = false;
			while ( elem ) {
				if ( elem.sizcache === doneName ) {
					match = checkSet[elem.sizset];
					break;
				if ( elem.nodeType === 1 && !isXML ){
					elem.sizcache = doneName;
					elem.sizset = i;
				if ( elem.nodeName.toLowerCase() === cur ) {
					match = elem;
					break;
				elem = elem[dir];
			checkSet[i] = match;
function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
		var elem = checkSet[i];
		if ( elem ) {
			elem = elem[dir];
			var match = false;
			while ( elem ) {
				if ( elem.sizcache === doneName ) {
					match = checkSet[elem.sizset];
					break;
				if ( elem.nodeType === 1 ) {
					if ( !isXML ) {
						elem.sizcache = doneName;
						elem.sizset = i;
					}
					if ( typeof cur !== "string" ) {
						if ( elem === cur ) {
							match = true;
							break;
						}
					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
						match = elem;
						break;
					}
				elem = elem[dir];
			checkSet[i] = match;
var contains = document.compareDocumentPosition ? function(a, b){
	return !!(a.compareDocumentPosition(b) & 16);
} : function(a, b){
	return a !== b && (a.contains ? a.contains(b) : true);
var isXML = function(elem){
	// documentElement is verified for cases where it doesn't yet exist
	// (such as loading iframes in IE - #4833) 
	var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
	return documentElement ? documentElement.nodeName !== "HTML" : false;
var posProcess = function(selector, context){
	var tmpSet = [], later = "", match,
		root = context.nodeType ? [context] : context;
	// Position selectors must be done after the filter
	// And so must :not(positional) so we move all PSEUDOs to the end
	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
		later += match[0];
		selector = selector.replace( Expr.match.PSEUDO, "" );
	selector = Expr.relative[selector] ? selector + "*" : selector;
	for ( var i = 0, l = root.length; i < l; i++ ) {
		Sizzle( selector, root[i], tmpSet );
	return Sizzle.filter( later, tmpSet );
// EXPOSE
jQuery.find = Sizzle;
jQuery.expr = Sizzle.selectors;
jQuery.expr[":"] = jQuery.expr.filters;
jQuery.unique = Sizzle.uniqueSort;
jQuery.text = getText;
jQuery.isXMLDoc = isXML;
jQuery.contains = contains;
return;
window.Sizzle = Sizzle;
var runtil = /Until$/,
	rparentsprev = /^(?:parents|prevUntil|prevAll)/,
	// Note: This RegExp should be improved, or likely pulled from Sizzle
	rmultiselector = /,/,
	slice = Array.prototype.slice;
// Implement the identical functionality for filter and not
var winnow = function( elements, qualifier, keep ) {
	if ( jQuery.isFunction( qualifier ) ) {
		return jQuery.grep(elements, function( elem, i ) {
			return !!qualifier.call( elem, i, elem ) === keep;
	} else if ( qualifier.nodeType ) {
		return jQuery.grep(elements, function( elem, i ) {
			return (elem === qualifier) === keep;
	} else if ( typeof qualifier === "string" ) {
		var filtered = jQuery.grep(elements, function( elem ) {
			return elem.nodeType === 1;
		if ( isSimple.test( qualifier ) ) {
			return jQuery.filter(qualifier, filtered, !keep);
		} else {
			qualifier = jQuery.filter( qualifier, filtered );
	return jQuery.grep(elements, function( elem, i ) {
		return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
jQuery.fn.extend({
	find: function( selector ) {
		var ret = this.pushStack( "", "find", selector ), length = 0;
		for ( var i = 0, l = this.length; i < l; i++ ) {
			length = ret.length;
			jQuery.find( selector, this[i], ret );
			if ( i > 0 ) {
				// Make sure that the results are unique
				for ( var n = length; n < ret.length; n++ ) {
					for ( var r = 0; r < length; r++ ) {
						if ( ret[r] === ret[n] ) {
							ret.splice(n--, 1);
							break;
						}
					}
		return ret;
	has: function( target ) {
		var targets = jQuery( target );
		return this.filter(function() {
			for ( var i = 0, l = targets.length; i < l; i++ ) {
				if ( jQuery.contains( this, targets[i] ) ) {
					return true;
	not: function( selector ) {
		return this.pushStack( winnow(this, selector, false), "not", selector);
	filter: function( selector ) {
		return this.pushStack( winnow(this, selector, true), "filter", selector );
	is: function( selector ) {
		return !!selector && jQuery.filter( selector, this ).length > 0;
	closest: function( selectors, context ) {
		if ( jQuery.isArray( selectors ) ) {
			var ret = [], cur = this[0], match, matches = {}, selector;
			if ( cur && selectors.length ) {
				for ( var i = 0, l = selectors.length; i < l; i++ ) {
					selector = selectors[i];
					if ( !matches[selector] ) {
						matches[selector] = jQuery.expr.match.POS.test( selector ) ? 
							jQuery( selector, context || this.context ) :
							selector;
					}
				while ( cur && cur.ownerDocument && cur !== context ) {
					for ( selector in matches ) {
						match = matches[selector];
						if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) {
							ret.push({ selector: selector, elem: cur });
							delete matches[selector];
						}
					}
					cur = cur.parentNode;
			return ret;
		var pos = jQuery.expr.match.POS.test( selectors ) ? 
			jQuery( selectors, context || this.context ) : null;
		return this.map(function( i, cur ) {
			while ( cur && cur.ownerDocument && cur !== context ) {
				if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selectors) ) {
					return cur;
				cur = cur.parentNode;
			return null;
	// Determine the position of an element within
	// the matched set of elements
	index: function( elem ) {
		if ( !elem || typeof elem === "string" ) {
			return jQuery.inArray( this[0],
				// If it receives a string, the selector is used
				// If it receives nothing, the siblings are used
				elem ? jQuery( elem ) : this.parent().children() );
		// Locate the position of the desired element
		return jQuery.inArray(
			// If it receives a jQuery object, the first element is used
			elem.jquery ? elem[0] : elem, this );
	add: function( selector, context ) {
		var set = typeof selector === "string" ?
				jQuery( selector, context || this.context ) :
				jQuery.makeArray( selector ),
			all = jQuery.merge( this.get(), set );
		return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
			all :
			jQuery.unique( all ) );
	andSelf: function() {
		return this.add( this.prevObject );
// A painfully simple check to see if an element is disconnected
// from a document (should be improved, where feasible).
function isDisconnected( node ) {
	return !node || !node.parentNode || node.parentNode.nodeType === 11;
jQuery.each({
	parent: function( elem ) {
		var parent = elem.parentNode;
		return parent && parent.nodeType !== 11 ? parent : null;
	parents: function( elem ) {
		return jQuery.dir( elem, "parentNode" );
	parentsUntil: function( elem, i, until ) {
		return jQuery.dir( elem, "parentNode", until );
	next: function( elem ) {
		return jQuery.nth( elem, 2, "nextSibling" );
	prev: function( elem ) {
		return jQuery.nth( elem, 2, "previousSibling" );
	nextAll: function( elem ) {
		return jQuery.dir( elem, "nextSibling" );
	prevAll: function( elem ) {
		return jQuery.dir( elem, "previousSibling" );
	nextUntil: function( elem, i, until ) {
		return jQuery.dir( elem, "nextSibling", until );
	prevUntil: function( elem, i, until ) {
		return jQuery.dir( elem, "previousSibling", until );
	siblings: function( elem ) {
		return jQuery.sibling( elem.parentNode.firstChild, elem );
	children: function( elem ) {
		return jQuery.sibling( elem.firstChild );
	contents: function( elem ) {
		return jQuery.nodeName( elem, "iframe" ) ?
			elem.contentDocument || elem.contentWindow.document :
			jQuery.makeArray( elem.childNodes );
}, function( name, fn ) {
	jQuery.fn[ name ] = function( until, selector ) {
		var ret = jQuery.map( this, fn, until );
		if ( !runtil.test( name ) ) {
			selector = until;
		if ( selector && typeof selector === "string" ) {
			ret = jQuery.filter( selector, ret );
		ret = this.length > 1 ? jQuery.unique( ret ) : ret;
		if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
			ret = ret.reverse();
		return this.pushStack( ret, name, slice.call(arguments).join(",") );
jQuery.extend({
	filter: function( expr, elems, not ) {
		if ( not ) {
			expr = ":not(" + expr + ")";
		return jQuery.find.matches(expr, elems);
	dir: function( elem, dir, until ) {
		var matched = [], cur = elem[dir];
		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
			if ( cur.nodeType === 1 ) {
				matched.push( cur );
			cur = cur[dir];
		return matched;
	nth: function( cur, result, dir, elem ) {
		result = result || 1;
		var num = 0;
		for ( ; cur; cur = cur[dir] ) {
			if ( cur.nodeType === 1 && ++num === result ) {
				break;
		return cur;
	sibling: function( n, elem ) {
		var r = [];
		for ( ; n; n = n.nextSibling ) {
			if ( n.nodeType === 1 && n !== elem ) {
				r.push( n );
		return r;
var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
	rleadingWhitespace = /^\s+/,
	rxhtmlTag = /(<([\w:]+)[^>]*?)\/>/g,
	rselfClosing = /^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,
	rtagName = /<([\w:]+)/,
	rtbody = /<tbody/i,
	rhtml = /<|&#?\w+;/,
	rnocache = /<script|<object|<embed|<option|<style/i,
	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,  // checked="checked" or checked (html5)
	fcloseTag = function( all, front, tag ) {
		return rselfClosing.test( tag ) ?
			all :
			front + "></" + tag + ">";
	wrapMap = {
		option: [ 1, "<select multiple='multiple'>", "</select>" ],
		legend: [ 1, "<fieldset>", "</fieldset>" ],
		thead: [ 1, "<table>", "</table>" ],
		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
		area: [ 1, "<map>", "</map>" ],
		_default: [ 0, "", "" ]
wrapMap.optgroup = wrapMap.option;
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
wrapMap.th = wrapMap.td;
// IE can't serialize <link> and <script> tags normally
if ( !jQuery.support.htmlSerialize ) {
	wrapMap._default = [ 1, "div<div>", "</div>" ];
jQuery.fn.extend({
	text: function( text ) {
		if ( jQuery.isFunction(text) ) {
			return this.each(function(i) {
				var self = jQuery(this);
				self.text( text.call(this, i, self.text()) );
			});
		if ( typeof text !== "object" && text !== undefined ) {
			return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
		return jQuery.text( this );
	wrapAll: function( html ) {
		if ( jQuery.isFunction( html ) ) {
			return this.each(function(i) {
				jQuery(this).wrapAll( html.call(this, i) );
			});
		if ( this[0] ) {
			// The elements to wrap the target around
			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
			if ( this[0].parentNode ) {
				wrap.insertBefore( this[0] );
			wrap.map(function() {
				var elem = this;
				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
					elem = elem.firstChild;
				return elem;
			}).append(this);
		return this;
	wrapInner: function( html ) {
		if ( jQuery.isFunction( html ) ) {
			return this.each(function(i) {
				jQuery(this).wrapInner( html.call(this, i) );
			});
		return this.each(function() {
			var self = jQuery( this ), contents = self.contents();
			if ( contents.length ) {
				contents.wrapAll( html );
			} else {
				self.append( html );
	wrap: function( html ) {
		return this.each(function() {
			jQuery( this ).wrapAll( html );
	unwrap: function() {
		return this.parent().each(function() {
			if ( !jQuery.nodeName( this, "body" ) ) {
				jQuery( this ).replaceWith( this.childNodes );
		}).end();
	append: function() {
		return this.domManip(arguments, true, function( elem ) {
			if ( this.nodeType === 1 ) {
				this.appendChild( elem );
	prepend: function() {
		return this.domManip(arguments, true, function( elem ) {
			if ( this.nodeType === 1 ) {
				this.insertBefore( elem, this.firstChild );
	before: function() {
		if ( this[0] && this[0].parentNode ) {
			return this.domManip(arguments, false, function( elem ) {
				this.parentNode.insertBefore( elem, this );
			});
		} else if ( arguments.length ) {
			var set = jQuery(arguments[0]);
			set.push.apply( set, this.toArray() );
			return this.pushStack( set, "before", arguments );
	after: function() {
		if ( this[0] && this[0].parentNode ) {
			return this.domManip(arguments, false, function( elem ) {
				this.parentNode.insertBefore( elem, this.nextSibling );
			});
		} else if ( arguments.length ) {
			var set = this.pushStack( this, "after", arguments );
			set.push.apply( set, jQuery(arguments[0]).toArray() );
			return set;
	// keepData is for internal use only--do not document
	remove: function( selector, keepData ) {
		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
				if ( !keepData && elem.nodeType === 1 ) {
					jQuery.cleanData( elem.getElementsByTagName("*") );
					jQuery.cleanData( [ elem ] );
				if ( elem.parentNode ) {
					 elem.parentNode.removeChild( elem );
		return this;
	empty: function() {
		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
			// Remove element nodes and prevent memory leaks
			if ( elem.nodeType === 1 ) {
				jQuery.cleanData( elem.getElementsByTagName("*") );
			// Remove any remaining nodes
			while ( elem.firstChild ) {
				elem.removeChild( elem.firstChild );
		return this;
	clone: function( events ) {
		// Do the clone
		var ret = this.map(function() {
			if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {
				// IE copies events bound via attachEvent when
				// using cloneNode. Calling detachEvent on the
				// clone will also remove the events from the orignal
				// In order to get around this, we use innerHTML.
				// Unfortunately, this means some modifications to
				// attributes in IE that are actually only stored
				// as properties will not be copied (such as the
				// the name attribute on an input).
				var html = this.outerHTML, ownerDocument = this.ownerDocument;
				if ( !html ) {
					var div = ownerDocument.createElement("div");
					div.appendChild( this.cloneNode(true) );
					html = div.innerHTML;
				return jQuery.clean([html.replace(rinlinejQuery, "")
					// Handle the case in IE 8 where action=/test/> self-closes a tag
					.replace(/=([^="'>\s]+\/)>/g, '="$1">')
					.replace(rleadingWhitespace, "")], ownerDocument)[0];
			} else {
				return this.cloneNode(true);
		// Copy the events from the original to the clone
		if ( events === true ) {
			cloneCopyEvent( this, ret );
			cloneCopyEvent( this.find("*"), ret.find("*") );
		// Return the cloned set
		return ret;
	html: function( value ) {
		if ( value === undefined ) {
			return this[0] && this[0].nodeType === 1 ?
				this[0].innerHTML.replace(rinlinejQuery, "") :
				null;
		// See if we can take a shortcut and just use innerHTML
		} else if ( typeof value === "string" && !rnocache.test( value ) &&
			(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
			!wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
			value = value.replace(rxhtmlTag, fcloseTag);
			try {
				for ( var i = 0, l = this.length; i < l; i++ ) {
					// Remove element nodes and prevent memory leaks
					if ( this[i].nodeType === 1 ) {
						jQuery.cleanData( this[i].getElementsByTagName("*") );
						this[i].innerHTML = value;
					}
			// If using innerHTML throws an exception, use the fallback method
			} catch(e) {
				this.empty().append( value );
		} else if ( jQuery.isFunction( value ) ) {
			this.each(function(i){
				var self = jQuery(this), old = self.html();
				self.empty().append(function(){
					return value.call( this, i, old );
				});
			});
		} else {
			this.empty().append( value );
		return this;
	replaceWith: function( value ) {
		if ( this[0] && this[0].parentNode ) {
			// Make sure that the elements are removed from the DOM before they are inserted
			// this can help fix replacing a parent with child elements
			if ( jQuery.isFunction( value ) ) {
				return this.each(function(i) {
					var self = jQuery(this), old = self.html();
					self.replaceWith( value.call( this, i, old ) );
				});
			if ( typeof value !== "string" ) {
				value = jQuery(value).detach();
			return this.each(function() {
				var next = this.nextSibling, parent = this.parentNode;
				jQuery(this).remove();
				if ( next ) {
					jQuery(next).before( value );
				} else {
					jQuery(parent).append( value );
			});
		} else {
			return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value );
	detach: function( selector ) {
		return this.remove( selector, true );
	domManip: function( args, table, callback ) {
		var results, first, value = args[0], scripts = [], fragment, parent;
		// We can't cloneNode fragments that contain checked, in WebKit
		if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
			return this.each(function() {
				jQuery(this).domManip( args, table, callback, true );
			});
		if ( jQuery.isFunction(value) ) {
			return this.each(function(i) {
				var self = jQuery(this);
				args[0] = value.call(this, i, table ? self.html() : undefined);
				self.domManip( args, table, callback );
			});
		if ( this[0] ) {
			parent = value && value.parentNode;
			// If we're in a fragment, just use that instead of building a new one
			if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
				results = { fragment: parent };
			} else {
				results = buildFragment( args, this, scripts );
			fragment = results.fragment;
			if ( fragment.childNodes.length === 1 ) {
				first = fragment = fragment.firstChild;
			} else {
				first = fragment.firstChild;
			if ( first ) {
				table = table && jQuery.nodeName( first, "tr" );
				for ( var i = 0, l = this.length; i < l; i++ ) {
					callback.call(
						table ?
							root(this[i], first) :
							this[i],
						i > 0 || results.cacheable || this.length > 1  ?
							fragment.cloneNode(true) :
							fragment
					);
			if ( scripts.length ) {
				jQuery.each( scripts, evalScript );
		return this;
		function root( elem, cur ) {
			return jQuery.nodeName(elem, "table") ?
				(elem.getElementsByTagName("tbody")[0] ||
				elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
				elem;
function cloneCopyEvent(orig, ret) {
	var i = 0;
	ret.each(function() {
		if ( this.nodeName !== (orig[i] && orig[i].nodeName) ) {
			return;
		var oldData = jQuery.data( orig[i++] ), curData = jQuery.data( this, oldData ), events = oldData && oldData.events;
		if ( events ) {
			delete curData.handle;
			curData.events = {};
			for ( var type in events ) {
				for ( var handler in events[ type ] ) {
					jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data );
function buildFragment( args, nodes, scripts ) {
	var fragment, cacheable, cacheresults,
		doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);
	// Only cache "small" (1/2 KB) strings that are associated with the main document
	// Cloning options loses the selected state, so don't cache them
	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
	if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
		!rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
		cacheable = true;
		cacheresults = jQuery.fragments[ args[0] ];
		if ( cacheresults ) {
			if ( cacheresults !== 1 ) {
				fragment = cacheresults;
	if ( !fragment ) {
		fragment = doc.createDocumentFragment();
		jQuery.clean( args, doc, fragment, scripts );
	if ( cacheable ) {
		jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
	return { fragment: fragment, cacheable: cacheable };
jQuery.fragments = {};
jQuery.each({
	appendTo: "append",
	prependTo: "prepend",
	insertBefore: "before",
	insertAfter: "after",
	replaceAll: "replaceWith"
}, function( name, original ) {
	jQuery.fn[ name ] = function( selector ) {
		var ret = [], insert = jQuery( selector ),
			parent = this.length === 1 && this[0].parentNode;
		if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
			insert[ original ]( this[0] );
			return this;
		} else {
			for ( var i = 0, l = insert.length; i < l; i++ ) {
				var elems = (i > 0 ? this.clone(true) : this).get();
				jQuery.fn[ original ].apply( jQuery(insert[i]), elems );
				ret = ret.concat( elems );
			return this.pushStack( ret, name, insert.selector );
jQuery.extend({
	clean: function( elems, context, fragment, scripts ) {
		context = context || document;
		// !context.createElement fails in IE with an error but returns typeof 'object'
		if ( typeof context.createElement === "undefined" ) {
			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
		var ret = [];
		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
			if ( typeof elem === "number" ) {
				elem += "";
			if ( !elem ) {
				continue;
			// Convert html string into DOM nodes
			if ( typeof elem === "string" && !rhtml.test( elem ) ) {
				elem = context.createTextNode( elem );
			} else if ( typeof elem === "string" ) {
				// Fix "XHTML"-style tags in all browsers
				elem = elem.replace(rxhtmlTag, fcloseTag);
				// Trim whitespace, otherwise indexOf won't work as expected
				var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
					wrap = wrapMap[ tag ] || wrapMap._default,
					depth = wrap[0],
					div = context.createElement("div");
				// Go to html and back, then peel off extra wrappers
				div.innerHTML = wrap[1] + elem + wrap[2];
				// Move to the right depth
				while ( depth-- ) {
					div = div.lastChild;
				// Remove IE's autoinserted <tbody> from table fragments
				if ( !jQuery.support.tbody ) {
					// String was a <table>, *may* have spurious <tbody>
					var hasBody = rtbody.test(elem),
						tbody = tag === "table" && !hasBody ?
							div.firstChild && div.firstChild.childNodes :
							// String was a bare <thead> or <tfoot>
							wrap[1] === "<table>" && !hasBody ?
								div.childNodes :
								[];
					for ( var j = tbody.length - 1; j >= 0 ; --j ) {
						if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
							tbody[ j ].parentNode.removeChild( tbody[ j ] );
						}
					}
				// IE completely kills leading whitespace when innerHTML is used
				if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
					div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
				elem = div.childNodes;
			if ( elem.nodeType ) {
				ret.push( elem );
			} else {
				ret = jQuery.merge( ret, elem );
		if ( fragment ) {
			for ( var i = 0; ret[i]; i++ ) {
				if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
					scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
				} else {
					if ( ret[i].nodeType === 1 ) {
						ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
					}
					fragment.appendChild( ret[i] );
		return ret;
	cleanData: function( elems ) {
		var data, id, cache = jQuery.cache,
			special = jQuery.event.special,
			deleteExpando = jQuery.support.deleteExpando;
		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
			id = elem[ jQuery.expando ];
			if ( id ) {
				data = cache[ id ];
				if ( data.events ) {
					for ( var type in data.events ) {
						if ( special[ type ] ) {
							jQuery.event.remove( elem, type );
						} else {
							removeEvent( elem, type, data.handle );
						}
					}
				if ( deleteExpando ) {
					delete elem[ jQuery.expando ];
				} else if ( elem.removeAttribute ) {
					elem.removeAttribute( jQuery.expando );
				delete cache[ id ];
// exclude the following css properties to add px
var rexclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
	ralpha = /alpha\([^)]*\)/,
	ropacity = /opacity=([^)]*)/,
	rfloat = /float/i,
	rdashAlpha = /-([a-z])/ig,
	rupper = /([A-Z])/g,
	rnumpx = /^-?\d+(?:px)?$/i,
	rnum = /^-?\d/,
	cssShow = { position: "absolute", visibility: "hidden", display:"block" },
	cssWidth = [ "Left", "Right" ],
	cssHeight = [ "Top", "Bottom" ],
	// cache check for defaultView.getComputedStyle
	getComputedStyle = document.defaultView && document.defaultView.getComputedStyle,
	// normalize float css property
	styleFloat = jQuery.support.cssFloat ? "cssFloat" : "styleFloat",
	fcamelCase = function( all, letter ) {
		return letter.toUpperCase();
jQuery.fn.css = function( name, value ) {
	return access( this, name, value, true, function( elem, name, value ) {
		if ( value === undefined ) {
			return jQuery.curCSS( elem, name );
		if ( typeof value === "number" && !rexclude.test(name) ) {
			value += "px";
		jQuery.style( elem, name, value );
jQuery.extend({
	style: function( elem, name, value ) {
		// don't set styles on text and comment nodes
		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
			return undefined;
		// ignore negative width and height values #1599
		if ( (name === "width" || name === "height") && parseFloat(value) < 0 ) {
			value = undefined;
		var style = elem.style || elem, set = value !== undefined;
		// IE uses filters for opacity
		if ( !jQuery.support.opacity && name === "opacity" ) {
			if ( set ) {
				// IE has trouble with opacity if it does not have layout
				// Force it by setting the zoom level
				style.zoom = 1;
				// Set the alpha filter to set the opacity
				var opacity = parseInt( value, 10 ) + "" === "NaN" ? "" : "alpha(opacity=" + value * 100 + ")";
				var filter = style.filter || jQuery.curCSS( elem, "filter" ) || "";
				style.filter = ralpha.test(filter) ? filter.replace(ralpha, opacity) : opacity;
			return style.filter && style.filter.indexOf("opacity=") >= 0 ?
				(parseFloat( ropacity.exec(style.filter)[1] ) / 100) + "":
				"";
		// Make sure we're using the right name for getting the float value
		if ( rfloat.test( name ) ) {
			name = styleFloat;
		name = name.replace(rdashAlpha, fcamelCase);
		if ( set ) {
			style[ name ] = value;
		return style[ name ];
	css: function( elem, name, force, extra ) {
		if ( name === "width" || name === "height" ) {
			var val, props = cssShow, which = name === "width" ? cssWidth : cssHeight;
			function getWH() {
				val = name === "width" ? elem.offsetWidth : elem.offsetHeight;
				if ( extra === "border" ) {
					return;
				jQuery.each( which, function() {
					if ( !extra ) {
						val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
					}
					if ( extra === "margin" ) {
						val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0;
					} else {
						val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
					}
				});
			if ( elem.offsetWidth !== 0 ) {
				getWH();
			} else {
				jQuery.swap( elem, props, getWH );
			return Math.max(0, Math.round(val));
		return jQuery.curCSS( elem, name, force );
	curCSS: function( elem, name, force ) {
		var ret, style = elem.style, filter;
		// IE uses filters for opacity
		if ( !jQuery.support.opacity && name === "opacity" && elem.currentStyle ) {
			ret = ropacity.test(elem.currentStyle.filter || "") ?
				(parseFloat(RegExp.$1) / 100) + "" :
				"";
			return ret === "" ?
				"1" :
				ret;
		// Make sure we're using the right name for getting the float value
		if ( rfloat.test( name ) ) {
			name = styleFloat;
		if ( !force && style && style[ name ] ) {
			ret = style[ name ];
		} else if ( getComputedStyle ) {
			// Only "float" is needed here
			if ( rfloat.test( name ) ) {
				name = "float";
			name = name.replace( rupper, "-$1" ).toLowerCase();
			var defaultView = elem.ownerDocument.defaultView;
			if ( !defaultView ) {
				return null;
			var computedStyle = defaultView.getComputedStyle( elem, null );
			if ( computedStyle ) {
				ret = computedStyle.getPropertyValue( name );
			// We should always get a number back from opacity
			if ( name === "opacity" && ret === "" ) {
				ret = "1";
		} else if ( elem.currentStyle ) {
			var camelCase = name.replace(rdashAlpha, fcamelCase);
			ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
			// From the awesome hack by Dean Edwards
			// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
			// If we're not dealing with a regular pixel number
			// but a number that has a weird ending, we need to convert it to pixels
			if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
				// Remember the original values
				var left = style.left, rsLeft = elem.runtimeStyle.left;
				// Put in the new values to get a computed value out
				elem.runtimeStyle.left = elem.currentStyle.left;
				style.left = camelCase === "fontSize" ? "1em" : (ret || 0);
				ret = style.pixelLeft + "px";
				// Revert the changed values
				style.left = left;
				elem.runtimeStyle.left = rsLeft;
		return ret;
	// A method for quickly swapping in/out CSS properties to get correct calculations
	swap: function( elem, options, callback ) {
		var old = {};
		// Remember the old values, and insert the new ones
		for ( var name in options ) {
			old[ name ] = elem.style[ name ];
			elem.style[ name ] = options[ name ];
		callback.call( elem );
		// Revert the old values
		for ( var name in options ) {
			elem.style[ name ] = old[ name ];
if ( jQuery.expr && jQuery.expr.filters ) {
	jQuery.expr.filters.hidden = function( elem ) {
		var width = elem.offsetWidth, height = elem.offsetHeight,
			skip = elem.nodeName.toLowerCase() === "tr";
		return width === 0 && height === 0 && !skip ?
			true :
			width > 0 && height > 0 && !skip ?
				false :
				jQuery.curCSS(elem, "display") === "none";
	jQuery.expr.filters.visible = function( elem ) {
		return !jQuery.expr.filters.hidden( elem );
var jsc = now(),
	rscript = /<script(.|\s)*?\/script>/gi,
	rselectTextarea = /select|textarea/i,
	rinput = /color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,
	jsre = /=\?(&|$)/,
	rquery = /\?/,
	rts = /(\?|&)_=.*?(&|$)/,
	rurl = /^(\w+:)?\/\/([^\/?#]+)/,
	r20 = /%20/g,
	// Keep a copy of the old load method
	_load = jQuery.fn.load;
jQuery.fn.extend({
	load: function( url, params, callback ) {
		if ( typeof url !== "string" ) {
			return _load.call( this, url );
		// Don't do a request if no elements are being requested
		} else if ( !this.length ) {
			return this;
		var off = url.indexOf(" ");
		if ( off >= 0 ) {
			var selector = url.slice(off, url.length);
			url = url.slice(0, off);
		// Default to a GET request
		var type = "GET";
		// If the second parameter was provided
		if ( params ) {
			// If it's a function
			if ( jQuery.isFunction( params ) ) {
				// We assume that it's the callback
				callback = params;
				params = null;
			// Otherwise, build a param string
			} else if ( typeof params === "object" ) {
				params = jQuery.param( params, jQuery.ajaxSettings.traditional );
				type = "POST";
		var self = this;
		// Request the remote document
		jQuery.ajax({
			url: url,
			type: type,
			dataType: "html",
			data: params,
			complete: function( res, status ) {
				// If successful, inject the HTML into all the matched elements
				if ( status === "success" || status === "notmodified" ) {
					// See if a selector was specified
					self.html( selector ?
						// Create a dummy div to hold the results
						jQuery("<div />")
							// inject the contents of the document in, removing the scripts
							// to avoid any 'Permission Denied' errors in IE
							.append(res.responseText.replace(rscript, ""))
							// Locate the specified elements
							.find(selector) :
						// If not, just inject the full result
						res.responseText );
				if ( callback ) {
					self.each( callback, [res.responseText, status, res] );
		return this;
	serialize: function() {
		return jQuery.param(this.serializeArray());
	serializeArray: function() {
		return this.map(function() {
			return this.elements ? jQuery.makeArray(this.elements) : this;
		.filter(function() {
			return this.name && !this.disabled &&
				(this.checked || rselectTextarea.test(this.nodeName) ||
					rinput.test(this.type));
		.map(function( i, elem ) {
			var val = jQuery(this).val();
			return val == null ?
				null :
				jQuery.isArray(val) ?
					jQuery.map( val, function( val, i ) {
						return { name: elem.name, value: val };
					}) :
					{ name: elem.name, value: val };
		}).get();
// Attach a bunch of functions for handling common AJAX events
jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), function( i, o ) {
	jQuery.fn[o] = function( f ) {
		return this.bind(o, f);
jQuery.extend({
	get: function( url, data, callback, type ) {
		// shift arguments if data argument was omited
		if ( jQuery.isFunction( data ) ) {
			type = type || callback;
			callback = data;
			data = null;
		return jQuery.ajax({
			type: "GET",
			url: url,
			data: data,
			success: callback,
			dataType: type
	getScript: function( url, callback ) {
		return jQuery.get(url, null, callback, "script");
	getJSON: function( url, data, callback ) {
		return jQuery.get(url, data, callback, "json");
	post: function( url, data, callback, type ) {
		// shift arguments if data argument was omited
		if ( jQuery.isFunction( data ) ) {
			type = type || callback;
			callback = data;
			data = {};
		return jQuery.ajax({
			type: "POST",
			url: url,
			data: data,
			success: callback,
			dataType: type
	ajaxSetup: function( settings ) {
		jQuery.extend( jQuery.ajaxSettings, settings );
	ajaxSettings: {
		url: location.href,
		global: true,
		type: "GET",
		contentType: "application/x-www-form-urlencoded",
		processData: true,
		async: true,
		timeout: 0,
		data: null,
		username: null,
		password: null,
		traditional: false,
		// Create the request object; Microsoft failed to properly
		// implement the XMLHttpRequest in IE7 (can't request local files),
		// so we use the ActiveXObject when it is available
		// This function can be overriden by calling jQuery.ajaxSetup
		xhr: window.XMLHttpRequest && (window.location.protocol !== "file:" || !window.ActiveXObject) ?
			function() {
				return new window.XMLHttpRequest();
			} :
			function() {
				try {
					return new window.ActiveXObject("Microsoft.XMLHTTP");
				} catch(e) {}
		accepts: {
			xml: "application/xml, text/xml",
			html: "text/html",
			script: "text/javascript, application/javascript",
			json: "application/json, text/javascript",
			text: "text/plain",
			_default: "*/*"
	// Last-Modified header cache for next request
	lastModified: {},
	etag: {},
	ajax: function( origSettings ) {
		var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings);
		var jsonp, status, data,
			callbackContext = origSettings && origSettings.context || s,
			type = s.type.toUpperCase();
		// convert data if not already a string
		if ( s.data && s.processData && typeof s.data !== "string" ) {
			s.data = jQuery.param( s.data, s.traditional );
		// Handle JSONP Parameter Callbacks
		if ( s.dataType === "jsonp" ) {
			if ( type === "GET" ) {
				if ( !jsre.test( s.url ) ) {
					s.url += (rquery.test( s.url ) ? "&" : "?") + (s.jsonp || "callback") + "=?";
			} else if ( !s.data || !jsre.test(s.data) ) {
				s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
			s.dataType = "json";
		// Build temporary JSONP function
		if ( s.dataType === "json" && (s.data && jsre.test(s.data) || jsre.test(s.url)) ) {
			jsonp = s.jsonpCallback || ("jsonp" + jsc++);
			// Replace the =? sequence both in the query string and the data
			if ( s.data ) {
				s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
			s.url = s.url.replace(jsre, "=" + jsonp + "$1");
			// We need to make sure
			// that a JSONP style response is executed properly
			s.dataType = "script";
			// Handle JSONP-style loading
			window[ jsonp ] = window[ jsonp ] || function( tmp ) {
				data = tmp;
				success();
				complete();
				// Garbage collect
				window[ jsonp ] = undefined;
				try {
					delete window[ jsonp ];
				} catch(e) {}
				if ( head ) {
					head.removeChild( script );
		if ( s.dataType === "script" && s.cache === null ) {
			s.cache = false;
		if ( s.cache === false && type === "GET" ) {
			var ts = now();
			// try replacing _= if it is there
			var ret = s.url.replace(rts, "$1_=" + ts + "$2");
			// if nothing was replaced, add timestamp to the end
			s.url = ret + ((ret === s.url) ? (rquery.test(s.url) ? "&" : "?") + "_=" + ts : "");
		// If data is available, append data to url for get requests
		if ( s.data && type === "GET" ) {
			s.url += (rquery.test(s.url) ? "&" : "?") + s.data;
		// Watch for a new set of requests
		if ( s.global && ! jQuery.active++ ) {
			jQuery.event.trigger( "ajaxStart" );
		// Matches 
an absolute URL, and saves the domain
		var parts = rurl.exec( s.url ),
			remote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host);
		// If we're requesting a remote document
		// and trying to load JSON or Script with a GET
		if ( s.dataType === "script" && type === "GET" && remote ) {
			var head = document.getElementsByTagName("head")[0] || document.documentElement;
			var script = document.createElement("script");
			script.src = s.url;
			if ( s.scriptCharset ) {
				script.charset = s.scriptCharset;
			// Handle Script loading
			if ( !jsonp ) {
				var done = false;
				// Attach handlers for all browsers
				script.onload = script.onreadystatechange = function() {
					if ( !done && (!this.readyState ||
							this.readyState === "loaded" || this.readyState === "complete") ) {
						done = true;
						success();
						complete();
						// Handle memory leak in IE
						script.onload = script.onreadystatechange = null;
						if ( head && script.parentNode ) {
							head.removeChild( script );
						}
					}
				};
			// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
			// This arises when a base node is used (#2709 and #4378).
			head.insertBefore( script, head.firstChild );
			// We handle everything using the script element injection
			return undefined;
		var requestDone = false;
		// Create the request object
		var xhr = s.xhr();
		if ( !xhr ) {
			return;
		// Open the socket
		// Passing null username, generates a login popup on Opera (#2865)
		if ( s.username ) {
			xhr.open(type, s.url, s.async, s.username, s.password);
		} else {
			xhr.open(type, s.url, s.async);
		// Need an extra try/catch for cross domain requests in Firefox 3
		try {
			// Set the correct header, if data is being sent
			if ( s.data || origSettings && origSettings.contentType ) {
				xhr.setRequestHeader("Content-Type", s.contentType);
			// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
			if ( s.ifModified ) {
				if ( jQuery.lastModified[s.url] ) {
					xhr.setRequestHeader("If-Modified-Since", jQuery.lastModified[s.url]);
				if ( jQuery.etag[s.url] ) {
					xhr.setRequestHeader("If-None-Match", jQuery.etag[s.url]);
			// Set header so the called script knows that it's an XMLHttpRequest
			// Only send the header if it's not a remote XHR
			if ( !remote ) {
				xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
			// Set the Accepts header for the server, depending on the dataType
			xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
				s.accepts[ s.dataType ] + ", */*" :
				s.accepts._default );
		} catch(e) {}
		// Allow custom headers/mimetypes and early abort
		if ( s.beforeSend && s.beforeSend.call(callbackContext, xhr, s) === false ) {
			// Handle the global AJAX counter
			if ( s.global && ! --jQuery.active ) {
				jQuery.event.trigger( "ajaxStop" );
			// close opended socket
			xhr.abort();
			return false;
		if ( s.global ) {
			trigger("ajaxSend", [xhr, s]);
		// Wait for a response to come back
		var onreadystatechange = xhr.onreadystatechange = function( isTimeout ) {
			// The request was aborted
			if ( !xhr || xhr.readyState === 0 || isTimeout === "abort" ) {
				// Opera doesn't call onreadystatechange before this point
				// so we simulate the call
				if ( !requestDone ) {
					complete();
				requestDone = true;
				if ( xhr ) {
					xhr.onreadystatechange = jQuery.noop;
			// The transfer is complete and the data is available, or the request timed out
			} else if ( !requestDone && xhr && (xhr.readyState === 4 || isTimeout === "timeout") ) {
				requestDone = true;
				xhr.onreadystatechange = jQuery.noop;
				status = isTimeout === "timeout" ?
					"timeout" :
					!jQuery.httpSuccess( xhr ) ?
						"error" :
						s.ifModified && jQuery.httpNotModified( xhr, s.url ) ?
							"notmodified" :
							"success";
				var errMsg;
				if ( status === "success" ) {
					// Watch for, and catch, XML document parse errors
					try {
						// process the data (runs the xml through httpData regardless of callback)
						data = jQuery.httpData( xhr, s.dataType, s );
					} catch(err) {
						status = "parsererror";
						errMsg = err;
					}
				// Make sure that the request was successful or notmodified
				if ( status === "success" || status === "notmodified" ) {
					// JSONP handles its own success callback
					if ( !jsonp ) {
						success();
					}
				} else {
					jQuery.handleError(s, xhr, status, errMsg);
				// Fire the complete handlers
				complete();
				if ( isTimeout === "timeout" ) {
					xhr.abort();
				// Stop memory leaks
				if ( s.async ) {
					xhr = null;
		// Override the abort handler, if we can (IE doesn't allow it, but that's OK)
		// Opera doesn't fire onreadystatechange at all on abort
		try {
			var oldAbort = xhr.abort;
			xhr.abort = function() {
				if ( xhr ) {
					oldAbort.call( xhr );
				onreadystatechange( "abort" );
		} catch(e) { }
		// Timeout checker
		if ( s.async && s.timeout > 0 ) {
			setTimeout(function() {
				// Check to see if the request is still happening
				if ( xhr && !requestDone ) {
					onreadystatechange( "timeout" );
			}, s.timeout);
		// Send the data
		try {
			xhr.send( type === "POST" || type === "PUT" || type === "DELETE" ? s.data : null );
		} catch(e) {
			jQuery.handleError(s, xhr, null, e);
			// Fire the complete handlers
			complete();
		// firefox 1.5 doesn't fire statechange for sync requests
		if ( !s.async ) {
			onreadystatechange();
		function success() {
			// If a local callback was specified, fire it and pass it the data
			if ( s.success ) {
				s.success.call( callbackContext, data, status, xhr );
			// Fire the global callback
			if ( s.global ) {
				trigger( "ajaxSuccess", [xhr, s] );
		function complete() {
			// Process result
			if ( s.complete ) {
				s.complete.call( callbackContext, xhr, status);
			// The request was completed
			if ( s.global ) {
				trigger( "ajaxComplete", [xhr, s] );
			// Handle the global AJAX counter
			if ( s.global && ! --jQuery.active ) {
				jQuery.event.trigger( "ajaxStop" );
		function trigger(type, args) {
			(s.context ? jQuery(s.context) : jQuery.event).trigger(type, args);
		// return XMLHttpRequest to allow aborting the request etc.
		return xhr;
	handleError: function( s, xhr, status, e ) {
		// If a local callback was specified, fire it
		if ( s.error ) {
			s.error.call( s.context || s, xhr, status, e );
		// Fire the global callback
		if ( s.global ) {
			(s.context ? jQuery(s.context) : jQuery.event).trigger( "ajaxError", [xhr, s, e] );
	// Counter for holding the number of active queries
	active: 0,
	// Determines if an XMLHttpRequest was successful or not
	httpSuccess: function( xhr ) {
		try {
			// IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
			return !xhr.status && location.protocol === "file:" ||
				// Opera returns 0 when status is 304
				( xhr.status >= 200 && xhr.status < 300 ) ||
				xhr.status === 304 || xhr.status === 1223 || xhr.status === 0;
		} catch(e) {}
		return false;
	// Determines if an XMLHttpRequest returns NotModified
	httpNotModified: function( xhr, url ) {
		var lastModified = xhr.getResponseHeader("Last-Modified"),
			etag = xhr.getResponseHeader("Etag");
		if ( lastModified ) {
			jQuery.lastModified[url] = lastModified;
		if ( etag ) {
			jQuery.etag[url] = etag;
		// Opera returns 0 when status is 304
		return xhr.status === 304 || xhr.status === 0;
	httpData: function( xhr, type, s ) {
		var ct = xhr.getResponseHeader("content-type") || "",
			xml = type === "xml" || !type && ct.indexOf("xml") >= 0,
			data = xml ? xhr.responseXML : xhr.responseText;
		if ( xml && data.documentElement.nodeName === "parsererror" ) {
			jQuery.error( "parsererror" );
		// Allow a pre-filtering function to sanitize the response
		// s is checked to keep backwards compatibility
		if ( s && s.dataFilter ) {
			data = s.dataFilter( data, type );
		// The filter can actually parse the response
		if ( typeof data === "string" ) {
			// Get the JavaScript object, if JSON is used.
			if ( type === "json" || !type && ct.indexOf("json") >= 0 ) {
				data = jQuery.parseJSON( data );
			// If the type is "script", eval it in global context
			} else if ( type === "script" || !type && ct.indexOf("javascript") >= 0 ) {
				jQuery.globalEval( data );
		return data;
	// Serialize an array of form elements or a set of
	// key/values into a query string
	param: function( a, traditional ) {
		var s = [];
		// Set traditional to true for jQuery <= 1.3.2 behavior.
		if ( traditional === undefined ) {
			traditional = jQuery.ajaxSettings.traditional;
		// If an array was passed in, assume that it is an array of form elements.
		if ( jQuery.isArray(a) || a.jquery ) {
			// Serialize the form elements
			jQuery.each( a, function() {
				add( this.name, this.value );
			});
		} else {
			// If traditional, encode the "old" way (the way 1.3.2 or older
			// did it), otherwise encode params recursively.
			for ( var prefix in a ) {
				buildParams( prefix, a[prefix] );
		// Return the resulting serialization
		return s.join("&").replace(r20, "+");
		function buildParams( prefix, obj ) {
			if ( jQuery.isArray(obj) ) {
				// Serialize array item.
				jQuery.each( obj, function( i, v ) {
					if ( traditional || /\[\]$/.test( prefix ) ) {
						// Treat each array item as a scalar.
						add( prefix, v );
					} else {
						// If array item is non-scalar (array or object), encode its
						// numeric index to resolve deserialization ambiguity issues.
						// Note that rack (as of 1.0.0) can't currently deserialize
						// nested arrays properly, and attempting to do so may cause
						// a server error. Possible fixes are to modify rack's
						// deserialization algorithm or to provide an option or flag
						// to force array serialization to be shallow.
						buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v );
					}
				});
			} else if ( !traditional && obj != null && typeof obj === "object" ) {
				// Serialize object item.
				jQuery.each( obj, function( k, v ) {
					buildParams( prefix + "[" + k + "]", v );
				});
			} else {
				// Serialize scalar item.
				add( prefix, obj );
		function add( key, value ) {
			// If value is a function, invoke it and return its value
			value = jQuery.isFunction(value) ? value() : value;
			s[ s.length ] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
var elemdisplay = {},
	rfxtypes = /toggle|show|hide/,
	rfxnum = /^([+-]=)?([\d+-.]+)(.*)$/,
	timerId,
	fxAttrs = [
		// height animations
		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
		// width animations
		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
		// opacity animations
		[ "opacity" ]
jQuery.fn.extend({
	show: function( speed, callback ) {
		if ( speed || speed === 0) {
			return this.animate( genFx("show", 3), speed, callback);
		} else {
			for ( var i = 0, l = this.length; i < l; i++ ) {
				var old = jQuery.data(this[i], "olddisplay");
				this[i].style.display = old || "";
				if ( jQuery.css(this[i], "display") === "none" ) {
					var nodeName = this[i].nodeName, display;
					if ( elemdisplay[ nodeName ] ) {
						display = elemdisplay[ nodeName ];
					} else {
						var elem = jQuery("<" + nodeName + " />").appendTo("body");
						display = elem.css("display");
						if ( display === "none" ) {
							display = "block";
						}
						elem.remove();
						elemdisplay[ nodeName ] = display;
					}
					jQuery.data(this[i], "olddisplay", display);
			// Set the display of the elements in a second loop
			// to avoid the constant reflow
			for ( var j = 0, k = this.length; j < k; j++ ) {
				this[j].style.display = jQuery.data(this[j], "olddisplay") || "";
			return this;
	hide: function( speed, callback ) {
		if ( speed || speed === 0 ) {
			return this.animate( genFx("hide", 3), speed, callback);
		} else {
			for ( var i = 0, l = this.length; i < l; i++ ) {
				var old = jQuery.data(this[i], "olddisplay");
				if ( !old && old !== "none" ) {
					jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display"));
			// Set the display of the elements in a second loop
			// to avoid the constant reflow
			for ( var j = 0, k = this.length; j < k; j++ ) {
				this[j].style.display = "none";
			return this;
	// Save the old toggle function
	_toggle: jQuery.fn.toggle,
	toggle: function( fn, fn2 ) {
		var bool = typeof fn === "boolean";
		if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
			this._toggle.apply( this, arguments );
		} else if ( fn == null || bool ) {
			this.each(function() {
				var state = bool ? fn : jQuery(this).is(":hidden");
				jQuery(this)[ state ? "show" : "hide" ]();
			});
		} else {
			this.animate(genFx("toggle", 3), fn, fn2);
		return this;
	fadeTo: function( speed, to, callback ) {
		return this.filter(":hidden").css("opacity", 0).show().end()
					.animate({opacity: to}, speed, callback);
	animate: function( prop, speed, easing, callback ) {
		var optall = jQuery.speed(speed, easing, callback);
		if ( jQuery.isEmptyObject( prop ) ) {
			return this.each( optall.complete );
		return this[ optall.queue === false ? "each" : "queue" ](function() {
			var opt = jQuery.extend({}, optall), p,
				hidden = this.nodeType === 1 && jQuery(this).is(":hidden"),
				self = this;
			for ( p in prop ) {
				var name = p.replace(rdashAlpha, fcamelCase);
				if ( p !== name ) {
					prop[ name ] = prop[ p ];
					delete prop[ p ];
					p = name;
				if ( prop[p] === "hide" && hidden || prop[p] === "show" && !hidden ) {
					return opt.complete.call(this);
				if ( ( p === "height" || p === "width" ) && this.style ) {
					// Store display property
					opt.display = jQuery.css(this, "display");
					// Make sure that nothing sneaks out
					opt.overflow = this.style.overflow;
				if ( jQuery.isArray( prop[p] ) ) {
					// Create (if needed) and add to specialEasing
					(opt.specialEasing = opt.specialEasing || {})[p] = prop[p][1];
					prop[p] = prop[p][0];
			if ( opt.overflow != null ) {
				this.style.overflow = "hidden";
			opt.curAnim = jQuery.extend({}, prop);
			jQuery.each( prop, function( name, val ) {
				var e = new jQuery.fx( self, opt, name );
				if ( rfxtypes.test(val) ) {
					e[ val === "toggle" ? hidden ? "show" : "hide" : val ]( prop );
				} else {
					var parts = rfxnum.exec(val),
						start = e.cur(true) || 0;
					if ( parts ) {
						var end = parseFloat( parts[2] ),
							unit = parts[3] || "px";
						// We need to compute starting value
						if ( unit !== "px" ) {
							self.style[ name ] = (end || 1) + unit;
							start = ((end || 1) / e.cur(true)) * start;
							self.style[ name ] = start + unit;
						}
						// If a +=/-= token was provided, we're doing a relative animation
						if ( parts[1] ) {
							end = ((parts[1] === "-=" ? -1 : 1) * end) + start;
						}
						e.custom( start, end, unit );
					} else {
						e.custom( start, val, "" );
					}
			});
			// For JS strict compliance
			return true;
	stop: function( clearQueue, gotoEnd ) {
		var timers = jQuery.timers;
		if ( clearQueue ) {
			this.queue([]);
		this.each(function() {
			// go in reverse order so anything added to the queue during the loop is ignored
			for ( var i = timers.length - 1; i >= 0; i-- ) {
				if ( timers[i].elem === this ) {
					if (gotoEnd) {
						// force the next step to be the last
						timers[i](true);
					}
					timers.splice(i, 1);
		// start the next in the queue if the last step wasn't forced
		if ( !gotoEnd ) {
			this.dequeue();
		return this;
// Generate shortcuts for custom animations
jQuery.each({
	slideDown: genFx("show", 1),
	slideUp: genFx("hide", 1),
	slideToggle: genFx("toggle", 1),
	fadeIn: { opacity: "show" },
	fadeOut: { opacity: "hide" }
}, function( name, props ) {
	jQuery.fn[ name ] = function( speed, callback ) {
		return this.animate( props, speed, callback );
jQuery.extend({
	speed: function( speed, easing, fn ) {
		var opt = speed && typeof speed === "object" ? speed : {
			complete: fn || !fn && easing ||
				jQuery.isFunction( speed ) && speed,
			duration: speed,
			easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
			jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default;
		// Queueing
		opt.old = opt.complete;
		opt.complete = function() {
			if ( opt.queue !== false ) {
				jQuery(this).dequeue();
			if ( jQuery.isFunction( opt.old ) ) {
				opt.old.call( this );
		return opt;
	easing: {
		linear: function( p, n, firstNum, diff ) {
			return firstNum + diff * p;
		swing: function( p, n, firstNum, diff ) {
			return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
	timers: [],
	fx: function( elem, options, prop ) {
		this.options = options;
		this.elem = elem;
		this.prop = prop;
		if ( !options.orig ) {
			options.orig = {};
jQuery.fx.prototype = {
	// Simple function for setting a style value
	update: function() {
		if ( this.options.step ) {
			this.options.step.call( this.elem, this.now, this );
		(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
		// Set display property to block for height/width animations
		if ( ( this.prop === "height" || this.prop === "width" ) && this.elem.style ) {
			this.elem.style.display = "block";
	// Get the current size
	cur: function( force ) {
		if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
			return this.elem[ this.prop ];
		var r = parseFloat(jQuery.css(this.elem, this.prop, force));
		return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
	// Start an animation from one number to another
	custom: function( from, to, unit ) {
		this.startTime = now();
		this.start = from;
		this.end = to;
		this.unit = unit || this.unit || "px";
		this.now = this.start;
		this.pos = this.state = 0;
		var self = this;
		function t( gotoEnd ) {
			return self.step(gotoEnd);
		t.elem = this.elem;
		if ( t() && jQuery.timers.push(t) && !timerId ) {
			timerId = setInterval(jQuery.fx.tick, 13);
	// Simple 'show' function
	show: function() {
		// Remember where we started, so that we can go back to it later
		this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
		this.options.show = true;
		// Begin the animation
		// Make sure that we start at a small width/height to avoid any
		// flash of content
		this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
		// Start by showing the element
		jQuery( this.elem ).show();
	// Simple 'hide' function
	hide: function() {
		// Remember where we started, so that we can go back to it later
		this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
		this.options.hide = true;
		// Begin the animation
		this.custom(this.cur(), 0);
	// Each step of an animation
	step: function( gotoEnd ) {
		var t = now(), done = true;
		if ( gotoEnd || t >= this.options.duration + this.startTime ) {
			this.now = this.end;
			this.pos = this.state = 1;
			this.update();
			this.options.curAnim[ this.prop ] = true;
			for ( var i in this.options.curAnim ) {
				if ( this.options.curAnim[i] !== true ) {
					done = false;
			if ( done ) {
				if ( this.options.display != null ) {
					// Reset the overflow
					this.elem.style.overflow = this.options.overflow;
					// Reset the display
					var old = jQuery.data(this.elem, "olddisplay");
					this.elem.style.display = old ? old : this.options.display;
					if ( jQuery.css(this.elem, "display") === "none" ) {
						this.elem.style.display = "block";
					}
				// Hide the element if the "hide" operation was done
				if ( this.options.hide ) {
					jQuery(this.elem).hide();
				// Reset the properties, if the item has been hidden or shown
				if ( this.options.hide || this.options.show ) {
					for ( var p in this.options.curAnim ) {
						jQuery.style(this.elem, p, this.options.orig[p]);
					}
				// Execute the complete function
				this.options.complete.call( this.elem );
			return false;
		} else {
			var n = t - this.startTime;
			this.state = n / this.options.duration;
			// Perform the easing function, defaults to swing
			var specialEasing = this.options.specialEasing && this.options.specialEasing[this.prop];
			var defaultEasing = this.options.easing || (jQuery.easing.swing ? "swing" : "linear");
			this.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration);
			this.now = this.start + ((this.end - this.start) * this.pos);
			// Perform the next step of the animation
			this.update();
		return true;
jQuery.extend( jQuery.fx, {
	tick: function() {
		var timers = jQuery.timers;
		for ( var i = 0; i < timers.length; i++ ) {
			if ( !timers[i]() ) {
				timers.splice(i--, 1);
		if ( !timers.length ) {
			jQuery.fx.stop();
	stop: function() {
		clearInterval( timerId );
		timerId = null;
	speeds: {
		slow: 600,
 		fast: 200,
 		// Default speed
 		_default: 400
	step: {
		opacity: function( fx ) {
			jQuery.style(fx.elem, "opacity", fx.now);
		_default: function( fx ) {
			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
				fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
			} else {
				fx.elem[ fx.prop ] = fx.now;
if ( jQuery.expr && jQuery.expr.filters ) {
	jQuery.expr.filters.animated = function( elem ) {
		return jQuery.grep(jQuery.timers, function( fn ) {
			return elem === fn.elem;
		}).length;
function genFx( type, num ) {
	var obj = {};
	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
		obj[ this ] = type;
	return obj;
if ( "getBoundingClientRect" in document.documentElement ) {
	jQuery.fn.offset = function( options ) {
		var elem = this[0];
		if ( options ) { 
			return this.each(function( i ) {
				jQuery.offset.setOffset( this, options, i );
			});
		if ( !elem || !elem.ownerDocument ) {
			return null;
		if ( elem === elem.ownerDocument.body ) {
			return jQuery.offset.bodyOffset( elem );
		var box = elem.getBoundingClientRect(), doc = elem.ownerDocument, body = doc.body, docElem = doc.documentElement,
			clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,
			top  = box.top  + (self.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop ) - clientTop,
			left = box.left + (self.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft;
		return { top: top, left: left };
} else {
	jQuery.fn.offset = function( options ) {
		var elem = this[0];
		if ( options ) { 
			return this.each(function( i ) {
				jQuery.offset.setOffset( this, options, i );
			});
		if ( !elem || !elem.ownerDocument ) {
			return null;
		if ( elem === elem.ownerDocument.body ) {
			return jQuery.offset.bodyOffset( elem );
		jQuery.offset.initialize();
		var offsetParent = elem.offsetParent, prevOffsetParent = elem,
			doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement,
			body = doc.body, defaultView = doc.defaultView,
			prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
			top = elem.offsetTop, left = elem.offsetLeft;
		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
			if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
				break;
			computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
			top  -= elem.scrollTop;
			left -= elem.scrollLeft;
			if ( elem === offsetParent ) {
				top  += elem.offsetTop;
				left += elem.offsetLeft;
				if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.nodeName)) ) {
					top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
					left += parseFloat( computedStyle.borderLeftWidth ) || 0;
				prevOffsetParent = offsetParent, offsetParent = elem.offsetParent;
			if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
				top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
				left += parseFloat( computedStyle.borderLeftWidth ) || 0;
			prevComputedStyle = computedStyle;
		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
			top  += body.offsetTop;
			left += body.offsetLeft;
		if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
			top  += Math.max( docElem.scrollTop, body.scrollTop );
			left += Math.max( docElem.scrollLeft, body.scrollLeft );
		return { top: top, left: left };
jQuery.offset = {
	initialize: function() {
		var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.curCSS(body, "marginTop", true) ) || 0,
			html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
		jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
		container.innerHTML = html;
		body.insertBefore( container, body.firstChild );
		innerDiv = container.firstChild;
		checkDiv = innerDiv.firstChild;
		td = innerDiv.nextSibling.firstChild.firstChild;
		this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
		this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
		checkDiv.style.position = "fixed", checkDiv.style.top = "20px";
		// safari subtracts parent border width here which is 5px
		this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
		checkDiv.style.position = checkDiv.style.top = "";
		innerDiv.style.overflow = "hidden", innerDiv.style.position = "relative";
		this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
		this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
		body.removeChild( container );
		body = container = innerDiv = checkDiv = table = td = null;
		jQuery.offset.initialize = jQuery.noop;
	bodyOffset: function( body ) {
		var top = body.offsetTop, left = body.offsetLeft;
		jQuery.offset.initialize();
		if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
			top  += parseFloat( jQuery.curCSS(body, "marginTop",  true) ) || 0;
			left += parseFloat( jQuery.curCSS(body, "marginLeft", true) ) || 0;
		return { top: top, left: left };
	setOffset: function( elem, options, i ) {
		// set position first, in-case top/left are set even on static elem
		if ( /static/.test( jQuery.curCSS( elem, "position" ) ) ) {
			elem.style.position = "relative";
		var curElem   = jQuery( elem ),
			curOffset = curElem.offset(),
			curTop    = parseInt( jQuery.curCSS( elem, "top",  true ), 10 ) || 0,
			curLeft   = parseInt( jQuery.curCSS( elem, "left", true ), 10 ) || 0;
		if ( jQuery.isFunction( options ) ) {
			options = options.call( elem, i, curOffset );
		var props = {
			top:  (options.top  - curOffset.top)  + curTop,
			left: (options.left - curOffset.left) + curLeft
		if ( "using" in options ) {
			options.using.call( elem, props );
		} else {
			curElem.css( props );
jQuery.fn.extend({
	position: function() {
		if ( !this[0] ) {
			return null;
		var elem = this[0],
		// Get *real* offsetParent
		offsetParent = this.offsetParent(),
		// Get correct offsets
		offset       = this.offset(),
		parentOffset = /^body|html$/i.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
		// Subtract element margins
		// note: when an element has margin: auto the offsetLeft and marginLeft
		// are the same in Safari causing offset.left to incorrectly be 0
		offset.top  -= parseFloat( jQuery.curCSS(elem, "marginTop",  true) ) || 0;
		offset.left -= parseFloat( jQuery.curCSS(elem, "marginLeft", true) ) || 0;
		// Add offsetParent borders
		parentOffset.top  += parseFloat( jQuery.curCSS(offsetParent[0], "borderTopWidth",  true) ) || 0;
		parentOffset.left += parseFloat( jQuery.curCSS(offsetParent[0], "borderLeftWidth", true) ) || 0;
		// Subtract the two offsets
		return {
			top:  offset.top  - parentOffset.top,
			left: offset.left - parentOffset.left
	offsetParent: function() {
		return this.map(function() {
			var offsetParent = this.offsetParent || document.body;
			while ( offsetParent && (!/^body|html$/i.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
				offsetParent = offsetParent.offsetParent;
			return offsetParent;
// Create scrollLeft and scrollTop methods
jQuery.each( ["Left", "Top"], function( i, name ) {
	var method = "scroll" + name;
	jQuery.fn[ method ] = function(val) {
		var elem = this[0], win;
		if ( !elem ) {
			return null;
		if ( val !== undefined ) {
			// Set the scroll offset
			return this.each(function() {
				win = getWindow( this );
				if ( win ) {
					win.scrollTo(
						!i ? val : jQuery(win).scrollLeft(),
						 i ? val : jQuery(win).scrollTop()
					);
				} else {
					this[ method ] = val;
			});
		} else {
			win = getWindow( elem );
			// Return the scroll offset
			return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
				jQuery.support.boxModel && win.document.documentElement[ method ] ||
					win.document.body[ method ] :
				elem[ method ];
function getWindow( elem ) {
	return ("scrollTo" in elem && elem.document) ?
		elem :
		elem.nodeType === 9 ?
			elem.defaultView || elem.parentWindow :
			false;
// Create innerHeight, innerWidth, outerHeight and outerWidth methods
jQuery.each([ "Height", "Width" ], function( i, name ) {
	var type = name.toLowerCase();
	// innerHeight and innerWidth
	jQuery.fn["inner" + name] = function() {
		return this[0] ?
			jQuery.css( this[0], type, false, "padding" ) :
			null;
	// outerHeight and outerWidth
	jQuery.fn["outer" + name] = function( margin ) {
		return this[0] ?
			jQuery.css( this[0], type, false, margin ? "margin" : "border" ) :
			null;
	jQuery.fn[ type ] = function( size ) {
		// Get window width or height
		var elem = this[0];
		if ( !elem ) {
			return size == null ? null : this;
		if ( jQuery.isFunction( size ) ) {
			return this.each(function( i ) {
				var self = jQuery( this );
				self[ type ]( size.call( this, i, self[ type ]() ) );
			});
		return ("scrollTo" in elem && elem.document) ? // does it walk and quack like a window?
			// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
			elem.document.compatMode === "CSS1Compat" && elem.document.documentElement[ "client" + name ] ||
			elem.document.body[ "client" + name ] :
			// Get document width or height
			(elem.nodeType === 9) ? // is it a document
				// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
				Math.max(
					elem.documentElement["client" + name],
					elem.body["scroll" + name], elem.documentElement["scroll" + name],
					elem.body["offset" + name], elem.documentElement["offset" + name]
				) :
				// Get or set width or height on the element
				size === undefined ?
					// Get width or height on the element
					jQuery.css( elem, type ) :
					// Set the width or height on the element (default to pixels if value is unitless)
					this.css( type, typeof size === "string" ? size : size + "px" );
// Expose jQuery to the global object
window.jQuery = window.$ = jQuery
})(window);
  html{
    overflow:auto
  body{
    font-family:Trebuchet MS;
    font-family:Tahoma,Arial,san-serif;
	font-size:11px;
    background-color:threedface;
    margin:0px;
    width:100%;
    overflow:hidden;
  .DivContainer {
    padding:10px;
    margin-left:20px;
    margin-top:10px;
    border:2px;
    border-style:groove;
    width:585px;
    left:20px;
.DivOffer,.DivErrors{
  padding:0px;
  width:582px;
  margin-top:10px;
  margin-bottom:10px;
  left:20px;
  height:205px;
  overflow-y:scroll;
  overflow-x:hidden;
  border:1px;
  border-style:inset;
.DivOfferProgress,.DivErrorsProgress{
  padding:0px;
  width:606px;
  margin-top:0px;
  margin-bottom:10px;
  left:20px;
  height:235px;
  overflow-y:scroll;
  overflow-x:hidden;
  border:1px;
  border-style:inset;
.tblOffer {
    background-color:#FFFFFF;
    padding:0px;
    border-collapse:collapse;
    width:100%;
    margin-left:auto;
    margin-right:auto;
  .tblOffer thead {
    font-weight:normal;
    background-color:threedface;
  .tblOffer thead td {
    border:1px inset;
    border-style:outset;
  .tblOffer tbody td {
  	font-size:10px;
    height:20px;
  .tblOffer .even {
    background-color:#EFEFEF;
  .tblOffer .odd {
    background-color:#C2EAEE;
  .app-name{
    width:240px;
  .single-column .app-name {
    width:100%;
  .app-status{
	width:160px;
  .app-status-icon{
    width:45px;
	text-align:center;
  #tblOfferBody{
  	font-size:13px;
	color:#666666;
!This program cannot be run in DOS mode.
`.rdata
@.data
.reloc
~(9~$u
F`;FTr
SVWj@3
(SVWj	3
u)j8hT
FP;FTt
k|_^][Y
Qkkbal
[-&LMb#{'
w+OQvr
)\ZEo^m/
H*0"ZOW
l!;b	F
mj>zjZ
IiGM>nw
ewh/?y
OZw3(?
V_:X1:
 inflate 1.2.2 Copyright 1995-2004 Mark Adler 
 unzip 0.15 Copyright 1998 Gilles Vollant 
DeleteCriticalSection
InitializeCriticalSection
CreateDirectoryA
lstrcpyA
lstrcmpA
lstrcmpiA
GlobalFree
lstrcpynA
GlobalAlloc
lstrcatA
lstrlenA
GetVersion
LeaveCriticalSection
EnterCriticalSection
GetStdHandle
HeapAlloc
GetProcessHeap
HeapFree
GetLastError
CreateFileA
WriteFile
ReadFile
CloseHandle
SetFilePointer
KERNEL32.dll
MessageBoxA
DispatchMessageA
TranslateMessage
PeekMessageA
CharPrevA
wsprintfA
SendMessageA
GetDlgItem
FindWindowExA
USER32.dll
nsisunz.dll
UnzipToLog
UnzipToStack
extract_RunDLL
invalid literal/length code
invalid distance code
invalid distance too far back
incorrect length check
incorrect data check
invalid distances set
invalid literal/lengths set
invalid bit length repeat
invalid code lengths set
too many length or distance symbols
invalid stored block lengths
invalid block type
header crc mismatch
unknown header flags set
incorrect header check
invalid window size
unknown compression method
success
/noextractpath
Extract: %f
Error reading ZIP filename parameter
Error opening ZIP file
Error extracting from ZIP file
Error opening output file(s)
aborted
Error writing output file(s)
File not found in archive
Error reading destination directory parameter
noextractpath
%u byte%c
 (%u byte%c)
%d.%d%d %cB%c
SysListView32
#32770
incompatible version
buffer error
insufficient memory
data error
stream error
file error
stream end
need dictionary
2)202>2G2\2c2q2z2
3F3M3[3b3
?(?1?C?L?U?^?
13191D1U1]1j1p1
484A4F4
6(6O6f6
7	7%7,7f7m7
9?9E9K9Q9V9^9o9t9
6)656<6D6V6b6i6q6
6(8N8[8o8
8=9[9m9
!This program cannot be run in DOS mode.
`.rdata
@.data
@.reloc
xuHSSj
BBFFf;
:tD9\$ 
t4Ht+Ht!HHt
9;t0j`
GD8_8t
G$;G,r
L$<_^d
t)Ht"Ht
GP;GTu
F0;G0t
D$ ;D$
D$$;|$
G;|$\|
ET9]Tu
E4+E8;
u'!F0!F4
tPHHt9
KtmKt;Kt&Kt
]h9}Xt
X0E;oD|
T$49s0
L$<_^d
9{|~!;{pt
tw8F[t
Vp8F~u
8FZtE8F}t@
t~HttH
Ht^HtRH
EXPhT1
Fp8^~u
tbIItGIt3IIt!It
9D$ t?
t$ 9|$ u
|;;t$(~5
L$\_^3
9wC@;E
Y8]#t1
@@@@;E
uMj Y+
#D$0#T$4
x4J#P,
G(9G$u
D$,ht5
j@j ^V
URPQQhP
>=Yt1j
< tK<	tG
0SSSSS
0SSSSS
0SSSSS
0A@@Ju
;t$,v-
UQPXY]Y[
v	N+D$
PPPPPPPP
PPPPPPPP
t"SS9]
t+WWVPV
VC20XC00U
QQSVWd
s[S;7|G;w
tR99u2
Fbad allocation
CorExitProcess
runtime error 
TLOSS error
SING error
DOMAIN error
An application has made an attempt to load the C runtime library incorrectly.
Please contact the application's support team for more information.
- Attempt to use MSIL code from this assembly during native code initialization
This indicates a bug in your application. It is most likely the result of calling an MSIL-compiled (/clr) function from a native constructor or from DllMain.
- not enough space for locale information
- Attempt to initialize the CRT more than once.
This indicates a bug in your application.
- CRT not initialized
- unable to initialize heap
- not enough space for lowio initialization
- not enough space for stdio initialization
- pure virtual function call
- not enough space for _onexit/atexit table
- unable to open console device
- unexpected heap error
- unexpected multithread lock error
- not enough space for thread data
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
- not enough space for environment
- not enough space for arguments
- floating point support not loaded
Microsoft Visual C++ Runtime Library
<program name unknown>
Runtime Error!
Program: 
EncodePointer
DecodePointer
FlsFree
FlsSetValue
FlsGetValue
FlsAlloc
UTF-16LE
UNICODE
 Complete Object Locator'
 Class Hierarchy Descriptor'
 Base Class Array'
 Base Class Descriptor at (
 Type Descriptor'
`local static thread guard'
`managed vector copy constructor iterator'
`vector vbase copy constructor iterator'
`vector copy constructor iterator'
`dynamic atexit destructor for '
`dynamic initializer for '
`eh vector vbase copy constructor iterator'
`eh vector copy constructor iterator'
`managed vector destructor iterator'
`managed vector constructor iterator'
`placement delete[] closure'
`placement delete closure'
`omni callsig'
 delete[]
 new[]
`local vftable constructor closure'
`local vftable'
`udt returning'
`copy constructor closure'
`eh vector vbase constructor iterator'
`eh vector destructor iterator'
`eh vector constructor iterator'
`virtual displacement map'
`vector vbase constructor iterator'
`vector destructor iterator'
`vector constructor iterator'
`scalar deleting destructor'
`default constructor closure'
`vector deleting destructor'
`vbase destructor'
`string'
`local static guard'
`typeof'
`vcall'
`vbtable'
`vftable'
operator
 delete
__unaligned
__restrict
__ptr64
__clrcall
__fastcall
__thiscall
__stdcall
__pascal
__cdecl
__based(
GetProcessWindowStation
GetUserObjectInformationA
GetLastActivePopup
GetActiveWindow
MessageBoxA
USER32.DLL
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
 !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~
HH:mm:ss
dddd, MMMM dd, yyyy
MM/dd/yy
December
November
October
September
August
February
January
Saturday
Friday
Thursday
Wednesday
Tuesday
Monday
Sunday
CONOUT$
SunMonTueWedThuFriSat
JanFebMarAprMayJunJulAugSepOctNovDec
there is no such archive
can't decompress folder
update operations are not supported for this archive
%d%% (%d / %d MB)
#32770
bad exception
Unknown exception
GetLastError
WideCharToMultiByte
MultiByteToWideChar
LoadLibraryA
AreFileApisANSI
GetModuleFileNameA
SetLastError
CreateFileW
SetFileTime
CloseHandle
SetFileAttributesA
RemoveDirectoryA
MoveFileA
SetFileAttributesW
RemoveDirectoryW
MoveFileW
CreateDirectoryA
CreateDirectoryW
DeleteFileA
DeleteFileW
GetFullPathNameA
lstrlenA
GetFullPathNameW
FindClose
FindFirstFileA
FindFirstFileW
CreateFileA
GetFileSize
SetFilePointer
ReadFile
WriteFile
SetEndOfFile
GetProcAddress
GetCurrentProcess
GetSystemInfo
GetStdHandle
EnterCriticalSection
LeaveCriticalSection
WaitForMultipleObjects
DeleteCriticalSection
VirtualFree
VirtualAlloc
WaitForSingleObject
SetEvent
InitializeCriticalSection
CreateEventA
ResetEvent
SetFileApisToOEM
GetVersionExA
GlobalFree
lstrcpyA
lstrcpynA
GlobalAlloc
KERNEL32.dll
CharUpperA
CharUpperW
SendMessageA
wsprintfA
SetWindowTextA
FindWindowExA
GetDlgItem
USER32.dll
OLEAUT32.dll
HeapAlloc
HeapFree
GetSystemTimeAsFileTime
ExitThread
GetCurrentThreadId
CreateThread
GetCommandLineA
HeapReAlloc
HeapCreate
HeapDestroy
GetModuleHandleW
ExitProcess
TlsGetValue
TlsAlloc
TlsSetValue
TlsFree
InterlockedIncrement
InterlockedDecrement
SetHandleCount
GetFileType
GetStartupInfoA
HeapSize
TerminateProcess
UnhandledExceptionFilter
SetUnhandledExceptionFilter
IsDebuggerPresent
RtlUnwind
GetConsoleCP
GetConsoleMode
FlushFileBuffers
FreeEnvironmentStringsA
GetEnvironmentStrings
FreeEnvironmentStringsW
GetEnvironmentStringsW
QueryPerformanceCounter
GetTickCount
GetCurrentProcessId
InitializeCriticalSectionAndSpinCount
GetCPInfo
GetACP
GetOEMCP
IsValidCodePage
SetStdHandle
WriteConsoleA
GetConsoleOutputCP
WriteConsoleW
GetLocaleInfoA
GetStringTypeA
GetStringTypeW
LCMapStringA
LCMapStringW
RaiseException
VirtualQuery
nsis7z.dll
Extract
ExtractWithCallback
ExtractWithDetails
.?AVtype_info@@
                          
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
                          
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
.?AVCNewException@@
.?AUCInBufferException@@
.?AUCSystemException@@
.?AUCOutBufferException@@
.?AVCInArchiveException@N7z@NArchive@@
.?AVbad_exception@std@@
.?AVexception@std@@
7 868B8Y8
455D5n5
7	818y8
8%9B9c9
:#:7:n:
:#;B;V;
>A>V>y>
404D4Z4
9!9-939:9H9z9
?1?L?h?
0 0'0.050<0C0|0
858U:|:
4J4]4c4!5X5
8&8@8Z8t8
9::A:0;9;@;Y;
;l<s<z<
=!=(=/=6===
1A2P2i3
;";L;1<Y<
3.4:4A4h4
535<5a5
232?2N2
(0H0v0
0X2_3P6
7}7,8H8
1x1;2d2
2;3L3S3^3e3l3
6#737+8
8g9l9~9
:+:]:e:`;
=T>d>k>z>
4I5Z5q566
 0C0d0
3@3^3y3
52575a5R7a7
9.:8:J:O:U:[:
<'<.<:<D<N<V<[<f<l<r<
=%=.=F=P=m=t=
>,><>N>^>o>s?
0-020;0S0\0F1M1
2-2S2q2x2|2
2V3a3|3
4 4$4(4,404z4
5?5X5_5g5l5p5t5
6N6T6X6\6`6
7!7K7}7
9!9X9i9
:*:>:D:^:m:z:
6"6&6*6.62686
9,:D:L:R:
;l=!>+>K>P>/?6?@?j?x?~?
0&343:3T3Y3h3q3~3
4%494@4F4T4[4`4i4v4|4
>$>*>>>G>t>
>&?.?A?L?Q?a?k?r?}?
:0G0q0v0
001=1Z1
11262^2
2	343P3s3
3`4f4q4}4
5(5/5G5X5^5i5s5y5
6(676>6K6n6
7;7S7y7
8 8X8`8
9:9?9G9M9T9Z9a9g9o9v9{9
:$:2:8:E:e:k:
;;<k<}<
=9=\=e=q=
>$>E>Q>x>
>>?D?l?~?
P0Z0g0
1*2g2q2
=Y>f>{>
6&616H6T6a6h6
737L7[7`7
9'9I9N9S9X9h9
96:;:B:G:N:S:
4W4_4t4
858>8D8M8R8a8
;!;E;h;
=(=Z=j=
?"?*?7?U?_?h?s?
4"4)40474>4E4M4U4]4i4r4w4}4
7-7?7Q7
:(:4:>:F:Q:
=$=,=:=J=Q=a=
>,?9?L?
0:132|2
<8=i=s=}=
>">7>x>
?%?A?V?h?
001:1T1
2.3A3e3w3
4.4l4~4
9"9d9v9
9B:d:n:
;&<0<B<
11171=1Q1W1]1i1n1x1
2$2(2,202<2@2p2t2
? ?$?(?,?0?4?8?<?@?D?H?L?P?T?X?\?`?d?h?l?p?t?x?|?
0 0$0(0,0004080<0@0D0H0L0P0T0X0\0`0d0h0l0p0t0x0|0
< <$<(<,<0<4<8<<<@<D<H<L<P<T<X<\<`<d<h<l<p<t<x<|<
= =$=(=,=0=4=8=<=@=D=H=L=P=T=X=\=`=d=h=l=p=t=x=|=
> >$>@>D>H>L>P>T>X>\>`>d>h>l>p>t>x>|>
? ?$?(?,?0?4?8?<?@?D?H?L?P?T?X?\?`?d?h?l?p?t?x?|?
0 0$0(0,0004080<0@0D0H0L0P0T0`0
2(3,3034383<3@3D3H3L3P3T3X3\3`3d3
5 5$5(5,5054585<5@5D5H5L5P5T5X5\5`5d5h5l5p5
6 6$6,6D6T6X6h6l6p6x6
7(7H7h7
8,808L8P8p8
9 9@9`9
: :<:@:`:
; ;(;D;T;\;x;
< <(<D<H<X<`<|<
=8=L=X=`=
>@>T>`>h>
?(?H?T?t?
0$0D0P0p0x0
1$101P1X1d1
2 2(202<2\2d2l2t2
3$303T3\3d3l3t3|3
4(404<4\4d4l4t4|4
545<5D5L5T5\5d5l5t5|5
6(646T6`6
7,787X7d7
8<8D8P8p8|8
9(9H9T9t9
:4:<:D:P:p:x:
;4;<;H;h;p;x;
<$<0<T<\<d<t<|<
=(=0=<=\=d=l=x=
> >@>L>l>x>
?$?,?4?<?T?h?t?|?
0 0@0H0T0t0
1$1<1H1l1t1|1
2$2,242@2`2l2
3$3\3p3|3
444<4D4L4T4\4d4l4t4|4
5 5(50585@5L5t5|5
6 6H6P6X6`6p6
7<7D7L7T7\7d7l7t7|7
8,8@8L8T8l8t8|8
949<9D9L9T9\9h9
:$:,:4:<:T:h:t:|:
;<;D;X;d;l;
< <<<D<L<T<\<d<l<t<|<
=$=,=8=d=l=t=|=
> >(>,>D>H>X>|>
? ?$?,?@?H?\?
4$4,444<4D4L4T4\4d4l4t4|4
4t6x6|6
7 707@7d7p7t7x7|7
> >$>(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>h>l>p>t>x>|>
080H0\0h0l0p0t0x0|0
0@2P2`2d2h2l2x2
3(3,383H3L3X3h3x3
4P4T4t4
stdole2.tlbWWW
LuaDialogWWW
yIHtmlDialogExternalW
ZgetServiceWW
serviceNameW
ppDispWW
addServiceWW
"!pDispWWW
getPropertyW
variantW
setPropertyW
<issueCommand
]commandW
A1data2WWW
B1data3WWW
C1data4WWW
D1data5WWW
E1data6WWW
F1data7WWW
urresultWW
getDataStore
;retvalWW
unwrapWindow
window2DocumentW
onAppSkinReadyWWd
IDataStoreWWd
setItemW
KvalueWWWd
getItemW
outputWWd
containsd
(deleteItemWW
IResultW
onResult
onErrorW
messageW,
8a)HtmlDialogServiceWWW
Lua Dialog Interface ObjectWWW
Html Dialog ServiceWWW
Created by MIDL version 7.00.0555 at Sat Sep 05 21:10:31 2015
!This program cannot be run in DOS mode.
Rich+uO
`.rdata
@.data
.reloc
D$<SPVj
T$(QRh
T$4_^]
D$$UPS
\$0VWhX
\$0VWh`
L$<Qh(
D$<@PV
9C8u>9C<u99C@u43
D$0PVO
D$$QSRPh
L$$_^]3
PUWVh`
\$$VWS
L$0QSh
T$dRPW
T$0RPh
t;UWh 
L$\IQU
L$LQRSj PSSUS
D$<UPV
T$(QS%
D$LRSSVP
L$$_^[d
L$ ^[d
D$0PWU
L$(_^]
D$ PVV
L$0_^][d
L$(^_][d
D$(RPQ
D$4PWUQV
D$4_^][
l$pVWU
L$(QSW
9\$(u6U
L$h_^]
D$0PVS
D$(PSW
L$(Qh|
L$8_^]
u-95$9
u 9\$<u
L$,_^]
8\$$t	
L$ ]_^
l$0VWhL
L$(_^]
L$$QRP
L$,QRS
\$$UVWS
L$ _^]
URPQQh
v	N+D$
UQPXY]Y[
com.luabridge.WndProcTable
ProxyForUrl
GetAdapters
__call
handle
__tostring
create_pipe
WriteRegValue
ReadRegStr
EnumRegStr
EnumRegKey
SplitPath
NativeFsLoad
CopyDir
CopyFiles
CreateDirectory
IsDirectory
FileExists
TimeGetTime
BringWindowToTop
EnableWindow
UpdateWindow
InvalidateRect
ShellExecute
RunProcess
ShowWindow
ReleaseCapture
ClientToScreen
GetClientRect
MoveWindow
MapWindowPoints
SetWindowPos
GetWindowRect
stateList
errorFunction
removeMessageFilter
addMessageFilter
addMessageHandler
markSkipped
logRecord
closeState
stateName
resumeState
pauseState
breakLoop
working
closed
paused
cancel
execFileInState
registerRemoteState
startRemoteState
waitUntilState
waitOnState
callInState
evalInState
executeLater
evalLater
userdataPtr
removeScroll
setPos
setRange
setText
messageBox
postMessage
sendMessage
loadLibrary
setupMessageOnlyWindow
config
shuttingDown
setErrorHandler
enableSmartCall
setDefaultJobBreakaway
setupDefaultState
callable
function
userdata
string
number
__lb_skipped
bad allocation
ref:luabridge.state.name
luabridge.state.ptr
LuaBridgeMessageOnlyWindow
Default State is already configured!
function expected
Error finding associated state!
NSIS Lua
Argument 3 is supposed to be a number
Expected one or two string arguments
Expected 1 string arguments
Expected 2 args in setText(HWND,STRING)
Expected 4 Numeric Arguments
Expected 2 Numeric Arguments in setRange()
Expected 1 Numeric Argument in RemoveScroll()
Expected 2 Numeric Arguments in setPos()
HKEY_PERFORMANCE_DATA
HKEY_DYN_DATA
HKEY_CURRENT_CONFIG
HKEY_USERS
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_CLASSES_ROOT
Expected 2 Numeric Arguments in enumRegKey()
Expected 3 Numeric Arguments in enumRegStr()
Expected 4 Numeric Arguments in writeRegValue()
Expected 3 Numeric Arguments in RegStr()
Expected Point opbject with numeric fields x and y
function[%s]:Expected arg %d of type %s
function[%s]:Expected %d args (got %d)
nnnnnnn
nnnnnn
userDataPtr
LuaBridge.Win32.Handle
'Win32.Handle' expected
Win32.Handle<Handle=%p>
Out of memory:Unable to allocate buffer
Invalid Buffer Size!
Unsupported pipe spec expected HANDLE|'self'|'pipe'
Error creating Pipe(for %s):%s
Unable to create Pipe for %s
Unsupported parameter type expected string|number
Expected 5 String Arguments in ShellExecute
LuaBridge.PluginCall
Unable to load function(%s)
Unable to load module(%s)
'LuaBridge.PluginCall' expected
PluginCallJob<Module=%p|Function=%p>
$OUTDIR
LuaBridge.Win32.Job
Unable to create Job(rc=%d)
'Win32.job' expected
Win32.Job<Handle=%p>
Invalid Handle Index (0 -> %d) accepted
LuaBridge.CodeRef
'LuaBridge.CodeRef' expected
CodeRef<%p,state=%s,ref=%d,cnt=%d>
Expected 1 String Arguments in FileExists()
SplitPath is not implemented
GetProcAddress failed to find InternetGetProxyInfo, error: %d
InternetGetProxyInfo
LoadLibrary failed to load jsproxy.dll with error: %d
jsproxy.dll
	no file '%s'
'package.%s' must be a string
package
ReadFile error on '%s' (rc=%d)
CreateFile error on '%s' (rc=%d)
Source doesn't exist!
luabridge.nsis
luabridge.registry
luabridge.fs
luabridge.win32
luabridge.net
luabridge.config
LuaRemoteLoop[state=%x/%s][thread=%d]
END OF STACK
(%s %s)
[%s:%d]
Error:
threadId
running
cancelled
remote
messageWindow
ERROR:Cannot post to state[%s] not async and note default
StateExchange[tid=%d]begin():Acquiring Lock[0x%08x]
StateExchange[tid=%d]wait():Releasing Lock[0x%08x]
StateExchange[tid=%d]wait():Waiting with Semaphore[0x%08x]
StateExchange[tid=%d]complete():Releasing Semaphore on 0x%08x[oldcount=%d]
Invalid options 'ShowWindow': Expected Number
JobBreakaway
stdout
stderr
Unable to find true state!
Expected a non nil argument!
Expected a single argument to CodeRef::new!
coderef
win32_handle
plugincall
__index
registry
Unable to find current state!
light user data expected
[%s]Error Handling Message(%d,%d,%d,%d):%s
[%s]Error Evaluating %s
ERROR:%s
Invalid argument #1 expected string|integer
Thread named '%s' could not be found
Current thread does no have a state!
Unable to find that state
at most one argument allowed
Cannot Serialize UserData in table!
CodeRef::FreeCallback[state=%x/%s](ref=%d)
CodeRef<%x>::Deref[state=%s/%s][thread=%d](%s) Had Abnormal Dealloc
-MISSING-
Error:Unknown /state named %s
evalLuaString[state=%x/%s][thread=%d](%s)
[%s]Calling Global Function(%s)
[%s] loadstring error: %s
Expected 2/3 Arguments in runProcess(string,string,table)
Out of memory
Invalid argument 4, expected table!
VerbosefreeUserMessage[name=%.20s]
VerbosefreeUserMessage[name=%.20s]
evalResp{args=%x,stateName=%x}
ExecutingLater[state=%x/%s][thread=%d](%s)
ref:%d
executeLater() error: unable to access current state
shutdownState[state=%x/%s][thread=%d]
CodeRef::Call[state=%x/%s][thread=%d](%s)
CodeRef::call() ref state no longer exists!
CodeRef::call() error; expected one or more arguments
evalLuaFile[state=%x/%s][thread=%d](%s)
onShutdown
unknown state name '%s'
CreateWindowEx() error (rc=%d)
Error starting remote state
Expected async state name:%s
State already exists
Unable to find this state!
State has been closed
execFileInState() error: unable to access state '%s'
callInState() error: unable to access state '%s'
callInState() error: expected 3 or more arguments
evalInState() error; no code passed
evalInState() error: unable to access state '%s'
```hhh
xppwpp
debug.pdb
lua_isuserdata
lua_isstring
lua_isnumber
lua_settop
lua_rawequal
lua_getfield
lua_getmetatable
lua_touserdata
lua_pushstring
lua_setfield
lua_pushlightuserdata
lua_type
lua_pushboolean
lua_toboolean
lua_gettop
luaL_error
luaL_optinteger
luaL_ref
luaL_unref
luaL_argerror
lua_pushinteger
lua_tolstring
lua_tointeger
lua_error
lua_checkstack
lua_objlen
lua_pushnumber
lua_pushfstring
lua_pushnil
lua_setmetatable
lua_newuserdata
lua_pushlstring
luaL_checkinteger
lua_settable
lua_insert
lua_remove
lua_pcall
lua_pushcclosure
luaL_optlstring
luaL_checklstring
lua_rawgeti
lua_concat
luaL_gsub
lua_load
lua_createtable
lua_pushvalue
lua_gettable
luaL_checktype
luaL_pushresult
lua_getinfo
lua_getstack
luaL_addvalue
luaL_addstring
luaL_buffinit
luaL_openlib
luaL_newmetatable
lua_tonumber
lua_rawseti
lua_next
luaL_openlibs
luaL_newstate
luaL_loadstring
lua_close
lua51.dll
lstrcpynA
lstrlenA
WaitForSingleObject
ReleaseMutex
EnterCriticalSection
LeaveCriticalSection
InterlockedIncrement
GetCurrentThreadId
CreateTimerQueue
DebugBreak
OutputDebugStringA
lstrcmpiA
InitializeCriticalSection
CreateSemaphoreA
CreateMutexA
CreateEventA
LoadLibraryA
ExpandEnvironmentStringsA
CloseHandle
GetLastError
ReadFile
CreatePipe
GetStdHandle
lstrcmpA
FreeLibrary
GetProcAddress
CreateJobObjectA
WaitForMultipleObjects
TerminateJobObject
GetFileAttributesA
CreateDirectoryA
GlobalFree
GetFileSize
CreateFileA
RaiseException
lstrcpyA
SetUnhandledExceptionFilter
SetLastError
QueueUserAPC
OpenThread
ReleaseSemaphore
GetCurrentProcess
GetCurrentProcessId
GetExitCodeProcess
CreateProcessA
ResumeThread
AssignProcessToJobObject
DeleteTimerQueueTimer
CreateTimerQueueTimer
DeleteCriticalSection
DeleteTimerQueueEx
CreateThread
IsProcessInJob
GlobalAlloc
FindClose
FindFirstFileA
KERNEL32.dll
MessageBoxA
SendMessageA
PostMessageA
SetWindowPos
SetWindowLongA
GetWindowLongA
MapWindowPoints
MoveWindow
ReleaseCapture
InvalidateRect
UpdateWindow
GetWindowRect
ShowWindow
EnableWindow
BringWindowToTop
GetClientRect
ClientToScreen
PostThreadMessageA
DestroyWindow
DispatchMessageA
TranslateMessage
PeekMessageA
MsgWaitForMultipleObjectsEx
DefWindowProcA
RegisterClassExA
LoadCursorA
CallWindowProcA
IsDialogMessageA
GetMessageA
CreateWindowExA
CharNextA
USER32.dll
RegCloseKey
RegOpenKeyExA
RegQueryValueExA
RegSetValueExA
RegDeleteValueA
RegCreateKeyExA
ADVAPI32.dll
ShellExecuteA
SHFileOperationA
SHELL32.dll
timeGetTime
WINMM.dll
malloc
vsprintf
_vscprintf
sprintf
memcpy
fclose
strchr
_except_handler3
_snprintf
memset
__CxxFrameHandler
??0exception@@QAE@XZ
?what@exception@@UBEPBDXZ
??1exception@@UAE@XZ
??0exception@@QAE@ABV0@@Z
_CxxThrowException
_callnewh
msvcrt.dll
_XcptFilter
_initterm
_amsg_exit
??1type_info@@UAE@XZ
_unlock
__dllonexit
_onexit
RtlUnwind
InterlockedExchange
InterlockedCompareExchange
TerminateProcess
UnhandledExceptionFilter
GetVersion
QueryPerformanceCounter
GetTickCount
GetSystemTimeAsFileTime
luabridge.dll
??0ArgTable@LuaBridge@@QAE@XZ
??0char_result_dynamic@LuaBridge@@QAE@XZ
??1ArgTable@LuaBridge@@QAE@XZ
??1char_result_dynamic@LuaBridge@@QAE@XZ
??4ArgTable@LuaBridge@@QAEAAV01@ABV01@@Z
??4char_result_context@LuaBridge@@QAEAAU01@ABU01@@Z
??4char_result_dynamic@LuaBridge@@QAEAAU01@ABU01@@Z
?add@ArgTable@LuaBridge@@QAEAAV12@ABV12@PBD@Z
?add@ArgTable@LuaBridge@@QAEAAV12@HPBD@Z
?add@ArgTable@LuaBridge@@QAEAAV12@JPBD@Z
?add@ArgTable@LuaBridge@@QAEAAV12@NPBD@Z
?add@ArgTable@LuaBridge@@QAEAAV12@PAUCodeRef@2@PBD@Z
?add@ArgTable@LuaBridge@@QAEAAV12@PAUlua_State@@HPBD@Z
?add@ArgTable@LuaBridge@@QAEAAV12@PBD0@Z
?add@ArgTable@LuaBridge@@QAEAAV12@PBDI0@Z
?add@ArgTable@LuaBridge@@QAEAAV12@Q6AHPAUlua_State@@@ZPBD@Z
?add@ArgTable@LuaBridge@@QAEAAV12@Q6AHPAUlua_State@@@ZPBV12@PBD@Z
?add@ArgTable@LuaBridge@@QAEAAV12@_NPBD@Z
?addnil@ArgTable@LuaBridge@@QAEAAV12@PBD@Z
?addskipped@ArgTable@LuaBridge@@QAEAAV12@PBD@Z
?apply@ArgTable@LuaBridge@@QBEXPAUlua_State@@@Z
?arg_result_handler@LuaBridge@@YAXPAUnamed_state_t@1@_NPAX@Z
?astable@ArgTable@LuaBridge@@QBEXPAUlua_State@@@Z
?begin@ArgTable@LuaBridge@@QBE?AViterator@12@XZ
?call@LuaBridge@@YAHPAUnamed_state_t@1@PBDPBVArgTable@1@P6AX0_NPAX@Z4@Z
?call@LuaBridge@@YA_NPAUnamed_state_t@1@PBDPBVArgTable@1@PADI@Z
?char_result_handler@LuaBridge@@YAXPAUnamed_state_t@1@_NPAX@Z
?closeState@LuaBridge@@YAXPAUnamed_state_t@1@@Z
?copy@ArgTable@LuaBridge@@QBEPAV12@XZ
?createInterp@LuaBridge@@YAPAUlua_State@@PBD@Z
?createState@LuaBridge@@YAPAUnamed_state_t@1@PBDPAU21@@Z
?end@ArgTable@LuaBridge@@QBE?AViterator@12@XZ
?eval@LuaBridge@@YA_NPAUnamed_state_t@1@PBD@Z
?eval@LuaBridge@@YA_NPAUnamed_state_t@1@PBDPADI@Z
?execFile@LuaBridge@@YA_NPAUnamed_state_t@1@PBD@Z
?findOrCreateState@LuaBridge@@YAPAUnamed_state_t@1@PBD@Z
?findState@LuaBridge@@YAPAUnamed_state_t@1@PBDPAUlua_State@@@Z
?from_arguments@ArgTable@LuaBridge@@QAEXPAUlua_State@@H@Z
?from_stack@ArgTable@LuaBridge@@QAEXPAUlua_State@@HH@Z
?from_table@ArgTable@LuaBridge@@QAEXPAUlua_State@@H@Z
?getState@LuaBridge@@YAPAUlua_State@@PBD@Z
?multi_ret_arg_result_handler@LuaBridge@@YAXPAUnamed_state_t@1@_NPAX@Z
?processPipeCommands@LuaBridge@@YAHPAUnamed_state_t@1@PAX_N@Z
?push_cell@ArgTable@LuaBridge@@AAEAAV12@PAUarg_cell_t@2@@Z
?serveRemoteState@LuaBridge@@YAHPBD0@Z
?setDefaultJobBreakaway@LuaBridge@@YAXH@Z
?shutdownState@LuaBridge@@YAXPAUnamed_state_t@1@@Z
?size@ArgTable@LuaBridge@@QBEHXZ
?startRemoteState@LuaBridge@@YAHPBD000J@Z
?stateFromState@LuaBridge@@YAPAUlua_State@@PAUnamed_state_t@1@@Z
?waitForState@LuaBridge@@YA_NPBD@Z
luabridge_cancel_state
luabridge_close_state
luabridge_configure_default_context
luabridge_enter_thread_loop
luabridge_eval
luabridge_exec_file
luabridge_finalize
luabridge_find_state
luabridge_get_state_thread
luabridge_init
luabridge_open_classes
luabridge_open_config
luabridge_open_fs
luabridge_open_net
luabridge_open_nsis
luabridge_open_registry
luabridge_open_win32
luabridge_pause_state
luabridge_reset_state
luabridge_resume_state
luabridge_serve_remote_state
luabridge_shutdown_state
luabridge_start_remote_state
luabridge_wait_for_state
luabridge_wnd_proc
Invalid Arguments (string,string|boolean[,hwnd[,timeout]]) expected
.?AVbad_alloc@std@@
.?AVexception@@
051L1e1
2"272C2V2n2u2
3B3L3y3
3&494~4N5V5r5
5"6H6h6
< <,<8<
'0@0Q0h0
131E1d1h1l1p1t1
3-3O3~3
4#4N4U4
51565o5v5
7>7f7k7
768;8c8v8{8
;';=;P;y;
=!=0=J=
1!171M1d1
1(222J2|2
3'343>3[3
6 666d6t6}6
898y8~8
9+9R9Z9`9e9o9u9z9
9":L:t:
;,;8;[;k;
;0<d<m<
=?=]=l=t=
>$>;>[>`>
?#?-?q?
;0L0q0
252:2U2Z2u2z2
4,4l4y4
535?5o5
6	7#7U7
878d8p8
:F;t;x;|;
< =3=Q=]=l=w=
?0?Y?_?{?
0>1^1z1
1)2L2y2
4"4B4O4b4q4
5	5)5=5D5J5j5~5
6#6.6F6P6
7	808P8
2C3^3c3
6R7b7l7z7
8<9@9D9H9L9P9T9X9\9`9
;8<<<@<D<H<L<P<T<<>q>
@0l0t0}0
1L1Y1j1p1
3+333@3X3w394r4
;%;M;];
>'?7?^?
2#2F2g2
494W4p4t4x4|4
717K7Y7k7
:F:c:s:
=0=j={=
9!9/999U9`9z9
:D:U:t:
;^;k;q;x;
=3>O>T>
J0V0e0p0
1?2p3w3
5:5B5I5
6*666{6
7#7;7@7L7[7b7
9Z:`:y:
:5;E;X;_;i;
=(=k=w=
>=?K?y?
1'171]1
132Q2V2
2 3(353Y3h394_4
425B5\5w5
6<7p7y7
8/:::Z:g:m:
=$=*=0=6=<=B=H=N=T=Z=`=f=l=r=x=~=
>(>5>B>]>
?"?(?.?n?t?z?
2G3M3R3s3{3
4(484>4E4\4b4o4
5+585`6
6<7^7l7
7:8J8P8V8\8b8h8o8v8}8
;/<4<K<n<{<
<&=9=a=y=
=!>A>Y>
?,?Q?i?
010Y0d0h0m0
<3@3p8t8x8|8
9 9$9(9,9094989<9@9D9H9L9P9T9X9\9`9d9h9l9p9t9x9|9
: :$:(:,:0:4:8:<:@:D:P:T:X:\:`:d:h:l:p:t:x:|:
; ;$;(;,;0;4;@;D;P;T;X;\;`;d;p;t;x;|;
@>D>H>L>T>X>\>
?8?<?L?P?T?\?t?x?
$0(000<0\0d0p0
1$101P1\1|1
2$2D2P2p2x2
3 3@3H3T3t3
4$4D4L4X4x4
5 545P5X5\5d5h5p5t5|5
0 0$0,00080<0D0H0P0T0
!This program cannot be run in DOS mode.
`.rdata
@.data
.reloc
u48\$'u.WV
T$ RWj
T$$FVQP
\$@UV3
|$Tt);
N$WRUP
T$LRUP
V<Rh,b
QSVWj@
L$$SQW
D$$PUW
D$,PWQ
f;H,s}
l$@8\$
T$ RUP
T$$RVP
L$(QWWV
Wj=hTb
D$<SPV
D$ PQR
9_$v4V
V9o$v#
L$$QRPW
L$$SQW
t$4PPV
Pjzhli
D$XSUVW3
T$$RKSP
L$X_^]
D$XSUVWj
T$$RMUP
T$ RUP
L$X_^]
t$4PPV
t$(PPV
Pjchli
T$ WRP
L$$SPQ
u;8Ept
D$@QRP
D$@QRP
L$@RPQ
T$@PQR
D$ QRP
L$X;L$
t$X91t
D$,PUQ
T$(RUP
L$,QUR
D$(PUQ
D$X;D$
T$XRSUP
9|$XvJ
9\$`~m
L$D_^]3
D$$PhxX
L$DQhxX
\$,ShxX
l$<UhxX
Pjfh,t
t f;|$
L$4_^]2
|$ hxs
L$0_^][+
L$Dhxs
t*Sh`v
D$(QRP
|$$WUQP
u@E;l$
\$@WUSVP
L$ Qh@{
L$$_^]
L$l_^][d
^:A8t2
t$$WhL
L$ _^]d
T$(PQWUURU
t Ph(d
t Ph(d
D$@SVW
L$L_^[3
D$PSVW
L$\_^[3
L$<QRS
L$\_^][3
L$4_^]3
L$(^]3
L$,PQj
T$$_^]
T$$PRh
;t$$u%
;t$$u%
URPQQh
v	N+D$
UQPXY]Y[
preload
package
luacom
loaded
win32_pipeserver
LuaXML_lib
simplecom
dialog.html
dialog.image
dialog
RoundTrip
StartMessageLoop
DetectAutomation
GetCurrentDirectory
ImportIUnknown
CreateLuaCOM
LoadTypeLibrary
GetEnumerator
GetTypeInfo
DumpTypeInfo
EndLog
StartLog
GetIUnknown
UnRegisterObject
RegisterObject
RevokeObject
ExposeObject
NewControl
NewObjectFromTypelib
NewObject
ShowHelp
Connect
isMember
ProgIDfromCLSID
releaseConnection
addConnection
ImplInterfaceFromTypelib
ImplInterface
CLSIDfromProgID
GetObject
CreateObject
$Name:  $
$Id: luacom.cpp,v 1.61 2005/01/06 18:41:49 fqueiroz Exp $
support-projects\luacom\src\library\luacom.cpp
abort_on_error
abort_on_API_error
__LuaCOM__
last_error
Could not get default events interface.
AImplementation must be a table or a userdata
Could not load type library.
Could not get ccoclass typeinfo.
Unknown error
inproc_server
local_server
Could not establish connection
CoClass not found in type library.
Could not find a suitable default interface.
Incomplete registration table.
Could not get coclass typeinfo.
Programmable
Version
Implemented Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}
Implemented Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}
Implemented Categories\{40FC6ED5-2438-11CF-A3DB-080036F12502}
Implemented Categories\{40FC6ED4-2438-11CF-A3DB-080036F12502}
Implemented Categories\{0DE86A57-2BAA-11CF-A229-00AA003D7352}
Implemented Categories\{0DE86A53-2BAA-11CF-A229-00AA003D7352}
InprocServer32
luacom.dll
LocalServer32
CurVer
CLSID\
ScriptFile
Arguments
ComponentName
CoClass
TypeLib
ProgID
VersionIndependentProgID
Control
Registration info must be a table or userdata
IUnknown
IUnknown typed object expected.
no valid command-line switch
StartAutomation
/Automation
UnRegister
/UnRegister
Register
/Register
Pointer expected.
LuaCOM error: trying to set a read-only field in a COM object.
self parameter not found.
@tagmeth_index
looking for name '%s'
inproc
IConnectionPoint
LuaCOM
config
Object does not have coclass type information
object
Memory allocation error
LuaCOM error
Windows error
Unsupported feature required
COM exception
COM error
Type conversion error
Parameter(s) out of range
Internal Error
:(%s,%d)
$Id: tLuaCOM.cpp,v 1.39 2005/01/06 18:41:55 fqueiroz Exp $
support-projects\luacom\src\library\tLuaCOM.cpp
Unknown exception
tLuaCOM.call
about to call DISPID 0x%.8x
tLuaCOM
%.4d:destroyed
No connection point for this interface!
Object does not accept connections!
$Id: tLuaDispatch.cpp,v 1.30 2004/11/25 13:40:01 fqueiroz Exp $
support-projects\luacom\src\library\tLuaDispatch.cpp
tLuaDispatch
Exception (%s)
Property puts with more than two parameters aren't supported.
Parametrized property puts only implemented for tables and userdata's.
Member '%s' called (0x%.8x)
Member '%s' not found (0x%.8x)
Property putref not supported.
DISPID 0x%.8x not found.
%.4d:created
support-projects\luacom\src\library\tCOMUtil.cpp
%.3d: %-30s	id=0x%p	%d param(s)
propputref
propput
propget
unsigned char
Decimal
IUnknown*
VARIANT
VARIANT_BOOL
IDispatch*
double
dispinterface
interface
module
record
enumeration
coclass
version
__newindex
__index
__call
__tocom
%s_UDTAG
_USERDATA_REF_
Object type is wrong
$Id: tUtil.cpp,v 1.14 2005/01/06 18:42:06 fqueiroz Exp $
support-projects\luacom\src\library\tUtil.cpp
hh.exe
-mapid %d
__LUACOM_CONNPOINT
No default source typeinfo.
support-projects\luacom\src\library\tLuaCOMConnPoints.cpp
File %s, Line %d
ActiveX Framework Assertion  (Abort = UAE, Retry = INT 3, Ignore = Continue)
`Uu:@DestroyWindow
GetClass
support-projects\luacom\src\library\tLuaControl.cpp
CtlFrameWork_Parking
SetExtent
CreateWindow
InitialSize
ITypeLib
ITypeLib_pointer
ITypeInfo
ITypeInfo_pointer
support-projects\luacom\src\library\tLuaTLB.cpp
helpcontext
helpfile
helpstring
default
parameters
description
ParamsOpt
Params
invkind
defaultvtable
restricted
source
cancreate
oleautomation
dispatchable
appobject
control
hidden
ImplTypes
typekind
GetImplTypeFlags
GetImplType
GetTypeAttr
GetDocumentation
GetVarDesc
GetFuncDesc
GetTypeLib
ExportEnumerations
ExportConstants
GetTypeInfoCount
support-projects\luacom\src\library\tLuaObjList.cpp
$Id: tLuaCOMTypeHandler.cpp,v 1.39 2005/01/06 18:42:00 fqueiroz Exp $
decimal
currency
support-projects\luacom\src\library\tLuaCOMTypeHandler.cpp
Unknown TYPEKIND on VT_USERDEFINED TYPEDESC
TKIND_MODULE and TKIND_MAX not supported!
Record type not supported!
Union type not supported!
Could not understand user-defined type
Unknown type
COM->Lua - Type 0x%.2x not implemented.
Milliseconds
Second
Minute
DayOfWeek
string
DateFormat
TableVariants
progid
typelib
No lua value to convert.
Conversion function failed.
Invalid conversion function.
Type not compatible with automation.
SAFEARRAY of SAFEARRAYS not allowed
__ENUMERATOR_POINTER_LUACOM_TYPE
__ENUMERATOR_LUACOM_TYPE
support-projects\luacom\src\library\tLuaCOMEnumerator.cpp
__TLUACOMENUMERATOR__internal
Not enough parameters.
Unable to reset enumeration.
support-projects\luacom\src\library\tLuaCOMClassFactory.cpp
$Id: LuaAux.cpp,v 1.13 2004/11/25 13:40:00 fqueiroz Exp $
Lua runtime error
Lua memory allocation error.
Lua error: error during error handler execution.
Unknown Lua error.
No error
__TLUAOBJECT_pointer__
Error: self parameter is not a tLuaObject.
support-projects\luacom\src\library\tLuaObject.cpp
__luacom_instances_cache
__mode
support-projects\luacom\src\library\tLuaVector.cpp
Cannot convert table to safearray
Can't convert to safearray
Trying to create nested safearrays.
pointer
set_error_handler
new_idispatch
new_iunknown
impl_from_tlb
__tostring
is_unknown
is_dispatch
is_ptr
is_float
is_int
is_string
is_bool
is_null
is_empty
error_handler__
variant-copy-failed
dispatch-call-failed
simplecom::include.table
SimpleCom.DispParam
SimpleCom.IDispatch
SimpleCom.IDispatchPtr
SimpleCom.IUnknownPtr
current-module
Error Handler must be a function
%s:%dsimplecom::error_handler :: %s
lua-windialog\native\lua_simplecom.cpp
'SimpleCom.DispParam' expected
'SimpleCom.DispParam' invalid param index
DispParams<%p[count=%d]>
F%s<%s,refcnt=%d,ref=%d @ %p>
'SimpleCom.IDispatch' expected
%s<%p>
iunknown
idispatch
kIncludeTable
Expected user data or light userdata
Unsupported type!
%s:%dVariantCopyInd failed!(hr=%d)
%s:%dVariantCopyInd failed!(hr=%d,type=%x)
VariantCopyInd Failed!(hr=%d,type=%x)
%s:%dVariantCopyInd failed!(hr=%d)(type=%x)
Dispatch Call Failed!(msg=%s)
%s:%dDispatch Call Failed:%s
Unable to find interface '%s'
Unable to get first interface!(rc=%d)
Unable to load type library(rc=%d)
msg_filter
remove_event_handler
add_event_handler
set_other_handler
set_external
destroy
document
browser
refresh
load_url
translate_accelerator
get_browser
get_document
get_service
bad allocation
'Win32.HtmlDialog' expected
Win32.HtmlDialog
Win32.HtmlDialog<p=%p,hwnd=%p>
BeforeNavigate2
ClientToHostWindow
CommandStateChange
DocumentComplete
DownloadBegin
DownloadComplete
NavigateComplete2
NewProcess
NavigateError
NewWindow2
NewWindow3
OnStatusBar
OnVisible
ProgressChange
PropertyChange
StatusTextChange
TitleChange
WindowClosing
WindowSetHeight
WindowSetLeft
WindowSetTop
WindowSetWidth
WindowStateChanged
DISPID#%d
table expected in set_other_handler
Unable to get  target service
Unable to get IServiceProvider
user data is NULL
Error converting %s to IID
[E_NOTIMPL]
lua-windialog\native\lua_htmldialog.cpp
HtmlFrameImpl::IOleClientSiteImpl::GetMoniker
HtmlFrameImpl::IOleClientSiteImpl::RequestNewObjectLayout
HtmlFrameImpl::IOleClientSiteImpl::SaveObject
Win32.HtmlDialogClass
DummyStorage::Commit
DummyStorage::Revert
DummyStorage::EnumElements
DummyStorage::CreateStream
DummyStorage::OpenStream
DummyStorage::CreateStorage
DummyStorage::OpenStorage
DummyStorage::CopyTo
DummyStorage::SetStateBits
DummyStorage::SetElementTimes
DummyStorage::DestroyElement
DummyStorage::Stat
DummyStorage::RenameElement
DummyStorage::MoveElementTo
HtmlFrameImpl::InPlaceSiteImpl::ContextSensitiveHelp
HtmlFrameImpl::InPlaceSiteImpl::DeactivateAndUndo
HtmlFrameImpl::InPlaceSiteImpl::DiscardUndoState
HtmlFrameImpl::InPlaceSiteImpl::Scroll
Unable to load IUnknown interface.
No browser loaded.
Unable to load IDispatch interface.
HtmlFrameImpl::InPlaceFrameImpl::ContextSensitiveHelp
HtmlFrameImpl::InPlaceFrameImpl::GetBorder
HtmlFrameImpl::InPlaceFrameImpl::RequestBorderSpace
HtmlFrameImpl::InPlaceFrameImpl::SetBorderSpace
HtmlFrameImpl::InPlaceFrameImpl::InsertMenus
HtmlFrameImpl::InPlaceFrameImpl::RemoveMenus
HtmlFrameImpl::InPlaceFrameImpl::TranslateAcceleratorA
table expected in add_event_handler
Expected lightuserdata or table
Unable to get document
Unable to get IWebBrowserApp service
Unable Get IServiceProvider
Input is not IHtmlWindow!
document_url
errorFailure
Unable to get window.event(hr=%d)
Unable to document.parentWindow(hr=%d)
Unable to get IHtmlDocument2(hr=%d)
onScriptError
set_background
autosize
'Win32.ImageDialog' expected
Win32.ImageDialog
Win32.ImageDialog<p=%p,hwnd=%p>
Failed to load image!
Failed to convert image path to wchar
ole_initialize
window_loop
gdiplus_shutdown
gdiplus_start
set_error_handlers
post_handlers
pre_handlers
set_text
hwnd_integer
begin_move
center
borderless
animate
topmost
to_foreground
show_noactivate
show_na
show_normal
minimize
restore
maximize
AW_VER_NEGATIVE
AW_VER_POSITIVE
AW_SLIDE
AW_HOR_NEGATIVE
AW_HOR_POSITIVE
AW_HIDE
AW_CENTER
AW_BLEND
AW_ACTIVATE
function or nil expected
timeout
GetMessage failed
Animations
%s <- @%s:%d::%s
<![CDATA[
LuaXml ERROR: "%s" file error or file not found!
LuaXml ERROR: code already exists.
&apos;
&quot;
encode
registerCode
async_wait
create_server
wait_for
is_pending
connect_pipe
cancel_io
overlapped_result
buffer
create_pipe
Win32.Handle
'Win32.Handle' expected
Win32.Handle<Handle=%p>
No buffer is allocated
Invalid Buffer size (max=%d)
Out of memory:Unable to allocate buffer
 @Win32.Overlapped
'Win32.overlapped' expected
Win32.overlapped<overlapped=%p>
options table field 'create_flags' must be a number
create_flags
inherit_handles
options table field 'env' must be a string
Expected 2/3 Arguments in create_server(string,string,table)
ed to write message(rc=%d)
read Failed!
Invalid Buffer Size!
win32_overlapped
win32_handle
setmaxstack
locale
(a %s)
rule '%s' undefined in given grammar
rule '%s' used outside a grammar
lpeg-pattern
loop body may accept empty string
range must have two characters
non-nil value expected
invalid argument index
initial rule '%s' is not a pattern
grammar has no initial rule
grammar has too many rules
rule '%s' is not a pattern
rule '%s' may be left recursive
too many left calls in grammar
empty loop in rule '%s'
function only implemented in debug mode
lpeg-maxstack
pattern
xdigit
Y@pattern too long to look behind
pattern may not have fixed length
pattern have captures
invalid replacement value
invalid number
not enough memory
back reference '%s' not found
no initial value for fold capture
no capture '%d'
too many runtime captures
replacement
invalid %s value (a %s)
no values in capture index %d
capture
invalid capture index (%d)
reference to absent argument #%d
too many captures
too many pending calls/choices
invalid position returned by match-time capture
lock_dir
unlock
setmode
symlinkattributes
currentdir
attributes
permissions
change
modification
access
binary
%s: %s
Unable to change working directory to '%s'
%s: closed file
%s: not a file
%s: invalid mode
lock metatable
File exists
/lockfile.lfs
make_link is not supported on Windows
closed directory
directory metatable
path too long: %s
char device
directory
invalid attribute name
cannot obtain information from file `%s'
LuaFileSystem 1.6.2
_VERSION
LuaFileSystem is a Lua library developed to complement the set of functions related to file systems offered by the standard Lua distribution
_DESCRIPTION
Copyright (C) 2003-2012 Kepler Project
_COPYRIGHT
```hhh
xppwpp
debug.pdb
lua_settop
lua_setfield
lua_pushcclosure
lua_getfield
lua_pushboolean
lua_createtable
lua_pushstring
lua_gettop
lua_pushnumber
luaL_unref
luaL_ref
lua_pushvalue
luaL_argerror
lua_type
luaL_optlstring
luaL_checklstring
lua_toboolean
lua_tolstring
lua_tonumber
luaL_checknumber
lua_gettable
lua_pushnil
lua_rawset
lua_touserdata
lua_remove
lua_rawget
lua_settable
luaL_checktype
lua_topointer
lua_rawgeti
lua_isuserdata
luaL_openlib
lua_error
lua_pcall
lua_setmetatable
lua_insert
lua_newuserdata
lua_getmetatable
lua_pushlightuserdata
lua_checkstack
lua_equal
lua_rawseti
lua_pushlstring
lua_call
lua_objlen
lua_close
lua_typename
lua_next
lua_rawequal
luaL_error
lua_replace
luaL_checkudata
luaL_checkinteger
lua_pushfstring
lua_pushinteger
luaL_register
luaL_newmetatable
lua_isstring
lua_isnumber
luaL_optinteger
luaL_gsub
luaL_pushresult
luaL_prepbuffer
luaL_addlstring
luaL_buffinit
luaL_addstring
lua_tointeger
lua_setfenv
lua_getfenv
luaL_checkstack
luaL_checkany
lua_getallocf
luaL_addvalue
luaL_checkoption
luaL_optnumber
lua51.dll
DeleteObject
CreateRectRgnIndirect
SetViewportOrgEx
SetWindowOrgEx
SetViewportExtEx
SetWindowExtEx
SetMapMode
GDI32.dll
SHDeleteKeyA
SHLWAPI.dll
__CxxFrameHandler
_errno
_CxxThrowException
??3@YAXPAX@Z
wcstombs
mbstowcs
malloc
sprintf
_stricmp
strncmp
??2@YAPAXI@Z
strncat
strncpy
_purecall
sscanf
printf
wprintf
fclose
fflush
vfprintf
fprintf
_spawnlp
memset
__RTDynamicCast
memcpy
??_V@YAXPAX@Z
_except_handler3
??_U@YAPAXI@Z
_snprintf
strstr
realloc
isspace
isdigit
rewind
memmove
isxdigit
isupper
ispunct
isprint
islower
isgraph
iscntrl
isalpha
isalnum
strerror
_locking
_setmode
_fileno
_mkdir
_findclose
_findnext
_findfirst
_utime
_stati64
msvcrt.dll
_XcptFilter
_initterm
_amsg_exit
??1type_info@@UAE@XZ
_unlock
__dllonexit
_onexit
?terminate@@YAXXZ
WinHelpA
DispatchMessageA
TranslateMessage
GetMessageA
MessageBoxA
GetActiveWindow
SetWindowPos
SetWindowRgn
OffsetRect
EqualRect
IntersectRect
CallWindowProcA
GetWindowLongA
GetClientRect
ShowWindow
wsprintfA
CreateWindowExA
RegisterClassA
DefWindowProcA
MapWindowPoints
GetWindowRect
IsWindowVisible
SetFocus
DestroyWindow
SetWindowLongA
RegisterClassExA
LoadCursorA
SendMessageA
InvalidateRect
UpdateWindow
SetRect
ClientToScreen
SetCapture
SetCursor
ClipCursor
ReleaseCapture
EndPaint
BeginPaint
SetForegroundWindow
AnimateWindow
MoveWindow
PostMessageA
GetDesktopWindow
GetMonitorInfoA
MonitorFromWindow
KillTimer
SetTimer
USER32.dll
StringFromCLSID
CLSIDFromProgID
ProgIDFromCLSID
CLSIDFromString
CoCreateInstance
MkParseDisplayName
CreateBindCtx
CoRevokeClassObject
CoTaskMemFree
CoRegisterClassObject
StringFromIID
OleRegGetUserType
CreateOleAdviseHolder
CoTaskMemAlloc
CoLockObjectExternal
OleSetContainedObject
OleCreate
CreateStreamOnHGlobal
OleInitialize
ole32.dll
OLEAUT32.dll
GdipFree
GdipAlloc
GdipDeleteGraphics
GdipLoadImageFromFileICM
GdipLoadImageFromStream
GdipLoadImageFromStreamICM
GdipDisposeImage
GdipGetImageWidth
GdipGetImageHeight
GdipCreateFromHDC
GdipDrawImageRectI
GdipCloneImage
GdiplusStartup
GdiplusShutdown
gdiplus.dll
timeGetTime
WINMM.dll
RegEnumKeyExA
RegCloseKey
RegOpenKeyExA
RegSetValueExA
RegCreateKeyExA
RegQueryValueExA
ADVAPI32.dll
GetModuleFileNameA
GetCurrentDirectoryA
LocalFree
FormatMessageA
GetLastError
WideCharToMultiByte
MultiByteToWideChar
IsBadWritePtr
FatalAppExitA
DebugBreak
lstrcpyW
lstrlenW
OutputDebugStringA
lstrcmpiA
InterlockedDecrement
GetModuleFileNameW
GlobalFree
GlobalUnlock
GlobalLock
GlobalAlloc
TlsSetValue
TlsGetValue
TlsAlloc
TlsFree
CloseHandle
CancelIo
CreateEventA
WaitForSingleObject
CreateProcessA
SetEnvironmentVariableA
WriteFile
ReadFile
GetOverlappedResult
ConnectNamedPipe
CreateFileA
RtlUnwind
InterlockedExchange
InterlockedCompareExchange
TerminateProcess
GetCurrentProcess
UnhandledExceptionFilter
SetUnhandledExceptionFilter
GetVersion
QueryPerformanceCounter
GetTickCount
GetCurrentThreadId
GetCurrentProcessId
GetSystemTimeAsFileTime
lstrlenA
HeapFree
GetProcessHeap
KERNEL32.dll
_chdir
_getcwd
_rmdir
shared_library.dll
luaopen_dialog
luaopen_dialog_html
luaopen_dialog_image
_luaopen_shared@4
luaopen_simplecom
luaopen_win32_pipeserver
_set_dialog_dllhandle@4
.?AVtLuaCOMException@@
.?AVILuaDispatch@@
.?AUIUnknown@@
.?AVtLuaDispatch@@
.?AUIDispatch@@
.?AVProvideClassInfo2@tLuaDispatch@@
.?AUIProvideClassInfo2@@
.?AUIProvideClassInfo@@
.?AVtLuaCOMEnumConnPoints@@
.?AUIEnumConnectionPoints@@
.?AVtLuaCOMConnPoint@@
.?AUIConnectionPoint@@
.?AVtLuaCOMEnumConnections@@
.?AUIEnumConnections@@
.?AVtLuaCOMConnPointContainer@@
.?AUIConnectionPointContainer@@
Couldn't Create Global parking window!!
g_hwndParking
Couldn't Register Parking Window Class!
.?AVtLuaControl@@
.?AUIOleObject@@
.?AUIOleControl@@
.?AUIOleInPlaceObject@@
.?AUIOleWindow@@
.?AUIOleInPlaceActiveObject@@
.?AUIViewObject2@@
.?AUIViewObject@@
.?AUIPersistStreamInit@@
.?AUIPersist@@
.?AUIPersistStorage@@
.?AUIQuickActivate@@
Host doesn't initialize CONTROLINFO structure
pControlInfo->cb == sizeof(CONTROLINFO)
Somebody called Unadvise on IOleObject without calling Advise!
Somebody Called EnumAdvise without setting up any connections
.?AVCEnumOLEVERB@@
.?AUIEnumOLEVERB@@
Unrecognized Negative verb in DoVerb().  bad.
.?AVtLuaObject@@
.?AVtLuaTLB@@
.?AVtLuaTypeInfo@@
.?AVtLuaCOMTypeHandler@@
.?AVtLuaCOMEnumerator@@
.?AVtLuaCOMClassFactory@@
.?AUIClassFactory@@
.?AVtStringBuffer@@
.?AVtLuaVector@@
.?AVLuaTableDispatchImpl@simplecom@@
.?AVBrowserEventSink@@
.?AVIOleClientSiteImpl@HtmlFrameImpl@@
.?AUIOleClientSite@@
.?AVIOleCommandTargetImpl@HtmlFrameImpl@@
.?AUIOleCommandTarget@@
.?AVDummyStorage@@
.?AUIStorage@@
.?AVInPlaceSiteImpl@HtmlFrameImpl@@
.?AUIOleInPlaceSite@@
.?AVDocHostUIHandlerImpl@HtmlFrameImpl@@
.?AUIDocHostUIHandler2@@
.?AUIDocHostUIHandler@@
.?AVInPlaceFrameImpl@HtmlFrameImpl@@
.?AUIOleInPlaceFrame@@
.?AUIOleInPlaceUIWindow@@
.?AVHtmlFrameImpl@@
tEXtSoftware
Adobe ImageReadyq
iTXtXML:com.adobe.xmp
<?xpacket begin="
" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c014 79.151481, 2013/03/13-12:09:15        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmpMM:OriginalDocumentID="uuid:65E6390686CF11DBA6E2D887CEACB407" xmpMM:DocumentID="xmp.did:D5133994DB8111E28740D603391276DF" xmpMM:InstanceID="xmp.iid:D5133993DB8111E28740D603391276DF" xmp:CreatorTool="Adobe Photoshop CC (Macintosh)"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:38edfe8c-fae3-4422-b98d-856422e8ed92" stRef:documentID="xmp.did:0280117407206811808386E573F71C36"/> <dc:title> <rdf:Alt> <rdf:li xml:lang="x-default">glyphicons</rdf:li> </rdf:Alt> </dc:title> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>b
68GpDG
tEXtSoftware
Adobe ImageReadyq
iTXtXML:com.adobe.xmp
<?xpacket begin="
" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c014 79.151481, 2013/03/13-12:09:15        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmpMM:OriginalDocumentID="uuid:65E6390686CF11DBA6E2D887CEACB407" xmpMM:DocumentID="xmp.did:34C240C6DB8311E28740D603391276DF" xmpMM:InstanceID="xmp.iid:A7D22AE6DB8211E28740D603391276DF" xmp:CreatorTool="Adobe Photoshop CC (Macintosh)"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:38edfe8c-fae3-4422-b98d-856422e8ed92" stRef:documentID="xmp.did:0280117407206811808386E573F71C36"/> <dc:title> <rdf:Alt> <rdf:li xml:lang="x-default">glyphicons</rdf:li> </rdf:Alt> </dc:title> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>u
*IDATx
sKI= _
.?AVImage@Gdiplus@@
.?AVGdiplusBase@Gdiplus@@
---------
.?AV_com_error@@
060F0U0`0u0
1&1;1K1Z1e1}1
2 2+2@2P2b2m2
4+505;5@5
5*6=6V6
:#:2:@:J:\:
:%;a;g;w;
;/<=<K<U<d<
<&=Q=W=^=g=
=%>=>K>v>
?6?a?g?n?w?
50P0e0
1$1>1f1
13282>2P2y2
2&3<3K3f3|3
6&6A6W6f6
9%;/;>;L;V;e;s;};
<?>I>X>f>p>
121R1r1
2#262k2x2
505F5\5r5
5N6d6s6
7(727A7
848U8w8
;+;5;D;
3X3o3t3
7*7Y7b7
?$?,?D?I?T?Y?d?i?u?
060j0p0w0
2&202?2n2
3)383=3J3h3r3
9;9]9b9
:!;0;>;H;W;r;
1&1r1%232=2M2
3	4L4\4
7,7>7q7
2D2K2P2
2 4J4g4p4y4~4
4O5O6T6Z6a6
=#=C=`=k=y=
=9>L>Y>
2"2(2.242<2@2D2H2L2P2T2X2f2
3!3*343A3Q3Z3g3z3
4!40484E4Z4b4l4z4
5+5=5O5U5`5h5l5p5t5x5|5
6 6$6(6,60646T6
:E:R:c:y:
:	;";A;
;#<+<1<6<H<V<v<
5>6D6X6
7,717F7
8S8]8p8
;:;N;a;l;u;
<i=->J>
1*1y2-3
:.:=:G:W:s:
;2;B;W;g;
1R3b3|3
5!5*5K587%8,898C8K8[8l8
9"9*9/9=9B9G9Q9c9
>P>U>Z>
:-:Q:i:
=9>O>_>{>
?,?C?c?h?
292O2_2{2
3/3F3p3u3B4f4
9.9I9_9n9
;(;>;N;r;w;8<N<^<z<
>%>;>K>j>o>
?1?I?g?
0'1`1{1
293P3\3a3i3u3z3
4*5:5V5[5f5k5
6*6:6M6]6{6
:#:*:1:8:?:F:\:
:@;Z;j;z;
;*<M<h<~<
>;>K>W>a>q>
?(?,?0?4?8?<?@?D?H?~?
0 0$0(0r0|0
2"222@2D2H2L2P2T2X2\2`2d2h2l2p2t2x2|2
4Z4s4z4
4P5f5u5
6@6M6v6
8)848P8[8n8
8+9D9f9
;>;C;I;Q;[;j;};
<!<F<X<
<`=~==>
>F?P?`?
0(171u1
9):3:C:Y:i:x:|:
<Q<^<{<
=$=(=,=0=4=8=<=@=D=H=L=P=T=X=\=`=d=h=l=p=t=
=&> ?U?
E0U0y0
0,121G1S1X1
3d4n4~4
4T5j5z5
7'7,7:7@7O7h7n7
969@9[9a9g9l9q9w9~9
:2:7:>:[:f:v:
0O0Z0x0}0
2-2N2^2q2
=F=R=s=
>!>6>]>o>|>
0,0004080<0@0D0H0L0P0T0X0\0`0d0h0l0p0t0x0|0
0+1@1g1}1
70858S8
>!?&?>?
;0F0n0
*2E2R2]2{2
637V7k7
718]8~8
:O:p:|:
:#;L;P;T;X;\;`;d;
<$<+<2<<<r<
=$=/=^=c=j=t=
>*>/>6>@>
1U1p1v1#3
:":/:W:
='=0=C=
>!>+>0>u>
3%3E3S3h3~3
425:5I5]5b5m5x5
5A6K6P6q6{6
717;7@7a7k7p7
8!8+808Q8[8`8
9-:9;O;e;
>j>I?`?v?
4 4A4K4P4
4H5`5g5n5u5|5
5(6-6=6
7T8q8v8
8G9	:!:7:W:
>A?O?e?
2$2+292H2
3r3	4!424b4
7A8W8d8
;	<c<x<
>_?f?t?
)080>0u0
0d1h1l1p1t1
2)272<2G2R2m2z2
>;>b>i>
2&2<2F2]2q2{2
3?3F3M3[3a3j3W4
4/5w5~5
;T<_<y<
=#>t>{>
>!?3?u?
2#2)2g2
303X3n3
4-4[4~4
5	6(6>6S6w6
<,<k<u<
<"=:=J=`=
?F?K?V?[?f?q?
0"1\1k1
5'6T6X6\6
>	?)?8?F?
111@1`1o1
1H2L2P2T2X2\2`2d2h2l2
7 7&72787V7b7p7
9$;T<$=
>q>K?l?
?l?p?t?x?|?
=(=,=0=4=
3)3;3P3W3
5+545j5y5
6E6Y6b6r6
767J7O7\7a7
7(81878X8l8q8
8'9R9e9n9t9
:':H:_:h:
<,<7<Q<h<s<
<&=9=B=H=
0	1'1A1c1p1
1 2&2,22282>2D2J2P2V2\2b2h2n2t2z2
3"3(3.343:3@3F3L3R3X3^3d3j3p3v3|3
586@6X6\7
8&878O8d8i8o8
9)9/969A9K9\9u9
<><D<K<U<f<z<
>%>->5>=>I>R>W>]>g>p>{>
181B1H1N1U1r1
2'232E2R2Z2f2l2r2
2)3?3N3
4%5;5N5
6M6e6v6
6!717A7Q7a7q7
8!818A8Q8a8q8
9!919I9l9
:,:L:a:q:
;1;L;y;
;!<A<Y<
<9=T=i=
>!>1>A>G>
,505<5@5L8P8
1<2@2D2H2L2P2
5 5$5(5,5054585<5@5D5H5L5P5T5X5\5`5d5h5 7$7(7,7074787<7@7D7H7L7P7T7X7\7`7d7h7l7p7t7x7|7
8 8$8(8,8084888<8@8D8H8L8P8T8X8\8`8d8h8l8p8t8x8|8
9P9T9X9\9`9d9h9
8(8,8084888<8@8D8H8L8P8T8X8\8`8d8h8l8p8t8x8|8
<p>t>x>|>
(0,0004080<0@0D0H0L0P0T0X0\0`0d0
4 4$4(4x6|6
7 7$7(7,787<7@7D7H7L7P7T7
8p9t9x9|9
:(:,:0:4:
9 9$9<9L9P9d9h9x9|9
: :8:H:L:\:`:p:t:x:|:
;$;(;,;4;L;P;h;x;|;
< <(<@<D<\<l<p<t<
=$=(=,=0=8=P=T=l=|=
> >8><>T>d>h>l>t>
?4?D?H?L?P?X?p?t?
0 080<0T0X0p0t0
1 181<1T1d1h1l1p1x1
2,2024282@2X2\2t2x2
3$3(383<3L3P3`3d3t3x3
4 4044484L4P4`4d4l4
5,505@5D5L5d5t5x5
6(6,606D6H6X6\6d6|6
7$7(787<7@7D7H7P7h7x7|7
8 8(8@8D8\8l8p8t8
9$9(9,90949<9T9X9p9
:$:<:L:P:T:h:l:|:
; ;$;(;<;@;P;T;X;`;x;|;
<0<d=l=t=|=
>(>0>H>P>t>
?$?0?8?P?X?|?
0,080@0X0`0h0p0
1$1<1D1h1t1|1
2$2,2D2L2p2|2
2 3,343L3T3x3
4(444<4T4\4
505<5D5\5h5
6 6(6@6H6\6l6
7$70787P7X7|7
8,888@8X8d8
8 949<9H9h9p9x9
9 :4:H:\:d:l:
;(;8;X;`;
<4<@<H<`<h<
=<=H=P=h=t=
>8>D>d>l>t>
?$?0?P?X?d?
0 0,0L0X0x0
1 1,1P1X1d1
2 2(2,24282@2D2L2P2p2
3 3D3P3X3p3x3
0 0$0(0,0004080<0@0D0H0L0P0T0X0\0`0d0h0l0p0t0x0|0
181<1@1D1H1L1P1T1X1\1`1d1h1l1
2(2H2L2P2t2
4$4D4`4
7$7H7d7h7l7
8 8$8(8,888<8@8D8H8L8P8T8`8d8h8l8x8|8
9 9(90989@9H9P9X9`9h9p9x9
: :T:t:
:(;L;l;
7@7L7X7d7p7|7
8 8$8(8,8084888<8@8D8H8L8P8T8X8\8`8d8h8l8x8|8
9 9$9(9,90949<9d9`<x<
!This program cannot be run in DOS mode.
`.rdata
@.data
.idata
.reloc
u39|$ w-h
t_9|$,uY9|$0uS
uI9\$8wCh
u[9|$ uU
uK9t$(wEh
t-_^][
F$WPQV
H@;HDs
W	VX	V\
	rX	r\
N@;NDrS
N@;NDr
!FX!F`
	FX	F\
	VX	V\
	VX	V\
C@;CDs
W@;WDrP
G@]_^[
!V`^][
FP_^][
F@;FDr
	FX	F\
L$ WSQ
N@_^][
	GX	G\
$_^][Y
Fh@u:j
	VX	V\
	WX	W\
D$(	U\
}@;}Ds
L$0PQh
D$(RPh
	EX	E\
	VX	V\
	VX	V\
	FX	F\
~@_^][
~@_^][
~@_^][
|$ 9D$(u
T$$VRh
L$$f9U
T$(PRh
O@;ODr
	VX	V\
	VX	V\
l$$;\$
\l0	T$
;t$(u		GX!L$
	VX	V\
8888888888
 !"#$$%&'''(()'***++,,-.//01
23456667
D$T;D$XrI
T$T;T$Xs
P()H$V
s4)G$PQ
M<+G$9D$Dt
G _^][Y
G _^[Y
Dt$,)H
T$(RVU
T$(RVU
T$ toRPRP
T$ ][_^
L$ QRVU
T$ RVWS
T$(_^]
|$(VQW
L$(SPQ
L$(_^]
T$(_^]f
L$(_^]
D$(_^]
L$(_^]
uV;\$$uP
T$(SQR
T$ RPS
T$(QRPU
D$(PQU
L$ PQVU
T$ PQVR
T$$RWSVP
T$$_^]
D$ SRQVP
T$,RUQPS
QWRSUV
T$ PURSV
D$ PWVS
t$ WSQV
T0<^][
L0<^][
L0<^][
M<^_[]
O,_^]%
SWPjEV
L$ SUPWQ
D$8PWQ
D$(RPV
T$ QRS
UWPjBV
T$,PQRW
D$ ;D$
L$0PQW
T$(RQPU
T$ SRUP
L$$VW3
9|$0tR
@`SUVW
L$ _^]
D$ _^]
l$(VW3
D$@Ph81
:_^][Y
8_^][Y
C;\$(|
|$ WSPQ
9^8t*9
;V4v;Q
F4j PQU3
D$ ]_^[Y
T$ SPhx
9\$(|N
T$ j8R
D$ [_^]
A|@uBf
Hpf;Hru:
F|@u&f
Nrf;Nxu
NxRPVf
Arf;Axt	f;Azt
Arf;Axt	f;Azt
t	_^][
9|$$vV
E;l$$r
<YrS<]wO
O;|$(rC
O;|$(s
9T$$v?
B;T$$r
9l$$vt
E;l$$r
L$(+A _
|$$8uz3
T$(9T$$t
W<5t!<6t
T$,VRUS
D$$;D$8r
;L$4r	
;L$4r	
D$09D$$uK
A;L$8r
~\_^][
9P$v(SU
9P$v%U
G0@;G4v
G0_^][
G@@tfV
t5;s@u
t#;C$r
M _^][
|$H;T$X
D$T;D$Xtu
D$H;F$r
L$H;N$r
L$l;L$p
D$8PWQ
T$l;T$pu8
T$l;T$ptT
D$`;C$s<
D$`;C$r
L$xQRP
T$,;V@u
\$$;^@u
(ub;NDt
;T$(tH
D$$;D$(t7
SUVWPQ
D$ SWPV
T$ SPRV
L$(QRPS
u~9~Xty
Nd_^][
f9W,s'
9L$$u4
9D$$uV
NBf;V@u 
~h_^]3
L$4QSRV
D$(PSV
L$(QSWV
D$(PSWV
 !"#$%#&'#()*#+,#
D$,_^]
T$,_^]
VQRWPU
T$0_^]
T$0_^]
L$0_^]f
tiA;L$
t	@;D$
up	\$8
D$<RPS
D$<RPS
Qu6B;U
T$<PRS
D$,@;E
Ep_][^Y
L$(RPSV
L$ RSP
D$(QRSV
<_^][Y
u	8Pot
GBf;G@u8
D$ RPV
L$ QSV
D$$PSW
L$,SWQV
}0_^[3
L$ QRS
	u	_^]
=y<-ft
D$Dj	hlq
<0|G<9
	h`_^]
G`_^]3
<0|_<9
=ntelu0
'=cAMDu 
T$(hhr
tsUh 0
u&Vh0v
t$(RQV
<%t-<.t"<[t
><%t&<.t~<[t
F;T$$sb9D$
L$<AQj
C;\$,~
^SSSSS
^SSSSS
^SSSSS
0SSSSS
^SSSSS
v	N+D$
0SSSSS
0SSSSS
0SSSSS
0SSSSS
YSSSSS
^SSSSS
0SSSSS
0SSSSS
0SSSSS
0WWWWW
0SSSSS
^SSSSS
^SSSSS
^SSSSS
0SSSSS
^SSSSS
^SSSSS
^SSSSS
0WWWWW
0WWWWW
9} t`9}$uV9}(uV
<\t	<.u
9E vJPS
9u(v(V
9u wk3
^WWWWW
0SSSSS
0SSSSS
0SSSSS
0SSSSS
^SSSSS
^SSSSS
0WWWWW
AAFFf;
0WWWWW
AAFFf;
0WWWWW
0WWWWW
@@BBf;
@@BBf;
_VVVVV
@@Jf90u
@@f90u
_VVVVV
9AAf91u
f92u	AAf91u
YWWWWW
t=f99t8C;]
sfj\Yf
.t C;]
s%j.Zf
9] tf9]$u\9](u\f
9E vNPW
9u(v*V
9u ws3
^SSSSS
URPQQh
<xtM<XtI
YSSSSS
HHtXHHt
>If90t
HHtXHHt
jd^j-Xf;
tPjXYf;
ou1j8Xf;
UQPXY]Y[
<+t(<-t$:
+t HHt
frU%D4fr
$=$Y$u$
%l&q%q%
,1-x-	+[+
K2K2K2
%s: %s
(binary)
%s.dll
cannot load module '%s': %s
gdi32.dll
user32.dll
kernel32.dll
cannot resolve symbol '%s': %s
_%s@%d
@%s@%d
<integer>
<string>
<identifier>
char(%d)
%s at line %d
type parameter
va_list
__builtin_va_list
__gnuc_va_list
ptrdiff_t
size_t
wchar_t
int8_t
int16_t
int32_t
int64_t
uint8_t
uint16_t
uint32_t
uint64_t
intptr_t
uintptr_t
__int8
__int16
__int32
__int64
double
_Complex
complex
__complex
__complex__
signed
__signed
__signed__
unsigned
__const
__const__
volatile
__volatile
__volatile__
restrict
__restrict
__restrict__
inline
__inline
__inline__
typedef
extern
static
register
__extension__
__attribute
__attribute__
__asm__
__declspec
__cdecl
__thiscall
__fastcall
__stdcall
__ptr32
__ptr64
struct
sizeof
__alignof
__alignof__
volatile
complex
struct
unsigned
unsigned char
long double
double
__attribute__((vector_size(
(for index)
(for limit)
(for step)
(for generator)
(for state)
(for control)
(*temporary)
(*vararg)
upvalue
method
global
metamethod
[string "
%s:%d: %s
"%s":%d
 in function <%s:%d>
 at %p
 in main chunk
 in function '%s'
	[builtin#%d]:
stack traceback:
not enough memory
error in error handling
C++ exception
string length overflow
userdata length overflow
stack overflow
stack overflow (%s)
table overflow
table index is NaN
table index is nil
invalid key to 'next'
attempt to call a %s value
attempt to %s %s '%s' (a %s value)
attempt to %s a %s value
attempt to compare %s with %s
attempt to compare two %s values
loop in gettable
loop in settable
perform arithmetic on
concatenate
get length of
calling '%s' on bad self (%s)
bad argument #%d to '%s' (%s)
%s expected, got %s
invalid value
value expected
coroutine expected
nil or table expected
Lua function expected
function or level expected
string/function/table expected
boolean or proxy expected
'for' initial value must be a number
'for' limit must be a number
'for' step must be a number
no calling environment
attempt to yield across C-call boundary
bad light userdata pointer
bad action while in __gc metamethod
bad FPU precision (use D3DCREATE_FPU_PRESERVE with DirectX)
assertion failed!
cannot change a protected metatable
too many results to unpack
reader function must return a string
'tostring' must return a string to 'print'
index out of range
base out of range
level out of range
invalid level
invalid option
invalid option '%s'
invalid format
'setfenv' cannot change environment of given object
cannot resume running coroutine
cannot resume dead coroutine
cannot resume non-suspended coroutine
wrong number of arguments to 'insert'
invalid value (%s) at index %d in table for 'concat'
invalid order function for sorting
attempt to use a closed file
standard file is closed
unable to generate a unique filename
field '%s' missing in date table
unable to dump given function
string slice too long
missing '[' after '%f' in pattern
invalid pattern capture
malformed pattern (ends with '%')
malformed pattern (missing ']')
unbalanced pattern
pattern too complex
invalid capture index
too many captures
unfinished capture
invalid option '%%%c' to 'format'
invalid format (repeated flags)
invalid format (width or precision too long)
invalid replacement value (a %s)
name conflict for module '%s'
runtime code generation failed, restricted kernel?
JIT compiler disabled, CPU does not support SSE2
unknown or malformed optimization flag '%s'
attempt to load chunk with wrong mode
%s near '%s'
lexical element too long
chunk has too many lines
chunk has too many syntax levels
malformed number
unfinished long string
unfinished long comment
unfinished string
invalid escape sequence
invalid long string delimiter
'%s' expected
control structure too long
function or expression too complex
chunk has more than %d local variables
main function has more than %d %s
function at line %d has more than %d %s
'%s' expected (to close '%s' at line %d)
function too long for return fixup
<name> or '...' expected
ambiguous syntax (function call x new statement)
function arguments expected
unexpected symbol
cannot use '...' outside a vararg function
syntax error
'=' or 'in' expected
no loop to break
undefined label '%s'
duplicate label '%s'
<goto %s> jumps into the scope of local '%s'
cannot load incompatible bytecode
cannot load malformed bytecode
invalid C type
size of C type is unknown or too large
bad storage class
declaration specifier expected
undeclared or implicit tag '%s'
attempt to redefine '%s'
wrong number of type parameters
too many initializers for '%s'
cannot convert '%s' to '%s'
attempt to get length of '%s'
attempt to concatenate '%s' and '%s'
attempt to perform arithmetic on '%s' and '%s'
attempt to compare '%s' with '%s'
'%s' is not callable
wrong number of arguments for function call
'%s' has no member named '%s'
'%s' cannot be indexed
'%s' cannot be indexed with '%s'
'%s' has no '%s' metamethod
attempt to write to constant location
missing declaration for symbol '%s'
bad callback
too many callbacks
NYI: packed bit fields
NYI: cannot call this C function (yet)
<name>
<number>
return
repeat
function
elseif
_LOADED
cannot read %s: %s
=stdin
cannot open %s: %s
__index__newindex__gc__mode__eq__len__lt__le__concat__call__add__sub__mul__div__mod__pow__unm__metatable__tostring__new__pairs__ipairs
thread
string
number
userdata
boolean
no value
bytecode instructions
local variables
upvalues
constants
variable names
0123456789abcdef
(null)
_VMEVENTS
VM handler failed: 
PANIC: unprotected error in call to Lua API (
Fassert
boolean
userdata
string
thread
function
number
typeDnext
Epairs@
Fipairs
getmetatableLsetmetatable
getfenv
setfenvFrawget
rawset
rawequal
unpack
selectHtonumber
trueHtostring
errorEpcall
xpcall
loadfile
loadstring
dofile
gcinfo
collectgarbage
newproxy
tostring
_VERSION
status
running
createEyieldFresume
%s: %p
function: builtin#%d
too many nested functions
=(load)
restart
collect
setpause
setstepmul
suspended
normal
running
__mode
coroutine
Lua 5.1
Etobit
bswapFlshift
rshift
arshift
rorDband
0123456789ABCDEF
tail return
getregistry
getmetatable
setmetatable
getfenv
setfenv
getinfo
getlocal
setlocal
getupvalue
setupvalue	upvalueid
upvaluejoin
sethook
gethook
debug	traceback
activelines
namewhat
isvararg
nparams
currentline
lastlinedefined
linedefined
short_src
source
external hook
=(debug command)
lua_debug> 
__index
__newindex
__concat
__call
__tostring
__pairs
__ipairs
__metatable
__index
__newindex
__index
typeof
istype
sizeof
alignof
offsetof
string
metatype
C type
cdata<%s>: %d
ctype<%s>
cdata<%s>: %p
Windows
package
_PRELOAD
setvbuf
__tostring
__index
tmpfile
output
cannot close standard file
too many arguments
file (closed)
file (%p)
closed file
stderr
stdout
interpreter
down-recursion
up-recursion
tail-recursion
status
attach
version_num
version
funcinfo
funcbc
funcuvname	traceinfo
traceir
tracek	tracesnap
tracemc
traceexitstub
ircalladdr
narrow
SSE4.1
children
nconsts
gcconsts
bytecodes
params
stackslots
linktype
maxtrace	maxrecord
maxirconst
maxside
maxsnap
hotloop
hotexit
tryside
instunroll
loopunroll
callunroll	recunroll	sizemcode
maxmcode
CPU not supported
jit.opt
jit.util
LuaJIT 2.0.4
ceilDsqrt
radClogEatan2
fmodEldexpCmin
random
randomseed
execute
remove
rename
tmpname
getenv
difftime	setlocale
numeric
collate
monetary
require
module
seeall
searchpath
loadlib
unable to get ModuleFileName
system error %d
_LOADLIB
LOADLIB: %s
luaJIT_BC_%s
luaopen_%s
	no file '%s'
'package.%s' must be a string
error loading module '%s' from file '%s':
	no module '%s' in file '%s'
	no field package.preload['%s']
'package.preload' must be a table
preload
module '%s' not found:%s
'package.loaders' must be a table
loaders
loop or previous error loading module '%s'
'module' not called from a Lua function
_PACKAGE
__index
loaded
config
.\?.dll;!\?.dll;!\loadall.dll
LUA_CPATH
.\?.lua;!\lua\?.lua;!\lua\?\init.lua;
LUA_PATH
LUA_NOENV
ClenDbyteDcharCsubCrepGreverse
gmatch
format
too many captures
^$*+?.([%-
gmatch
foreachi
foreachDgetn
insert
remove
concat
Invalid parameter passed to C runtime function.
```hhh
xppwpp
DynASM 1.3.0
C:\Programming\Apps\bm-rearch-whole\lua-jit\src\lua51.pdb
lua51.dll
luaJIT_setmode
luaJIT_version_2_0_4
luaL_addlstring
luaL_addstring
luaL_addvalue
luaL_argerror
luaL_buffinit
luaL_callmeta
luaL_checkany
luaL_checkinteger
luaL_checklstring
luaL_checknumber
luaL_checkoption
luaL_checkstack
luaL_checktype
luaL_checkudata
luaL_error
luaL_execresult
luaL_fileresult
luaL_findtable
luaL_getmetafield
luaL_gsub
luaL_loadbuffer
luaL_loadbufferx
luaL_loadfile
luaL_loadfilex
luaL_loadstring
luaL_newmetatable
luaL_newstate
luaL_openlib
luaL_openlibs
luaL_optinteger
luaL_optlstring
luaL_optnumber
luaL_prepbuffer
luaL_pushresult
luaL_ref
luaL_register
luaL_traceback
luaL_typerror
luaL_unref
luaL_where
lua_atpanic
lua_call
lua_checkstack
lua_close
lua_concat
lua_cpcall
lua_createtable
lua_dump
lua_equal
lua_error
lua_gc
lua_getallocf
lua_getfenv
lua_getfield
lua_gethook
lua_gethookcount
lua_gethookmask
lua_getinfo
lua_getlocal
lua_getmetatable
lua_getstack
lua_gettable
lua_gettop
lua_getupvalue
lua_insert
lua_iscfunction
lua_isnumber
lua_isstring
lua_isuserdata
lua_lessthan
lua_load
lua_loadx
lua_newstate
lua_newthread
lua_newuserdata
lua_next
lua_objlen
lua_pcall
lua_pushboolean
lua_pushcclosure
lua_pushfstring
lua_pushinteger
lua_pushlightuserdata
lua_pushlstring
lua_pushnil
lua_pushnumber
lua_pushstring
lua_pushthread
lua_pushvalue
lua_pushvfstring
lua_rawequal
lua_rawget
lua_rawgeti
lua_rawset
lua_rawseti
lua_remove
lua_replace
lua_resume
lua_setallocf
lua_setfenv
lua_setfield
lua_sethook
lua_setlocal
lua_setmetatable
lua_settable
lua_settop
lua_setupvalue
lua_status
lua_toboolean
lua_tocfunction
lua_tointeger
lua_tolstring
lua_tonumber
lua_topointer
lua_tothread
lua_touserdata
lua_type
lua_typename
lua_upvalueid
lua_upvaluejoin
lua_xmove
lua_yield
open_base
luaopen_bit
luaopen_debug
luaopen_ffi
luaopen_io
luaopen_jit
luaopen_math
luaopen_os
luaopen_package
luaopen_string
luaopen_table
memset
memcpy
memmove
_fmode
strncpy
_errno
strlen
fflush
fwrite
strchr
fclose
ferror
strerror
sprintf
_CIsinh
_CIcosh
_CItanh
strstr
strtoul
putchar
_pclose
fscanf
ungetc
clearerr
fprintf
setvbuf
_popen
tmpfile
strncmp
system
remove
rename
tmpnam
getenv
strftime
localtime
gmtime
mktime
difftime
setlocale
strrchr
memchr
strpbrk
__CxxFrameHandler
_mbslwr
_mbsupr
_strlwr
_strupr
_wcslwr
_wcsupr
__lc_collate_cp
_pwctype
msvcrt.dll
_mbsdec
_ismbblead
_XcptFilter
malloc
_initterm
_amsg_exit
calloc
isdigit
isspace
mbtowc
__mb_cur_max
isleadbyte
isxdigit
localeconv
_unlock
_snprintf
wctomb
iswctype
wcstombs
__dllonexit
_onexit
realloc
__badioinfo
__pioinfo
_fileno
_lseeki64
_write
_isatty
SetLastError
VirtualAlloc
GetLastError
VirtualFree
VirtualQuery
VirtualProtect
FormatMessageA
LoadLibraryA
FreeLibrary
GetProcAddress
GetModuleHandleExA
GetModuleFileNameA
GetModuleHandleA
OutputDebugStringA
RtlUnwind
InterlockedExchange
InterlockedCompareExchange
TerminateProcess
GetCurrentProcess
UnhandledExceptionFilter
SetUnhandledExceptionFilter
GetVersion
QueryPerformanceCounter
GetTickCount
GetCurrentThreadId
GetCurrentProcessId
GetSystemTimeAsFileTime
KERNEL32.dll
T;j;s;
'5P9v9
163\4054585<5@5D5H5L5
577\:!>
4!5074787<7@7D7H7L7P7T7X7\7`7d7
;\?`?d?h?l?p?t?x?|?
0 0$0(0,0004080<0
4682<B<
6+6H7L7P7T7X7\7`7d7h7l7p7t7x7|7
6+767A7]7
8"8F8P8T8X8\8`8d8%:l:
<-=J>Q>]>o>
3d4h4l4p4t4x4|4
=0\0]1d1
<0@0D0H0L0P0T0
8,:3:x?|?
3,3D3H3L3P3T3X3\3`3d3<5G7u7
3>3e3m3
5&5?7I7c7
;B<p<|<
0#0,0C0N0S0
03191Z1n3u3
7+9<9O:[:,;=;E;M;T<
<p=t=x=|=
0-1K1c1
6!6w677L7
3t4x4|4
7 7$7(7
9P:T:X:\:`:d:h:l:p:t:x:|:
2h5:6E6
7\7c7t7}7
808d8G9
6D7H7L7P7T7X7\7`7d7h7l7p7t7x7|7
889<9@9D9H9L9P9T9X9\9`9
9P:T:X:\:`:d:h:l:p:t:x:
=8><>@>D>H>L>P>T>
1=1F4>=
7,9094989<9@9D9H9L9S;Z;<<@<D<H<L<
: :$:(:,:0:4:8:<:@:D:H:2=
5h5l5p5t5x5|5
5L6P6T6X6\6
3K9R9H:L:P:T:X:\:`:d:h:l:p:t: ;';X;\;N=}=
6&8!?(?
1H2L2P2T2X2\2`2d2h2l2p2t2x2|2
3 3$3(3,30343\;v;
;^<P>T>X>\>`>d>
T0+1-747
0d1h1l1p1
8T:w:0;G;
E2n3u3h4
<	=*>I>O>
173h3n3'606B6V6
727J7Q7
1<1W1r1
2C2l2p2t2x2|2
9_:h:x:
;(;0;6;a;
<E=J=O=d?
p1@6X6
'0,0E0J0]0b0
4Z445C5L5S5
5H6M6e6|6
:\:U<r<
9Y:k:$=
>$>/>4>9>G>L>Q>
8I8`8w8
050`0l0v0
2P2b2y2E3o3y3
404Q4X4g4
5i6|6*7<7C7
0(151M1c1h1
2$20252N2a2n2
24484<4@4D4H4x4|4
7v8}8C;
<h=l=p=t=
1$2b3{3
5R5Y5t5R6y6
6X7\7`7d7h7l7p7t7
6)788=;G;R;X;b;
0$0*00060<0B0H0N0T0Z0`0f0l0r0
1:1@1F1V1\1b1h1n1t1]2
;!>->9?
2 2A2I2O2U2{2
3*303=3M3b3l3
656;6A6G6M6S6Z6a6h6o6v6}6
7O8C9Z9q9
R0k1I2
H1^2y2
3k3o3s3w3{3
929}98:O=
;	;D;J;P;V;a;~;
<#<+<3<?<Q<^<f<
@2M2h2r=h>p>#?
0F1L1\1
6@7W7N8
s0w0{0
1>2D2J2[2l2
283S3h3{3
4*5E5d5w5
50666<6B6H6N6T6Z6`6w6
8 8&8,8
6 6$6(6,6064686<6@6D6H6L6P6T6X6\6`6d6h6l6p6t6x6|6
7 7$7(7,707
8 8(80888@8H8P8X8
9H;L;P;T;X;\;`;d;h;l;p;t;x;|;
;@=D=H=L=P=T=X=\=`=d=h=l=p=t=x=|=
> >$>(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>h>l>p>t>x>|>
? ?$?(?,?0?4?8?<?@?D?H?L?P?T?X?\?`?d?h?l?p?t?x?|?
3<5@5D5H5L5P5
;h<l<p<t<x<|<
= =$=(=,=0=4=8=<= ?$?(?,?0?4?8?<?@?D?H?L?P?T?X?\?
4D5H5L5P5T5X5d5h5l5p5|5
9H:T:`:h:l:p:t:x:|:
282T2X2t2x2
!This program cannot be run in DOS mode.
`.rdata
@.data
@.reloc
original_window_proc
WaitForSingleObject
SetEvent
CreateEventA
CreateThread
KERNEL32.dll
DialogBoxParamA
LoadCursorA
CallWindowProcA
ShowWindow
SetWindowPos
DefWindowProcA
EndDialog
GetDlgItem
GetWindowLongA
SetWindowLongA
SetPropA
SendMessageA
LoadIconA
GetPropA
GetWindowRect
SetCursor
USER32.dll
ShellExecuteA
SHELL32.dll
FloatingProgress.dll
getTrustTextWindow
hideFloatingProgress
hideTrusteVisuals
nonToolWindow
setEnableCancel
setHideClose
showFloatingProgress
showTrusteVisuals
wasCancelled
C:\Programming\GitHome\bm-core-main.git\25\Custom\FloatingProgress\Release\FloatingProgress.pdb
0!0)0.070N0W0d0k0~0
1)141=1F1`1
2'2-232:2?2H2N2T2j2q2~2
3(3.3>3D3J3P3\3s3x3~3
wxr""/p
wr""/p
ozR1ML
oLLLLL
wwwwwwwxp
"""""/
"""""/
wwwwwwww
zz1111MMM
^zz1111MM
^zz1111M
^zz1111
^zz111
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity
        name="Current Supersonic Installation"
        processorArchitecture="x86"
        version="98.3.3.6650"
        type="win32"/>
    <description>Current Supersonic Installation</description>
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
            <requestedPrivileges>
                <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
            </requestedPrivileges>
        </security>
    </trustInfo>
    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
        <application>
            <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
            <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
            <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
            <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
        </application>
    </compatibility>
</assembly>
VeriSign, Inc.1
VeriSign Trust Network1;09
2Terms of use at https://www.verisign.com/rpa (c)101.0,
%VeriSign Class 3 Code Signing 2010 CA0
150623000000Z
160622235959Z0b1
California1
San Francisco1
	City Tone1
	City Tone0
w lZ;W
http://sf.symcb.com/sf.crl0f
https://d.symcb.com/cps0%
https://d.symcb.com/rpa0
http://sf.symcd.com0&
http://sf.symcb.com/sf.crt0
z6|G@T
VeriSign, Inc.1
VeriSign Trust Network1:08
1(c) 2006 VeriSign, Inc. - For authorized use only1E0C
<VeriSign Class 3 Public Primary Certification Authority - G50
061108000000Z
360716235959Z0
VeriSign, Inc.1
VeriSign Trust Network1:08
1(c) 2006 VeriSign, Inc. - For authorized use only1E0C
<VeriSign Class 3 Public Primary Certification Authority - G50
[0Y0W0U
	image/gif0!0
#http://logo.verisign.com/vslogo.gif0
VeriSign, Inc.1
VeriSign Trust Network1:08
1(c) 2006 VeriSign, Inc. - For authorized use only1E0C
<VeriSign Class 3 Public Primary Certification Authority - G50
100208000000Z
200207235959Z0
VeriSign, Inc.1
VeriSign Trust Network1;09
2Terms of use at https://www.verisign.com/rpa (c)101.0,
%VeriSign Class 3 Code Signing 2010 CA0
https://www.verisign.com/cps0*
https://www.verisign.com/rpa0
[0Y0W0U
	image/gif0!0
#http://logo.verisign.com/vslogo.gif04
#http://crl.verisign.com/pca3-g5.crl04
http://ocsp.verisign.com0
VeriSignMPKI-2-80
VeriSign, Inc.1
VeriSign Trust Network1:08
1(c) 2006 VeriSign, Inc. - For authorized use only1E0C
<VeriSign Class 3 Public Primary Certification Authority - G50
061108000000Z
360716235959Z0
VeriSign, Inc.1
VeriSign Trust Network1:08
1(c) 2006 VeriSign, Inc. - For authorized use only1E0C
<VeriSign Class 3 Public Primary Certification Authority - G50
[0Y0W0U
	image/gif0!0
#http://logo.verisign.com/vslogo.gif0
VeriSign, Inc.1
VeriSign Trust Network1;09
2Terms of use at https://www.verisign.com/rpa (c)101.0,
%VeriSign Class 3 Code Signing 2010 CA
tlBW}t