diff --git a/help/taseditor/AdvancedFeatures.html b/help/taseditor/AdvancedFeatures.html new file mode 100644 index 00000000..17455923 --- /dev/null +++ b/help/taseditor/AdvancedFeatures.html @@ -0,0 +1,226 @@ + + + + 6. Advanced Features + + + + + + + + + + + + + + +
+
+

6. Advanced Features

+ +
+ Beginner's Guide ››
+
+
+ Parent + + Previous + + Next + +
+
+
+
+ +

+

Advanced Features

+


+


+

1. How to share projects.

+

2. Patterns usage.

+

3. Effective usage of Markers.

+

4. Lua usage.

+


+
+

+

+

1. How to share projects.

+


+

A Taseditor project is saved to disk as an .fm3 file. All essential aspects of the work process are saved into this file, making it possible to restore the postponed work in its exact state. The size of such "instant snapshot" may be pretty huge (depending on the Greenzone size, it may take hundreds of megabytes).

+

When you want to publish your project in the Internet (for example, as a TASVideos submission), it's better to share only the most important information, but not the whole snapshot of your working process. To do that, choose File -> Save Compact in Taseditor's main menu. The "Save Compact" window will appear, prompting you to select which aspects you want to save to the new FM3 file.

+

+

Binary format of Input – save movie Input in binary form. This option is related to fm2 format, which is the base of the fm3 format. If you uncheck it, Input will be saved to the fm3 file in text format, which will increase file size but leave the possibility to edit it in any text editor. However, Taseditor is much better suited for editing movies, so it's recommended to keep that checkbox set, and avoid changing FM3 projects outside Taseditor. Anyway, in non-compact fm3 projects (saved regular way) Input is always stored in binary.

+

Markers – save Markers to the file. The movie Input is always saved to fm3 file, because without it emulator won't be able to open fm3 files. But without Markers the movie replay is still possible, so you can uncheck the checkbox if you don't want to share them. Although this way your fm3 won't differ much from an fm2 movie, so it's recommended to leave that checkbox checked, to share all current Markers and their Notes in the compact project. The file size will increase insignificantly.

+

Bookmarks – save all Bookmarks and their branches data to the file. It's recommended to leave this option checked. The file size will increase insignificantly.

+

Greenzone – save Greenzone to the file, including all savestates and the Lag Log. The file size will increase dramatically! Greenzone is the main factor causing huge project file size. It's recommended to keep this option unchecked. If during the compact saving the Playback cursor is at the very first frame of the movie, there will be no single Greenzone savestate in the fm3 project. But if the cursor was left at some frame in the middle of the movie, the compact fm3 will contain one Greenzone savestate, allowing to restore the emulator state on the Playback cursor frame when you open the project. Since one savestate uses very little disk space, the file is still compact.

+

History – save History Log to the file. The file size will increase by several megabytes. Usually there's no need to publish the data. So it's recommended to uncheck this option. When you open an fm3 project with no History Log, Taseditor creates a new History automatically.

+

Piano Roll – save current position of vertical scrolling of the Piano Roll, in order to see the exact segment of the movie after loading the compact fm3 file. The file size will increase insignificantly, so you may keep that option checked.

+

Selection – save all Selection data to the file. Both current Selection and whole Selection History is saved. The file size will increase insignificantly, but usually there's no need to publish the data. So it's recommended to uncheck this option.

+


+

Using compact saving you can get an fm3 project being less than 500KB in size, while still sharing all essential data the recipient may need. For example, if you are working in co-authorship with another TASer(s), you will need to share not only Input, but also Markers and Bookmarks. As for the Greenzone, the recipient can recreate it by replaying the project movie in Taseditor.

+

On compact saving, your project name receives the "-compact" suffix. Compact saving doesn't replace normal project saving, so if you have any unsaved changes in the project, the asterisk in the window caption will not disappear after Save Compact.

+

+

Besides saving a compact fm3 you can also export movie data to fm2 format, accepted at TASVideos before Taseditor even existed. But in such files you will share only Input. To do that, choose File -> Export to FM2 in Taseditor's main menu. The "Export to FM2" window will appear, prompting you to choose target movie type (1P, 2P, Fourscore).

+

Since FM2 format also supports text subtitles, you can use existing Marker Notes as a source for generating movie subtitles. For that, enable the "Convert Marker Notes to Movie Subtitles" checkbox. Then while watching the fm2 file the viewers will see text messages appearing when passing certain frames (the frames where your project had Markers at). If necessary, you can then convert those fm2 subtitles into the commonly used .srt format to post the TAS on Youtube. To do that, right-click the FCEUX window while replaying the subtitled movie and choose "Dump Subtitles to SRT file" command.

+

FM2 files can be opened in Taseditor similarly to loading fm3 projects. In the "Open TAS Editor Project" window (File -> Open) switch to the filter "All Files (*.*)" and then choose your fm2 movie file. Taseditor will bring the message box saying that this is not a project file, and will ask confirmation. After you click "Yes" it will create new project using Input and settings from the fm2 file.

+

Also, you can import Input from any fm2 or fm3 file using File -> Import Input. This time no new project will be created, but Input of current project will be replaced with Input from the file. This operation is very similar to pasting Input from the Clipboard, it is registered in History Log and can be undone by Ctrl + Z.

+


+
+

+

+

2. Patterns usage.

+


+

When editing Input, TASer actually creates a unique sequence of presses and releases for every button of joypad. But, despite the uniqueness, this large sequence still contains many typical segments, which are are short sequences of presses and releases that repeat many times in succession, or appear many times in different places of the movie.

+

To speed up the work, you can remember the most typical or frequent sequences as patterns, to be able to put them with a couple of clicks, not drawing every single buttonpress manually each time.

+

Patterns are useful in several cases:

+ +

Some of the most obvious patterns are already added by author. To add your own pattern you need to edit the taseditor_patterns.txt file in any text editor (like Notepad), this file is stored in /tools subfolder of FCEUX main folder. Every second line in this file constitutes an encoded sequence of button states. The code is straightforward: "button pressed" is encoded by 1, "button released" – by 0.

+

Every pattern is looped, which means, when a long sequence of Input is created using a short pattern, the pattern is repeated the necessary amount of times to fill the whole given interval.

+

+

After adding or editing the patterns file, restart Taseditor to reread the file changes. The list of all available patterns is always in the upper right corner of the TAS Editor window. To change the current pattern, enter that menu and click the needed pattern name. For easy orientation in patterns it's recommended to call each pattern by a distinct name that reflects its in-game meaning.

+

To apply current pattern, Taseditor needs to know the beginning and the end of the interval where the chosen button is going to be pressed and released according to the rule. There are 3 different ways to apply a pattern:

+

Example 1. Point and click the start frame (click in any Piano Roll column except the icons column), thus selecting that frame. Then hold the Alt key and left-click the end frame in the column of the button you are editing. In the interval between those two frames you will get the needed sequence of the chosen button presses. This method is rather handy when the start frame is already selected by previous clicks in Piano Roll, and you only need to to hold down Alt and click the end frame.

+

Example 2. Left-click the start frame in the column of the button you are editing, and hold the mouse button to start drawing. Hold Alt and move the mouse cursor up or down. This way you will be drawing the pattern sequence of buttonpresses.

+

Example 3. Select a range of frames, then hold Alt and left-click on the edited button symbol in the Piano Roll Header. The pattern will be applied to the selected area.

+


+

When using traditional method of TASing you are also able to apply patterns to recorded sequences, although in a less convenient manner. To do that you should set the "Use pattern" checkbox on Recorder panel. Before that you may want to record the buttons you don't need to alternate (record them without using patterns), and then record the needed button(s) with pattern, using the "Superimpose" function for the segment.

+

For example, you need to record a burst of fire while jumping over the pit. At first, record that jump without shooting, then return the Playback cursor to the beginning of the segment (by jumping to the Bookmark left here), check "Superimpose" and "Use pattern", hold the B button and unpause the emulation. You'll see how the shooting Input superimposes over jump Input.

+

Before Taseditor there was the "Autofire" concept similar to patterns. But due to inconveniences of the Recording method that feature was rarely used, because when you are typing Input it's usually easier to press and release the needed buttons manually. So if you stick to traditional method of TASing, you won't likely use patterns. But in the non-linear or semi-automatic TASing, patterns are drawn as quickly as regular buttonpresses, so that's where they can really speed up the work.

+


+

Patterns are used when creating sequences for a single button. But when you want to use a typical macro involving several buttons, use Copy/Paste.

+


+
+

+

+

3. Effective usage of Markers.

+


+

Markers exist to simplify complicated situations by structurizing the problem. When the game requires you to perform (or think over) several complex actions, you should break the large segment into separate intervals, in order to understand clearly where one action stops and another one starts. Even if the initial subdividing appears to be wrong, it still helps you to get thoughts in order.

+

Obviously, you are not expected to set Markers on commonplace segments, most of which aren't even polished (e.g. where it's enough to hold R to win). But key moments and memorable situations of the movie should be marked and commented with Notes. It will help you to keep the whole picture of the project in mind and navigate the movie by text.

+

No need to write works of literature inside the Notes. You may just confine yourself with simple label words, numbers, tags. Invent the words on the fly, but try to keep systematic approach. As in, if at the beginning of the first level (on the transition screen) you've set a Marker with the Note "level 1 start", you should also write "level 2 start" at the beginning of the second level, and not "act II begin" or something. During the creation of TAS you naturally form a unique glossary in your mind using various terms that are topical for that specific game. And the more systematic approach you apply to writing the Notes, the easier it will be to describe another (similar) segment and understand its task. The easier it'll be to find similar Input segments, recalling only their vague in-game appearance.

+

The tasks you meet in video games are often repeatable. Details and environment may be different, but player actions remain more or less the same. In some cases you can just copy the Input (solution of the similar task) from the previous level, and it will successfully sync with the new in-game situation (probably after a little adjustment). Though, after the copy/paste it's recommended to diversify the Input to prevent the TAS viewers from noticing the repetition and getting bored.

+

For example, at the beginning of many levels in Super Mario Bros you need to use the same button sequence to accelerate to maximum speed optimally. Let's imagine, you are honestly commenting Input during TASing. Then in World 1-1 in the acceleration section you probably left a Note with words like "acceleration" or similar. Now, when you start creating Input for a segment with that task again, in a new level you put a Marker at the beginning of the segment and write a Note, describing your current task. Obviously enough, you are going to use the word "acceleration" there as well, because you need to accelerate.

+

+

And that's where you can use Taseditor's function of automatic searching for similar Notes. Leave the Playback cursor inside the current segment and press the "Similar" button at the bottom of the Toolbox. The Selection cursor will instantly jump to the Marker that contains the most resembling Note, in Taseditor's opinion. Most likely, it will be the Marker left at the beginning of the acceleration segment in the World 1-1. Therefore you can instantly select all Input in that segment by pressing Ctrl + A, then copy the Input to the Clipboard (Ctrl + C), return to the current segment (press Shift twice) and paste from the Clipboard (Ctrl + V).

+

If the first search result doesn't bring you to the intended segment, you can press the "More" button to try next result of the search. Usually the right segment is among the first offered finds, granted that you marked the segment with a sensible Note.

+

Interesting fact: while writing the Note for the second appearance of the acceleration segment, you use the word "acceleration" without an intent to correlate to previous cases, but only according to the in-game situation. So you are not expected to actually remember the text of old Notes. The right words will come to your mind in the right time.

+

This way, right during the TASing process you form a library of useful Input combinations, not unlike the pattern list described above, except that you don't have to purposely prepare the button sequences – they appear natural way during the segments shaping and optimization, and they are stored inside the movie, not in an external file. And when you improve a combination for some segment (e.g. find a faster way to accelerate), you can easily find and fix all related segments with similar button sequence. Also, here you don't have to remember the exact description or the name of the needed sequence, because, if you use systematic approach to describe tasks, the words will partially match (and a perfect match is not required, since the searching algorithm is rather smart).

+

The auto-search is also useful when you need to jump between two (or more) related segments, located far from each other in the movie. Scrolling the Piano Roll with the mouse wheel or jumping through dozens of Markers from one segment to another is not as handy as clicking the "Similar" or "More" button. To let the algorithm instantly find the twin segment (or the source segment and the destination segment), consider using some unique word in their Notes, one that isn't used in other places of the movie.

+

For example, in the "Megaman" game each robot master must be beaten twice (second time it's in the end of the game). It's logical to suppose that both battles will be entitled by Marker Notes containing the name of the robot and the word "boss" or "fight", or something like that. As a result, when the Playback cursor is in one of those 2 places, pressing the "Similar" button will get you to another one.

+

In this example the proper words for the Notes text are no-brainer, yet they are unique enough not to repeat in other places (at least not in that combination), so the auto-search will work perfectly. In a different case you may have to invent a unique label, but usually the first description you think of is enough.

+


+

+

You can also use standard search for Note text. For example, it's common to leave a Note beginning with the "TODO" word at some places where you are not sure the best solution is found (the segment Input is optimal). So, when you have mood to make fixes, you could skim through all Markers with that tag by bringing the "Find Note" window (Ctrl + F) and typing the word "TODO" to search for.

+


+

If you don't like all these big ideas with Markers, you can TAS without them. After all, many games provide rather simple tasks for a TASer, they don't require a highly organized approach to the solving process. If the problem can be solved on impulse, don't spend time on preparation and fortification. Markers provide advantages only in long-term goals.

+

So, just like in programming, in most cases you can successfully write the so-called "dirty code" (here it would be a project without Markers and Notes) that is fast to create, but hard to maintain and extend. Or you can make a lovingly formatted project which is nice to watch and modify. Since TASers have to modify their movies very often (in order to beat previous records), the today's time costs for the project formatting are likely to be repaid by the fact that the looks of the project motivate to continue the work on it.

+


+
+

+

+

4. Lua usage.

+


+

With the Lua language you can write scripts that can be executed by FCEUX along with game emulation. Writing scripts requires minimal programming skill, while the range of possibilities is pretty huge. You can create your own TAS tools, modify the game at the time of execution, have access to images and sound on the fly, send data via network or record it to disk, etc. And you can make custom extensions for TAS Editor.

+

To master the Lua language completely you would need to read its documentation and gain actual experience, but for making simple scripts it should be enough to read this Manual and the Lua chapter in FCEUX docs. At first, try to run scripts created for FCEUX by various people. They are stored in the /luaScripts subfolder. Each script is a text file with .lua extension, such file may be created and modified in any text editor. Before running scripts you need to open some game ROM in FCEUX. To run a script, open the Lua console (File -> Lua -> New Lua Script Window), in this window press the "Browse" button and load the script file, then press "Run". If emulator is paused, either unpause it or advance a frame to activate the script. As for the Lua console, the window may be hidden or minimized.

+

Program code in Lua scripts for FCEUX usually consists of 2 parts: the first part is executed once the script is activated, another part runs on certain emulation events, such as the end of a frame emulation, loading a savestate and so on.

+

The first part, which runs on script activation, is usually executed only once (unless you made an infinite loop in it). The code is executed line by line, from top to down. Usually the task of that part is to initialize global variables and register functions to be launched by FCEUX when certain events occur.

+

In most of cases the main code of the script is contained in the single function that is automatically executed at the end of every frame. For example, this is how Mario hitbox drawing code for SMB may look:

+


+
+ + + +

marioWidth = 16

+

marioHeight = 32

+


+

function everyframe()

+

       marioX = memory.readbyte(0x3AD)

+

       marioY = memory.readbyte(0xCE)

+

       gui.drawbox(marioX, marioY, marioX + marioWidth, marioY + marioHeight)

+

end

+


+

emu.registerafter(everyframe)

+
+
+


+

When activating this script, FCEUX creates and initializes two variables ("marioWidth" and "marioHeight"), then registers the function called everyframe() to the "frame end" event (registerafter). After that the text ends and the script finishes its execution, but the registered function remains in emulator memory, and if you unpause it or press Frame Advance, after every frame it will run the code stored within the everyframe() function. That code consists of 3 lines. The first two create variables for the hitbox position and initialize them with current values from RAM of the emulated console. The third line draws graphics over the game picture output.

+

Actual RAM addresses can be found in public resources (like http://tasvideos.org/GameResources/NES/SuperMarioBros.html) or found on your own using the Cheat Search tool or the RAM Search tool built in FCEUX. In this case we know that Mario's X position is stored in memory address 0x3AD, and his Y position is in 0xCE. So, the script just takes their current values and draws the rectangle in the corresponding screen position. Sometimes there's need to recalculate the values to translate the in-game world coordinates into on-screen coordinates, but in this case they match.

+

The standard functions readbyte(), drawbox() and other useful functions are described in the FCEUX documentation. It also describes how to use mathematical expressions and make loops and conditions.

+

The standard functions available only when Taseditor is engaged are listed in the Reference. Using all this knowledge you can not only draw and write messages over the emulator screen, but also control Playback and Selection, and most importantly, modify the movie Input and Markers.

+

For example, this code copies one joypad Input to the second one's place:

+


+
+ + + +

function doCopy()

+

       selection_table = taseditor.getselection()

+

       if (selection_table ~= nil) then

+

               for i = 1, #selection_table do

+

                       selected_frame = selection_table[i]

+

                       joypad1data = taseditor.getinput(selected_frame, 1)

+

                       taseditor.submitinputchange(selected_frame, 2, joypad1data)

+

               end

+

               taseditor.applyinputchanges("Copy 1P->2P")

+

       end

+

end

+


+

taseditor.registermanual(doCopy, "Copy 1P to 2P")

+
+
+


+

When launching this script, FCEUX registers the doCopy() function to the event of pressing the "Run function" button (registermanual). Now any click on the button will run the code of that function, consisting of 9 lines. At first, the function gets information about Selection from Taseditor, and if it's not blank (i.e. at least one frame is selected in the Piano Roll) it runs the FOR loop, going through all the selected frames from the first to the last. For each selected frame the function requests the Input of the first player from Taseditor (and stores this data to the "joypad1data" variable), then it submits the claim to change the second player Input for that frame. All these submissions are accumulated in Taseditor memory until the FOR loop ends, after that they all are applied by calling the applyinputchanges(). As a result, the second joypad in the selected range of frames contains the same Input as the first joypad.

+

+

This simple script is already a useful mini-tool that may be needed when making a TAS for 2 or more players. Launch it, and while TASing you will be able to select a range of frames in the Piano Roll and click the "Copy 1P to 2P" button (or press the "Run Manual Lua function" hotkey) to synchronize both players. Every time the script work results in an Input change, the Greenzone is automatically truncated, and a new item is added to the History Log, allowing you to undo the changes done by the script. This way you've got a feature completely integrated into Taseditor, and you've programmed the behavior of the feature yourself.

+

Even though you can successfully TAS without Lua knowledge, its support can save you much time and even hint on a less obvious solutions during the Input optimization (or more exactly, during the game Output analysis).

+

Videogames often hide important details of the situation, and TASer has to watch memory state directly in order to know for sure what's going on and to precisely perceive the optimality factors while polishing segments.

+

For example, many games don't show boss HP on screen. So, to know exactly the damage you inflict, you need to watch the numeric value of the corresponding RAM address in the Memory Watch window. And when there is a plenty of hidden factors (for example, several timers of invulnerability and boss attack, and some special counters of the player character), TASer needs to watch and analyze many memory addresses as they change according to different rules. In this case an on-screen visualization of some data would be huge helper. For example, boss HP can be displayed as a bar or a number above his head, and a red color can indicate the damage frames or other events. As a result, your mind is relieved by moving from deciphering an abstract data format to the format that instantly delivers the main idea (e.g. "the boss was damaged", "good/bad").

+

So it's recommended to learn Lua at least to the level of being able to sensibly modify others' scripts. For the long time FCEUX existed, people wrote and published a lot of scripts serving for various purposes, and you'll probably only need to change some RAM addresses to adjust a script to your game. Oftentimes it also makes sense to ask for help at TASVideos forums.

+


+
+


+

The Taseditor guide is over. If you were reading carefully, you should now know everything necessary to make a TAS up to the high standards of TASVideos. The only thing left is to gain an experience in real work, master some actions to automatism in order to feel no trace of routine and have fun from the process of armed playthrough and investigation of games.

+


+


+


+


+


+

+

Created with the Personal Edition of HelpNDoc: Single source CHM, PDF, DOC and HTML Help creation

+
+ + + + + + diff --git a/help/taseditor/BeginnersGuide.html b/help/taseditor/BeginnersGuide.html new file mode 100644 index 00000000..d9eade0a --- /dev/null +++ b/help/taseditor/BeginnersGuide.html @@ -0,0 +1,97 @@ + + + + Beginner's Guide + + + + + + + + + + + + + + +
+
+

Beginner's Guide

+ +
+
+ Previous + + Next + +
+
+
+
+ +

+

Beginner's Guide

+


+


+

This part of the documentation is presented in the form of a textbook on TASing.

+

It explains the practice of using Taseditor and describes the mechanism of conventional TASing methods.

+

The course will be useful both to people who wish to learn TASing and to already experienced TASers who are open to new trends and wish to improve their knowledge.

+


+


+

Introduction

+

General overview of TAS Editor's goals and features

+


+

Program Interface

+

Learning the fundamentals of the program usage

+


+

TASing Process

+

The author's vision of the competent working process

+


+

TASing Methodology

+

Dissection of the Input improvement methods

+


+

Program customization

+

Detailed review of all settings

+


+

Advanced Features

+

Describing the additional possibilities

+


+


+


+


+


+

+

Created with the Personal Edition of HelpNDoc: Full-featured Kindle eBooks generator

+
+ + + + + + diff --git a/help/taseditor/Controls.html b/help/taseditor/Controls.html new file mode 100644 index 00000000..21093f81 --- /dev/null +++ b/help/taseditor/Controls.html @@ -0,0 +1,499 @@ + + + + Controls + + + + + + + + + + + + + + +
+
+

Controls

+ +
+ Reference ››
+
+
+ Parent + + Previous + + Next + +
+
+
+
+ +

+

Controls

+


+


+

Taseditor is controlled by mouse and keyboard.

+

Every operation can be done in several alternative ways (via menu, hotkey or GUI element).

+

Any action can be done using mouse, but some are faster to do with keyboard. The Manual assumes that one hand of user is holding the mouse and other hand is placed on a side of the keyboard, occasionally holding Shift/Ctrl/Alt or pressing a key combination.

+

Some actions (e.g. switching "Follow cursor") can be done by mouse only.

+


+
+

+

+

Mouse controls

+


+ +


+

+

+

Pointing with mouse

+


+

A. Displaying Bookmarks screenshots and descriptions

+

Hover mouse cursor over the right half of Bookmarks List to see the game screenshot of the bookmarked frame in the movie branch you're pointing at. Optionally there can be a description of the branch under the screenshot.

+


+

B. Displaying information of the Bookmark

+

Hover mouse cursor over an icon of any Bookmark in the Branches Tree to see the information about the Bookmark (real time of creation, bookmarked frame, full timeline, screenshot and description). When you point at a Bookmark that doesn't belong to the timeline of current movie branch, mouse cursor changes to arrow with question mark.

+


+

C. Illuminating button symbols in the Piano Roll Header

+

Hover mouse cursor over a button symbol in the Piano Roll Header to see if you can change the movie by clicking this symbol. When some rows of Piano Roll are selected, symbols in the Header will illuminate on mouse hover.

+


+

+

+

Left  mouse button

+


+

The main button.

+


+

A. Standard Windows actions

+

Most of GUI elements of TAS Editor window are controlled the same way as in other Windows applications.

+ +


+

B. Moving Playback cursor

+

Click on any row in the "Icons" column of Piano Roll to send Playback cursor to the frame pointed. If you hold the left mouse button, you can drag the Playback cursor up and down. This way you can even move Playback cursor into frames outside currently visible area of the movie. Just try dragging the cursor below or above Piano Roll – the farther you lead the mouse, the faster will be scrolling and Playback rewinding.

+


+

C. Selecting rows in Piano Roll

+

Click on a frame number in the "Frame#" column of Piano Roll to select this frame and remove selection from other frames (if there was any selection before). If you hold the left mouse button, you can stretch the selection by moving mouse up or down.

+

If you need to append new selection to an already existing selection, hold Ctrl while clicking on a frame number. This way you can select several non-overlapping segments. Also this way you can remove some parts of existing Selection, just hold Ctrl while clicking on a selected frame.

+

If you hold Shift instead of Ctrl, the click will select a region of frames starting from the beginning of previous Selection.

+

If you hold Alt, the click will select rows using current Pattern.

+


+

D. Setting/unsetting Input in Piano Roll

+

Point mouse cursor at needed cell of Input (find crossing point of needed frame row and needed button column) and press left mouse button. The Input in this cell changes at the moment you press the button. Empty cell will become occupied and vice versa.

+

The row containing this cell will become selected, and other Piano Roll rows will become unselected. This feature ensures that Selection cursor always appears in the context of Input editing.

+

If you hold the left mouse button, you can draw or erase Input in other cells of Piano Roll by moving mouse cursor over them. Drawing starts when you click on an empty cell, erasing starts by clicking on an occupied cell.

+

If you hold Shift while clicking on a cell, the Input change will apply to all frames from Selection cursor to the row containing the cell. Selection cursor won't move this time.

+

If you hold Alt instead of Shift. the click will set Input (from Selection cursor to the row containing the cell) as on current Pattern. Selection cursor won't move this time.

+


+

E. Setting/unsetting Input using the Header of Piano Roll

+

Click on a button symbol in the Piano Roll Header to change the Input of this button in selected frames. If no frames are selected, nothing will happen. If in some of the selected frames the button in not set, the click will set the button in all selected frames. If the button is set in all selected frames, the click will unset the button in all selected frames.

+

If you hold Alt while clicking on a button symbol, the click will the button Input in selected frames as on current Pattern.

+

If you click on the "Frame#" label, the click will apply to Markers instead of Input.

+


+

F. Creating and moving Markers

+

Double-click on a frame number in Piano Roll to set Marker to this frame. If you hold the left mouse button, you can drag the Marker freely. Release the button to leave the Marker at the frame number it was held over. This way you can move Markers from place to place. If you release the Marker over Input columns, the dragging will be cancelled, and the Marker will return to the frame it was picked from. If you release the Marker over another Marker, those two Markers will switch places.

+

If you release the Marker outside Piano Roll, this Marker will be dumped. Thus, to remove a Marker, double-click on it and drag it somewhere outside TAS Editor window.

+


+

G. Entering/exiting Note editing mode

+

Click on the upper or the lower edit field to start editing Note text displayed in this field at the moment.

+

To finish editing (and save changes) click on anything outside the edit field.

+


+

H. Controlling the Bookmarks List

+

Click on a frame number in Bookmarks List (on the left side of the list) to send Playback cursor to the frame.

+

Click on a time indicator in Bookmarks List (on the right side of the list) to restore movie state saved into the Bookmark and send Playback cursor to the bookmarked frame.

+

Those operations fire on the left button release.

+


+

I. Controlling the Branches Tree

+

Click on icon of a Bookmark to send Playback cursor to the bookmarked frame.

+

Double-click on icon of a Bookmark to restore movie state saved into the Bookmark and send Playback cursor to the bookmarked frame.

+

Those operations fire on the left button press.

+


+

J. Controlling the History Log

+

Click on any row of the History Log to restore movie state to the point of time when the Log record was created.

+


+

+

+

Right mouse button

+


+

A. Moving Playback cursor with mouse wheel

+

Hold right button and roll the mouse wheel up or down to move Playback cursor respectively.

+

Mouse cursor can be anywhere over the TAS Editor window or emulator main window.

+


+

B. Scrolling the Piano Roll

+

Place mouse cursor over the Piano Roll, hold right button and move mouse cursor anywhere outside the Piano Roll to scroll visible area to the side. This is especially useful for horizontal scrolling, because using scrollbar would be too slow.

+


+

C. Setting a Bookmark

+

Right-click on a row of the Bookmarks List to set the Bookmark to the frame where Playback cursor currently is.

+

Alternatively, right-click on icon of a Bookmark in the Branches Tree to set the Bookmark to the frame where Playback cursor currently is.

+

Those operations fire on the right button release.

+


+

D. Context menu

+

Right-click on a frame number of any selected frame in the Piano Roll to bring the context menu containing the following items:

+ +


+

Scrollbars and Note editing fields also have their own context menus.

+


+

+

+

Middle mouse button

+


+

The middle mouse button serves one major role – to pause and unpause emulator, no matter where mouse cursor is  The button fires on button press.

+


+

When emulator is paused, pressing the middle mouse button will unpause it (same as pressing Pause hotkey). Moreover, if there is the green arrow outside Greenzone in Piano Roll, the middle-click will launch seeking to the frame with the green arrow (same as pressing Restore Playback hotkey).

+

If you hold Shift while mid-clicking, this will launch seeking to the nearest Marker.

+

If you hold Ctrl while mid-clicking, this will either launch seeking to Selection cursor (if it's below Playback cursor) or re-watch the movie segment starting from Selection cursor (if it's above Playback cursor).

+


+

When emulator is unpaused, pressing the middle mouse button will pause it (same as pressing Pause hotkey).

+


+

Usually the middle mouse button is the mouse wheel.

+


+

+

+

Mouse wheel

+


+

The wheel can be rolled up and down with different speed. When you need precision, roll the wheel slowly. When you need speed, roll the wheel quickly.

+


+

A. Scrolling the Piano Roll or History Log

+

When mouse cursor is over the History Log, roll the mouse wheel to scroll visible area of the History Log.

+

When mouse cursor is anywhere else, roll the mouse wheel to scroll visible area of the Piano Roll.

+


+

B. Moving Playback cursor

+

Hold right mouse button and roll the mouse wheel up or down to move Playback cursor respectively.

+

If you want to always see the Playback cursor position in Piano Roll, check the "Follow cursor" checkbox in the Playback section of TAS Editor window.

+


+

C. Jumping on Markers

+

This is similar to pressing << and >> buttons or using Ctrl/Shift + Page Up/Page Down hotkeys.

+

Hold the Shift key and roll the wheel to make jumps with Playback cursor. The Piano Roll will follow it if the "Follow cursor" checkbox is checked.

+

Hold the Ctrl key and roll the wheel to make jumps with Selection cursor. The Piano Roll will follow it automatically.

+


+

D. Crossing gaps

+


+

Point mouse cursor to any member of a long column of buttonpresses or to an empty cell among other empty cells in its neighborhood, then hold the Alt key and roll the wheel up or down to scroll the Piano Roll in such a manner that mouse cursor immediately appears before the upper end or after the lower end of the column / emptiness.

+

This allows you to quickly navigate among long sequences of Input.

+

The same approach can be used to find previous/next Markers (when mouse cursor is over the column with frame numbers) and Bookmarks (when it's over the icons column).

+


+
+

+

+

Keyboard controls

+


+

+


+ +


+

+

+

Modifiers (Shift, Ctrl, Alt)

+


+

When you hold one of these keys the functions of left mouse button and mouse wheel change.

+


+ +


+

If you tap the Shift key twice in a row, the Piano Roll will automatically scroll to Playback cursor.

+

If you tap the Ctrl key twice in a row, the Piano Roll will automatically scroll to Selection cursor.

+


+

When you're drawing/erasing Input, hold Shift key to remove the "single-column" confinement.

+


+

+

+

Accelerator hotkeys

+


+

These are key combinations typical for many Windows applications. You cannot redefine those combinations. In this documentation they are highlighted with red color.

+


+

+


+

Ctrl + S = save project to disk

+


+

Ctrl + Z = undo (step back in History Log)

+

Ctrl + Y = redo (step forward in History Log)

+


+

Ctrl + Q = restore previous Selection (Selection undo)

+

Ctrl + W = restore next Selection (Selection redo)

+

Ctrl + A = select all frames between two Markers surrounding Selection cursor

+

Ctrl + B = reselect frames that contain Input that was copied to the Clipboard

+


+

Ctrl + C = copy selected Input to the Clipboard (Copy)

+

Ctrl + X = copy selected Input to the Clipboard and then clear selected frames (Cut)

+

Ctrl + V = paste Input from the Clipboard to Selection cursor (Paste)

+

Ctrl + Shift + V = insert Input from the Clipboard to Selection cursor (PasteInsert)

+


+

Delete = clear selected frames

+

Ctrl + Delete = remove selected frames from the movie

+

Insert = insert given number of blank frames before Selection cursor

+

Ctrl + Insert = clone selected frames

+

Ctrl + Shift + Insert = insert blank frames before selected frames

+


+

Ctrl + F = bring Find Note dialog

+


+

Ctrl + PageUp / Ctrl + PageDown = jump on Markers with Selection cursor

+

Ctrl + Home / Ctrl + End = move Selection to the beginning / to the end of the movie

+

Ctrl + Up / Ctrl + Down = transpose Selection 1 frame up / down

+

Ctrl + Right / Ctrl + Left = scroll Piano Roll right / left

+


+

Shift + PageUp / Shift + PageDown = jump on Markers with Playback cursor

+

Shift + Home / Shift + End = send Playback cursor to the beginning / to the end of the movie

+

Shift + Up / Shift + Down = move Playback cursor 1 frame up / down

+

Shift + Right / Shift + Left = scroll Piano Roll right / left

+


+

PageUp / PageDown = scroll Piano Roll up / down

+

Home / End = scroll Piano Roll to the beginning / to the end of the movie

+


+

+

+

FCEUX hotkeys

+


+

Emulator allows to map keyboard keys to different functions, see the Program Customization chapter. Keys that are already mapped by default are highlighted by light-blue color in this documentation.

+


+

+


+

Ctrl + F1 = reload last project

+


+

Pause = pause/unpause emulator

+

Esc = cancel seeking

+

Spacebar = restore Playback cursor position (launch seeking to the green arrow)

+

Ctrl + Spacebar = toggle "Auto-restore last position" checkbox

+

\ (backslash) = Frame Advance (emulate 1 frame)

+

Backspace = Frame Rewind (move Playback cursor 1 frame up)

+

Shift + R = play movie from the beginning

+


+

- (white "minus") = decrease emulation speed

+

= (white "plus") = increase emulation speed

+

Tab = Turbo speed (applies as long as the key is being held)

+


+

F1-F10 = load movie branch from respective Bookmark slot (1-10)

+

1-0 = jump to the frame of the Bookmark (1-10)

+

Shift + F1-F10 = set Bookmark (1-10)

+

I = set currently selected Bookmark (deprecated)

+

P = load movie branch from currently selected Bookmark (deprecated)

+


+

M = show/hide rerecord counter

+

, (comma) = switch Input display

+

. (dot) = show/hide frame counter

+

/ (slash) = show/hide lag counter

+


+

Shift + L = reload current Lua script

+


+

Q = toggle Recording mode

+

W = switch current multitracking mode

+

Ctrl + R = invoke Reset command

+


+

Full list of FCEUX hotkeys that can be used when Taseditor is engaged:

+


+ +


+

Other FCEUX hotkeys will not work when Taseditor is running, for more details see Mistake-proofing.

+


+

+

+

Virtual gamepad

+


+

Emulator also allows to map keyboard keys to buttons of emulated console. You can use these keys for Input Recording and for changing Input in Selection, see the Program Customization chapter.

+

By default these keys are mapped to Player 1 buttons:

+

DB

+

FA

+

EnterStart

+

SSelect

+

Keypad upUp

+

Keypad leftLeft

+

Keypad downDown

+

Keypad rightRight

+


+

When you need to input hardware commands, use FCEUX menu or hotkeys:

+ +


+

These commands work only when Recording mode is on. And after invoking a command you need to advance at least 1 frame to actually activate the command and insert it into the movie.

+

Since in TAS Editor 1.0 Piano Roll doesn't have columns for displaying hardware commands (they are rarely used), it's recommended to set Markers to frames where a command was inserted.

+


+
+

+

+

Controls in Note editing mode

+


+


+

When you enter Note editing mode, the keyboard is used for typing the text.

+


+

1. The following accelerator hotkeys change their meaning:

+

Ctrl + A – select all text of the Note

+

Ctrl + Z – undo/redo the last change in the text

+

Ctrl + X, Ctrl + C, Ctrl + V – text copy/cut/paste

+

Delete – delete one symbol or all selected symbols

+

Home/End – move typing position to the beginning/to the end of the text

+


+

2. FCEUX hotkeys do not work.

+

Backspacedelete previous symbol

+

Esc – exit Note editing mode without saving any changes

+

Tab – toggle between upper and lower Note editing field

+


+

3. Virtual gamepad keys do not work. Note: they will work if you check the Config -> Enable -> Background Input in FCEUX menu, so it's not recommended to enable the feature.

+


+

4. Mouse controls are the same as usual.  Any click outside the text edit field (except for mid-clicks) will exit Note editing mode and save text changes. Also, if the Playback cursor or Selection cursor move away from the Marker while you're editing its Note, the text changes will be saved and you'll begin editing another Marker's Note.

+


+


+


+


+


+

+

Created with the Personal Edition of HelpNDoc: Full-featured Kindle eBooks generator

+
+ + + + + + diff --git a/help/taseditor/FAQ.html b/help/taseditor/FAQ.html new file mode 100644 index 00000000..7a41943b --- /dev/null +++ b/help/taseditor/FAQ.html @@ -0,0 +1,140 @@ + + + + FAQ + + + + + + + + + + + + + + +
+
+

FAQ

+ +
+ Reference ››
+
+
+ Parent + + Previous + + Next + +
+
+
+
+ +

+

FAQ

+


+


+

If after reading the Manual you still have any questions on the topic, feel free to ask them at TASVideos forum.

+


+
+


+

I think I've found a bug in the program, what should I do?

+

Post a message in the FCEUX subforum of TASVideos. Try to explain the issue precisely, to help author reproduce the situation. Attach a screenshot if you think it reflects the essence of the problem.

+


+

Is it possible to use Taseditor with other emulators?

+

No. Even though the program code of Taseditor is isolated from the emulator code, it is by no means a plug-in. So it's necessary to manually port its source code and modify it according to specifications of target platform.

+


+

How can I TAS the traditional way, yet with Taseditor interface?

+

Basically, you can start traditional TASing right away, no additional settings are required. But if you must keep some old habits intact, you can fine-tune the program. Try the following options:

+ +

Also, it's recommended to switch the Bookmarks List to the "Branches Tree" view.

+


+

Why the right-click on the FCEUX window doesn't prompt the usual context menu?

+

It's done to facilitate the Playback cursor navigation with mouse wheel.

+

Usually users move the mouse cursor in such a manner that it's in sight. Thus when TASer is watching the game events the cursor will often be inside the FCEUX window. Context menus would obstruct the view when you want to rewind the Playback by holding right mouse button and rolling the mouse wheel. Since there's no important items in the menu while TAS Editor is engaged, the menu was removed.

+


+

Why the right-click on the Piano Roll sometimes prompts a context menu and sometimes doesn't?

+

Taseditor's context menu only appears when you right-click on the number of a selected frame. If you right-click on a frame that is not selected, or you right-click on the Input of a selected frame, the menu won't appear.

+

It's done to facilitate the Piano Roll scrolling by right-clicking and dragging.

+

Generally, it's recommended to use keyboard shortcuts and other means of accessing Taseditor features instead of using context menu.

+


+

How do I insert a Reset command into the movie?

+

You should use Input Recording here. Place the Playback cursor to the target frame, switch on Recording, then choose NES -> Reset in FCEUX main menu and press Frame Advance. Also, it's recommended to set a Marker to this frame, since there's no other way to mark a Reset/Power switch in the Piano Roll (there's no columns for commands, only for joypad buttons).

+

Then you can switch Recording off and continue usual movie editing. The frame with the Reset command can be transposed up or down by inserting or deleting frames above it.

+

Other hardware commands are invoked the same way, see Controls.

+


+

How do I change the order of columns in the Piano Roll?

+

Unfortunately, this feature is not supported in TAS Editor 1.0.  This will be fixed in next versions.

+


+

How do I change the number of players (joypads) in my movie?

+

You should create a new project, copying the Input and Markers from current one.

+

Choose File -> New in TAS Editor main menu. In the "Create New Project" window: choose the needed Input type, check "Copy current Input" and "Copy current Markers" checkboxes and click "OK".

+

Old project's Bookmarks won't be copied to the new project this way. You can recreate them using export/import Input features.

+


+

How can I quickly compare two movies?

+
    +
  1. Make sure that Hot Changes are enabled and Auto-adjustment of Input is disabled.
  2. +
  3. Create an empty project, import the first movie into it (using File -> Import Input), replay the movie to the end and save it to Bookmark 1.
  4. +
  5. Import the second movie over the existing Input and save the result to Bookmark 2.
  6. +
+

The import operation will truncate the Greenzone after the frame where the first difference between Input of the two movies was found. Other places of discrepancy can be detected by observing the Input in the Piano Roll:

+ +

For extra convenience it's recommended to name both Bookmarks, e.g. copy/paste the filename of the imported movie into the upper Marker Note just before creating a Bookmark.

+


+

Why are those fm3 files so large?

+

An FM3 file usually contains full snapshot of the working process, including the Greenzone data (which takes the most part of the file). See Advanced Features for details.

+


+

Why is the Manual so long?

+

Because besides the program specifications the Manual contains comprehensive tutorial (the Beginner's Guide) which systematizes known principles of effective TASing. Since there was no similar endeavours before, the author decided that lengthy explanations are the lesser evil than possible inexactitude.

+


+


+


+


+


+

+

Created with the Personal Edition of HelpNDoc: Full-featured Help generator

+
+ + + + + + diff --git a/help/taseditor/FM3format.html b/help/taseditor/FM3format.html new file mode 100644 index 00000000..7085240a --- /dev/null +++ b/help/taseditor/FM3format.html @@ -0,0 +1,392 @@ + + + + FM3 format + + + + + + + + + + + + + + +
+
+

FM3 format

+ + +
+
+ Parent + + Previous + +
+
+
+
+ +

+

FM3 format

+


+


+

The FM3 format is a simple extension of the FM2 format. FM2 files contain data which is needed for replaying the movie, and FM3 just adds Taseditor's working data to the end of FM2 file.

+

You can read full specifications of FM2 format in the FCEUX Help and on official site.

+


+

Every FM3 consists of 3 parts:

+ +


+
+

+

+

Header

+


+

The Header is always in ASCII plain text format.

+

It consists of several key-value pairs (lines of text where all symbols before the first space separator are considered to be the keyword and all symbols after this separator are considered to be the text representation of the value).

+

Newlines may be \r\n or \n.

+

If a line starts from "|" (pipe), it means the end of Header and the beginning of Input Log.

+


+

The key-value pairs may be in any order, except that the first key must be version.

+

Value text is always terminated by a newline, which the value text does not include.

+

The value text is parsed differently depending on the keyword, it can be either integer or string.

+


+

Keys with integer value:

+


+

(also used for booleans, with a 1 for true and 0 for false)

+

(the value can be stored as int32)

+


+ + + + + + + +


+


+

Keys with string value:

+


+

(their values cannot contain newlines)

+


+

romFilename (required) – the name of the file used to record the movie

+

romChecksum (required) – the base64 of the hexified MD5 hash of the ROM which was used to record the movie

+

comment (optional) – simply a memo. By convention, the author of the movie should be stored in a comment with the subject "author". Example: "comment author AnS"

+

subtitle (optional) – a message that will be displayed on screen when movie is played back (unless Subtitles are turned off). Right after the word "subtitle" and following space separator there must be an integer value indicating the frame that the subtitle will be displayed.  Any remaining text after the integer and following space separator is considered to be the string displayed. Example: "subtitle 100 Level Two" – at frame 100 the words "Level Two" will be displayed on the screen

+

guid (required) – a unique identifier for a movie, generated when the movie is created. Meaningless in FM3, because all there's no external savestates associated with the project file.

+


+
+

+

+

Input Log

+


+

The Input Log section consists of movie records either in the form of text lines or in the form of binary data.

+


+


+

Text format:

+


+

Every frame of the movie is represented by line of text beginning and ending with a "|" (pipe).

+


+


+

If fourscore is not used, the fields in the line are as follows:

+

|commands|port0|port1|port2|

+


+

Field commands is a variable length decimal integer which is interpreted as a bit field corresponding to miscellaneous input states which are valid at the start of the frame. Current values for this are:

+ +


+

The format of port0, port1, port2 depends on which types of devices were attached.

+ + +


+

If fourscore is used, then port0 and port1 are irrelevant and ignored. The input types must all be gamepads, and each input log record must be in the following format:

+

|commands|RLDUTSBA|RLDUTSBA|RLDUTSBA|RLDUTSBA|port2|

+

(commands, player 1, player 2, player 3, player 4, port2)

+


+


+

Binary format:

+


+

Input Log section starts with a | (pipe).

+

Every frame of the movie is represented by a record of a fixed length. The length can be determined by the devices on port0 and port1.

+


+

The first byte of each record stores "commands" bit field:

+ +


+

If fourscore is not used, the remaining bytes in the record depend on which types of devices are attached to port0 and port1:

+ + +


+

If fourscore is used, then port0 and port1 are irrelevant and ignored. 4 bytes are added to the size of record. The bits of the 1st byte represent the state of buttons of the 1st joypad (bit0 = A, bit1 = B, bit2 = Select, bit3 = Start, bit4 = Up, bit5 = Down, bit6 = Left, bit7 = Right); bits of the 2nd byte represent the state of buttons of the 2nd joypad, and so on.

+


+
+

+

+

Taseditor Data

+


+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

4 bytes

+

unsigned int32

+

FM3 version

+

4 bytes

+

unsigned int32

+

Saved modules

+

4 bytes

+

unsigned int32

+

Number of offsets (N = 6)

+

4 * 6 bytes

+

pointers

+

Offsets

+

???

+

stream

+

MARKERS DATA

+

???

+

stream

+

BOOKMARKS DATA

+

???

+

stream

+

GREENZONE DATA

+

???

+

stream

+

HISTORY DATA

+

???

+

stream

+

PIANO ROLL DATA

+

???

+

stream

+

SELECTION DATA

+
+
+


+

The data starts right after the last record of the Input Log. If there's EOF after the last record, TAS Editor will interpret the file as an FM2 file.

+


+

First 4 bytes of Taseditor Data contain the version of the project file format. The first release version of TAS Editor 1.0 saves projects with version = 3.

+


+

Next 4 bytes contain bit field that can be used for determining which modules of Taseditor were saved to the FM3 file:

+ +


+

Next 4 bytes contain the total number of modules, in the version 3 this number must be 6.

+

Then there are six offsets (4 bytes each) pointing at the data of each module. The offsets are counted from the beginning of the file.

+


+

When Taseditor saves the project, it calls all 6 modules that need saving. Each of them saves current writing offset and then serializes its own data into the file stream and moves current write position forward. The order of calling modules is always the same (Markers, Bookmarks, Greenzone, History, Piano Roll, Selection). When loading a project Taseditor calls those modules in the same order and they seek to the given offset and load / deserialize the data from the file.

+

To check the integrity of the data loaded, every module writes its own ID (string) into the file stream before writing the data. When loading the data it expects the ID to match, if it doesn't match then the module refuses to load following data, creates default state and reports "loading error" to Taseditor.

+

When using Save Compact settings, modules either save all their data as usual or write dummy ID which indicates that this module didn't save its data into the file. When loading the file a module that detects dummy ID refuses to load following data, creates default state but then reports "loading success" to Taseditor.

+


+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Module

+

ID when saved

+

ID when not saved

+

Markers

+

MARKERS

+

MARKERX

+

Bookmarks

+

BOOKMARKS

+

BOOKMARKX

+

Greenzone

+

GREENZONE

+

GREENZONX

+

History

+

HISTORY

+

HISTORX

+

Piano Roll

+

PIANO_ROLL

+

PIANO_ROLX

+

Selection

+

SELECTION

+

SELECTIOX

+
+
+


+


+


+


+


+

+

Created with the Personal Edition of HelpNDoc: Single source CHM, PDF, DOC and HTML Help creation

+
+ + + + + + diff --git a/help/taseditor/Glossary.html b/help/taseditor/Glossary.html new file mode 100644 index 00000000..ca4a3f5b --- /dev/null +++ b/help/taseditor/Glossary.html @@ -0,0 +1,285 @@ + + + + Glossary + + + + + + + + + + + + + + +
+
+

Glossary

+ +
+ Reference ››
+
+
+ Parent + + Previous + + Next + +
+
+
+
+ +

+

Glossary

+


+


+

Here you can find definitions for many terms that are used throughout this Manual. Most of them were used in the context of TASing before TAS Editor was created. Some of those terms are described more thoroughly in the Beginner's Guide.

+

It's recommended to read the Glossary at once, because many terms are interconnected.

+


+
+

+

+

+

Input

+

Data about player's actions, that can be received by a game.

+

TASing became feasible because of general assumption that behavior of a game is always determined by its initial state and player's input, and nothing else (see Determinism).

+

Examples of Input: pressing a button on a gamepad, pushing analog stick, touching by stylus, shouting into a microphone, etc.

+

Taseditor works with Input in the form of "sequence of buttons states".

+

Note: the fact of player not pressing any button is also considered an Input.

+

+

+

Output

+

Data sent from a game as a result of processing player's Input.

+

The process of playing a game can be depicted as a loop of interaction between a subject (player) and an object (game).

+

Examples of Output: displaying an image, producing a sound, vibrating gamepad, changing the value of an observed RAM address, providing an information about lag, etc.

+


+

Playthrough / Walkthrough (Solution)

+

A sequence of player's actions needed for successful completion of the game.

+

This sequence is inputted into the game using an input device (e.g. gamepad). The sequence can be either performed live (created in real-time) or constructed in advance in a form of reproducible recording (e.g. a log of button presses). The latter form allows editing of the sequence.

+


+

Speedrun

+

A walkthrough aimed on fastest completion of the game.

+

Some games have  build-in "Speedrun" or "Time Attack" mode, where the game counts the time spent while playing. For other games it's possible to use external timer, measuring time in seconds or TV frames.

+


+

TAS (Tool-Assisted Superplay / Tool-Assisted Speedrun)

+

A walkthrough made with use of tools for editing the sequence of player's actions.

+

The process of creating TASes is called "TASing", authors are usually called "TASers".

+

The Input editing exempts TASers from certain human limitations (e.g. slow reflexes), allowing to spend full energy on making extraordinary walkthroughs. It can be either speedruns or entertainment videos (playarounds).

+

TASes can be distributed:

+ +


+

Movie (replay)

+

Container for storing Input and associated data.

+

Unlike video containers, the movies don't contain Output (game footage). The Output appears only when user applies the movie Input to appropriate game file.

+


+

Lag

+

The term used when the delay between Input and Output is greater than normally.

+

The loop of interaction between player and game usually establishes fixed amount of time between polling Input and updating Output, for example 60 times per second.

+

A computer processor can only make fixed amount of operations in this fixed amount of time. But videogames try to mimic the unboundedness of real life, so the quantity of in-game objects may vary greatly. Thus it's possible that processing all objects takes more time than allotted. In such cases the Output update will be delayed, and next Input polling will be delayed too.

+

Speedrunners try to avoid excessive delays, and the lag is often considered as a factor when TASing. Usually TASers try to minimize the number of "frames containing lag".

+

Emulators can detect lag in a frame right after finishing the frame emulation. The criterion is simple: if the game didn't poll Input during the frame then it's the lag frame. If it did poll Input then this is normal frame. Taseditor highlights lag frames with red color, and it's useless to draw any Input on these frames.

+


+

Desync

+

Discrepancy between expected and received Output, which results in player's Input not syncing with the logic of the game.

+

Desync may appear when the Input made for one game is applied to another game, using different emulator version or different settings. Also desyncs appear when emulator doesn't support deterministic emulation.

+


+

Segment

+

Part of the movie, representing the period of time between two in-game events.

+

Breaking the movie into segments is used to decompose huge task to small subtasks.

+

The size of a segment can be measured in frames, but the limits of a segment are defined by in-game events. The beginning event cuts all previous tasks and concentrates TASer's attention on the nearest set of conditions. The ending event serves as an optimality criterion for all possible approaches for current task solution.

+

More: TASing Process

+


+

Optimization

+

The process of searching for optimal (the best) solution of the task in current segment.

+

Almost any task in videogames can be solved in a variety of ways. Every way has its own pluses and minuses. When starting a project, TASer chooses his goal (e.g. pacifist speedrun), thus setting priorities to those pluses and minuses, so all the ways of solving a task can be evaluated and compared to each other to determine which one is better.

+

Optimization of a TAS consists of editing Input and evaluating resulting Output. When TASer gets better result, he marks current Input as the best until he finds even more optimal Input. Final product (TAS movie) contains best solution for every subtask.

+

More: TASing Methodology

+


+

Improvement

+

A way to solve the task better (closer to optimum).

+

Examples of improvements in speedruns: removing inaccuracy, applying unused timesaver, increasing the usefulness of an old timesaver, adding entertainment without losing speed.

+


+

Timesaver

+

An in-game trick that can save time.

+

When making a speedrun, TASer is supposed to use every unprohibited opportunity to make the walkthrough become as fast as possible. One thing is polishing the Input to find the best outcome from current knowledge about the game. Another important activity is expanding this knowledge base – finding and applying tricks. True TASer strives to gather the maximum information about the game and use all known tricks to full extent, so that his record wouldn't be easily beaten.

+

Examples of timesavers: features of the game, bugs of the game, luck manipulation.

+

Note: sometimes TASers deliberately refuse certain timesavers, in this case the TAS aims for extra category. Examples: Super Mario Bros TAS without using B button (denying one feature of the game), Sonic the Hedgehog TAS without zipping (denying one bug of the game).

+


+

Feature

+

An intended aspect of the game.

+

Some features are unimportant (or even unnoticeable) for an ordinary player, but substantial for a TASer. So before optimizing Input it's recommended to make a research of the game engine.

+

Examples of such features: damage boost, forced waiting for score countdown, coordinate subpixels, AI peculiarities, etc...

+


+

Bug / Glitch

+

An unintended aspect of the game.

+

Bugs abused by TASer should be reproducible on real console (at least theoretically). Bugs caused by emulation are not permitted.

+

Many bugs are discovered during real-time play. Some of them require thorough research and disassembly of the game code.

+

Examples of bugs: simplistic collision detection system, not checking save data corruption, race conditions, mistake in the order of checks, etc...

+


+

Luck Manipulation

+

Unrestricted exploiting of certain game features, which are normally limited by the shortage of player's knowledge.

+

Although any experiments with Input modification are manipulations of game features, but some aspects of games appear especially unpredictable for an ordinary player. Developers intentionally entangle algorithms of those features, so that for a naked eye they seem completely random and uncontrollable.

+

However, in deterministic world all aspects of videogames are predictable (defined by Input). Using tools and careful analysis you can reveal those hidden laws and dependencies, and then use the knowledge when creating the Input. And sometimes you don't even have to dissect algorithms, when you can use trial-and-error method.

+

More: Nonlinear TASing (example of luck manipulation)

+


+

Subpixels

+

The term used when in-game objects have coordinates with fractional parts.

+

Generally, there's difference between on-screen coordinates of a sprite and in-game coordinates of the object this sprite represents. In some games those coordinates have the same scale and their values coincide, but usually on-screen images represent a rough outline of the real state of things. So, to get max precision TASers observe the memory of emulated console, using Memory Watch tool or custom Lua HUD. This way even allows to see hidden variables of the game, that aren't displayed on-screen normally.

+


+

Recording

+

One of ways to create Input for a movie.

+

It consists of appending new Input sequentially to the end of current movie, while watching interim results of the Input.

+

Another way would be drawing Input directly in the movie.

+

More: Toolbox, TASing Methodology, Traditional TASing

+


+

Rerecording

+

One of ways to edit Input in a movie.

+

It consists of rewriting old Input sequentially from starting frame to ending frame, while watching interim results of the Input changes.

+

Another way would be direct modification of existing Input in the movie.

+

More: TASing Methodology, Traditional TASing, Rerecords counter

+


+

Multitracking (multi-track recording)

+

One of ways to record Input for a walkthrough of the game in multi-player mode.

+

It consists of recording Input for a segment of the movie by taking turns for every player separately.

+

Another way would be recording Input for all players simultaneously.

+

More: Toolbox

+


+

Frame Advance

+

Step-by-step emulation of a game using the minimum units of measuring time – frames.

+

Used for manual control of progression of time. Considered to be more effective replacement to "slow motion".

+


+

Turbo (turbo speed)

+

The feature of speeding up emulation to the maximum possible speed.

+

Used for skipping meaningless in-game events and reducing waiting time when emulator is seeking.

+

Most emulators allow to customize emulation speed, slowing it down or speeding up when needed. Turbo speed means the fastest speed possible, which depends on your computer performance.

+

More: Toolbox, Nonlinear TASing, Semiautomatic TASing

+


+

Savestate

+

A snapshot of the emulated system's state at that current moment.

+

Unlike in-game saves, savestate contains comprehensive data on the state of emulated hardware.

+


+

Piano Roll

+

A type of visual representation of data, similar to table or grid view.

+

The interface is used in many music editing programs (MIDI sequencers and MOD trackers). Its name and basic concept was derived from existing storage medium used to operate a mechanic piano (paper rolls).

+

Taseditor's Piano Roll displays current movie data (Input and Markers) and allows editing the data by mouse clicks. It also displays auxillary information like pointers, Bookmarks, Lag log, etc.

+

Every row of the Piano Roll corresponds to one frame of the movie.

+

More: Piano Roll, Piano Roll specs

+


+

Playback cursor

+

Pointer at currently played frame of the movie.

+

Events of this frame are displayed in emulator's main window as current screenshot. Piano Roll marks respective row with light-blue color and the "Play" symbol (light-blue arrow).

+

Only one frame of the movie can be seen at any given moment. To see the screenshot of upcoming events you'll have to move Playback cursor forward (down in Piano Roll). To see the screenshot of previous events you'll have to move Playback cursor backward (up in Piano Roll).

+

More: Piano Roll, Playback cursor Navigation

+


+

Greenzone (access zone)

+

The storage designed for speeding up Playback cursor navigation.

+

This storage automatically collects savestates for all emulated frames of the movie, and when it's necessary to rewind or jump forward to a frame, Taseditor loads respective savestate from Greenzone.

+

More: Toolbox, Program Customization, Greenzone specs

+


+

Selection

+

Set of rows in Piano Roll that are highlighted by special color (usually dark-blue).

+

Any row of Piano Roll (and respective frame of the movie) can be either selected or not selected.

+

Selection allows to operate with many frames at once, for example, delete whole section of the movie instead of deleting every single frame in it.

+

Upper row of the Selection is called "Selection cursor".

+

Selection cursor automatically follows the process of Input editing.

+

More: Piano Roll, Selection cursor Navigation

+


+

Marker

+

Yellow mark for a row in Piano Roll that emphasizes the frame among its neighbors.

+

Any row in the Piano Roll can be marked. Markers can improve the distinctness of movie data.

+

Markers can be used to:

+ +

More: Piano Roll, Markers specs

+


+

Note

+

Single line of text accompanying every Marker.

+

More: Piano Roll, Controls, Advanced Features

+


+

Bookmark

+

A numbered mark for a frame of the movie.

+

Bookmark stores all necessary data about the frame it was placed on. Including the movie branch that contains Input that definitely leads the game to events of this frame.

+

Bookmarks can be used for Playback cursor navigation, but their main purpose is to store branches.

+

More: Toolbox, Bookmarks specs

+


+

Branch

+

A copy of the movie, storing its state at the moment of creating the Bookmark.

+

Current movie can be replaced by the branch when necessary, thus restoring saved state of the movie.

+

With branches you can have many different movies in one project, and you can instantly switch among them:

+ +

More: Toolbox, Program Customization, Branches specs

+


+

Project

+

Container for storing work data in Taseditor.

+

More: Advanced Features

+


+

Lua

+

A programming language used in many TAS-friendly emulators.

+

Useful for making custom tools and data visualization.

+

More: Advanced Features, Lua, Lua API

+


+

Bot (robot)

+

A program made for automation of a task.

+

Bots are created to free humans from tedious work that doesn't require high intelligence. Unlike humans, bots don't invent the solution, they just methodically test all possible approaches within given limits, following strict algorithm made by the programmer.

+

Nowadays bots are only practical for running exhaustive search within a small segment of the movie. Most of time it's faster to search for best solution manually, using human intuition to eliminate dead ends without unnecessary tests.

+

Making bots requires programming skills. TASing bots are either written in Lua or built-in into emulators by modifying open source code.

+


+

Pattern

+

A predefined sequence of Input values for a button.

+

More: Advanced Features, Patterns specs

+


+


+


+


+


+

+

Created with the Personal Edition of HelpNDoc: Free EBook and documentation generator

+
+ + + + + + diff --git a/help/taseditor/Ideas.html b/help/taseditor/Ideas.html new file mode 100644 index 00000000..31b180a9 --- /dev/null +++ b/help/taseditor/Ideas.html @@ -0,0 +1,583 @@ + + + + Ideas + + + + + + + + + + + + + + +
+
+

Ideas

+ + +
+
+ Parent + + Previous + + Next + +
+
+
+
+ +

+

Ideas

+


+


+

Тасэдитор объединяет множество экспериментальных идей в единую систему. Многие из этих идей были озвучены очень давно (см. темы на форуме в духе "инструмент мечты" и т.д.), но для их реализации в рамках единой непротиворечивой системы понадобилось немалое время.

+

Основообразующей идеей Тасэдитора является интерфейс Piano Roll, позволяющий взаимодействовать с мувиком в интуитивно понятной форме. Первые упоминания о необходимости создания инструмента для ТАСинга на основе Piano Roll звучали ещё в 2005 году, возможно, даже ранее. Прототип под названием TASEdit был создан в 2008 году. Окончательное видение Тасэдитора сформировалось в сентябре 2011 года и дорабатывалось по ходу разработки вплоть до лета 2012. Помимо реализованных идей в это время было придумано множество перспективных, но второстепенных или сложно реализуемых идей, которые было решено отложить на будущее.

+


+
+ + + + + + + + +

Реализовано в 1.0

+

Запланировано на 2.0

+

Piano Roll

+

Выделение

+

Маркеры

+

Горячие Правки

+

Гринзона

+

Проигрыватель

+

Зелёная стрелка

+

Автовосстановление утраченной позиции

+

Мультитрекинг-рекордер

+

Lua-автоматизация

+

Закладки и ответвления

+

Всплывающие окна

+

Журнал Истории

+

Счётчик перезаписей

+

Система клавиш-модификаторов

+

Шаблоны

+

Пересечение промежутков

+

Компактное сохранение

+

Автосохранение

+

Журнал Вывода

+

Миникарта

+

Виртуальный Джойстик

+

Усовершенствование Выделения

+

Гибкая настройка колонок

+

Теплокарта перезаписей

+

Прочие мелочи

+

Поддержка платформ, отличных от NES

+
+
+


+
+

+

+

Реализованные идеи

+

+

+

Piano Roll

+


+

Основа Тасэдитора, вокруг этой идеи и были сформированы все остальные.

+


+ +

+

+

Выделение

+


+

Как и в любом другом редакторе,  в Тасэдиторе Выделение служит для применения операций к множеству кадров одновременно. Кроме того, здесь Выделение служит в качестве указателя (курсора) на место последнего щелчка по Вводу.

+


+ +

+

+

Маркеры

+


+

При редактировании больших мувиков пользователю может понадобиться установка отметок на некоторые строки Piano Roll, чтобы эти строки визуально отличались от соседних. После ряда усовершенствований эта идея вылилась в многогранную фичу.

+


+ +

+

+

Горячие Правки

+


+

Раскраска текстовых символов в ячейках Ввода разными цветами, в зависимости от давности редактирования каждой ячейки. Подробнее см. Интерфейс программы и Настройка программы.

+


+ + +

+

+

Гринзона

+


+

Так как интерфейс Piano Roll предоставляет пользователю почти мгновенный доступ к изменению Ввода на любом кадре мувика, желательно также предоставить быстрый доступ к просмотру состояния игры на любом кадре мувика. Это реализуется с помощью кеширования данных о всех полученных состояниях игры.

+


+ +

+

+

Проигрыватель

+


+

Проигрыватель – это собрание всех функций по просмотру Вывода (состояния игры в нужных кадрах).

+


+ +

+

+

Зелёная стрелка

+


+

При создании спидранов ТАСер пытается обогнать свой рекорд на каждом участке. В большинстве случаев критерием оптимальности является номер кадра, на котором происходит конечное событие участка. Для его определения ТАСер перемещает Курсор Проигрывателя, одновременно просматривая экран FCEUX, и останавливает этот ручной поиск в тот момент, когда обнаружено начало интересующего события. Обычно Курсор Проигрывателя так и остаётся на найденном кадре, а ТАСер начинает изменять Ввод на участке, надеясь улучшить его и получить то же событие на более ранний кадр.

+

Во время изменения Ввода Гринзона усекается, и Курсор Проигрывателя отступает назад. Когда ТАСер считает, что внёс во Ввод достаточно существенные изменения, он начинает проверку Вывода, чтобы определить, на каком кадре начинается целевое событие теперь. Для этого он опять перемещает Курсор Проигрывателя, одновременно просматривая экран FCEUX.

+

Чтобы сделать вывод об улучшении, ТАСеру нужно сравнить старый номер кадра (найденный в прошлый раз) и новый номер, найденный только что. Тасэдитор визуализирует эти данные, чтобы пользователю не требовалось запоминать их в уме. На новый номер указывает Курсор Проигрывателя, на старый номер указывает зелёная стрелка.

+


+ +
    +
  1. эмуляция хотя бы одного кадра (подразумевается, что пользователь запустил просмотр участка)
  2. +
  3. следующее отступление Курсора Проигрывателя из-за усечения Гринзоны
  4. +
+ +

+

+

Автоматическое восстановление последней позиции

+


+

При создании любых ТАСов критерием оптимальности может быть состояние игры на одном и том же кадре, либо ход событий на одном и том же участке. ТАСер просматривает участок и оставляет Курсор Проигрывателя на последнем кадре участка, затем изменяет Ввод на участке и опять просматривает участок, останавливая Курсор Проигрывателя на том же самом кадре. Вывод об улучшении ТАСер делает либо во время просмотра событий участка, либо после остановки эмуляции, оценивая характеристики последнего кадра.

+

Этот процесс можно автоматизировать, автоматически запуская добегание к утерянной позиции Курсора Проигрывателя после каждого усечения Гринзоны. Для этого служит галочка "Auto-restore last position".

+


+ +

+

+

Мультитрекинг-рекордер

+


+

Рекордер – это собрание всех функций по редактированию Ввода на кадре под Курсором Проигрывателя. Рекордер предоставляет ТАСеру второй способ редактирования Ввода – Запись.

+


+ + + +

+

+

Lua-автоматизация

+


+

Lua позволяет пользователю расширить возможности Тасэдитора, в частности, предоставляет ТАСеру третий способ редактирования Ввода – автоматическая генерация.

+


+ +

+

+

Закладки и ответвления

+


+

Закладки являются специализированной альтернативой Маркерам. А ответвления служат для хранения нескольких мувиков в одном проекте. Для упрощения создания и навигации по ответвлениям они привязаны к Закладкам, по аналогии с традиционными сохранениями.

+


+ +

+

+

Всплывающие окна

+


+

Служат для показа контекстозависимой информации, которая нужна только в определённые моменты времени.

+


+ +

+

+

Журнал Истории

+


+

История всех существенных изменений проекта служит, главным образом, для удобного отката этих изменений, а также для визуального отслеживания этой истории.

+


+ + + +

+

+

Счётчик перезаписей

+


+

По традиции во всех ТАСерских эмуляторах ведётся учёт количества перезаписей, использованных во время создания ТАСа. Это число может использоваться для примерной оценки трудозатрат.

+


+ +

+

+

Система клавиш-модификаторов

+


+

Для повышения интуитивности клавиатурного управления в Тасэдиторе используется строгое разделение функций клавиш модификаторов:

+


+ +

+

+

Шаблоны

+


+

Заготовленные последовательности  нажатий для одной кнопки. Подробнее см. Продвинутые возможности.

+


+ +

+

+

Пересечение промежутков

+


+

Дополнительный способ быстрой навигации по содержимому Piano Roll, облегчающий визуальное прослеживание длинных последовательностей для отдельно взятой кнопки или Маркеров.

+


+ +

+

+

Компактное сохранение

+


+

Файл проекта Тасэдитора в первую очередь предназначен для сохранения точного снимка рабочего процесса. Чтобы использовать тот же самый формат для обмена файлами между соавторами ТАСа или для опубликования в Интернете, необходимо предоставить пользователю возможность избирательного сохранения рабочих данных в файл. При открытии такого fm3-файла отсутствующие данные будут заменяться данными по умолчанию.

+

Подробнее см. Продвинутые возможности и Формат FM3.

+

+

+

Автосохранение

+


+

Как и в случае с любым офисным документом, проект Тасэдитора желательно время от времени сохранять на диск, даже если не планируется выход из программы. Однако до Тасэдитора у ТАСеров не было такой привычки, поэтому имеет смысл сохранять проект автоматически, предоставив пользователю возможность настроить или отключить эту функцию.

+

Подробнее см. Настройка программы.

+


+
+

+

+

Запланированные идеи

+


+

+

+

Журнал Вывода (Output Log)

+


+

Следующий этап эволюции инструмента Memory Watch – просмотр состояния игровых данных в динамике, а не только в статике. Аналогично Журналу лага, эта фича позволит легче и точнее анализировать принципы изменения игрового Вывода.

+


+ +

+

+

Миникарта

+


+

Графически отображает в окне Тасэдитора весь мувик – Гринзону, лаг, Курсор Проигрывателя, Выделение, Маркеры, Закладки, точки Горячих Правок, подсветку Журнала Вывода и т.д. Предоставляет пользователю мгновенный образ текущего проекта, не обладающий детальностью, зато полностью умещающийся на экране. Также усовершенствует навигацию по мувику.

+


+ +

+

+

Виртуальный Джойстик

+


+

Альтернативный способ ввода инпута. Очень похож на изменение инпута щелчками по Заголовку Piano Roll, однако более удобен и нагляден.

+


+ +

+

+

Усовершенствование Выделения

+


+

Архитектура TAS Editor 1.0 не рассчитана на выделение столбцов Piano Roll, однако в некоторых ситуациях это может быть необходимо при ТАСинге. Например, для очистки Ввода первого джойстика без очистки Ввода второго джойстика. Либо для перемещения Ввода одной/двух кнопок без смещения остальных внопок.

+

Кроме того, необходимо усовершенствовать процесс рисования Выделения, чтобы пользователь мог видеть цвет строк Piano Roll под полупрозрачным Выделением.

+


+ +

+

+

Гибкая настройка колонок

+


+

В TAS Editor 1.0 столбцы Piano Roll имеют фиксированную ширину. Количество и порядок следования столбцов также фиксированы, Для команд приставки (сброс, вставка диска и т.д.) отдельные столбцы не отводятся, так как эти команды используются крайне редко. Однако при портировании Тасэдитора на другие эмуляторы количество столбцов будет возрастать (например, у PSX нужно отображать столбцы для 14 кнопок), необходимо предоставить пользователю возможность настраивать их.

+


+ +

+

+

Теплокарта перезаписей

+


+

Хранит и отображает статистику "изменений после просмотра" (перезаписей). Может быть полезна для выявления сложных мест в мувике.

+


+ +

+

+

Прочие мелочи

+


+ +

+

+

Поддержка платформ, отличных от NES

+


+

Если Тасэдитор приобретёт популярность среди ТАСеров, необходимо расширить его доступность для всех эмулируемых платформ.

+


+ +


+


+


+


+


+

+

Created with the Personal Edition of HelpNDoc: Produce Kindle eBooks easily

+
+ + + + + + diff --git a/help/taseditor/Implementation.html b/help/taseditor/Implementation.html new file mode 100644 index 00000000..aeb6c75b --- /dev/null +++ b/help/taseditor/Implementation.html @@ -0,0 +1,419 @@ + + + + Implementation + + + + + + + + + + + + + + +
+
+

Implementation

+ + +
+
+ Parent + + Previous + + Next + +
+
+
+
+ +

+

Implementation

+


+


+

At first the TAS Editor was based on the codebase of experimental tool named TASEdit, using FCEUX 2.1.5 as a kick-start.

+

The premise of TASEdit was to build an input editor (like TAS Movie Editor) into emulator, so that the delay between editing and checking results would greatly shrink. Since there was no research done on typical behaviors in TASing process, the concept was vague and the code wasn't scalable. Thus, soon after formulating the new vision of the editing tool the code of TAS Editor was fully rewritten to make adding new features easier.

+

The following architecture of TAS Editor was designed according to author's notion of a methodical TASing and of features needed for such TASing.

+


+
+


+

TAS Editor modules (classes)

+


+

taseditor.cpp

+

Main – Main gate between emulator and Taseditor

+

[singleton]

+ +


+

taseditor_window.cpp

+

Window – User Interface

+

[singleton]

+ +


+

bookmarks.cpp

+

Bookmarks – Manager of Bookmarks

+

[singleton]

+ +


+

branches.cpp

+

Branches – Manager of Branches

+

[singleton]

+ +


+

bookmark.cpp

+

Bookmark – Single Bookmark data

+ +


+

snapshot.cpp

+

Snapshot – Snapshot of all edited data

+ +


+

inputlog.cpp

+

InputLog – Log of Input

+ +


+

laglog.cpp

+

LagLog – Log of Lag occurrence

+ +


+

markers.cpp

+

Markers – Snapshot of Markers state

+ +


+

popup_display.cpp

+

Popup display – Manager of popup windows

+

[singleton]

+ +


+

history.cpp

+

History – History of movie modifications

+

[singleton]

+ +


+

piano_roll.cpp

+

Piano Roll – Piano Roll interface

+

[singleton]

+ +


+

selection.cpp

+

Selection – Manager of selections

+

[singleton]

+ +


+

editor.cpp

+

Editor – Tool for editing

+

[singleton]

+ +


+

splicer.cpp

+

Splicer – Tool for montage

+

[singleton]

+ +


+

taseditor_config.cpp

+

Config – Current settings

+

[singleton]

+ +


+

playback.cpp

+

Playback – Player of emulation states

+

[singleton]

+ +


+

greenzone.cpp

+

Greenzone – Access zone

+

[singleton]

+ +


+

recorder.cpp

+

Recorder – Tool for input recording

+

[singleton]

+ +


+

markers_manager.cpp

+

Markers_manager – Manager of Markers

+

[singleton]

+ +


+

taseditor_lua.cpp

+

Lua – Manager of Lua features

+

[singleton]

+ +


+

taseditor_project.cpp

+

Project – Manager of working project

+

[singleton]

+ +


+
+


+

Emulator modifications

+


+


+

Taseditor needs the following modifications to be applied to an emulator code.

+


+

Main/Window:

+ +


+

Movie:

+ +


+

Input:

+ +


+

Output:

+ +


+

SaveStates:

+ +


+

Config:

+ +


+

Lua engine:

+ +


+

Replay:

+ +


+

Other:

+ +


+


+


+


+


+

+

Created with the Personal Edition of HelpNDoc: Single source CHM, PDF, DOC and HTML Help creation

+
+ + + + + + diff --git a/help/taseditor/Introduction.html b/help/taseditor/Introduction.html new file mode 100644 index 00000000..2a8f34df --- /dev/null +++ b/help/taseditor/Introduction.html @@ -0,0 +1,146 @@ + + + + 1. Introduction + + + + + + + + + + + + + + +
+
+

1. Introduction

+ +
+ Beginner's Guide ››
+
+
+ Parent + + Previous + + Next + +
+
+
+
+ +

+

Introduction

+


+


+

+

TASing – the process of creating an extraordinary game playthrough. For a true TASer, just simply beating the game is not enough. You must do something unique, something that would justify the use of tools.

+

And that requires a non-standard way of thinking. During the regular play, almost entire flow of our thoughts is determined by the gameplay rules, and those who try to question the rules are quickly fined with a game over and other means. These trivial psychological methods help the game to direct player's fantasy to an intended path, in order to give him a credible atmosphere of integral world and to keep him within a craftily devised comfort zone.

+

So, to create an extraordinary playthrough, TASer needs to both use emulator tools masterfully and be able to mentally abstract from the original game rules, while still obeying them physically (because TASing is not cheating, we won't influence the game other way than by joypad input).

+

Early TASing, just as regular speedrunning, was not much far away from the "normal" gaming process. TASer simply launched an emulator, switched on buttons logging and played a game, saving and loading often enough to fix the most obvious mistakes, slowing down the gameplay at the most intense moments, thus compensating for the slow reaction of the human organism.

+

The ability to fix mistakes emancipates man's imagination and incites him to experiment. Illusions of the game realm now confine his mind much less than before. But real-world stereotypes still affect his thinking. For instance, if a harmful object usually kills you, it's only natural to assume it always kills. But in truth it may appear to be killing only while even frame numbers, or when the subpixel value is equal to zero. But how would you guess it using only savestates and slowdown? First you have to stop being a gamer and become a researcher.

+

A huge breakthrough in the TASing history was the introduction of Frame Advance – a frame-by-frame emulation. Now when you're TASing, the game is constantly being held paused, thus allowing to analyze every in-game aspect separately. Until then the game still appeared as a coherent stream of events (with simple slowdown). The stream that the player had to perceive as a complex emotional cocktail. And now with frame-by-frame play TASer can mentally isolate any given event of the current frame. This drastically alters the principles of consuming the in-game information. Material world stereotypes don't dictate how to act in the virtual world anymore, and you see the game more objectively, thus finding imperfections/loopholes in its rules.

+

Of course the game still keeps trying to impose typical behavior templates, and they are harder to resist when you're newbie rather than experienced TASer. That's the exact reason why a skilled TASer can beat someone's speedrun (even his own old TAS) – not because of handling the tools better, but owing to "Déformation professionnelle" that helps to notice vulnerabilities in games.

+


+

Many more TASing tools were invented since then, but the very way of interaction between a TASer and a game remained the same. Using rerecords, TASer edits Input in the same succession as the flow of in-game time. This linearity of TASing process builds certain limits in TASer's thinking. When you get used to receiving the game reaction on each button press, you involuntarily associate yourself with a game character. This makes it harder to try to look at the events from an outsider's viewpoint. And yet TASer is expected to have the most objective point of view possible!

+


+

The development of the toolset named "TAS Editor" aims for 2 main goals:

+
    +
  1. to lower the threshold of joining TASing
  2. +
  3. to raise the objectivity of gameplay analysis
  4. +
+


+

The first goal is achieved by detailed visualization of all major aspects of TASing.

+

The second goal is achieved by switching from linear recording of movie segments to non-linear Input editing. The higher level of abstracting from in-game rules is reached by giving the TASer the following new abilities:

+ +


+

In addition, TAS Editor 1.0 developed some old TASing tools up to a new level:

+ +


+

When launching Taseditor, get ready to control the game from bird's eye view. The following chapters of this tutorial will explain you almost everything a prolific TASer needs to know. If you already have an experience in traditional TASing, some learning aspects should come easier, but some may appear more difficult to you than to a newcomer. Either way, try to finish the whole Guide, and you will likely learn a thing or two about TASing in general.

+

One of the most unconventional features of TASing with Taseditor is the stress on mouse control. Mouse allows high speed of Input editing and unparalleled convenience of Playback navigation. Even though most of Taseditor functions also have keyboard shortcuts, the comfortable work would be impossible without a mouse.

+

The gamepad is useful when you need to quickly record an Input without caring about accuracy. But most of his time TASer spends on various manipulations with once created Input. And here the mouse or keyboard becomes much more handy than gamepad. For example, using a key combination you can move any part of Input one frame back or forth. And when you need to adjust the jump height (the duration of holding the A button), it's easier to do with single click, than to switch Recording on and retype the whole range of frames.

+

Nevertheless, it's still possible to work in Taseditor the same way people were TASing before. The program interface supports all essential aspects of the traditional TASing method. If you were to use the TAS Editor window only as an informational panel left in a corner of the desktop, you probably would not even notice any difference from usual flow of TASing. It can be good reason to smoothly move from the old method of TASing to the new one. At first you may only like some accessory features of Taseditor, such as the Lag visualization or the Branches Tree. Then you'll need some Input copy/paste, and Taseditor is the best alternative to an external editor. After some time you'll notice that direct Input editing turns out faster than rerecording.

+

+

Advantages of the new method reveal themselves quicker when you're making a TAS controlling 2 and more players simultaneously. In old times people invented plenty of hacks and workarounds to make such kind of TASing easier, e.g. binding several buttons to one key, using "Auto-hold", macros and custom multitracking scripts. Now all of this is irrelevant with Taseditor, because here TASer does not play the role of a gamer that associates himself with the controlled character. Now you are not playing the game, you are meditating over the decomposed continuum of the game, while creating a scenario of events via Input. And thus it's does not matter whether you control 1 character, or 2, or many.

+


+

Taseditor was also designed to reduce the rut. There are always lots of tedious recurring activities in TASing. Surely, the program won't save you from the necessity to test all possible branches of gameplay development, but it automates some actions and increases the efficiency in many little things, allowing TASer to keep patience longer than during raw TASing.

+


+

Interesting facts:

+ +


+

Special attention was paid to user interface. When you gain enough experience, you'll be able to do most of things mechanically, staying focused on the in-game situation analysis.

+

If you happen to get a nice idea how to reduce the rut some more, feel free to post on TASVideos forums. Many ideas implemented in TAS Editor were first voiced on these forums as "dream tools".

+


+

Besides the new approach to TASing, Taseditor offers simple means for organization of your working process. Because of unsystematic approach to TASing many newcomers waste their time ineffectively, dissipate the effort and get tired quickly, then start to save the energy by reducing the amount of tests. As a result, they end up with a very suboptimal TAS. Then, as the time goes, they acquire a set of methods and habits, become experienced TASers. But every newbie had to learn by his own mistakes. In this Guide we will try to formulate a clear notion on a methodical TASing (both traditional and new), so that newcomers can realize the essence of the process faster.

+

Working with Taseditor is pretty similar to an interactive programming using an interpreted language. You just edit the code and instantly see the result of its execution on the screen. TASer can either immediately observe the effect of his interim actions, or he can get carried away by the construction of a code section and watch the result only after the section is finished.

+

Programmers have the valuable ability to increase the code readability with comments. It allows to keep more clear picture of the project in mind, and proceed without constant re-inspection of results, because in most cases the result is rather predictable, when the context is known.

+

Also, good code readability allows to quickly refresh all necessary memories when you return to a project delayed long ago. Granted that this project was well documented.

+

Taseditor helps to document TAS project on the fly – write comments, assign clear names to structures (patterns and Input sections), test different code versions in separate branches of the repository (see "Branches Tree") and efficiently work in co-authorship. And no, there's no strict conventions to follow. You set your own rules for when and how to shape your project. For example, if you didn't hesitate to describe a trick used in the first level, in next levels you'll be able to quickly duplicate the trick Input by several key strokes. If you didn't – you'll have to search the trick location manually. In simple TASes you can disregard comments and any long-term plans, but in complicated projects this program functionality should be very appropriate.

+

TASVideos.org site supports uploading and publishing Taseditor projects (.fm3 files), so you may share not just the TAS movie, but your groundwork as well, encouraging the spirit of openness and mutual aid. If you don't want to share, export the data to .fm2 format and upload that.

+

FM3 files are played back by FCEUX emulator since version 2.2.0 the same way as FM2 files. Older versions of FCEUX can also play such files if you change the extension to fm2.

+


+

Next chapter: learning the basics of the program usage.

+


+


+


+


+


+

+

Created with the Personal Edition of HelpNDoc: Easily create iPhone documentation

+
+ + + + + + diff --git a/help/taseditor/LuaAPI.html b/help/taseditor/LuaAPI.html new file mode 100644 index 00000000..b6a0efcd --- /dev/null +++ b/help/taseditor/LuaAPI.html @@ -0,0 +1,328 @@ + + + + Lua API + + + + + + + + + + + + + + +
+
+

Lua API

+ +
+ Reference ››
+
+
+ Parent + + Previous + + Next + +
+
+
+
+ +

+

Lua API

+


+


+

TAS Editor v1.0 comes with the library of 24 functions available for Lua scripts running in FCEUX emulator. With Lua scripts you can automate some aspects of TASing and even create your own tools for movie editing.

+


+

In FCEUX folder there's /luaScripts folder with /taseditor subfolder in it. There you can find examples of scripts using functions of this library.

+


+

If you don't know how to make and run Lua scripts in emulators, read Advanced Features and also refer to FCEUX Help.

+


+
+

Full list of functions:

+


+

taseditor.registerauto(function func)

+

taseditor.registermanual(function func, [string name])

+


+

bool taseditor.engaged()

+


+

bool taseditor.markedframe(int frame)

+

int taseditor.getmarker(int frame)

+

int taseditor.setmarker(int frame)

+

taseditor.removemarker(int frame)

+

string taseditor.getnote(int index)

+

taseditor.setnote(int index, string newtext)

+


+

int taseditor.getcurrentbranch()

+


+

string taseditor.getrecordermode()

+

int taseditor.getsuperimpose()

+


+

int taseditor.getlostplayback()

+

int taseditor.getplaybacktarget()

+

taseditor.setplayback(int frame)

+

taseditor.stopseeking()

+


+

table taseditor.getselection()

+

taseditor.setselection(table new_set)

+


+

int taseditor.getinput(int frame, int joypad)

+

taseditor.submitinputchange(int frame, int joypad, int input)

+

taseditor.submitinsertframes(int frame, int number)

+

taseditor.submitdeleteframes(int frame, int number)

+

int taseditor.applyinputchanges([string name])

+

taseditor.clearinputchanges()

+


+
+

+

+

taseditor.registerauto(function func)

+


+

Registers a callback function ("Auto Function") that runs periodically. The Auto Function can be registered and will be called even when TAS Editor isn't engaged.

+

When FCEUX is unpaused, your function will be called at the end of every frame (running 60 times per second on NTSC and 50 times per second on PAL).

+

When FCEUX is paused, your function will be called 20 times per second.

+

User can switch on/off auto-calling by checking "Auto function" checkbox in TAS Editor GUI.

+

Like other callback-registering functions provided by FCEUX, there is only one registered callback at a time per registering function per script. If you register two callbacks, the second one will replace the first, and the call to taseditor.registerauto() will return the old callback. You may register nil instead of a function to clear a previously-registered callback.

+

If a script returns while it still has registered callbacks, FCEUX will keep it alive to call those callbacks when appropriate, until either the script is stopped by the user or all of the callbacks are de-registered.

+

+

+

taseditor.registermanual(function func, [string name])

+


+

Registers a callback function ("Manual Function") that can be called manually by TAS Editor user. The function can be registered even when TAS Editor isn't engaged.

+

The Manual function doesn't depend on paused or unpaused FCEUX status. It will be called once every time user presses Run function button in TAS Editor GUI.

+

You can provide a new name for this button.

+

The Manual function cannot be run more often than TAS Editor window updates (60/50 FPS or 20FPS when emulator is paused).

+

In FCEUX code Manual function runs right after Auto Function.

+

You can use this feature to create new tools for TAS Editor. For example, you can write a script that reverses currently selected input, so user will be able to reverse input by selecting a range and clicking Run function button.

+

Like other callback-registering functions provided by FCEUX, there is only one registered callback at a time per registering function per script. If you register two callbacks, the second one will replace the first, and the call to taseditor.registermanual() will return the old callback. You may call taseditor.registermanual(nil) to clear a previously-registered callback.

+

If a script returns while it still has registered callbacks, FCEUX will keep it alive to call those callbacks when appropriate, until either the script is stopped by the user or all of the callbacks are de-registered.

+

+

+

bool taseditor.engaged()

+


+

Returns true if TAS Editor is currently engaged, false if otherwise.

+

Also when TAS Editor is engaged, movie.mode() returns "taseditor" string.

+

+

+

bool taseditor.markedframe(int frame)

+


+

Returns true if given frame is marked in TAS Editor, false if not marked.

+

If TAS Editor is not engaged, returns false.

+

+

+

int taseditor.getmarker(int frame)

+


+

Returns index number of the Marker under which given frame is located.

+

Returns -1 if TAS Editor is not engaged.

+

+

+

int taseditor.setmarker(int frame)

+


+

Sets Marker on given frame. Returns index number of the Marker created.

+

If that frame is already marked, no changes will be made, and the function will return the index number of existing Marker.

+

You can set markers even outside input range.

+

If TAS Editor is not engaged, returns -1.

+

+

+

taseditor.removemarker(int frame)

+


+

Removes marker from given frame. If that frame was not marked, no changes will be made.

+

If TAS Editor is not engaged, no changes will be made.

+

+

+

string taseditor.getnote(int index)

+


+

Returns string representing the Note of given Marker.

+

Returns nil if TAS Editor is not engaged.

+

If given index is invalid (if Marker with this index number doesn't exist), returns note of the zeroth marker.

+

+

+

taseditor.setnote(int index, string newtext)

+


+

Sets text of the Note of given Marker.

+

If given index is invalid (if Marker with this index number doesn't exist), no changes will be made.

+

If TAS Editor is not engaged, no changes will be made.

+

+

+

int taseditor.getcurrentbranch()

+


+

Returns number from 0 to 9 representing current Branch.

+

Returns -1 if there's no Branches or if TAS Editor is not engaged.

+

+

+

string taseditor.getrecordermode()

+


+

Returns string representing current recorder mode.

+ +

Returns nil if TAS Editor is not engaged.

+

When you want to check Recorder's read-only state, use emu.readonly().

+

+

+

int taseditor.getsuperimpose()

+


+

Returns number representing current state of Superimpose checkbox in TAS Editor GUI.

+

0 – unchecked

+

1 – checked

+

2 – indeterminate (you can interpret is as half-checked)

+

If TAS Editor is not engaged, returns -1.

+

+

+

int taseditor.getlostplayback()

+


+

Returns the number of the frame where Playback cursor was before input was changed.

+

If Playback didn't lose position during Greenzone invalidation, returns -1.

+

If TAS Editor is not engaged, returns -1.

+

+

+

int taseditor.getplaybacktarget()

+


+

If TAS Editor's Playback is currently seeking, returns number of target frame.

+

If Playback is not seeking or if TAS Editor is not engaged, returns -1.

+

+

+

taseditor.setplayback(int frame)

+


+

Sends Playback cursor (current frame counter) to given frame.

+

If given frame wasn't found in TAS Editor Greenzone, starts seeking to the frame.

+

If TAS Editor is not engaged, nothing will be done.

+

+

+

taseditor.stopseeking()

+


+

Stops Playback seeking and pauses emulation.

+

If Playback wasn't seeking, this function only pauses emulation.

+

If TAS Editor is not engaged, nothing will be done.

+

+

+

table taseditor.getselection()

+


+

Returns a table (array) containing numbers of currently selected frames. These numbers are sorted in ascending order.

+

If no frames are selected at the moment, returns nil.

+

If TAS Editor is not engaged, returns nil.

+

+

+

taseditor.setselection(table new_set)

+


+

Changes current selection to the given set of frames. Frame number in your table don't have to be sorted.

+

Call taseditor.setselection(nil) to clear selection.

+

If TAS Editor is not engaged, nothing will be done.

+

+

+

int taseditor.getinput(int frame, int joypad)

+


+

Returns a number representing input of given joypad stored in current movie at given frame.

+

If given frame is negative, returns -1.

+

If given frame is outside current input range, returns 0, which can be interpreted as a blank frame (no buttons pressed at this frame yet).

+

Joypad value must be one of the following:

+

0 – to get hardware commands (bit 0 = reset, bit 1 = poweron, bit 2 = FDS insert disk, bit 3 = FDS switch side)

+

1 – to get 1P buttons (bit 0 = A, bit 1 = B, bit 2 = Select, bit 3 = Start, bit 4 = Up, bit 5 = Down, bit 6 = Left, bit 7 = Right)

+

2 – to get 2P buttons

+

3 – to get 3P buttons

+

4 – to get 4P buttons

+

You should handle returned number (if it's not equal to -1) as a byte, each bit corresponds to one button (e.g. if bit 1 is set that means A button is pressed). Use Bitwise Operations to retrieve the state of specific buttons.

+

If given joypad is outside [0-4] range, returns -1.

+

If TAS Editor is not engaged, returns -1.

+

+

+

taseditor.submitinputchange(int frame, int joypad, int input)

+


+

Sends request to TAS Editor asking to change input of given joypad at given frame.

+

Actual movie input won't be changed until the moment you call taseditor.applyinputchanges().

+

Using several consecutive requests and then calling applyinputchanges() at the end, you can change several frames of current movie in one moment.

+

When applying the pile of requests, TAS Editor will execute them in consecutive order.

+

If given frame is negative, TAS Editor will ignore such request.

+

If given frame is outside current input range, TAS Editor will expand movie during applyinputchanges() to fit the frame.

+

If given joypad is outside [0-4] range, TAS Editor will ignore such request.

+

Given input will be treated by TAS Editor as a sequence of bits representing state of each button of given joypad (bit 0 = A, bit 1 = B, bit 2 = Select, bit 3 = Start, bit 4 = Up, bit 5 = Down, bit 6 = Left, bit 7 = Right).

+

If TAS Editor is not engaged, nothing will be done.

+

+

+

taseditor.submitinsertframes(int frame, int number)

+


+

Sends request to TAS Editor asking to insert given number of blank frames before given frame.

+

Actual movie won't be changed until the moment you call taseditor.applyinputchanges().

+

Insertion can move down some old input and Markers (if "Bind Markers to Input" option is checked by user).

+

If given number is less or equal to zero, TAS Editor will ignore such request.

+

If given frame is negative, TAS Editor will ignore such request.

+

If given frame is outside current input range, TAS Editor will expand movie during applyinputchanges() to fit the frame.

+

If TAS Editor is not engaged, nothing will be done.

+

+

+

taseditor.submitdeleteframes(int frame, int number)

+


+

Sends request to TAS Editor asking to delete given number of frames starting from given frame.

+

Actual movie won't be changed until the moment you call taseditor.applyinputchanges().

+

Deletion can move up some old input and Markers (if "Bind Markers to Input" option is checked by user).

+

If given number is less or equal to zero, TAS Editor will ignore such request.

+

If given frame is negative, TAS Editor will ignore such request.

+

If given frame is outside current input range, TAS Editor will expand movie during applyinputchanges() to fit the frame.

+

If TAS Editor is not engaged, nothing will be done.

+

+

+

int taseditor.applyinputchanges([string name])

+


+

Instantly applies the list of previously requested changes to current movie. If these requests actually modified movie data, new item will appear in History Log (so user can undo these changes), and Greenzone may become truncated, Playback cursor may lose its position, auto-seeking may be triggered.

+

Returns number of frame where first actual changes occurred.

+

If no actual changes were found (for example, you asked TAS Editor to set buttons that were already pressed), returns -1.

+

If pending list of changes is empty, returns -1.

+

You can provide a name that will be assigned to this change. This name will be shown in History Log. If you don't provide a name, TAS Editor will use default name ("Change").

+

After applying all requests TAS Editor clears the list of requests.

+

If TAS Editor is not engaged, nothing will be done.

+

+

+

taseditor.clearinputchanges()

+


+

Clears the list of previously requested changes, making TAS Editor forget about them before you call applyinputchanges(). Use this function to discard previously submitted input changes.

+

It's also recommended to call this function before making several requests in a row, so that you'll be sure that only your new changes will apply.

+

If TAS Editor is not engaged, nothing will be done.

+


+


+


+


+


+

+

Created with the Personal Edition of HelpNDoc: Full-featured Documentation generator

+
+ + + + + + diff --git a/help/taseditor/MistakeProofing.html b/help/taseditor/MistakeProofing.html new file mode 100644 index 00000000..2625c126 --- /dev/null +++ b/help/taseditor/MistakeProofing.html @@ -0,0 +1,201 @@ + + + + Mistake-proofing + + + + + + + + + + + + + + +
+
+

Mistake-proofing

+ + +
+
+ Parent + + Previous + + Next + +
+
+
+
+ +

+

Mistake-proofing

+


+


+

This page lists many small details of implementation that improve interaction between user and the program. All these points must be considered when porting Taseditor to other platforms.

+


+ + + + + + + + + + + + + +


+


+


+


+


+

+

Created with the Personal Edition of HelpNDoc: Full-featured Documentation generator

+
+ + + + + + diff --git a/help/taseditor/Navigation.html b/help/taseditor/Navigation.html new file mode 100644 index 00000000..5e71781c --- /dev/null +++ b/help/taseditor/Navigation.html @@ -0,0 +1,371 @@ + + + + Navigation + + + + + + + + + + + + + + +
+
+

Navigation

+ +
+ Reference ››
+
+
+ Parent + + Previous + + Next + +
+
+
+
+ +

+

Navigation

+


+


+

FCEUX main window can only display data of one frame of a movie at any given moment. Piano Roll can cover data for tens of frames at the same time. But average movie has thousands of frames. So TASer constantly needs to scroll the Piano Roll up and down or rewind emulator playback to get the data about needed frame or group of frames.

+

Throughout the documentation this is called "movie navigation". It takes major part of TASing, and Taseditor introduces many new ways of navigation, striving to make it as fast as possible. Depending on the situation some of them are better then others, so it's not recommended to stick to a single one.

+

Ideally, the navigation skills should move to muscle memory, allowing you to always appear in necessary place of the movie without interrupting the analysis of current task.

+


+

All ways of navigating a movie:

+


+ +
    +
  1. Using vertical scrollbar
  2. +
  3. Rolling mouse wheel
  4. +
  5. Crossing gaps
  6. +
  7. Paging through
  8. +
  9. Jumping to the beginning / to the end of the movie
  10. +
  11. Jumping to Playback cursor
  12. +
  13. Jumping to Selection cursor
  14. +
  15. Jumping to the Marker above Playback cursor
  16. +
  17. Jumping to the Marker above Selection cursor
  18. +
+ +
    +
  1. Frame-by-frame shift
  2. +
  3. Rewinding by mouse wheel
  4. +
  5. Dragging with mouse
  6. +
  7. Jumping on Markers
  8. +
  9. Jumping to Bookmarks
  10. +
  11. Jumping to the beginning / to the end of the movie
  12. +
+ +
    +
  1. Frame-by-frame shift
  2. +
  3. Moving Selection to the beginning / to the end of the movie
  4. +
  5. Jumping on Markers
  6. +
  7. Tracking the Selection History
  8. +
  9. Returning to the origin of Clipboard data
  10. +
+ +
    +
  1. Finding Markers with given text
  2. +
  3. Jumping to segment with similar description
  4. +
+


+
+

+

+

Scrolling Piano Roll

+


+

+

+

1. Using vertical scrollbar

+


+

Click on the scrollbar or drag its thumb to scroll Piano Roll like any other list.

+

Playback cursor and Selection cursor positions are not affected by Piano Roll scrolling.

+

When to use:

+ +

+

+

2. Rolling mouse wheel

+


+

Roll mouse wheel up or down to scroll Piano Roll like any other list.

+

Mouse cursor can be pointing anywhere except History Log window.

+

When to use:

+ +

+

+

3. Crossing gaps

+


+

Point mouse cursor to any cell in Input/Markers/icons, hold Alt and roll the mouse wheel up or down to scroll the Piano Roll to the closest cell that contains data different from the data of adjacent cell.

+

When to use:

+ +

+

+

4. Paging through

+


+

Press Page Up or Page Down key to scroll Piano Roll like any other list. The amount of scrolling depends on the size of Piano Roll visible area.

+

When to use:

+ +

+

+

5. Jumping to the beginning / to the end of the movie

+


+

Press Home or End to scroll Piano Roll to the beginning or to the end of the movie.

+

When to use:

+ +

+

+

6. Jumping to Playback cursor

+


+

Click on the upper "Marker #" label (colored light-blue) to immediately scroll Piano Roll to Playback cursor position. Alternative way to do it is to press Shift key twice within a short amount of time.

+

When to use:

+ +

+

+

7. Jumping to Selection cursor

+


+

Click on the lower "Marker #" label to immediately scroll Piano Roll to Selection cursor position. Alternative way to do it is to press Ctrl key twice within a short amount of time.

+

When to use:

+ +

+

+

8. Jumping to the Marker above Playback cursor

+


+

Click on the upper edit field to immediately scroll Piano Roll to the Marker which Note is going to be edited.

+

Works only when the View -> Follow Marker Note context option is enabled.

+

When to use:

+ +

+

+

9. Jumping to the Marker above Selection cursor

+


+

Click on the lower edit field to immediately scroll Piano Roll to the Marker which Note is going to be edited.

+

Works only when the View -> Follow Marker Note context option is enabled.

+

When to use:

+ +


+

+

+

Playback cursor navigation

+


+

The Playback cursor is always bound to current state of emulated game. This means that emulator affects this cursor when emulating the game, and vice versa, when you move this cursor, you affect the emulator.

+

There's one limitation in the controlling of the cursor: sometimes it can't immediately move to the desired frame, seeking takes some time.

+

When the "Follow cursor" checkbox in the Playback panel is checked, the Piano Roll automatically scrolls after the Playback cursor.

+

+

+

1. Frame-by-frame shift

+


+

Click on < or > button in the Playback panel, or press Shift + Up or Shift + Down, or use Frame Rewind or Frame Advance hotkey to move Playback cursor 1 frame back of forward.

+

When to use:

+ +

+

+

2. Rewinding by mouse wheel

+


+

Hold right mouse button and roll mouse wheel up or down to move Playback cursor.

+

Mouse cursor can be pointing anywhere.

+

When to use:

+ +

+

+

3. Dragging with mouse

+


+

Click on any cell in the leftmost column of the Piano Roll ("Icons" column) to send the Playback cursor to the frame. Also, click on any cell of the column and hold the left mouse button to drag the Playback cursor by moving the mouse. This method also allows to scroll the Piano Roll by dragging the Playback cursor outside (above or below the Piano Roll).

+

When to use:

+ +

+

+

4. Jumping on Markers

+


+

Click on << or >> button in the Playback panel, or press Shift + Page Up or Shift + Page Down, or hold Shift and roll the mouse wheel to move Playback cursor to previous or next Marker.

+

When to use:

+ +

+

+

5. Jumping to Bookmarks

+


+

Press the hotkey (0-9) corresponding to the number of desired Bookmark, or click on a frame number in Bookmarks List, or click on a Bookmark icon in the Branches Tree to send Playback cursor to the bookmarked frame.

+

When to use:

+ +

+

+

6. Jumping to the beginning / to the end of the movie

+


+

Press Shift + Home or Shift + End, or click the cloudlet or the fireball in the Branches Tree to move Playback cursor to the beginning or to the end of the movie.

+

You can also press the Play movie from the beginning hotkey (Shift + R by default) to move Playback cursor to the beginning of the movie.

+

When to use:

+ +


+

+

+

Selection cursor navigation

+


+

Selection cursor is usually located on the frame where the most recent changes of Input were made, but you can also move the cursor to any other frame when needed.

+

The Piano Roll automatically scrolls after the Selection.

+

+

+

1. Frame-by-frame shift

+


+

Press Ctrl + Up or Ctrl + Down to move current Selection 1 frame up or down.

+

When to use:

+ +

+

+

2. Moving Selection to the beginning / to the end of the movie

+


+

Press Ctrl + Home or Ctrl + End to move current Selection to the beginning or to the end of the movie.

+

When to use:

+ +

+

+

3. Jumping on Markers

+


+

Click on << or >> button at the bottom of the Toolbox, or press Ctrl + Page Up or Ctrl + Page Down, or hold Ctrl and roll the mouse wheel to move Selection cursor to previous or next Marker.

+

When to use:

+ +

+

+

4. Tracking the Selection History

+


+

Press Ctrl + Q or Ctrl + W to revert Selection to its previous or next state.

+

This method of navigation allows to return to previously edited segments and quickly remember the sequence of recent changes.

+

When to use:

+ +

+

+

5. Returning to the origin of Clipboard data

+


+

Press Ctrl + B to revert Selection to its state at the moment of the last "Copy to Clipboard" operation.

+

When to use:

+ +


+

+

+

Special

+


+

+

+

1. Finding Markers with given text

+


+

Open the Find Note window, enter the text to search and click Find next or press Enter key to set Selection cursor to the closest Marker which Note contains the text. The Piano Roll automatically scrolls after the Selection. You can search up or down from current position of Selection cursor.

+

When to use:

+ +

+

+

2. Jumping to segment with similar description

+


+

Leave Playback cursor in current segment and click the Similar or More button to set Selection cursor to the Marker containing the most relevant Note. The Piano Roll automatically scrolls after the Selection.

+

This method is described in the Advanced Features chapter.

+

When to use:

+ +


+


+


+


+


+

+

Created with the Personal Edition of HelpNDoc: Write EPub books for the iPad

+
+ + + + + + diff --git a/help/taseditor/NonlinearTASing.html b/help/taseditor/NonlinearTASing.html new file mode 100644 index 00000000..e57f0b65 --- /dev/null +++ b/help/taseditor/NonlinearTASing.html @@ -0,0 +1,164 @@ + + + + 4.2. Nonlinear TASing + + + + + + + + + + + + + + +
+
+

4.2. Nonlinear TASing

+ + +
+
+ Parent + + Previous + + Next + +
+
+
+
+ +

+

Nonlinear TASing

+


+


+

+

This is the main method when working with Taseditor. At first it may seem rather different from the traditional TASing, however, they are essentially very similar.

+

When using this method, the Recording mode should always be off. The "Auto-restore last position" checkbox should be disabled. The "Turbo seek" and "Follow cursor" checkboxes are usually disabled, but may be enabled when necessary.

+


+

General activity:

+


+
    +
  1. Scroll the Piano Roll to the beginning of the edited segment, put the Playback cursor here, define the goal. It's also recommended to mark the beginning with a Marker.
  2. +
  3. Suppose there's a mistake in the segment, weigh known factors of optimality and figure out the way to fix the mistake.
  4. +
  5. The mouse cursor navigation to any frame of the current segment is practically instant.
  6. +
  7. Edit the segment with the mouse. You can either change the Input blindly, or move the Playback cursor from time to time in order to check with the game. The steps 3 and 4 are constantly alternating until you consider the editing complete.
  8. +
  9. Detect the end of the segment by putting the Playback cursor at the target event.
  10. +
  11. [optional step] Save the finished approach to any free Bookmark, e.g. to slot 8.
  12. +
  13. If this isn't the first approach to the segment, compare the new result to the best old result, using the optimality criterion. If the new approach is better (or it's the first approach), save the result to the Bookmark 9. The slot 9 will be used for keeping the best result of polishing the segment.
  14. +
  15. If you still want to try different approaches, return to step 2, until you run out of ideas.
  16. +
  17. [optional step] If you need more ideas, you can get some information from the past or the future by moving the Playback cursor to different segments of the movie or unpausing the emulator. When necessary, you can quickly draw a rough Input for watching the upcoming events of the game.
  18. +
  19. When there's no more ideas, restore the best approach from the History Log or the Bookmark 9 into the current movie and proceed to the next segment.
  20. +
+


+
+


+

Since all created approaches to playing the segment are automatically saved in the History Log, you could follow the temptation to rely on the Log and not save the approaches to Bookmarks (steps 6 and 7), instead just reach the target event once and then experiment with this Input, gradually improving it (and simply undoing all the changes that are for the worse). Such perfunctory way of TASing is technically possible, but not recommended, because it doesn't let you think far outside the terms of the first approach (because you subconsciously fear to lose the old best approach by leaving it too far away).

+

Even if the outcome of the latest modification of the Input made the game behave worse, you should not immediately revert to the previous state of the movie, better try to examine the cause of the worsening and continue the modification to turn it into an improvement. And in order to never be afraid to lose the previous successful playthrough in the depths of the History Log, you should do exactly like they do in the traditional TASing – allot a special slot for storing the best result and set this Bookmark to the end of the segment every time you improve the result.

+

And you can do the same with those promising approaches that are somewhat better, but somewhat worse than the current best result. When you're saving all alternative approaches to separate Bookmarks, you can safely remove their Input from the working movie or change it beyond recognition, because you can return to any of them with a single key press, and no need to search within the History Log.

+


+

Unlike the traditional TASing method, here you may lose sight of dividing the movie into logical segments, because now you don't have to mark the beginning and the end of the current segment with Bookmarks. However, it's still recommended to keep an order and mark the beginning of every important segment with Markers, in order to limit the number of optimality factors.

+

The beginning and the end of a segment are usually associated with certain events of the game, and not with a soulless frame number. But since the starting event of the segment is not affected by modifying the Input of the segment, this event will always occur in the same frame, so you can lock the frame with a Marker.

+

The ending event of the segment may occur in various points of time, depending on the Input in the segment. So if you mark the end with a Marker, you will need to move the Marker up or down every time you change the target event by modifying the Input. Often it's impractical to spend time on dragging, so instead of the trailing Marker you can use aforementioned Bookmark which both stores the best approach and serves as a mark of the end of current segment.

+

+As for simple segments, you can polish them without marking the ending frame at all, by simply relying on your own memory and on the green arrow provided by Taseditor. With this green arrow the Taseditor hints you the frame where you've stopped watching the segment the last time (before you started modifying the Input of the segment). Usually this is the frame where the target event was detected in previous approach. So you may as well replay the updated segment up to the frame and compare the new result with the old one. If the target event is now detected 2 frames above the green arrow, it means you've outran previous result by 2 frames, so the new Input is better (if your criterion is speed). This entire logical chain pops in your mind once you glance at the Piano Roll after watching the outcome of the recent Input modification.

+


+

The process of polishing the Input in the nonlinear method is a constant alternation of editing and watching the segment. You analyze the situation during the watching and right after stopping the watching.

+

Possible ways to watch the outcome of Input:

+ +


+

Most often you are going to either click the middle mouse button or move the Playback cursor by scrolling the mouse wheel. Don't attach yourself to a single one of the ways, learn to use them depending on a situation.

+

The ratio between the time spent on editing and on watching depends on the complexity of the current segment and on the volume of your knowledge about the game. The more you TAS a single game, the better you are aware of its regularities. So near the end of your project you'll be able to foresee the outcome of your Input modifications before even attempting to edit them in. Then you'll only need to watch the segment in order to confirm your guess.

+

In some cases you can judge about the optimality of an Input by seeing its interim results and not even watching the segment to the end. For example, if the character bumps into a wall and nullifies his speed in the middle of the segment, you can immediately guess that he is going to reach the target event later than previous time. So sometimes you want to only watch a few frames and continue the editing. However, such a hurry may lead you to reject a solution that is suboptimal at first glance but has a potential to be very successful in another segment. For example, after bumping the wall Mario may accidentally enter inside and go through it. That's why it's recommended to never hurry when TASing, and to watch the current segment to the end, where you can be sure the optimality criterion won't let you down.

+

Technically you can watch and edit the Input simultaneously. When the "Follow cursor" checkbox is disabled, the Piano Roll stays still, while the movie is played, so you can draw buttonpresses right when they are executed (replayed). For example, when Mario jumps over an obstacle, try to change the height of the jump by drawing and erasing the A button presses without pausing the emulation. You can slow the emulation down by the - and = hotkeys, in order to have more time for clicking while watching.

+

But when you need to have enough time both for clicking and for thinking, better pause the emulator and TAS properly.

+

+

+

The emulation speed can be both decreased and increased. Before Taseditor, speeding up the emulation was used only for quick replay of the finished part of the movie. But now the turbo emulation also serves as an original way of TASing. With an extremely fast emulation you can feel the interconnection between a buttonpress and its distant outcome.

+

+

+A good example would be the process of luck manipulation.

+

Normally, when shooting you can see the connection between pressing the B button and a bullet appearing on screen at the next frame. Applying this association (B = shot) to an in-game situation makes you think "the later I press B, the later the bullet will appear".

+

But with turbo-seeking you effectively skip all irrelevant steps of the movie (shooting, bullet flying, collision, enemy death, etc), so right after making the B buttonpress you immediately see which item was dropped by the enemy. This new association (B = possibility of a bonus item) makes you think about this in-game situation more like "the type of the item drop depends on when I press B".

+

This way turbo allows to automatically filter useless information that is produced by the game in the middle of the segment, and only consume the necessary data that appears at the end of the segment.

+

Here's how you do it:

+ +


+
+


+

Pros of the method:

+

+ Instant navigation.

+

+ Possibility to skip useless scenes.

+

+ Detachment from the game flow increases the objectivity.

+


+

Cons of the method:

+

Lack of the feedback inherent to normal game-player interaction.

+

Emphasis on the mouse controls.

+


+

When the method is recommended to use: most of time. Combine this method with the next method in order to create the full picture of the in-game possibilities.

+


+

The next method fixes the main disadvantage of this method.

+


+


+


+


+


+

+

Created with the Personal Edition of HelpNDoc: Easily create EBooks

+
+ + + + + + diff --git a/help/taseditor/Operations.html b/help/taseditor/Operations.html new file mode 100644 index 00000000..83ff06fc --- /dev/null +++ b/help/taseditor/Operations.html @@ -0,0 +1,716 @@ + + + + Operations + + + + + + + + + + + + + + +
+
+

Operations

+ +
+ Reference ››
+
+
+ Parent + + Previous + + Next + +
+
+
+
+ +

+

Operations

+


+


+

All modifications of the movie are registered in History Log. Every record of the Log contains the time when the modification was done and the keyframe (or starting and ending frames of the section) to which the modification was applied.

+

Here you can find the list of all possible types of History records and corresponding operations with the movie.

+


+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Input change

+

Markers change

+

Other

+

Set

+

Marker Set

+

Initialization

+

Unset

+

Marker Remove

+

Undefined

+

Pattern

+

Marker Pattern

+


+

Clear

+


+

Cut

+

Paste

+

PasteInsert

+

Clone

+

Insert

+

Insert#

+

Delete

+

Truncate

+

Record

+


+

Import

+

Branch

+

Bookmark

+


+

Marker Branch

+


+

Marker Rename

+

Marker Drag

+

Marker Swap

+

Marker Shift

+

LUA Marker Set

+

LUA Marker Remove

+

LUA Marker Rename

+

LUA Change

+
+
+


+
+

+

+

Initialization

+

Category: other

+

The record is created automatically when new History Log is created.

+

Instances:

+ +

Example:

+

20:24:53 Initialization

+

Used: very rarely

+

Greenzone is truncated after zeroth frame.

+


+

+

+

Undefined

+

Category: other

+

Undefined modification. The record should not appear in TAS Editor 1.0.

+

Used: never

+


+

+

+

Set

+

Category: Input change

+

The record is created when one or more buttonpresses appear in one or several frames.

+

Instances:

+ +

Example:

+

20:25:18 Set 15-21

+

Used: very often

+

Greenzone is truncated after the first frame where Input was changed.

+


+

+

+

Unset

+

Category: Input change

+

The record is created when one or more buttonpresses disappear from one or several frames.

+

Instances:

+ +

Example:

+

20:25:22 Unset 21

+

Used: very often

+

Greenzone is truncated after the first frame where Input was changed.

+


+

+

+

Pattern

+

Category: Input change

+

The record is created when a sequence of buttonpresses changes to currently chosen pattern.

+

The name of the pattern is added to the text of the record.

+

Instances:

+ +

Example:

+

20:25:40 Pattern 21-30 Alternating (1010...)

+

Used: rarely

+

Greenzone is truncated after the first frame where Input was changed.

+


+

+

+

Clear

+

Category: Input change

+

The record is created when all buttonpresses disappear from one or several frames.

+

Instances:

+ +

Example:

+

20:26:51 Clear 15-20

+

Used: moderately

+

Greenzone is truncated after the first frame where Input was changed.

+


+

+

+

Cut

+

Category: Input change

+

The record is created when all buttonpresses disappear from one or several frames, caused by "Cut" operation.

+

This is identical to Clear operation, except that buttonpresses are copied to the Clipboard before clearing.

+

Note: although you can undo this operation, the Clipboard contents won't revert.

+

Instances:

+ +

Example:

+

20:27:05 Cut 21-23

+

Used: rarely

+

Greenzone is truncated after the first frame where Input was changed.

+


+

+

+

Paste

+

Category: Input change

+

The record is created when a Clipboard data is pasted into the movie.

+

Depending on the "Superimpose" checkbox the old Input on those frames is either erased or combined with the new Input. The Piano Roll Header briefly flashes symbols of those buttons that were added in the Paste process.

+

Instances:

+ +

Example:

+

20:27:11 Paste 21

+

Used: moderately/rarely

+

Greenzone is truncated after the first frame where Input was changed.

+


+

+

+

PasteInsert

+

Category: Input change, Markers change

+

The record is created when a Clipboard data is inserted into the movie.

+

Old Input and Markers are shifted down to make place for the Input from Clipboard.

+

Instances:

+ +

Example:

+

20:27:16 PasteInsert 21

+

Used: rarely

+

Greenzone is truncated after the first frame where Input or Lag was changed.

+


+

+

+

Clone

+

Category: Input change, Markers change

+

The record is created when copies of one or several frames are inserted into the movie, shifting the following Input and Markers down.

+

Instances:

+ +

Example:

+

20:27:34 Clone 23

+

Used: often

+

Greenzone is truncated after the first frame where Input or Lag was changed.

+


+

+

+

Insert

+

Category: Input change, Markers change

+

The record is created when one or several blank frames are inserted into the movie, shifting the following Input and Markers down.

+

Instances:

+ +

Example:

+

20:25:58 Insert 21

+

Used: moderately

+

Greenzone is truncated after the first frame where Input or Lag was changed.

+


+

+

+

Insert#

+

Category: Input change, Markers change

+

The record is created when specific number of blank frames is inserted into the movie, shifting the following Input and Markers down.

+

If there's Selection in the Piano Roll, this operation inserts frames before the Selection, otherwise it inserts frames before Playback cursor.

+

The number of inserted frames is added to the text of the record.

+

Instances:

+ +

Example:

+

20:26:09 Insert#4 29

+

Used: rarely

+

Greenzone is truncated after the first frame where Input or Lag was changed.

+


+

+

+

Delete

+

Category: Input change, Markers change

+

The record is created when one or several frames are deleted from the movie, shifting the following Input and Markers up.

+

Instances:

+ +

Example:

+

20:26:12 Delete 33

+

Used: often

+

Greenzone is truncated after the first frame where Input or Lag was changed.

+


+

+

+

Truncate

+

Category: Input change, Markers change

+

The record is created when the tail of the movie is truncated, deleting all Input (and Markers) starting from either the Selection cursor or Playback cursor (if there's no Selection in Piano Roll).

+

Instances:

+ +

Example:

+

20:26:28 Truncate 42

+

Used: very rarely

+

Greenzone is truncated after the frame of movie truncation.

+


+

+

+

Record

+

Category: Input change

+

The record is created when emulator is recording Input using virtual gamepads.

+

The new Input appears in the Playback cursor frame. Depending on the "Superimpose" checkbox the old Input the frame is either erased or combined with the new Input. The Piano Roll Header briefly flashes symbols of those buttons that were added in the Recording process.

+

IDs of gamepads whose Input was changed are added to the text of the record.

+

Instances:

+ +

Example:

+

20:28:01 Record(1P) 18-24

+

Used: moderately

+

Greenzone is truncated after the Playback cursor position.

+


+

+

+

Import

+

Category: Input change

+

The record is created when an Input of another FM2/FM3 movie is imported to current project.

+

Current movie Input is substituted by the Input of imported file. Markers are not changed.

+

The filename of the Input source is added to the text of the record.

+

Instances:

+ +

Example:

+

20:28:53 Import Battletoads-WIP1.fm2

+

Used: very rarely

+

Greenzone is truncated after the first frame where Input was changed.

+


+

+

+

Bookmark0

+

Bookmark1

+

Bookmark2

+

Bookmark3

+

Bookmark4

+

Bookmark5

+

Bookmark6

+

Bookmark7

+

Bookmark8

+

Bookmark9

+

Category: other

+

The record is created when the data of a Bookmark slot is changed.

+

Re-saving a Bookmark into the same slot only works when the new Bookmark data differs from the data stored in the slot, e.g. when the Bookmark is set to another frame or when current movie Input is different from the Input stored in the slot.

+

When a Bookmark is successfully saved, its Branch becomes "current branch of the movie", and emulator shows the "Branch # saved." message.

+

Instances:

+ +

Example:

+

20:28:53 Bookmark1 10

+

Used: often

+

Greenzone is not truncated.

+


+

+

+

Branch0 to

+

Branch1 to

+

Branch2 to

+

Branch3 to

+

Branch4 to

+

Branch5 to

+

Branch6 to

+

Branch7 to

+

Branch8 to

+

Branch9 to

+

Category: Input change, Markers change

+

The record is created when current movie is substituted with the data of a Bookmark slot. Both Input and Markers are substituted.

+

The time of the Bookmark creation is added to the text of the record, because the movie is in fact being reverted to its state at that time.

+

When a Bookmark is successfully loaded, its Branch becomes "current branch of the movie", and emulator shows the "Branch # loaded." message.

+

Instances:

+ +

Example:

+

20:29:02 Branch1 to 20:28:15

+

Used: moderately

+

Greenzone is truncated after the first frame where Input or Lag was changed.

+


+

+

+

Marker Branch0 to

+

Marker Branch1 to

+

Marker Branch2 to

+

Marker Branch3 to

+

Marker Branch4 to

+

Marker Branch5 to

+

Marker Branch6 to

+

Marker Branch7 to

+

Marker Branch8 to

+

Marker Branch9 to

+

Category: Markers change

+

The record is created when current movie is substituted with the data of a Bookmark slot, but new Input was identical to old Input, and only Markers were different.

+

Instances:

+ +

Example:

+

20:29:33 Marker Branch1 to 20:28:15

+

Used: very rarely

+

Greenzone is not truncated.

+


+

+

+

Marker Set

+

Category: Markers change

+

The record is created when a Marker appears on one or several frames.

+

Instances:

+ +

Example:

+

20:29:47 Marker Set 15-18

+

Used: often

+

Greenzone is not truncated.

+


+

+

+

Marker Remove

+

Category: Markers change

+

The record is created when Markers disappear from one or several frames.

+

Instances:

+ +

Example:

+

20:29:52 Marker Remove 16-18

+

Used: moderately

+

Greenzone is not truncated.

+


+

+

+

Marker Pattern

+

Category: Markers change

+

The record is created when a sequence of Markers is created using currently chosen pattern.

+

The name of the pattern is added to the text of the record.

+

Instances:

+ +

Example:

+

20:30:11 Marker Pattern 20-30 One Quarter (10001000...)

+

Used: very rarely

+

Greenzone is not truncated.

+


+

+

+

Marker Rename

+

Category: Markers change

+

The record is created when Note of a Marker is changed.

+

The new text of the Note is added to the text of the record.

+

Instances:

+ +

Example:

+

20:31:01 Marker Rename 20 Testing...

+

Used: often

+

Greenzone is not truncated.

+


+

+

+

Marker Drag

+

Category: Markers change

+

The record is created when moving a Marker from one frame to another.

+

The old and new frame number, as well as the Note of the Marker is added to the text of the record.

+

Instances:

+ +

Example:

+

20:31:08 Marker Drag 20=>15 Testing...

+

Used: moderately

+

Greenzone is not truncated.

+


+

+

+

Marker Swap

+

Category: Markers change

+

The record is created when two Markers switch places.

+

The old and new frame number of the dragged Marker, as well as its Note is added to the text of the record.

+

Instances:

+ +

Example:

+

20:31:14 Marker Swap 24<=>28

+

Used: rarely

+

Greenzone is not truncated.

+


+

+

+

Marker Shift

+

Category: Markers change

+

The record is created when an operation didn't change Input but still shifted some Markers up or down.

+

Instances:

+ +

Example:

+

20:31:44 Marker Shift 21

+

Used: very rarely

+

Greenzone is not truncated.

+


+

+

+

LUA Marker Set

+

Category: Markers change

+

The record is created when a Marker appears on a frame as a result of using taseditor.setmarker() function.

+

Instances:

+ +

Example:

+

20:35:14 LUA Marker Set 0

+

Used: rarely

+

Greenzone is not truncated.

+


+

+

+

LUA Marker Remove

+

Category: Markers change

+

The record is created when a Marker disappears from one frame as a result of using taseditor.removemarker() function.

+

Instances:

+ +

Example:

+

20:36:12 LUA Marker Remove 0

+

Used: rarely

+

Greenzone is not truncated.

+


+

+

+

LUA Marker Rename

+

Category: Markers change

+

The record is created when Note of a Marker is changed as a result of using taseditor.setnote() function.

+

The new text of the Note is added to the text of the record.

+

Instances:

+ +

Example:

+

20:37:03 LUA Marker Rename 0 Hello from Lua!

+

Used: rarely

+

Greenzone is not truncated.

+


+

+

+

LUA Change

+

Category: Input change, Markers change

+

The record is created when Input or Markers were changed as a result of using taseditor.applyinputchanges() function.

+

Instead of the word "Change" the operation can be named with any other text provided by the parameter of taseditor.applyinputchanges() function.

+

Instances:

+ +

Example:

+

20:39:56 LUA Corruptor 10

+

Used: rarely

+

Greenzone is truncated after the first frame where Input or Lag was changed.

+


+


+


+


+


+

+

Created with the Personal Edition of HelpNDoc: Free Kindle producer

+
+ + + + + + diff --git a/help/taseditor/PianoRoll.html b/help/taseditor/PianoRoll.html new file mode 100644 index 00000000..b43a73ff --- /dev/null +++ b/help/taseditor/PianoRoll.html @@ -0,0 +1,155 @@ + + + + 2.1. Piano Roll + + + + + + + + + + + + + + +
+
+

2.1. Piano Roll

+ + +
+
+ Parent + + Previous + + Next + +
+
+
+
+ +

+

Piano Roll

+


+

+


+

Taseditor's workspace is similar to the interface used in music-sequencing programs. Piano Roll is a table containing the most necessary data about the edited project. Users can both observe that data and edit it by mouse clicks on various cells of the table.

+

If you just opened the Taseditor window you will most likely see an empty project that contains only the starting (zeroth) frame of the movie. So, before you begin any experiments, you should temporarily unpause the emulator to let the movie reach at least the title screen of the game, the point where players can already affect the game with buttons Input. By default the hotkey to pause/unpause emulator is the Pause key on the keyboard, but in Taseditor you can use middle mouse button (the wheel) instead. Try watching the running game for a couple of seconds, then again press the Pause key or make the middle-click (anywhere) to stop emulation.

+

During the emulation, Piano Roll contents become filled with the information about the processed frames. Each line in the Piano Roll list is responsible for a single frame. The index number of the frame is shown at the beginning of the line, the numeration goes top-down. When the window size is not enough to display all the frames, the list gets a vertical scrollbar.

+

By the color of each line you can tell the following data about the corresponding frame:

+ +


+

To start adding and changing the movie Input, click cells of those columns to the right of the column with frame numbers. If you click an empty cell, a symbol corresponding to the real joypad button will appear there.

+
+ + + + +

AA button

+

BB button

+

SSelect button

+

TStart button

+

U – D-pad Up

+

DD-pad Down

+

LD-pad Left

+

RD-pad Right

+

+
+
+

If you click on an occupied cell, it will become cleared, and the corresponding button will be considered released on that frame. There is no other button states except these two: either pressed or released.

+

At first it might not be very trivial to correlate these 8 symbols with plastic buttons of a real joypad, but try pressing the first player input keys (set in your emulator) while you are in Taseditor. As you tap the buttons, the corresponding letters will flash in the Piano Roll Header, and you can easily associate the columns with buttons.

+

When working in Taseditor, the most of time is spent on that very process of setting and removing buttons at different frames. This way you form the sequence of button states, which is then fed to the game and reflected by actions of the game character(s). For example, if you put the letter "A" to a chosen Piano Roll cell at the middle of Super Mario Bros gameplay, Mario will perform a low jump, because a short A button press occurred in the movie. And if you set several "A" symbols in a row (vertically), Mario will do a high jump, because A was held longer.

+


+

Every time you change the Input above the line with the Playback cursor, the light-blue cursor steps back (up in the Piano Roll) also clearing some part of the Greenzone. This happens because the change of Input leads to a change in the game events, so the game data memorized inside the Greenzone becomes irrelevant. Thus after you change Input you need to replay some frames of the movie again – either by unpausing the emulator, or by manually dragging the Playback cursor to the frame of interest – and you will see results of the latest Input changes on FCEUX screen (and also restore a part of the Greenzone).

+

Besides, you can hold the right mouse button and roll the mouse wheel down to move the Playback cursor to the needed frame manually. Wheel-based navigation is the most responsive way to observe a little segment of the movie. You may use a single hand, and the mouse pointer may be anywhere, e.g. it may be left over the edited cells. Try this method, it's a very effective way to rewind back and forth. Just hold the right mouse button with one finger and roll the wheel with another finger while looking at the FCEUX window.

+


+

In addition to single cell clicks, you can also change button states in many frames at once. For instance, if you want the R button (Right) to be pressed for 20 straight frames, you don't have to click all 20 cells. You can just click on one of them, hold the left mouse button and move the mouse cursor up or down – it will leave a trail of symbols, thus you will draw a vertical row of buttonpresses. Similarly, you can quickly erase a row of symbols by clicking the first one and moving the eraser up or down. As you may notice, erasing starts when you click an occupied cell, and drawing starts when you click an empty cell.

+

Moreover, you can hold the Shift key before clicking on the Input to spread the effect of the click across all frames between the point of click and the Selection cursor. For example, you can set "R" in the first frame, then scroll the Piano Roll to the end, hold Shift and set "R" in the last frame – the R button press will appear in all frames.

+

+

There's one more way to mass set or mass remove buttonpresses. First, select several frames, for example, the 5th, the 10th and the 20th (to do it you have to hold Ctrl while clicking on numbers 0000005, 0000010 and 0000020). Then click on the "L" letter in the Piano Roll Header. If the selected frames didn't have the Left button symbols, they will get it. And if all of the frames had the Left button already pressed, the click will clear it.

+

Later you will find a few other ways to edit the Input, but these were the main ones. At first it might look unnatural to draw buttonpresses with the mouse instead of simulating them using keyboard keys. But this discomfort feeling will disappear soon after you devote a few some days to Taseditor.

+

+

+

When drawing the Input you've probably noticed that previously drawn letters have different color, and as you add new buttonpresses old letters change their color from orange to violet and blue, eventually becoming standard black. This is one of experimental features of Taseditor, called "Hot Changes". It was invented to unobtrusively increase TASer's awareness about recent changes. Every time you modify the Input, the latest buttonpresses receive the hottest color (bright orange), and all the previous edits cool down by one level, becoming less bright.

+

Because of the coloring, even a cursory glance on the Piano Roll is enough to get the idea which buttonpresses were added just recently and which were set long ago. Also, you can see which of them were recently removed (they are replaced with a dash).

+

If you don't like this feature, you can disable it, but within this Guide we'll imply that you have the "Hot Changes" enabled.

+


+

The narrow column to the left from the column with frame numbers is not just for dragging the Playback cursor. It also displays various informational icons. The blue arrow pointer always points to the frame where the Playback cursor is now. The green arrow pointer shows where the Playback cursor was before the Input above it has changed. And the digit cards in this column indicate Bookmarks, they will be described later.

+

+

+

The yellow marks on the numbers of some frames (frames 12 and 22 on the above picture) are called Markers. Besides the yellow color, they can be recognized by the wide font of the frame number.

+

Markers are meant to facilitate the movie navigation and improve TASer's self-organization. You decide how to use them on your own: whether to put them at the beginning of each level or to mark every jump, shot or any in-game event. Essentially, by setting Markers you logically break your movie down into sections, and then you can cross the movie not just by jumping from frame to frame, but from section to section. This allows you to interpret the movie on a higher level of abstraction.

+

Such structuring helps to keep a precise image of the entire movie in mind. That kind of an image exists in each TASer's mind, but usually it's rather fuzzy – we remember a rough sequence of the evens, but omit the details (because most of time they are insignificant). When TASer turns emulator off, the image starts to gradually become vague and forgotten. Thus at the next session one needs to re-watch his own movie from the beginning in order to refresh memories, figure key events, arrange priorities and, in general, mentally prepare for resumption of TASing. Sometimes this is needed even more often – depending on the complexity of the TAS. That's why it's recommended to consolidate that image by setting real Markers, not just in your mind but in actual movie.

+

A Marker can be set at any frame. Unlike the Input, Markers don't affect the game events. There are several ways to set Markers:

+

Example 1. Double-click on a frame number. If there was no Marker at this frame, it will appear there. If the Marker already exists, you can drag it while the left button is still held after the double-click. This way you can move any Marker to a different frame or simply dump it outside the Piano Roll, thus removing it from the movie.

+

Example 2. Select one or several frames by clicking the frame number(s), then click the "Frame#" label in the Piano Roll Header. If some of the selected frames didn't have Markers, they will all become marked. If all of them were already marked, all the Markers will be removed. This way you may mass set or mass remove Markers the same way as Input.

+

Example 3. Select one or several frames in the Piano Roll, right-click on any of the selected frame numbers and choose "Set Markers" or "Remove Markers" in the context menu. This is the slowest way, so the other two are more preferred.

+


+

Any Marker operation may be undone (Ctrl + Z) anytime, just like any Input operation.

+

Markers are automatically numbered by the order they are located in the movie – top-down from first to last. In the upper left corner of TAS Editor window you can see the number of the Marker that is located just above the Playback cursor in the movie (light-blue "Marker #" label). This label both informs you and serves as a button for auto-scrolling. E.g. if you left the Playback cursor in one part of the movie and scrolled the Piano Roll far from that point, you can immediately return to the light-blue cursor anytime by clicking the "Marker" label (or tapping the Shift key twice). You are definitely going to need this feature when editing large movies.

+

A similar button can be found in the lower left corner of Taseditor. The "Marker #" label of a dark blue color (the same color as the Selection cursor) displays the number of the Marker located just above the Selection. If you click this label, the Piano Roll will automatically jump to Selection. This button is going to be used as often as the upper one. Its keyboard alternative is tapping the Ctrl key twice.

+

It should be easy to remember that the Shift key is almost always used to control the Playback cursor, while the Ctrl key is to control the Selection cursor.

+

If both Playback and Selection cursors are below the same Marker, the numbers in both corners will obviously be the same.

+

Markers can do more than just divide the movie into logical parts. They may also contain text records (comments and work notes). The Marker Note is displayed right near its number. The upper edit field contains the Note of the Marker above the Playback Cursor, and the lower field shows the Note of the Marker above the Selection cursor.

+

By default, every new Marker contains an empty Note. When you create a new Marker by double-click, the lower edit field automatically becomes active, because the Selection cursor points to the just marked frame. So you may quickly type any text for the Note of that Marker and then resume your work with the movie. Text changes are saved automatically.

+

You can edit an old Marker Note in any of the following ways:

+ +

When typing a Note, press Enter or just click any unrelated element of TAS Editor window to finish editing. If you changed your mind, press Esc to cancel the editing. All the controls when editing Notes are listed in the Reference.

+

It is recommended to enter Notes when creating Markers, so you won't forget why the Marker was set there. This won't take much time if you set Markers by double-clicks and type laconic messages at the same second.

+


+

Proceed to the Toolbox description

+


+


+


+


+


+

+

Created with the Personal Edition of HelpNDoc: Full-featured Documentation generator

+
+ + + + + + diff --git a/help/taseditor/ProgramCustomization.html b/help/taseditor/ProgramCustomization.html new file mode 100644 index 00000000..2858bb8d --- /dev/null +++ b/help/taseditor/ProgramCustomization.html @@ -0,0 +1,292 @@ + + + + 5. Program customization + + + + + + + + + + + + + + +
+
+

5. Program customization

+ +
+ Beginner's Guide ››
+
+
+ Parent + + Previous + + Next + +
+
+
+
+ +

+

Program customization

+


+


+

Certain useful features of Taseditor are disabled by default, because using them requires understanding of their working principles. This chapter describes all Taseditor options and settings, as well as FCEUX settings that affect your work in Taseditor.

+

Settings are kept in the fceux.cfg file in emulator's main folder. If you delete this file, all settings will reset to default values when you launch FCEUX.

+
+ + + + +

First, if you've already read chapter 2 and understood the purpose of all GUI elements, you should disable pop-up tooltips (intended for newbies only). Go to "Help" submenu of Taseditor main menu and uncheck the option "Enable Tooltips". Before doing it you may want to actually read all the tooltips by pointing the mouse cursor at different elements of TAS Editor window, and thus consolidate your knowledge of the GUI.

+

+
+
+

Now open the "View" submenu.

+

+

The "Find Note window" brings up the window dedicated to searching text in Marker Notes. This function is useful when you're documenting your movie with Notes. It's described in the next chapter.

+

Then there are several checkboxes allowing to customize the program interface. To try the customization possibilities, create a test project right now (just open Taseditor) and experiment with it.

+


+

+

+

View -> Display Branch Screenshots

+

Displays pop-up screenshots when you point mouse cursor over Bookmarks. The screenshot helps you to recall movie events saved to the Bookmark, which simplifies searching for the needed branch of the movie, as you don't have to load the Bookmark to have an idea on its contents. This way you can also quickly compare results of several alternative approaches.

+

This option is enabled by default. If disabled, no screenshots will pop up on mouse hover.

+

It's recommended to have it enabled, unless you're annoyed with pop-up pictures, partially obstructing the view on Piano Roll.

+

+

+

View -> Display Branch Descriptions

+

Displays pop-up descriptions when you point mouse cursor over Bookmarks. The text, as well as the screenshot, gives you additional information about the contents of the Bookmark, helping to decide whether this branch should be loaded or not.

+

The description text is taken from the Marker above the frame of that Bookmark. The Marker itself may be actually removed from the working movie long ago, but if the Bookmark was created while the Marked existed, then this Marker still exists in the branch of this Bookmark. And if you load this Bookmark, the Marker will reappear on its place.

+

So, when trying alternative strategies of playing through a large segment (e.g. whole level of the game), before saving every approach to a separate branch, you can make a name for the approach by setting a Marker at the Playback cursor position and typing a text message like "here I chose upper way". After that, save a Bookmark on that frame. Then you can remove the Marker together with the Input of the old approach and create next approach by applying another strategy of playing current segment. When the new approach if finished and replayed, you can again create a Marker with a Note like "here I chose lower way" and save all that to another Bookmark. After that you can save the project and, say, close Taseditor. Next day you can easily recall all pros and cons of the two strategies you tried. Each Bookmark will show you the screenshot of the bookmarked frame and the text you wrote for that Bookmark. While it can be hard to distinguish the strategies by screenshots (since both approaches end at the same event of the game), but text descriptions will make them easy to recognize.

+

This option is enabled by default. If disabled, no descriptions will pop up on mouse hover.

+

It's recommended to have it enabled, unless you're annoyed with pop-up text fields.

+

+

+

View -> Enable Hot Changes

+

Switches the Hot Changes feature on and off.

+

Enabled by default. If disabled, all buttonpress symbols will be displayed in a standard black color. Otherwise, each symbol will have its own level of "hotness", depending on how long ago the corresponding Piano Roll cell was edited. Recently modified buttonpresses are more hot, so they are displayed by more intense shade of red. As the hotness decreases, the symbol colors become darker (more cold) and finally turn into standard black.

+


+

+


+

In total, Taseditor supports 15 shades of hotness + zeroth black color. When you change the state of an Input cell, it receives maximum hotness value (15), and all the previously edited cells cool down by 1. Thereby you only need a quick look at the Piano Roll to get an idea which edits were done just recently and which were done before, or long ago.

+

Also, with Hot Changes you can see which buttonpresses were recently removed – instead of an empty cell there will be a dash of the corresponding color. The dash also changes its color while cooling down, and after 15 levels it finally disappears.

+

The same dashes appear when you insert new frames in the movie.

+

It's recommended to enable this feature to increase the usability of Taseditor. In theory it should even increase your working speed, because this way you never have to recall which actions you did a minute ago. Of course even without Hot Changes you can always remind the sequence of last actions by reverting History (making several Ctrl + Z keypresses) and then returning the movie to normal state again (making as many Ctrl + Y keypresses). But in this case you will also truncate the Greenzone. So better just leave the Hot Changes enabled.

+

The only downside of this feature is that Hot Changes data will be stored in the History Log and in FM3 project file, thus increasing the occupied memory.

+

+

+

View -> Follow undo context

+

Scrolls the Piano Roll to relevant place every time you make an undo or redo. A purple pointer appears on the modified frame for a brief moment, thus drawing your attention to the movie changes.

+

This option is enabled by default. If disabled, the Piano Roll won't automatically scroll to the purple pointer.

+

It's recommended to have it enabled, in order to be able to backtrack undos. Usually, right after you revert an operation you want to make another edit on the same frame or nearby, so the autoscrolling is useful.

+

+

+

View -> Follow Marker Note context

+

Scrolls the Piano Roll to relevant Marker when you start editing its Note. For example, when you click the upper edit field to start editing the Note of the Marker above the Playback cursor, Piano Roll jumps to that Marker, allowing you to see its context (neighbor Markers and Input). And when you click the lower edit field (a Note above the Selection cursor), Piano Roll scrolls to the Marker above the Selection. This way you can observe the surroundings of the relevant Marker while editing its Note.

+

This option is enabled by default. If disabled, the Piano Roll won't automatically scroll to the Markers.

+

It's recommended to have it enabled.

+


+

And the View settings are over. During your future work you likely won't need to change these checkboxes.

+

+

Now open the "Config" submenu. Options listed in this menu affect Taseditor workflow more significantly. You may need reconfiguring some of them more than once.

+

+

+

+

Config -> Set Greenzone capacity

+

Defines the maximum size of the Greenzone. The Greenzone is used for easier Playback cursor navigation, allowing to instantly return to any frame that was emulated. It needs a lot of computer memory to store emulator's information and disk space for saving FM3 projects.

+

The more of green and red frames there are in the Piano Roll, the more memory the Greenzone occupies. For most NES games 1 frame costs about 10 kilobytes (compressed data). So, big movie projects may take hundreds of megabytes. It affects the project loading and saving time.

+

To decrease the amount of needed memory, Taseditor regularly cleans the Greenzone tail, forgetting the info about segments that are too far from from the Playback cursor.

+

This cleaning doesn't mean the Greenzone becomes inaccessible (white) on those frames. That would be very inconvenient, because to replay these frames you would need to wait until the emulation runs from the beginning of the movie. To avoid such inconvenience and still free some memory from old Greenzone sections, Taseditor uses gradual rarefication of the Greenzone tail.

+

This process works like shown in the picture to the right. The light-blue cursor runs down along the Piano Roll. The cursor is the head of the Greenzone. It leaves green/red lines behind, but far above it some of the lines become pale again. At first, every odd frame is cleared, then 3 of every 4, then 7 of 8, and finally 15 of 16.

+

Thus the Greenzone tail contains many hollow sections. And if you decide to send emulator to a frame inside such hollow section, you'll need to wait while emulation runs to it from the nearest bright Greenzone frame. But since bright frames alternate every 2 or 4 frames, the waiting will only last a split second, so you won't likely notice the difference between jumping to a regular Greenzone frame (instant jump) and jumping to a cleared tail (instant seeking).

+

By adjusting the "Set greenzone capacity" setting you can specify how many Greenzone frames (starting from its head) must stay untouched. On the picture to the right this number is 8.

+

For an experiment, choose the "Set greenzone capacity" item, a dialog window will appear asking you to enter a number, type 100 and press OK. This will mean that first hundred of frames above the Playback cursor should not be cleaned. Any cursor navigation along this area will be instant, so you may drag the light-blue cursor and use rewind with maximum comfort. After the first hundred of frames the cleaning will be removing every other frame – you'll see alternation of bright and pale lines in the Piano Roll. This alternation will last for about 200 frames. The Playback cursor navigation along the area of 200 frames will also be almost instant.

+

This way the Greenzone covers 100 + 200 = 300 frames, while only 100 + 100 = 200 frames are stored in memory. Then, during next 400 frames, every filled line will alternate with 3 cleared lines, and so on. In total, the Greenzone will only occupy memory needed for storing the data of 500 frames (about 5 MB), while the accessible area will be 3100 frames (about a minute).

+

By default, the Greenzone capacity is 10000 frames. This should be enough for most TASes. It's recommended to TAS with no less than 1000 frames of Greenzone capacity, because the further economy would be impractical.

+

The minimum number for that parameter is 1 (just for tests), the maximum number is 50000.

+

+

+

Config -> Set max undo levels

+

Specifies the maximum number of undo steps, how many times you can restore previous state of the project by pressing Ctrl + Z.

+

The History Log needs a lot of computer memory and takes some disk space to save FM3 files. The whole Log is stored in project files in compressed state. The compression is done in background – when the emulator is idle, Taseditor  gradually compresses new items of the History Log. Thanks to this behavior, the History Log size doesn't affect FM3 saving time much.

+

With this setting you can adjust the amount of memory occupied by History Log. By default you have 100 undo levels, which means you can revert up to hundred of recent movie edits. It's not very much, because during real TASing you make lots of various edits within a small time span, as the time runs imperceptibly. If your computer has enough RAM, you can increase the "max undo levels" value up to the maximum possible number – 1000.

+

+

+

Config -> Set Autosave period

+

Specifies how many minutes the project can be left with unsaved changes.

+

Taseditor has the feature of automatically saving current project to disk when user doesn't save it manually (Ctrl + S) for too long. Before Taseditor, TASers saved their movie to disk every time they saved a savestate. But Taseditor projects store much more data, and saving FM3 files can take several seconds, so it's not reasonable to resave them too often.

+

The default autosave period is 15 minutes. This means, if you've made some substantial changes to the project (e.g. you edited Input, and an asterisk appeared in the TAS Editor window caption), and then didn't save project for 15 minutes, Taseditor will remind you about that or just execute autosaving itself (see "Silent autosave").

+

The autosave function only works when current project already has a filename.

+

Maximum possible value for this parameter is 1440 minutes (24 hours). You can disable this function by specifying 0 as an autosave period, but that's not recommended.

+


+

The above were numeric settings of Taseditor, next go the checkboxes.

+

+

+

Config -> Enable Greenzoning

+

Controls the process of collecting data to the Greenzone.

+

If the option is enabled, every new frame is saved into the Greenzone right after it has been emulated. This is intended behavior of Taseditor, so the option is enabled by default.

+

Disabling this option may be useful in rare cases, for example, when running bots which need high performance. But in normal situations it's recommended to have this function enabled.

+

+

+

Config -> Silent Autosave

+

Defines the behavior of the autosave function.

+

If the option is enabled, after the autosave period is over, Taseditor silently saves the project to disk under the same filename.

+

If the option is disabled, after the autosave period, Taseditor brings up the "Save As" dialog, where you can confirm the saving or cancel it. In the latter case Taseditor will wait another "autosave period" of time until reminding you about the unsaved data.

+

This option is enabled by default. If you want complete control over project (e.g. to prevent saving any accidental changes done while watching somebody else's fm3), disable it. But when you're TASing it's recommended to let Taseditor use silent autosave.

+

+

+

Config -> Autofire Pattern skips Lag

+

Accounts for lag when you're using patterns (Alt + clicks on Input).

+

If the option is disabled, patterns appear in the Piano Roll exactly (e.g. for the "Alternating (1010...)" pattern the buttonpresses will actually alternate one after another).

+

If the option is enabled, the resulting sequence of buttonpresses may differ from original pattern (lag frames will have additional gaps not present in the pattern).

+

Since lag frames aren't accounted by most games, you have to skip red lines of the Piano Roll to correctly calculate the space between presses. For instance, if there must be exactly 3 blank frames between every buttonpress (pattern "10001000"), but there's also one lag frame in the middle of current segment, you have to add 1 more blank frame  (100001000).

+

This option is enabled by default. It's recommended to leave it enabled, because in vast majority of cases you need to skip lag frames, in order to adapt buttonpresses to how the game interprets Input.

+

+

+

Config -> Auto-adjust Input according to Lag

+

Enables automatic adjustment of Input according to changes of lag data.

+

Basically, games only care about Input at green lines of the Piano Roll. It's pointless to draw any Input on red lines, because during lag frames the game doesn't poll Input. Those frames simply don't exist from the point of view of the game engine.

+

When you edit Input, you change the flow of game events, and lag may appear on different frames too. If those frames previously had a meaningful Input, this Input must be shifted to the frames without lag, to allow it to affect the game.

+

If this checkbox is enabled, you won't have to adjust the Input manually every time the Lag appears on different frames. Taseditor will insert an extra line at every new lag frame, thus shifting Input 1 frame down. And when an old lag frame disappears, Taseditor will remove respective frames from the movie, thus shifting Input up. As a result, you can be sure that the game will perceive your old Input correctly, no matter any Lag changes.

+

Auto-adjustment operations are done by Taseditor only when you're watching (emulating) a segment, i.e. when Playback cursor runs through pale Piano Roll lines. The result of these operations is saved into the current History Log item.

+

This feature is enabled by default, and it's recommended to always work with the function enabled. It significantly increases the comfort of TASing, especially when dealing with lag-heavy games.

+

+

+

Config -> Draw Input by dragging

+

Allows to draw Input by holding the left mouse button and moving the mouse cursor over the Piano Roll.

+

This option is enabled by default, so you can quickly draw or erase a long line of buttonpresses.

+

Drawing/erasing is usually constrained by single column, which allows user to do sweeping motions with the mouse. But if you hold the Shift key while drawing, you will be able to draw/erase Input freely (it's rather impractical, but fun).

+

If you disable this option, your clicks will only set/unset single buttonpresses. It may be necessary, for example, if you have trembling hands. But otherwise enabling this feature is recommended.

+

+

+

Config -> Combine consecutive Recordings/Draws

+

Combines consecutive operations of Input Recording into single item of the History Log. Also combines all Input drawn with the same press of mouse button.

+

This feature is disabled by default. So when you're recording Input, every recorded frame will create a separate item in the History Log, and you can undo changes for any frame. Also, when you're drawing Input, every new stroke will create a new History Log item, and you can undo each of them separately.

+

However, in real TASing you don't need such precision of the undo. So, to save considerable amount of space in History Log, it's recommended to enable this option.

+

+

+

Config -> Use 1P keys for all single Recordings

+

Allows to record any joypad Input using only the first gamepad (1P). This function is used when you record Input traditional way using multitracking method to take turns for different players, e.g. first you record a short segment of Input for player one (1P), then record the Input for 2P and so on.

+

Thanks to multitracking, you don't have to press buttons on both controllers at once. And with the "Use 1P keys for all single Recordings" option you don't even have to confugure 2P controls, because the same keys used for 1P can be used for all the rest joypads too.

+

The option is enabled by default. If you disable it, emulator will use the second controller keys for recording 2P.

+

It's recommended to have it enabled, in order to save the space on the keyboard.

+

+

+

Config -> Use Input keys for Column Set

+

Allows editing Input in selected frames by pressing corresponding joypad keys.

+

This feature is intended to speed up the Input editing process. To mass-set/mass-unset buttonpresses in a given segment, you usually either draw with mouse, or select a range of frames and click the necessary symbol in the Piano Roll Header – the symbol flashes and the respective Input changes in all selected frames.

+

With the "Use Input keys for Column Set" option you can press real keys (assigned to joypads) instead of clicking the Piano Roll Header. The result will be the same.

+

The option is disabled by default. Turn it on if you mostly use the new TASing methods and don't record Input traditional way. But when you're using Recording, either disable it or just remove the Selection to avoid Input changes on the selected frames when pressing joypad buttons.

+

With this feature you can record joypad buttons even when Recording is off. Put the Selection cursor to the frame you want to apply Input to, and press the needed joypad buttons.

+

Multitracking mode in this case works the same way as with regular Recording. For example, if the "2P" radiobutton is chosen at the moment, pressing the key assigned to the A button will only record Input for the "A" column of the 2nd player.

+

+

+

Config -> Bind Markers to Input

+

Attaches Markers to Input. If the option is enabled, various Input editing functions will also affect Markers. For example, inserting blank frames into the movie will shift down both Input and Markers.

+

Usually Markers are set to frames where certain in-game events occur. And when you improve previous result and reach the given place earlier than before, the corresponding Marker (set there after previous attempt) must point to an earlier frame now. Sometimes you have to drag such Markers manually. But thanks to the binding feature, Markers will shift themselves during Input modifications, so the manual adjustment of Markers is rarely needed.

+

Detaching Markers may be necessary when you need to edit Input without shifting Markers. For example, when you need to remove a part of Input, leaving Markers intact.

+

The option is on by default. It's recommended to work with attached Markers most of the time, temporarily detaching them when necessary.

+

For clarification, Taseditor highlights attached Markers with a pale yellow color, and detached Markers with more bright yellow.

+

+

+

Config -> Empty new Marker Notes

+

Defines the default Notes text. If the option is set, each newly created Marker will have an empty Note. If not set, the new Marker will copy the above Marker's Note text.

+

The option is enabled by default. It's recommended to left it on, and type original Notes for important Markers, thus not leaving all Notes blank.

+

+

+

Config -> Old control scheme for Branching

+

Imitates certain limitations of the traditional TASing method, particularly related to handling the Bookmarks (savestates).

+

The option is disabled by default, so hotkeys F1-F10 are used to load branch of the the corresponding Bookmarks, and the numeric keys 1-10 are used for simple jumps to bookmarked frames without changing the movie.

+

Besides, Input Recording is switched on with a simple press of the Toggle Read-Only hotkey.

+

But if you enable this option, the controls scheme will be the same as in old emulators. Pressing F1-F10 will work depending on the Recording mode. When the Recording is off, functional keys jump to respective Bookmark frame, and when Recording is on, F1-F10 keys load the branch of the Bookmark.

+

Besides, Input Recording won't work until you load some Bookmark. This behavior allows you to press the Toggle Read-Only hotkey in the middle of watching the movie, without overwriting old Input until you actually load a savestate.

+

Also, there will be a red frame around the "current slot" number in the Bookmarks List. Press numeric keys 1-10 to switch the current slot.

+

This option is left to help old TASers move to TASing in Taseditor. However, it's not recommended to use it, because the new controls scheme much better fits the specifics of TASing process in Taseditor.

+

+

+

Config -> Branches restore entire Movie

+

Defines the way the branch is restored when you load a Bookmark.

+

The option is enabled by default, so when you're loading a Bookmark, you replace the current movie with the movie state stored in that Bookmark.

+

If this option is disabled, when you're loading a Bookmark, the current movie is replaced with a truncated version of the bookmarked movie state. The movie will be truncated at the bookmarked frame, thus imitating the traditional behavior of loading a savestate: savestates only recover the part of the movie before the Playback cursor, and the rest frames (from the light-blue cursor to the movie end) aren't loaded. This makes sense when TASing traditional way, because after loading a savestate TASer usually records a new Input starting from the position of the Playback cursor, so there's no need to load the data that will be overwritten anyway. But in Taseditor the movie is edited independently from the Playback cursor position, so you can load the entire movie state from Bookmarks, without caring if the Playback cursor is in the end of the movie or it is in the middle.

+

It's recommended to leave this option enabled.

+

+

+

Config -> HUD in Branch screenshots

+

Defines the way to capture screenshots when creating Bookmarks.

+

If the option is on, it takes a snapshot of the whole emulator window, including icons and emulator messages, Lua output and other data placed over the game picture. If the option is disabled, Bookmarks will only capture the game output.

+

The option is enabled by default. It's recommended to leave it on, in order to use Lua output and frame counter when comparing alternate approaches to playing through a segment.

+

+

+

Config -> Autopause at the end of Movie

+

Automatically stops movie playback at the last frame, unless it started playing from the last frame.

+

When replaying a finished (or partially finished) movie, you usually don't want to pass over the boundary of its Input. That's why the "Autopause at the end of Movie" option is enabled by default. If you disable it, the emulator will play infinitely after the current movie Input ended, expanding the movie size until you press Pause or the middle mouse button.

+

It's recommended to leave this option enabled.

+


+
+

+

+

Now you are aware of all Taseditor settings, the remaining part of the chapter describes FCEUX emulator settings that may be useful for a TASer.

+


+

If you are going to TAS traditional way, it's obligatory to set the first controller buttons to such keys that would be easy to press together with the Frame Advance hotkey. While FCEUX supports binding the virtual NES joypad to a real PC gamepad, it's recommended to use the keyboard for recording Input, in order to have fast access to Frame Advance, Frame Rewind, Pause, and to all 10 savestate slots.

+

However, if you use Taseditor as intended, you won't need to use Recording too much, and even in cases when you use it (for example, when recording a test playthrough of a level), an access to functional keys isn't critical. So, you can reassign the game controls to a USB gamepad, if you have one.

+

Virtual controller buttons are configured in FCEUX the following way. Choose Config -> Input in emulator main menu. In the appeared dialog, select the "Gamepad" item from the leftmost drop-down listbox (it's usually already selected). Click the left Configure button (since you need to configure the first gamepad). In the new window click the Up button, then a small window will appear, now press the keyboard key you want to set for the virtual Up button. Press that key 2nd time to confirms your choice, or just click Close. Then you need to do the same for the rest buttons of NES gamepad – Down, Left, Right, Select, Start, B, A. After you're done with the first controller buttons (Virtual Gamepad 1), you may close both windows: Gamepad and Input Configuration.

+

You can check the assigned buttons while playing the game or while Taseditor is engaged – as you press them, the corresponding symbols in the Piano Roll Header will shine with green color. Besides, if you enable Input display (FCEUX: Config -> Display -> Input Display -> 2 player), FCEUX screen will show you the pressed buttons too.

+

In addition to recording the regular gaming session, virtual gamepad buttons may be used to quickly set Input when editing movie (see Config -> Use Input keys for Column Set). Select a range of frames where you want to change Input and press the key you assigned to a button of the virtual gamepad.

+

When you map the virtual buttons to keyboard keys, make sure none of the emulator or Taseditor hotkeys are already assigned to those keys. The full list of default hotkeys can be found in Reference.

+

Some FCEUX hotkeys don't have default mapping (they're not mapped to any key yet), you can configure them this way. In the emulator main menu choose Config -> Map Hotkeys. A window listing all possible emulator hotkeys will appear. Choose the necessary hotkey, double-click it and then press the desired keyboard key.

+

First of all, find the item called "Open TAS Editor" and double-click it. In the appearing window press the key that you will always use to quickly launch Taseditor.

+

Second, find the item "Reload ROM or TAS Editor Project" and either remap it or remember the default combination (Ctrl + F1). This hotkey will help you quickly return to your interrupted work – just launch FCEUX, press the Reload ROM hotkey, then the aforementioned Open TAS Editor hotkey, and then again Reload ROM (this time it will work as Reload TAS Editor Project). This way you'll return to the state of your paused work in a split second.

+

Then look at the hotkeys "Frame Advance" и "Frame Rewind". They are used for Playback cursor navigation. By default they are mapped to "\" and "Backspace". You can reconfigure them to more handy keys or just ignore and use just the mouse wheel for Playback cursor navigation.

+

Also see the "Speed Down" and "Speed Up" hotkeys. You may consider remapping them to Numpad keys "+" and "-".

+

The "Pause" и "Restore Playback" hotkeys are set to "Pause/Break" and "Spacebar" keys by default, but in most cases it's easier to use the middle mouse button instead of these hotkeys, so you can even reassign the "Spacebar" for something else if you wish.

+

Finally, there is the "Cancel Seeking" hotkey ("Esc" key by default). Pressing it is the same as clicking the Taseditor progressbar – if the Playback was seeking to a target frame, the seeking will be canceled.

+

Some FCEUX hotkeys don't work when Taseditor is engaged. For example, the "Open ROM" won't work – you have to load ROM before running Taseditor. This is done for mistake-proofing.

+


+

The next chapter describes additional features of Taseditor. You may postpone reading it until you are used to main features. Anyway, now you're ready enough for productive work in Taseditor.

+


+


+


+


+


+

+

Created with the Personal Edition of HelpNDoc: Write EPub books for the iPad

+
+ + + + + + diff --git a/help/taseditor/ProgramInterface.html b/help/taseditor/ProgramInterface.html new file mode 100644 index 00000000..ede7ff4e --- /dev/null +++ b/help/taseditor/ProgramInterface.html @@ -0,0 +1,129 @@ + + + + 2. Program Interface + + + + + + + + + + + + + + +
+
+

2. Program Interface

+ +
+ Beginner's Guide ››
+
+
+ Parent + + Previous + + Next + +
+
+
+
+ +

+

Program Interface

+


+


+

This chapter describes the program interface and ways of interacting with it.

+

The description uses many specific terms, so make sure you know the Glossary before starting the read. Also, it's advisable to run Taseditor right now, to be able to check everything you read in practice.

+


+

To enter Taseditor do the following:

+
    +
  1. launch FCEUX emulator
  2. +
  3. load any game ROM (File -> Open ROM)
  4. +
  5. open Taseditor window (Tools -> TAS Editor)
  6. +
+


+

When you engage Taseditor, the game is reset, and the emulator pauses. It shall stand paused as you TAS, to prevent the game from urging you on and distracting from analysis of information.

+


+

+


+

While TASing in Taseditor, a considerable part of the desktop is covered by the very Taseditor window. Emulator window is used for picture output, and you'd better scale it up to 2x size, so you won't miss a tiny detail even at a cursory glance. During your work you'll have to move eyes between emulator window and Taseditor window (mostly contents of the Piano Roll). So put those windows close to each other. The remaining space of the desktop can be populated with RAM Watch window, Lua console, etc.

+


+

You can adjust the size of TAS Editor window by dragging its edges with the mouse. The size and position are automatically saved and restored at next launch.

+


+

The window caption displays the program name ("TAS Editor") and the name of current project. If there are any unsaved changes, an asterisk is added to the end of the text. Besides, when the Input Recording mode is on, the word "Recording" appears in the window caption.

+


+

The main menu of the program is similar to one found in text editors like Notepad.

+

The File item is responsible for all file operations – creating a new TAS project, opening an existing file, saving, data importing and exporting. There's also a "Recent" sub-menu that stores direct paths to recently used projects.

+

The Edit item contains functions that let you edit TAS movie like a simple text file or a table file. Most of those functions can be accessed through standard key combinations, such as Ctrl + C, Ctrl + V and others. They will be reviewed later.

+

The View item allows to adjust the program appearance. Besides, here you can open the "Find Note" window, used to search text in Marker Notes. All of that will be described later. Until you study the Chapter 5 of this Guide, it's recommended to keep default preferences.

+

The Config item stores the rest settings, e.g. project auto-saving timer, the number of undo levels and other features that will be described during the learning flow. Don't change those settings for now.

+

Finally, the Help item contains the link to local copy of this Guide and the "About" window. Here you can also switch on/off hints (tooltips).

+

To the right of the main menu there is the Pattern item, displaying the name of current pattern. Patterns are just templates for speeding up the Input creation. They will be described in Chapter 6.

+


+
+ + + + + +

+
+ + + +

Contents of the TAS Editor window can be divided into 2 parts – the workspace (Piano Roll) to the left and the Toolbox to the right.

+


+

Proceed to the Piano Roll description

+


+


+
+
+


+


+

+
+
+


+


+


+


+

+

Created with the Personal Edition of HelpNDoc: Free PDF documentation generator

+
+ + + + + + diff --git a/help/taseditor/Reference.html b/help/taseditor/Reference.html new file mode 100644 index 00000000..3101f10c --- /dev/null +++ b/help/taseditor/Reference.html @@ -0,0 +1,95 @@ + + + + Reference + + + + + + + + + + + + + + +
+
+

Reference

+ +
+
+ Previous + + Next + +
+
+
+
+ +

+

Reference

+


+


+

Glossary

+

Terms that are used throughout this documentation

+


+

Controls

+

Exhaustive review of controls

+


+

Navigation

+

The summary of all ways to navigate a movie

+


+

Operations

+

The list and mini-reviews of all possible operations with a movie

+


+

Lua API

+

Specifications of "taseditor" library of Lua functions

+


+

FAQ

+

Answers to some expected questions

+


+

Speedrunning synopsis

+

Abstract classification of typical issues arising when optimizing a segment for fastest time

+


+


+


+


+


+

+

Created with the Personal Edition of HelpNDoc: Write eBooks for the Kindle

+
+ + + + + + diff --git a/help/taseditor/SemiautomaticTASing.html b/help/taseditor/SemiautomaticTASing.html new file mode 100644 index 00000000..3e3d508c --- /dev/null +++ b/help/taseditor/SemiautomaticTASing.html @@ -0,0 +1,168 @@ + + + + 4.3. Semiautomatic TASing + + + + + + + + + + + + + + +
+
+

4.3. Semiautomatic TASing

+ + +
+
+ Parent + + Previous + + Next + +
+
+
+
+ +

+

Semiautomatic TASing

+


+


+

+

This method further develops the ideas of the nonlinear TASing method.

+

In many cases TASer needs to see the result of the Input modification immediately. Ideally, he should realize all the consequences of his decision right at the moment of making the decision. But in reality he has to spend precious time on inputting the decision and navigating with the Playback cursor to the end of the segment.

+

In these cases you can leave the Playback navigation to Taseditor and just focus on editing. Taseditor will immediately react on any Input modification and display the new result.by bringing the Playback cursor to the end of the current segment.

+

Since you feel the influence of every click, you build very high level of interconnection between TASer and the game. In such close interaction both TASer controls the game and the game urges TASer's actions into right direction. Of course, such high level of interdependency is not always useful, because it narrows your spectrum of thoughts, not allowing to look down on the game and apply the logic from different games and other fields of life.

+

However, when the current segment is simple and all optimality factors are already known (and you only need to find the perfect combination of them), it's useful to abstract from everything else and devote full attention to going over the possible options. This way you can test a lot of approaches before you become bored with the current segment.

+

The Recording mode and the "Follow cursor" checkbox should be off. The "Auto-restore last position" checkbox should be on. The "Turbo seek" checkbox can be either disabled or enabled.

+


+

General activity:

+


+
    +
  1. Scroll the Piano Roll to the beginning of the edited segment, put the Playback cursor here, define the goal.
  2. +
  3. Detect the end of the segment and leave the Playback cursor there.
  4. +
  5. Suppose there's a mistake in the segment, weigh known factors of optimality and figure out the way to fix the mistake.
  6. +
  7. The mouse cursor navigation to any frame of the current segment is practically instant.
  8. +
  9. Edit the segment with the mouse. After every Input modification the Playback cursor will automatically replay the segment and stop at the frame that was considered to be the end of the segment. If necessary, you can shift the end of the segment by moving the Playback cursor manually (using the wheel). The steps 4 and 5 are constantly alternating until you consider the editing complete, according to the optimality criterion.
  10. +
  11. [optional step] Save the finished approach to any free Bookmark, e.g. to slot 8.
  12. +
  13. If this isn't the first approach to the segment, compare the new result to the best old result, using the optimality criterion. If the new approach is better (or it's the first approach), save the result to the Bookmark 9. The slot 9 will be used for keeping the best result of polishing the segment.
  14. +
  15. If you still want to try different series of approaches, return to step 3, until you run out of ideas.
  16. +
  17. [optional step] If you need more ideas, you can get some information from the past or the future by moving the Playback cursor to different segments of the movie or unpausing the emulator. When necessary, you can quickly draw a rough Input for watching the upcoming events of the game. But when returning to the segment modification you have to return the Playback cursor to the frame of the target event.
  18. +
  19. When there's no more ideas, restore the best approach from the History Log or the Bookmark 9 into the current movie and proceed to the next segment.
  20. +
+


+
+


+

The main difference between this and previous method is that here the Playback cursor is generally located at the end of the current segment, and not at the beginning. Every time the Greenzone truncates, the Playback cursor seeks to the end of the segment, or rather to the frame where the segment end was before you modified the Input. If the Input modification also changed the frame of the target event, you can additionally move the light-blue cursor by mouse wheel if needed. But often there's no need for precise positioning, because you may only need to know the sequence of events occurring in the segment due to the Input modification.

+

The replay of the current segment is automatically launched after every interim step of the Input modifications, even when you haven't finished the thought yet and are not ready to compare the current result to the result of the previous approach. Fortunately, when TASer is carried away by the editing process, he doesn't look at FCEUX screen and only clicks the Piano Roll, until his idea is implemented in the form of a full-fledged button combination. And when the Input is starting to become interesting, TASer pays attention to the emulator screen or the Memory Watch window.

+

For example, when you need to create a jump over a pit, you first draw a long row of the R button presses, and you don't care that at the same time the FCEUX screen displays how Mario runs and falls into the pit. You just draw some A buttonpresses, then look at the emulator window and erase or draw additional A buttonpresses, thus changing the beginning and the duration of the jump while watching the trajectory of Mario sprite.

+

So, the process of polishing the Input in this method is a simultaneous editing and watching the segment. TASer gets in close informational contact with the game and soon starts to think synchronously with its responses. The game starts to help TASer filter and accept decisions. As a result, you may lose impartiality of your mind and stick to obvious decisions encouraged by the game. That's why you shouldn't use this method all the time, it's recommended to alternate it with the previous one.

+


+

As with the simple nonlinear method, you can change the speed of emulation and get different variations of the semiautomatic method:

+
    +
  1. editing and watching the changes in real time
  2. +
  3. editing and watching the changes in slow motion
  4. +
  5. editing and instantly seeing the final result (turbo)
  6. +
+

+

+

Turbo-seeking creates an association between two distant events (the beginning and the end of the segment). Here the association is even more efficient, because there's even less intermediaries – the seeking starts before you even release the mouse button when drawing the Input. So you see the distant result almost at the same time you change the decisive Input, even if the game normally only shows the result in a several seconds.

+

+A good example would be the process of searching for the first possible frame of pressing the Start button. Some games actually allow to press the button before there's even any graphics on screen. Besides, after the Start button is activated, games often meditate for some time, not giving you any information if the button worked or not. Only after a second or two you can see the changes in the scenery, thus learning the buttonpress was successful.

+

In the traditional method of TASing you would need to spend 5-10 minutes on examination of approaches (searching for the very first frame), but the semiautomatic method allows to go over all the approaches much faster:

+ + + +


+

In the same way you can search for an optimal duration of holding the A button, trying to land at certain point. Also consider using this method for quick luck manipulation in many games. The automatic turbo-seeking works best when you deal with a single factor of optimality and need to quickly test a hundred of similar approaches.

+

In general, the semiautomatic method induces you to think less and experiment more. Sure, many videogames allow this way of solving tasks, but TASing requires more from you, so try not to take a fancy to the comfort of this method.

+


+
+


+

Pros of the method:

+

+ Instant navigation and high speed of the working process incites to conduct more tests.

+

+ Constant feedback allows to adapt to the game while editing the Input, adjust your decisions and discard incorrect approaches prematurely.

+

+ Possibility to skip useless scenes.

+


+

Cons of the method:

+

The insistent game feedback provokes TASer to discard some illogical but potentially advantageous approaches.

+

Emphasis on the mouse controls.

+


+

When the method is recommended to use: when you need to polish the segment already knowing its all optimality factors. E.g. for quick resyncing of the old Input this method is better than previous. Also it may be better for making an initial playthrough of a segment.

+


+
+


+

Now that you know the main principles of working in Taseditor, you can begin TASing your game of interest. Practice is the best teacher, so you'll only learn all intricacies of the activity by engaging in real development of your own TAS.

+

After several weeks of practical TASing it's recommended to reread the 3rd and 4th chapters of this Guide, in order to understand the text on a deeper level.

+


+

In the next chapter: tweaking the program.

+


+
+ + + +

PRACTICE: Thoroughly polish the Input in the segments of your test movie. If the initial dividing appears to be wrong – just redo it on the fly.

+

Use only the 2nd and the 3rd method of TASing, because traditional method is obsolete. Also try using turbo when suitable.

+

Estimated time: 30-60 minutes.

+
+
+


+


+


+


+


+

+

Created with the Personal Edition of HelpNDoc: Produce Kindle eBooks easily

+
+ + + + + + diff --git a/help/taseditor/SpeedrunningSynopsis.html b/help/taseditor/SpeedrunningSynopsis.html new file mode 100644 index 00000000..e309c696 --- /dev/null +++ b/help/taseditor/SpeedrunningSynopsis.html @@ -0,0 +1,167 @@ + + + + Speedrunning synopsis + + + + + + + + + + + + + + +
+
+

Speedrunning synopsis

+ +
+ Reference ››
+
+
+ Parent + + Previous + + Next + +
+
+
+
+ +

+

Speedrunning synopsis

+


+


+

Thanks to the definite goal, creating tool-assisted speedruns is the easiest application of TASing, and relevant techniques are examined pretty well. Here you can find the summary of generic tasks emerging in the process of polishing the Input for a speedrun. Before reading this, make sure you've learned the materials in TASing Process and TASing Methodology.

+


+

Speedrunners have to search for the shortest way of completing every segment of the game. This process of searching consists of testing a multitude of approaches for playing the segment and finally choosing the best approach. Here we will discuss only the problem of choice.

+

To simplify the problem, TASers usually compare only two approaches: the new working approach and the old best approach; all other old approaches are promptly forgotten (although the interesting ones can always be saved in the Bookmarks).

+


+

The best of all old (previously tested) approaches can be stored:

+ +


+

When the new working approach is considered to be better (more optimal) than the old best approach, it's naturally assumed that it's also better than any of the old approaches, so this working approach instantly becomes the best. In the case of using Bookmarks you should re-save the new approach to the slot where the old best approach was stored. At the end of the search the contents of this Bookmark slot are loaded into the final movie.

+


+

Optimality criteria in speedruns:

+ +


+

Respectively, when you're comparing any pair of approaches you are doing one of the three:

+

1. Comparing presence/absence of the event.

+

A. By memory

+

B. Using Bookmarks

+

2. Comparing the time of occurrence.

+

A. By memory

+

B. Using the green arrow

+

C. Using a Marker

+

D. Using Bookmarks

+

3. Comparing the state of the game at the same frame.

+

A. By memory

+

B. Using Bookmarks

+


+

+

+

1. Comparing presence/absence of the event.

+

Choose the approach where the needed event happens / unneeded event doesn't happen. The occurrence of the event is only the first (and often easy) step in creating the Input for current segment, and next step is to try speeding up the time of the occurrence.

+

The search for approaches goes on until the first successful approach is found, or until you're tired (then the event is considered to be unfeasible).

+

Programming analogy: comparing two Booleans, comparing  two arrays of Booleans.

+


+

+A. Most of time it's enough to simply keep in mind the fact that target event didn't occur in previous approaches. Example: finding the Start buttonpress.

+


+

+B. When the target event is complex (e.g. you plan to shoot 3 enemies simultaneously), it's recommended to save the most promising approaches into Bookmarks (e.g. an approach where you shot 2 enemies simultaneously and 3rd one shortly after), because if the target event is unfeasible, you might be satisfied with such partial success.

+


+

+

+

2. Comparing the time of occurrence.

+

Choose the approach where the target event occurs earlier. The time of occurrence is defined by the frame in which the event can be detected, while in previous frame it cannot be detected. The number of this frame is found by bringing the Playback cursor to the frame and watching the FCEUX screen (or Memory Watch) for confirming.

+

The search for approaches goes on until you're tired, or until all possible types of approaches are exhausted (then the current best approach is considered to be frame perfect, until new factors are found).

+

Programming analogy: comparing two Integer Numbers.

+


+

+A. For simplest segments and small subsegments it may be enough to just keep in mind current fastest frame number and compare results of all new approaches with this number. But in general it's not recommended to rely on human memory. Details: TASing Process.

+


+

+B. On simple segments you can refer to the green arrow of Taseditor. When using it you're supposed to always leave the Playback cursor at the frame of target event (which is only natural). Thus if the new frame of target event is located above the green arrow, it means the new approach is faster than previous approach. Details:TASing Methodology.

+


+

+C. On complex segments use an unbound Marker that always points at current fastest frame number in the Piano Roll. Every time you beat the old result you're supposed to manually move the Marker higher. Thus if the new frame of target event is located above the Marker, it means the new approach is faster than the old best approach. Details: Program Customization.

+


+

+D. On segments of any level of complexity it's recommended to use Bookmarks that are displayed in the icons column of the Piano Roll. Every time you beat the old result you're supposed to manually save current approach to the same Bookmark slot, replacing the old best approach stored there. Thus if the new frame of target event is located above the Bookmark icon, it means the new approach is faster than the old best approach.

+


+

+

+

3. Comparing the state of the game at the same frame.

+

Choose the approach where properties of the game are more advantageous in a whole. This type of comparison is useful when you need to evaluate compound in-game situations. For example, in Formula 1 racing you have to care both about being as fast as possible and wearing tyres as little as possible, so you need to find an optimal balance on each segment of the track instead of just simply hurrying up.

+

Here the segment has defined end frame, and every new test is supposed to replay the segment up to that frame. Taseditor stores this frame number in the form of the green arrow, which automatically pauses emulation when you watch new approaches. So TASer only needs to edit Input (creating new approaches), launch replaying, wait for the stopping and evaluate the result (judging by FCEUX screen or Memory Watch).

+

The search of approaches goes on until you're tired, or until all possible types of approaches are exhausted (then the current best approach is considered to be perfect, until new factors are found).

+

Programming analogy: comparing two Strings, comparing  two arrays of Integer Numbers.

+


+

+A. For simple segments it may be enough to just keep in mind the value of the most important property of the game state achieved in the old best approach. Every time you watch the replaying of a new approach, you can compare results of the new approach with this value. If you decide the new value is better, you have to memorize it in place of old value. Example: luck manipulation.

+

When there's more than one important property, it's not recommended to rely on human memory.

+


+

+B. On complex segments and especially on gigantic segments (with the size of a whole level of the game) use Bookmarks that store alternative branches of the movie. The best approach for playing the segment is saved into one Bookmark slot and the new approach is saved into another slot. Then you can easily switch between these slots and compare values of each property of the game state. In addition, you can point the mouse cursor to respective Bookmarks to see screenshots of the game state and visually compare their properties with current image on FCEUX screen.

+

To display important RAM data on screenshots you should use Lua graphical output, then Memory Watch window won't be required to judge important properties, and you will be able to successfully judge by screenshots only. Details: Program Customization.

+

In the situation when some properties in the new approach are better and some others are worse you'll have to thoroughly weigh all of them (either in your mind or using a Lua-powered aggregate formula) and then decide which state of the game is better.

+

Every time you beat the old result you're supposed to manually save the new approach to the same Bookmark slot, replacing the old best approach stored there.

+


+
+


+

After finding the fastest approach of playing the segment a good TASer is expected to improve the entertainment value of the play through the segment. The optimality criteria in such activity may be very diverse, but the general requirement is to keep the same time of playing through the segment.

+

Alternatively, you can postpone the entertainment improvement of the segment and proceed to the next.

+


+


+


+


+


+

+

Created with the Personal Edition of HelpNDoc: Single source CHM, PDF, DOC and HTML Help creation

+
+ + + + + + diff --git a/help/taseditor/TASEditorInside.html b/help/taseditor/TASEditorInside.html new file mode 100644 index 00000000..0f4971af --- /dev/null +++ b/help/taseditor/TASEditorInside.html @@ -0,0 +1,93 @@ + + + + TAS Editor Inside + + + + + + + + + + + + + + +
+
+

TAS Editor Inside

+ +
+
+ Previous + + Next + +
+
+
+
+ +

+

TAS Editor Inside

+


+


+

This section of the documentation describes all ideas put into the Taseditor and reveals major details of the final implementation of TAS Editor 1.0. For more details check the source code of the program (in C++).

+

Taseditor is an open source program and is distributed under the MIT license which allows unrestricted use. The license was chosen to encourage a modification and porting Taseditor to another platforms.

+

You can download the source code of the FCEUX 2.2.0 emulator with built-in Taseditor from the official SVN repository: http://sourceforge.net/p/fceultra/code/

+

To work with SVN you'll need some SVN client program, like TortoiseSVN.

+

The source code of Taseditor is well-commented, and to understand the code you only need basic skills of programming in C++ under Win32 API.

+


+


+

Ideas

+

The intended functionality of the program

+


+

Implementation

+

The actual program architecture

+


+

Mistake-proofing

+

The list of unobvious nuances

+


+

FM3 format

+

Taseditor project file specifications

+


+


+


+


+


+

+

Created with the Personal Edition of HelpNDoc: Full-featured multi-format Help generator

+
+ + + + + + diff --git a/help/taseditor/TASingMethodology.html b/help/taseditor/TASingMethodology.html new file mode 100644 index 00000000..af340050 --- /dev/null +++ b/help/taseditor/TASingMethodology.html @@ -0,0 +1,213 @@ + + + + 4. TASing Methodology + + + + + + + + + + + + + + +
+
+

4. TASing Methodology

+ +
+ Beginner's Guide ››
+
+
+ Parent + + Previous + + Next + +
+
+
+
+ +

+

TASing Methodology

+


+


+

This chapter is dedicated to the principal activity in TASing – the way of creating an optimal Input for any given segment of the movie. TASes look so shiny exactly because of persistent manual polishing of Input. The size of the segment can be anything, criteria and factors of optimality can vary, but the method is basically one and the same: retry all sorts of approaches and choose the best one. The only question is how to do it with minimum time and effort.

+


+ +


+

It's rather difficult to convince yourself to spend time on alternative ways to play through the segment once it's already completed and all obvious mistakes are already fixed. After achieving the current in-game goal people usually want to set another in-game goal. But you must remember that TASer's goal is different from player's goals. So try to abstract away from the game rules and not to retreat from the segment until you complete real goal, not just player's small goal.

+

That's actually the most difficult part – to invent new approaches to solving one and the same task. TASers mainly consider the same approach a regular player would have used in this place of the game. That's why people mostly use evolutionary way instead of revolutionary. You keep modifying the existing basic approach, both fixing its mistakes and conducting experiments. In the process of these thoughtful modifications you enrich your knowledge base about the game, and as a result you produce an Input that isn't immediately obvious.

+

Of course, sometimes you have a flash of inspiration, when a revolutionary idea leads to tremendous improvements that surpass all polishing gains. People love TASing exactly for these emotional moments. Yet it doesn't exempt you from the need to polish this new revolutionary approach using the same methods to bring it even closer to an ideal.

+

Instead of reading the techniques described here you can just immediately start real TASing, so in a course of several projects you would work out your own methods. But most likely after a year of TASing you'll come to the described scheme of work.

+


+

So, the process of creating the best Input for the segment of optimization can be basically described as a loop of fixing mistakes in previous versions of Input of the segment. A mistake is any kind of divergence from the perfect yet unknown Input. Such statement of question is very advantageous, because it means that you can gradually approach the perfect Input by making small steps that you can elaborate even without being a genius. The majority of mistakes can be successfully fixed by repeated examination and modification. That is, even when you don't have any original ideas, you can achieve a success by persistence. The successful progress motivates you to continue the work and thus prepare the ground for breakthrough ideas.

+


+

To correct a mistake in the Input of a movie you have to:

+
    +
  1. Become aware of the mistake.
  2. +
  3. Conjecture a solution.
  4. +
  5. Navigate to the place.
  6. +
  7. Apply changes.
  8. +
  9. Verify the outcome.
  10. +
+


+

1. Realizing a mistake happens either when watching the movie in Read-Only mode or right when recording/editing the Input.

+
+ + + +

Comment: Instead of detecting a tangible mistake TASers often just assume that current segment is still improvable. It's always wise to doubt the perfectness of current result and try experimenting with the Input – sometimes you indeed find unrealized possibilities.

+
+
+

+

+

2. The means of solving the mistake are either immediately obvious or are found experimentally. In rare cases you have to resort to calculations and comparisons. A correctly chosen segment usually encompasses all key factors of optimality. The information from previous or next segments is rarely required.

+
+ + + +

Comment:

+

Sometimes while fixing one mistake we unwittingly create another mistake. In this case the optimization process would go in wrong direction, but fortunately such situations are extremely rare in TASing, because videogames are much more obvious and linear than real life, so player can find all factors and correct criterion of optimality. Taseditor additionally simplifies the process by data visualization.

+
+
+


+

3. The ability to navigate to the place of making the mistake is the essential distinction between TASing and normal speedrunning. Regular players can detect the mistake, but it's TASers who always return back to correct it.

+

In traditional method of TASing the navigation may take noticeable amount of time and effort. Taseditor makes the navigation lightning fast.

+
+ + + +

Comment:

+

Sometimes the place of making the mistake is located long before the segment where it is revealed. In this case you have to find the segment affecting the mistake and edit it according to the information given by the played segment. And in this case the speed of navigation is even more important.

+
+
+


+

4. Applying modifications to Input is how you make your thoughts real. The less the delay between an idea and its implementation is, the better.

+

In traditional method of TASing the Input modification takes longer, because in addition to rewriting erroneous frames you also have to rewrite adjacent frames  In Taseditor this is mostly not necessary.

+
+ + + +

Comment: В

+

Since any Input modification entails a change in game flow, sometimes you still have to resync the old Input that follows the place of of fixing the mistake.

+
+
+


+

5. To see the outcome you need to resume playing the movie from the beginning of current segment of right from the frame of fixing the mistake. There's no need to re-check previous segments of the movie, because the mistake fixing affects only subsequent events.

+
+ + + +

Comment: Although, when you're making an entertaining playthrough instead of a pure speedrun, after fixing a mistake (e.g. making the movement trajectory more smooth) you should ensure that this correction fits it with the general sequence of in-game events, so it's advised to rewatch some previous events together with current segment.

+
+
+

You have to watch current segment up to its end, that is, to the moment when the target event occurs, so that you can safely apply the optimality criterion. Because the correction may seem profitable at first but appear worse in the end.

+

After evaluating the outcome the mistake is either considered to be fixed/non-existent, or you have to return to step 2 and rethink the situation.

+


+
+

+

+

Before Taseditor, all mistakes (both explicit and supposed) were being fixed by creating and reloading savestates. If you're not familiar with the traditional method of TASing, here's its basic principles:

+ +


+

As you see, almost everything in the traditional method of TASing is done using savestates (Bookmarks). In Taseditor some of their functions are replaced by the Greenzone and the History Log, yet Bookmarks still play important role, allowing to keep alternative branches of the movie in a single project. The Playback cursor navigation now can be done faster by either drag'n'drop or mouse wheel. In fact, now you don't need to put Playback cursor to the frame of modification, you can just scroll the Piano Roll to the place and change the Input by mouse.

+

Since the Recording is less effective than direct editing, there's no more need to constantly switch modes. Now the emulator is always in Read-Only mode.

+

The game is always paused, as before. But now you are seeing the outcome of your Input only when you actually want to see it. At first this may seem inconvenient (as you don't feel the habitual feedback from your keypresses), but it's actually very advantageous, because it means the higher level of independence from the game. Instead of the standard mechanism of "involvement into the gameplay" there are other mechanisms of data transmission. So in any case you will receive all needed information on how the game interprets your Input, it's just that this data stream won't continually flow into your mind, it will be delivered on command.

+

And when it's really necessary, you can have an intensified feedback by switching to the third method of TASing in Taseditor.

+

Let's review pros and cons of all three methods, one by one.

+


+
+ + + +


+

The three methods of TASing in Taseditor:

+


+ +
    +
  • navigating the Input using the Playback cursor by jumping to Bookmarks
  • +
  • recording sequences of Input using the keyboard/joypad
  • +
  • watching interim results of the Input automatically
  • +
+


+ +
    +
  • navigating the Input using the mouse
  • +
  • editing the Input using the mouse/keyboard/joypad
  • +
  • watching interim or final results of the Input by user command
  • +
+


+ +
    +
  • navigating the Input using the mouse
  • +
  • editing the Input using the mouse/keyboard/joypad
  • +
  • watching interim or final results of the Input automatically
  • +
+


+
+
+


+


+


+


+


+

+

Created with the Personal Edition of HelpNDoc: Easily create Web Help sites

+
+ + + + + + diff --git a/help/taseditor/TASingProcess.html b/help/taseditor/TASingProcess.html new file mode 100644 index 00000000..ba4db22e --- /dev/null +++ b/help/taseditor/TASingProcess.html @@ -0,0 +1,178 @@ + + + + 3. TASing Process + + + + + + + + + + + + + + +
+
+

3. TASing Process

+ +
+ Beginner's Guide ››
+
+
+ Parent + + Previous + + Next + +
+
+
+
+ +

+

TASing Process

+


+


+

TASing is about striving for an absolute perfectness. For TASers, a game is more than just an amusement, it's an interesting and complex task.

+

People enjoy solving creative tasks, because it allows them to express their individuality and improve various skills. However, complicated tasks require both inventiveness and methodicalness. This Manual describes dry and methodical side of TASing, as for inventiveness – you'll have to show it yourself in real setting.

+

In general, to create a perfect (or very close to perfect) playthrough of the game you have to record an imperfect walkthrough and then work on consecutive improvements of its separate parts. When every fragment of the movie is perfect, we may consider the whole TAS to be perfect as well.

+

The concentration of efforts on small segments of the movie is the key to success. Every working segment has to be large enough to represent an adequate subtask, but small enough to make the task simple.

+

Without such structuring an effective and comfortable TASing would not be possible. There's too many factors affecting the final result of the game, and some of those factors append or contradict each other. Human memory is not enough to keep and calculate all interconnections of the game factors within a large segment of the playthrough. Therefore, when TASers deal with long play sessions, they aren't different from regular players who are carried by the temptation to use the first observations as a base for making decisions. But regular players can get away with such carefree approach, while TASers would end up with a clearly imperfect walkthrough.

+

Thus real TASing implies that segments are small. Much smaller than a single level of a typical videogame. The whole process of TASing may be portrayed like this: a man watches the recording of his own unfinished playthrough of the game, selects a small piece of the movie and throws all forces into improving it, then selects another piece and so on until the end of the game.

+

Of course, it's an incomplete picture, because besides the movie editing TASers also research and experiment with the game (to expose hidden factors) and do many other things. But that's beyond the scope of this Guide.

+

The skill of choosing adequate segments comes with experience. Many TASers don't even think what makes them spontaneously focus on a segment of the game and unconsciously limit the beginning and the end of current work. Some believe that they simply record the movie frame-by-frame in succession, but if you watch it from outside you can note that those repeated rerecords occur within a window of 20-200 frames, and the window goes forward the movie by making jumps (the end of previous segment becomes the beginning of next segment). Consider watching live stream videos of TASing, and you'll see certain regularities in handling savestates.

+

Here we'll try to analyze the behavior, in order to learn how to define current segment limits sensibly. And then practical TASing will make you do it mechanically.

+


+

An adequate segment (subtask) is supposed to give TASer a consistent goal and simple means to reach it.

+

The goal of a segment playthrough is usually to achieve certain in-game event. For example, the goal of playing through the whole game is the event when "THE END" text appears on the screen. The goal of one level can be such event as "the value of the level counter in RAM was increased" or simply "the screen faded at the end of current level". And the goal of a small segment may be something like "the character successfully landed on the other side of the pit". These intermediate goals are defined by the context.

+

Based on the goal, TASer defines the optimality criterion in mind. The criterion is the rule which let's you compare any two versions of playing through the current segment of the game. When you're TASing, it's not enough to simply reach the goal, you have to try many approaches to reaching it, and then choose the best approach of all. For example, in a speedrun the best approach to playing a segment is usually the one in which the target event occurs as early as possible. E.g. if the 1st approach to playing the segment made the event occur at frame 350, and the 2nd approach made it appear at frame 340, then the 2nd approach is better than the 1st, and the final movie should contain exactly the 2nd approach.

+

There are too many means for reaching the target event. In theory, any gameplay aspect (including those not planned by developers) may help or impede the progress in some way. So, to cope with this vague multitude of possibilities you should regard all aspects of the game as optimality factors.

+

+

An optimality factor is an aspect of the game that directly affects optimality of playing current segment. The word "directly" implies a monotonous dependence of outcome from applying the factor. For example, on this picture there's no monotonous dependence between the distance to finish and the duration of holding Right. Pressing the same R button either makes Mario be closer to the finish, or moves him away, depending on his position.

+

When people perceive such segment in a whole, it's difficult to guess the best moment to release the R button, when to press the L button and so on. So, in order to simplify the understanding of complex dependencies (and thus reveal factors), such segments should be broken into several subsegments.

+

Correct statement of question usually cuts off many irrelevant possibilities. For example, regular player could wait until the difficult enemy character walks away, but in a speedrun such tactic is not considered.

+

Thus even in an open-world game TASer is left with a limited set of useful actions and in-game indicators that must be followed while polishing one segment. And the less the segment is, the more limited is this set, so it's easier to find an ideal sequence of actions by going over combinations of factors.

+

On the other hand, the less the segment is, the less its goal intersects with the final goal of the TAS. The final goal is to make perfect walkthrough, e.g. the fastest in the world (which means the frame counter at the end of the movie should be as low as possible). But in terms of every specific segment the goal may be completely different, sometimes even opposite (for example, to stay in bonus stage as long as possible, which then grants time saving at another point of the game). That's why in very small segments the optimality criterion is not used, and playing such micro-segment is only evaluated as a part of a full-fledged segment.

+

For example, when your character is jumping over a pit and shooting enemies at the same time, every bullet release can be considered a separate subsegment (so it becomes easy to isolate such factors as "recharge timer", "max 3 bullets on screen" and so on). But then, when comparing approaches, you should compare different versions of jumping over the pit. Even if the 1st approach to jumping (which ends at the frame 350) allowed you to shoot two enemies and the 2nd approach (which ends at frame 340) allowed to shoot only single enemy, you are supposed to choose the 2nd approach, because the optimality criterion of the unbroken segment fits the final goal of the speedrun better.

+

While TASing you have to maintain an optimal balance between the necessity to decrease segments in order to grasp factors and the need to increase them in order to use a relevant criterion. This skill comes with time, so don't sweat it and just rely on your intuition.

+


+
+ + + +

Let's have an example when the segment is too large. In a Super Mario Bros speedrun you are expected to reach the end of World 1-1 as fast as possible, which means you have to maximize the X coordinate of the character moving from left to right. The basic premise is that at the beginning of the level the X value equals zero and at the end of the level it is one thousand. Using gamepad buttons you can influence the coordinate in various ways.

+

If we take the whole level from the moment X = 0 to the event X = 1000 as our working segment, we can immediately see the optimality criterion (the best approach will be the one with minimal value of the frame counter when X >= 1000), but we can't see definite factors. How exactly we're supposed to press buttons to get the X = 1000 within minimal number of frames? Well, we can apply a regular player's logic and intuition. When we press the R button, the X coordinate usually increases, and with the L button it decreases. So the most obvious decision is to hold the R button and see how many frames is needed to grow the value of X to one thousand. When testing such approach in emulator, it appears that Mario is hampered by obstacles and the X coordinate does not grow, even though the R button is held. This way a new factor comes to light – the need to jump over obstacles and pits. Using the A button Mario eventually reaches the X = 1000 event, and the optimality criterion can eliminate all alternative playthroughs where the A button presses were ill-timed (e.g. where Mario stumbled  over edges of pipes, the frame counter at the end of the segment was higher).

+

Now the player (or rather, TASer who is stuck in player's mindset) may think that all factors are applied and the segment is perfect. But it isn't. Super Mario Bros has somewhat complex physics engine. The X coordinate is influenced by current horizontal speed, and speed is influenced by acceleration. Acceleration is affected by the B button, skidding, Mario's direction and air-ground state. There are also teleporter pipes and useful glitches like the "flagpole glitch" and so on. A lot of things to bear in mind. But human working memory can only store about 7 objects, thus some factors inevitably slip away when you're editing Input on large segment. You'd better shrink the segment to such a scale which reveals factors individually or in a small group.

+

If we focus on the segment from X = 0 to X = 100, the optimality criterion will be the same, but now it also becomes obvious that in the first half of the segment Mario runs slower, and in the second half he runs with constant speed which can be considered maximum. This way you begin to appreciate the acceleration factor, so you add the RAM address to Memory Watch and start analyzing possible ways to influence the acceleration. After some experiments with turning and jumping you can discover more factors. As a result, you're going to find an intricate combination of R, L, B and A buttonpresses that makes the event X = 100 occur faster than simply holding R and B. And even if the new playthrough of the segment is only several frames faster than old, it's much closer to perfectness.

+
+
+


+
+ + + +

Now let's take a look at another extreme. When segment is too small, its optimality criterion may contradict the final goal of the TAS.

+

First, if you get carried away by maximizing speed and acceleration in equal intervals between every next hundred of pixels, you may forget about the shortcut pipe, because diving into pipes resets speed value to zero, which contradicts with the goal of current segment. In short term the diving factor is disadvantageous for a speedrunner, and its long-term profit may be overlooked when you're busy with habitual actions.

+

In this case the segment was chosen without much foresight, and as a consequence it sprouted wrong criterion of optimality ("the frame counter at the event X = 200 must be minimal"). Here the segment should end at the moment when any Down button press will start diving animation.

+

Of course such mistakes are often noticed when replaying finished movie on a fresh mind, but sometimes the situation is less obvious and is only revealed after publishing.

+

+

Second, in the same SMB game after diving into the pipe (World 1-1) you have to reach the exit to the right. It may seem necessary to start maximizing speed from the very beginning. But as you may see in the picture, within first dozen of frames it's better to hold the L button instead of R, so that Mario lands slightly aloof from the wall that needs to be jumped over. If you hold R too early, Mario will land close to the wall and will have to jump vertically, thus losing gathered speed.

+

This peculiarity is not so obvious when you choose optimizing the segment from the event Mario appears to the Mario lands event. The optimality criterion of such small segment will direct you to wrong sequence of buttonpresses.

+

Here you should choose the segment from the frame when Mario appears to the moment of overcoming the corner of the wall.

+

Unfortunately, even experienced TASers not always choose correct limits right away. Sometimes you have to rethink and redo, throw away results of many tests and change the scale of the segment, play the same part of the game many times again.

+
+
+


+

As you might have noticed, this document avoids measuring segments in real frames of the movie. Because actual size of segment varies from game to game and from stage to stage. Some parts of the game contain so little possibilities that they can last for more than a thousand of frames and still be easy to play and replay. By the way, some segments don't even need to be played more than once, since they are so simple that any successful playthrough is optimal (for instance, watching unskippable cutscenes between levels). And on the contrary, some stages of the game are supersaturated with events and factors, so you are going to sweat even over a dozen of frames.

+

Experienced TASers regard every segment individually (although they don't think too much about it). It's bad idea to choose the next segment by the same principle as previous, this would only work well in extremely repetitive games.

+

If you want, you can limit the end of current segment by a fixed frame number (e.g. set the goal to maximize the X coordinate value when the frame counter = 200). But usually it's more convenient to associate the end with some small frontier of the game (like passing over a trap or defeating another enemy) – then the goal itself is going to suggest you basic means for reaching it. The task "touch a flower as fast as possible" sounds more natural (for a gamer) than the task "at the frame 300 become as close to the flower as possible".

+

In the vast majority of video games the gameplay divides into "rooms", "enemy waves" and "traps", which are always separated by short periods of relaxation. Even in constantly scrolling and open-world games the level design ensures that there are intense moments and filler intervals between them. The truth is, game designers also structure player's task into subtasks, and in some cases TASer can even borrow the prepared segmentation. Just don't forget to critically assess it and subdivide into more subsegments when needed. Though, such subdivision will naturally take place in the process of editing Input on a excessively large segment. So TASing doesn't always require intense intellectual efforts. If you're skillful and smart, most of time you can just go with the flow and enjoy TASing no less than conventional gaming.

+

All this can be compared to how writers divide their books into chapters (game levels), and chapters into paragraphs and sentences (segments) in order to aid with comfortable reading and comprehending author's ideas. A regular reader (player) is satisfied with the author's subdivision, but a literary critic (TASer) needs to be able to "read between lines" by dividing text his own way.

+

For example, in Super Mario Bros every group of enemies is separated by a quiet space which doesn't require any skills, and it can be light-heartedly ran over or jumped over while holding Right (granted that Mario speed is already at maximum). So you don't even need TAS tools to be perfect at these moments. These intervals are the most suitable place to set a goal – if you mark an end of the segment at such place, the optimality criterion won't contradict with final goal of TAS for sure. And usually these moments occur often enough so the segment between them is of an acceptable size.

+


+
+


+

The division to segments was always present in TASing, but Taseditor allows to accentuate the process visually. Here you can mark the beginning and the end of a segment using Markers or Bookmarks. Thanks to the visible boundaries you won't be distracted onto adjacent Input and can focus on analyzing only closest factors.

+

The frame of current segment beginning is usually chosen when watching a test playthrough of the current segment. When recording or watching such playthrough you already pick one or two key factors of optimality. So it's only logical to start the segment at the moment when these factors join into force or dramatically change the behavior. For example, at the beginning of every level you usually start a new segment, because that's the point where you regain the ability to move forward (after the cutscene between levels ends). So it's wise to set a Marker or a Bookmark at the beginning of every level, thus marking both the level boundary and the beginning of current work segment.

+

And if in the process of optimizing the segment you reveal some factors that join into force earlier than current beginning of the segment, you can always adjust the chosen boundaries of the segment, or break it in two subsegments.

+

+The ending frame of current segment is more mobile than the frame of beginning. When you define your goal (e.g. to make the X coordinate reach the value of 50) you can mark the end of current segment by setting a Marker/Bookmark to the frame where current imperfect playthrough accomplishes this goal. Then by polishing the Input you try to reach the goal (X = 50) at an earlier frame. And if in the process of modifying and testing a new Input you discover that the goal indeed can be reached earlier, you move the closing Marker/Bookmark up (to the frame of the improved end). After that you continue testing new approaches, searching for even better one until you don't feel any more potential. In traditional TASing this is exactly how the main Bookmark (storing current best playthrough of the segment) gradually moves up.

+

Well, sometimes you can indulge in laziness and avoid marking the end of current segment, instead you just keep the goal in mind and remember the number of the frame where the target event occurs in the best case so far. Such behavior is reasonable when the segment is very simple and you don't plan to redo it many times.

+

Moreover, in many platformer games where the player character has constant running speed most of segments can be played optimally from the first try (you just have to hold the Right button and maybe jump over trivial obstacles). So if you don't see any obvious mistakes and don't intend to search for hidden flaws, you may as well skip the segment shaping, just proceed to next segment right away. Such simple games are especially suitable for newbie TASers, because TASing them is very similar to casual playing through videogames using savestates (when you only revise the most obvious mistakes, like falling into a pit, and ignore non-fatal roughness).

+

But in complex TASes, where the mind is occupied with many optimality factors, you shouldn't hurry. To make your thought process more precise, you'd better be perfectly aware of current segment boundaries. So mark the beginning of any difficult segment with a Marker, and mark the end by setting a Bookmark every time you find an improvement (use one and the same slot). Since it's not easy to find an improvement when dealing with difficult tasks, don't expect you'll have to re-set the Bookmark too often.

+

When you're confident you've found perfect solution of the segment, move to the next segment. Don't remove old Markers, since they may be useful in future, in case you begin doubting the perfectness of your decisions (e.g. after finding a new trick). The logic of movie dividing will most likely remain the same even after finding the new factor (the trick).

+

Also, if in the middle of optimization process you become confident you've found perfect Input for the first half (or a third) of current segment, you can divide the segment in two and focus on optimizing the remaining section. Such situations often rise when the initially chosen segment was too large and its logical parts naturally emerged in the process of editing the Input.

+


+

So, if you don't like to keep things organized, you can avoid Markers and Bookmarks whatsoever, working mostly in terms of fuzzy in-game concepts and imagining segments as some emotional sequences of events. Unfortunately, the data about fuzzy goals also occupies part of human working memory, and as a result you won't have enough resources to keep all optimality factors in mind. And you won't even notice how you're losing a multitude of possibilities.

+

On the contrary, if you like to keep an order, it's recommended to accompany Markers with text Notes, either before, or during, or after the optimization of the current segment. For example, make up a name for the segment or put a tag. This way you document the development of the TAS during actual TASing, give an objective meaning to the Input appearing in the process. This is especially useful when TASing in co-authorship. But even when working alone, you may notice the documentation from previous levels motivates you to carry on. It only takes seconds to type that kind of texts, and then it helps not to abandon the project.

+

Notes also help to better unlock the potential of tricks and bugs of the game. By writing the text you actually formalize your knowledge about the described phenomenon. When the essence of the trick is kept in your mind, you may think that you already know everything about it, and that your current TAS uses the trick the best way possible. But when you construct an objective model (a verbal description of the trick) you often find its new sides.

+

It's not uncommon for TASVideos.org to see how one TASer read the description of a trick in the submission text written by another TASer and found a way to use the trick better than original author. There were also cases when author himself reads his recent submission, facepalms and urgently records an improvement.

+


+
+


+

Making a perfect TAS can take anything from several days to several years, depending on complexity of the chosen game. Most of that time is spent on finding an ideal sequence of buttonpresses for every segment.

+

Often it seems right away that current Input is already the best possible. But usually it's not so, especially if you make the conclusion judging by the external image of the emulated game instead of its internal state (Memory Watch). So it's always reasonable to suppose that current result is not perfect. If you don't see any mistakes or potential improvements at the moment, try to watch the segment together with several previous segments (e.g. watch the last half a minute of your movie), because it's possible that previous segments contain some unregistered optimality factors that have an effect on current segment. And if you still don't get any ideas, consider moving to next segment, but don't completely refuse further attempts to criticize and improve finished segments.

+

Rewatch the finished part of your movie from time to time – either from the very beginning, or from the beginning of current level – and try to notice imperfections. Taseditor allows to edit Input in any part of the movie while the movie is still playing, so you can quickly test any spontaneous idea right when it comes to your mind. If the new idea appears to be unsuccessful, just undo latest changes or load the Bookmark containing the last stable state of the movie.

+

+And if the new idea in fact improves you TAS, after a joyful anticipation you have to ensure that all the following segments of Input sync to the game (because implementing the idea has changed the flow of the game). Most of time it's not necessary to redo all the following Input. Usually you only have to delete or insert a few frames (thus shifting all following segments up or down), or modify several segments between the place of implementing the new idea and the nearest checkpoint (the end of current level, etc). Checkpoints usually reset many in-game properties to default value (e.g. they require you to walk over specific platform, thus equalizing the Y coordinate), so after the checkpoint you old Input will sync with new timeline of the game once you adjust it to match the flow of game events.

+

Anyway, even in cases when you have to redo considerable parts of the movie, resyincing is much easier than TASing from zero ground, because now you know the best approach for each segment and only have to match your previous results. And sometimes you can even excel them, because, when you're doing these forced modifications in order to resync old Input, you still possess TASer's critical thinking, so you may notice another mistake or unimplemented idea by the way.

+

Sometimes it's like a snowslide – as the trouble grows, so grows the thrill of all the discoveries. Many ingenious speedrun overtakes were made because of noticing a small improvement in the middle of the movie, which then forced TASer to re-record the remaining half of the movie (in order to resync it using traditional method) and stumble upon new discoveries in the process. And then these new tricks appear to be useful in the first level of the game! Since the game has single engine, a trick that works in one level may be applied in another, where the similar conditions are met. Even if some conditions aren't met, sometimes you can create them by losing something less important. In the end, as the movie gets rewritten many times, the small improvement rises into large-scale progress.

+

You should learn not to feel sorry when you have to throw away results of your hard work. In TASing you're expected to reconsider even polished parts of the movie from time to time. The traditional method of TASing quickly makes you accustomed to inevitable losses of time, because any inattention or slipped finger requires you to rerecord part of current segment. Taseditor averts such minor losses, but doesn't change the fact that you have to retry new approaches after finding new optimality factors.

+

For example, when polishing the Input near the end of World 1-3, you've suddenly found a new trick allowing you to get a mushroom, and it also appears to work in the World 1-1. Now you have to redo both 1-1, 1-3 and even 1-2, because you now play World 1-2 with big Mario. Of course, TASing the same levels second time is easier, but the fact of wasted time may dispirit you at first. Sometimes it may seem that fixing the old mistake is not worth spending additional time. At this point you'd better stop thinking too much and just choose one of the two options – either immediately start fixing, or postpone it for an indefinite period (and leave the Marker with a note describing the issue). If at the end of the project you accumulate a critical mass of such postponed plans, the movie should be called a "test run" and probably also published, at least as a WIP (work in progress). Then take some considerable rest until you feel like redoing the TAS (making an improvement).

+


+

Despite all the difficulties, TASing can bring enjoyment both to viewers and authors. TASes are made by people who consider this kind of work to be balanced by the excitement from intermediate and final results. In many senses TASing is similar to a special meta-videogame with a unique gameplay mechanic. And until games bring fun, people play them no matter how hardcore they are.

+


+

In the next chapter: descriptions of Input optimization methods.

+


+
+ + + +

PRACTICE: Watch the imperfect playthrough of the 1st level that you made in previous chapter, and divide it into segments using Markers and your own discretion. If the movie is rather long, no need to structure it all, you just have to feel the principles.

+

Estimated time: 5-10 minutes.

+
+
+


+


+


+


+


+

+

Created with the Personal Edition of HelpNDoc: Free help authoring environment

+
+ + + + + + diff --git a/help/taseditor/Title.html b/help/taseditor/Title.html new file mode 100644 index 00000000..0670e78a --- /dev/null +++ b/help/taseditor/Title.html @@ -0,0 +1,135 @@ + + + + Title + + + + + + + + + + + + + + +
+
+

Title

+ +
+
+ Next + +
+
+
+
+ +

+


+


+

TAS Editor 1.0

+


+


+

Welcome to the TAS Editor Manual!

+


+
+ + + +

Taseditor is an Integrated development environment dedicated to TASing.

+

Playing videogames in Taseditor resembles both interactive programming and drawing notes by mouse in a music editor.

+
+
+


+
+ + + + + + + + + + + + + + + +

Beginner's Guide

+

Reference

+

TAS Editor Inside

+

If you're seeing the Manual for the first time, please study this whole course

+

Look here when you need to know comprehensive specifications about limits and possibilities of TAS Editor

+

Read these docs when you wish to learn details of the system

+

Introduction

+

Program Interface

+

TASing Process

+

TASing Methodology

+

Program Customization

+

Advanced Features

+

Glossary

+

Controls

+

Navigation

+

Operations

+

Lua API

+

FAQ

+

Speedrunning Synopsis

+

Ideas

+

Implementation

+

Mistake-proofing

+

FM3 format

+
+
+


+


+


+

Author of TAS Editor v1.0: AnS

+

Assistance in testing: feos

+


+

Author of this Manual: AnS

+

English translation: AnS, feos

+


+


+


+


+


+

+

Created with the Personal Edition of HelpNDoc: Free HTML Help documentation generator

+
+ + + + + + diff --git a/help/taseditor/Toolbox.html b/help/taseditor/Toolbox.html new file mode 100644 index 00000000..1d5a3a89 --- /dev/null +++ b/help/taseditor/Toolbox.html @@ -0,0 +1,278 @@ + + + + 2.2. Toolbox + + + + + + + + + + + + + + +
+
+

2.2. Toolbox

+ + +
+
+ Parent + + Previous + + Next + +
+
+
+
+ +

+

Toolbox

+


+

+


+

The Toolbox consists of 7 sections:

+


+ +


+
+

+

+

+

The top section is allotted to the Playback controls. The Playback is the component of Taseditor dedicated to handle the game emulation: keep it paused, replay in any direction, rewind to desired frame and so on. It allows to treat video games as straightforwardly as if they were regular video recordings, disregarding the interactivity element inherent to them.

+

There are 5 buttons at the top of the window.

+

The "||" button (pause/resume) is simple graphical analog of the Pause Emulation hotkey. When you click it, the game emulation either pauses or resumes. However, if your mouse has a middle button, it's easier to press it instead of clicking the "||" button, in this case you won't need to move the mouse cursor to the Playback section.

+

The ">" button (step forward / advance 1 frame) moves the light-blue cursor 1 frame down, forcing FCEUX to emulate one frame if necessary. You can either click that button or click and hold it to make several steps forward. This button's keyboard analog is Shift + Down. If your mouse has a wheel, it's easier to hold the right mouse button and scroll the wheel 1 step down instead of using the ">" button.

+

The "<" button (step back / rewind 1 frame) moves the Playback cursor 1 frame up, displaying the previous frame's events in the FCEUX window. You can hold the button as well, when you wish to go several frames back. This button has its hotkey Frame Rewind (mapped to Backspace key by default), and has a keyboard analog: Shift + Up. If your mouse has a wheel, it's easier to hold the right mouse button and scroll the wheel 1 step up instead of using "<" button.

+

The "<<" button (fast rewind) also moves the Playback cursor back, just not by 1 frame but by multiple frames at once. This button moves the light-blue cursor to the frame where the nearest upper Marker is located. In the above picture, if you press the "<<", the light-blue cursor will jump to frame 12 (where the Marker 1 is set). Using this button you may quickly go back to the beginning of the edited segment or to any other past moment of the movie. The keyboard analog for this button is Shift + Page Up. You can also hold it – the light-blue cursor will rapidly jump on Markers up in the Piano Roll, and in the meantime you can look for the desired fragment of the movie by watching FCEUX screen.

+

The ">>" button (fast forward) jumps on Markers forward. In the above picture, if you press the ">>", the light-blue cursor will jump to frame 22 (where the Marker 2 is located). With this button you can rapidly skip to the game events forward in the movie. But in case the next Marker is out of the Greenzone range, emulator would need some time to process the unknown frames, so such jump may take some time. This button's keyboard analog is Shift + Page Down. You can click and hold this button as well.

+

As an experiment, try to make a test movie of about 1000 frames in size and set a dozen of Markers, one per every 30-50 frames. Then hold Shift and tap some Page Up / Page Down keys to feel the convenience of the fast scrolling. Alternatively you can roll the mouse wheel while holding the Shift key.

+

+

+

Below these 5 buttons you can see a progress bar and three checkboxes.

+

The Progress bar helps to estimate the time needed for Playback seeking. Immediate jumps to any frame are only possible after FCEUX emulated the game up to the target frame by applying your movie as a game Input to get the actual game state for the frame. After the actual game state was rendered at least once, it is saved into the Greenzone, so next time the emulator can instantly jump to that frame, granted that Input above the frame didn't change. If the Input was changed, a new emulation attempt is required, because even the smallest change in buttonpresses may cause serious changes in the gameplay chronology. Thus after every such change the Greenzone is automatically truncated, removing the data of all those frames that might be affected by the new Input. These frames must be emulated again, and it takes some time.

+

So, when you send the Playback cursor to a frame far from the Greenzone, instead of immediate jump the light-blue cursor starts seeking to that frame. A shadow of the light-blue cursor will be blinking at the target line of the Piano Roll, and the game images on the FCEUX screen will rapidly change as the Playback cursor runs to the target.

+

In this case you'll have to wait. The seek time depends on the distance between the target frame and the end of the Greenzone, on your computer power and a few other factors. The progress bar helps to estimate the waiting time. If you don't want to wait, left-click on the progress bar (in addition to being an indicator, it's also a button) or use the Cancel Seeking hotkey (Esc by default). Then the target frame will quit blinking, the light-blue cursor will stop and the emulation will be paused.

+

While Playback is seeking you may change the target by clicking on the desired frame row in the icons column of the Piano Roll. If you pause the emulator during seeking, the light-blue cursor will freeze and the target frame blinking will slow down, but the seeking won't be cancelled – when you unpause, the Playback cursor will continue running to the target and stop automatically after hitting it.

+

Progress bar is also used when loading and saving Taseditor project files to disk.

+

+

+

The "Turbo seek" checkbox allows to change the seeking speed. When the Turbo is on, FCEUX emulates the game on the highest speed possible, reducing the seeking time tenfold. So, if you seek to a distant frame, check that option. But during the TASing process its often necessary to see all the intermediate frames, not just the last one. In such cases you should uncheck the checkbox and maybe even slow down the emulation with the - and = hotkeys to ensure you're not missing any important detail of the gameplay.

+


+

The "Follow cursor" checkbox forces the Piano Roll to follow the movement of the Playback cursor and autoscroll the view so that the light-blue cursor is always visible. This allows you to observe the Input played back when the emulator is unpaused. But when you edit the movie you should uncheck this option to prevent the Piano Roll from running away from the edited spot.

+


+

The "Auto-restore last position" checkbox makes the Playback automatically start seeking when the Playback cursor was moved back by the Greenzone. Every time you change an Input, the Greenzone is truncated after the first changed frame, forgetting old events that became irrelevant after that change. The Playback cursor must always be inside the Greenzone, so it steps back along with it. With the auto-restore checkbox you can instantly see new events on these frames. When the checkbox is checked, any Input modification triggers the replaying of the changed segment, helping you to compare different scenarios of the game events.

+

Thanks to auto-restore TASers can focus on Input editing and rapidly go over many approaches to playing current segment of the movie. This method of TASing will be described later.

+


+
+

+

+

+

Below the Playback you can find the Recorder section. The Recorder is used to record buttons Input from keyboard (or gamepad) into the movie, just like in regular playing using any emulator.

+


+

The "Recording" checkbox turns the Recording mode on and off. Before you start recording any physical keypresses, make sure the Playback cursor is on the frame you want to record from. Then either press the "Toggle Read-only" hotkey (Q key by default), or click the Recording checkbox. The word "Recording" will appear in the TAS Editor window caption, and the message "Movie is now Read+Write" will appear on the FCEUX screen. Now you can either unpause the emulator and play the game normally, or type the buttons frame-by-frame using the Frame Advance hotkey. As the playback goes forward, the movie will fill with the data on the buttons you press.

+

You may rerecord the same segment of the movie multiple times, overwriting the old button log with new buttonpresses data. If you don't like how a segment was played (e.g. the character fell into a pit), put the Playback cursor before the frame where you made wrong buttonpresses (e.g. the A button was pressed too late) and resume Recording, this time pressing buttons properly.

+

When the segment is ready, turn the Recording mode off to prevent accidental erasing of the Input when replaying the movie. Uncheck the checkbox by mouse click or via the hotkey. When TASing in Taseditor, the Recording checkbox is usually unchecked, because direct Input editing is preferred to Recording.

+

It's recommended to rationally combine the Recorder features with those of the Piano Roll. For long and easy segments of the game it may be convenient to record buttonpresses from the keyboard or a handy USB-gamepad, but for small dislocated edits the mouse is way better.

+

+

+

The "Superimpose" checkbox in the Recorder section allows to combine the existing Input with the newly recorded data on the same segment of the movie. For example, you can draw the R buttonpresses on rather long segment with a single mouse stroke, to make the character run right. Then you can enable the "Superimpose" option, turn on Recording and play the game by pressing only jump and shoot buttons, without the need to hold Right. The character in the game will still run right, jumping and shooting on command.

+

Unlike other checkboxes, the "Superimpose" option has three possible states. In addition to "enabled" and "disabled" it can also be in an interim state between these two. The third state works like this: when the player presses some gamepad buttons during Recording, these buttons are recorded in place of old Input. But if the player presses no buttons during Recording, the old Input on these frames is not overwritten.

+

+

+

The "Use pattern" checkbox applies current pattern to the process of buttons Recording. The name of the current pattern can be seen in the upper right corner of TAS Editor window (the last item of the main menu). If you click this menu item, a pop-down menu will appear, allowing you to choose another pattern from the list.

+

Patterns are used to speed up the process of entering monotonous buttonpresses and releases. For example, when you need to shoot at maximum rate (that is, alternate 1 frame of pressing B and 1 frame when B is released), you can just choose the "Alternating (1010...)" pattern and hold the B button without caring about manual mashing. Thanks to the pattern, the B buttonpresses will be recorded only for every other frame.

+

+

+

Besides the checkboxes the Recorder section also contains radio buttons that implement the multitracking feature.

+

Multitrack Recording greatly simplifies the traditional method of TASing games made for 2 or more players. Instead of pressing buttons of both gamepads at once, you can record a short segment of controlling the Player 1 and then record actions of Player 2 on the same segment of the movie.

+

By default the Recorder is set to recording "All" pads. You can choose a single pad by clicking the respective radio button ("1P", "2P", etc – the number of available gamepads depends on your project type). You can also use the "Switch current Multitracking mode" hotkey (W key by default). Now during the Recording the emulator will accept only the chosen player's buttonpresses, and the Piano Roll columns for other pads won't change even if you accidentally press another player's buttons.

+


+
+

+

+

+

The Splicer section comes after the Recorder. It's dedicated to displaying the most necessary data used in non-linear editing of the movie.

+

Despite the similar sounding, editing TASes is totally different from using a non-linear video editing software, because Taseditor only allows you to edit Input, not the finished video footage (Output). The resulting video stream is built by the game itself.

+

In this section you can see the information on current Selection size: how many rows and columns are covered. With this info you can use the Selection as a measuring scale (ruler). E.g. to find the temporal distance between two in-game events, click the frame of the first event and stretch the Selection to the frame of another – all those frames will be selected, and in the Splicer section the message "Selection: N rows, M columns" will tell you the number of frames in question.

+

Also, here is the info about the Clipboard contents: whether it contains an Input that could be pasted to any place in the movie. When an Input is copied to the Clipboard, this line displays total amount of frames copied. The Clipboard data is stored independently of Taseditor, and it's kept there even after you close FCEUX, until some other application copies its own data to the Clipboard.

+

The "Splicer" section has no controls, because all Input splicing commands are kept in the Edit menu item and are assigned with accelerator keys. In actual TASing process it's recommended to use the keyboard combinations, because they're easy to remember and the working speed increases immensely.

+

+

+

The list of all Editing functions

+


+

Basically, these are the standard functions of any text editor, but in Taseditor they can be applied to Input in the middle of emulation, which allows to analyze the results on the fly and flexibly tune your plans.

+ +


+

When TASing in Taseditor you're going to most often use Ctrl + Delete (Delete Frames) and Ctrl + Insert (Clone Frames) to quickly move edited segments up/down in the frame list, thus performing certain in-game actions sooner or later.

+

Unlike FCEUX hotkeys, these key combinations can't be reassigned, so if you have some other emulator functions assigned to Ctrl, Insert or Delete, you'll have to change emulator settings.

+


+
+

+

+

+

Under the Splicer you can see a small Lua section.

+

There is one inactive button and one checkbox here, their purpose will be described later. While you're not familiar with Lua scripting, you won't need this section.

+

The Lua scripting language allows to automate some part of TASers' work and to create your own plug-ins for Taseditor.

+


+
+

+

+

+

Then goes the Bookmarks/Branches section. We should speak of Bookmarks at a greater length here.

+

Bookmarks are the evolution of emulator savestates. Before Taseditor the savestates were the main way to navigate the movie, with their help TASers return back to the place of a mistake and fix it. In Taseditor there are better navigation methods, but this one was left too.

+

You have 10 slots for Bookmarks in your disposal. These are numbered with digits from 0 to 9. You can set any of 10 Bookmarks to any movie frame, pointing to that frame with the Playback cursor beforehand.

+

Example 1. Set the light-blue cursor to the frame you want a Bookmark at, and make an emulator savestate (Shift + F1-F10 by default). For example, press Shift + F1 to set the first Bookmark. It will appear in the Bookmarks List, flashing one time with the red light.

+

Example 2. Set the light-blue cursor to the needed frame and right-click on any line in the Bookmarks List. For example, right-click on the line 2 to create the Bookmark in slot 2.

+


+

You can undo the Bookmark set operations with Ctrl + Z.

+

The Bookmarks List displays the frame number where each Bookmark is sat, and the real time of setting the Bookmark. If you hover the mouse cursor over a Bookmark's time (the right column in the List), you'll see the screenshot from the game.

+


+

When setting a Bookmark, Taseditor saves to the chosen slot the data about the Playback cursor position and entire movie contents. Now at any time you can either make a "spatial jump to the Bookmark" (simply returning the Playback cursor to the bookmarked place), or make a "temporal jump to the Bookmark", returning the whole movie to the state saved in the Bookmark slot.

+

To jump to a Bookmark in space, left-click on the left half of the needed Bookmark (the pale-colored half of the Bookmarks List where the frame number is displayed). Or use the keyboard – press the corresponding number key (numeric keys 0-9 are under the F1-F10 keys). You can notice the jump by seeing the light-blue cursor movement in the Piano Roll and by green flash in the Bookmarks List.

+

To jump to a Bookmark in time, left-click on the right half of the needed Bookmark (the brighter-colored half of the Bookmark List where the time is displayed). Or load the corresponding emulator savestate (keys F1-F10 by default). If any Input was changed during this jump in time (since it returns to its state at the time of creating the Bookmark), the Bookmark flashes with blue color, otherwise it flashes green, like in a simple Playback cursor jump. As usual, when an Input changes, the Greenzone truncates automatically. And of course you can undo the change using Ctrl + Z to revert the movie to its state before the time jump to the Bookmark.

+


+

So, part of the Bookmarks may be used to speed up your movie navigation. For example, set a Bookmark at the beginning of current game level to be able to return the Playback cursor to that frame and replay the level events anytime. You could use a Marker for the same purpose, but the advantage of the Bookmarks is that you can instantly jump to a Bookmark from any remote segment of the movie, no matter how many Markers are set in between, while to reach the desired Marker you would have to jump on the neighbor Markers.

+

Another part of the Bookmarks can be used to store alternative approaches to playing the same game segment. When TASing complex games we can't always immediately evaluate the optimality of a playing strategy. Sometimes TASer needs to record several different versions of playing the same segment and then carefully compare the resulting movies, choosing the most appropriate one to be left in the final TAS.

+

In traditional TASing every such movie is kept in separate file, so to switch between the alternative movies (or rather between alternative branches of your main movie) you need to load corresponding savestates created when recording these playthroughs.

+

+

In Taseditor all saved branches of the movie are held together, forming the hierarchy called the Branches Tree. To switch between the alternative branches you need to load the corresponding Bookmark, thus returning the working movie to one of the prepared versions. Basically, it's the same as before. But now we can visualize all alternative playthroughs in a graph scheme to facilitate TASer's comprehension of the multitude of options.

+

When you test a couple of approaches to playing the 2nd level of the game, the 1st level playthrough remains the same in both branches, so the discrepancy of the Input starts not from the beginning, but from the 2nd level. So, if you left the Bookmark 1 before the beginning of the 2nd level, you'll see the fork in the graph starting from the card 1.

+

As an experiment, create a new project and make a very short movie. Then set the Playback cursor to the end of existing Input and save a Bookmark into the first slot (Shift + F1). Advance a few frames after that Bookmark and draw some buttonpresses, then play this new Input and save to Bookmark 2 (Shift + F2). Now return the movie to the first Bookmark state (press F1) and add some buttonpresses after the bookmarked frame again, but make sure they are different from the last time. Play this new Input to the end and save the 3rd Bookmark (Shift + F3) or any other.

+

Now click on the header of the Bookmarks section ("Bookmarks/Branches" label). The Bookmarks List view will change to the Branches Tree view. If the third Bookmark movie differs from the second Bookmark movie, and the difference starts after the first Bookmark frame, you'll see the picture similar to the above. The cloudlet symbolizes the beginning of the movie (the root of the hierarchy). Bookmarks are presented with cards of corresponding numbers. The blue-colored number stands for the current Bookmark containing the branch that corresponds to working movie (currently displayed in the Piano Roll). If the working movie was changed after saving/loading this Bookmark, you'll see the fireball descending from the current Bookmark.

+

Red lines connect those Bookmarks that are compatible with the chronology of current working movie. For example, if you set one Bookmark at the end of every level, all such Bookmarks will be sitting on one red line, because the movie of every next Bookmark is actually composed from the movie of previous Bookmark plus an additional level playthrough.

+

The Branches Tree also displays current Playback cursor position. Try dragging the cursor in the Piano Roll up and down, or just play the whole movie back (press Shift + Home and unpause the emulator). You will see how the light-blue arrow pointer rides on red lines that connect all Bookmarks of the current timeline. E.g. if the current branch is the Bookmark 2, the pointer will ride that route: "cloudlet -> Bookmark 1 -> Bookmark 2". And the other Bookmarks will be left aside, because they represent an alternative timeline, conflicting with the currently played movie.

+

The Branches Tree is automatically rebuilt each time you create a new Bookmark or change an existing Bookmark's contents. Depending on how complex your project is, the graph may appear differently.

+


+
+ + + + + + + + + + +

+

+

+

+

+

+
+
+


+

You can hover the mouse cursor over any Bookmark number to see some info about it.

+

Also you can make a single left-click on any Bookmark card to send the Playback cursor to the bookmarked frame (spatial jump). By clicking the cloudlet you send the Playback cursor to the beginning of the movie (equal to pressing Shift + Home), and by clicking the fireball you send the Playback cursor to the end of the movie (equal to Shift + End).

+

Besides, you can double-click a Bookmark by the left mouse button to jump to the Bookmark in time. The working movie reverts to the Bookmark's state, the Bookmark becomes current branch and the Playback cursor moves to the Bookmark frame.

+

Finally, you can right-click any card to save the current movie state and the Playback cursor position to the chosen Bookmark.

+

As you see, the Branches Tree view supports the same functionality as the Bookmarks List view does. Thus it's recommended for advanced users to stick to the Branch Tree view, because it provides more info for a TASer. When you want to switch back to the Bookmarks List view, click the section header again (the "Branches" label).

+

Now try using all 10 available slots. Each time slightly change the current movie Input and watch the changes on the FCEUX screen before saving them to a Bookmark. The position of each card on the Tree is defined by the Input preceding the bookmarked frame. It's implied that TASer always watches the edited Input segment in the emulator, and only then saves the tested work into a Bookmark.

+

In hands of an experienced TASer Bookmarks become very powerful tool, allowing to greatly simplify the TASing process and implement ideas that look impossible. Usually, an idea is labeled "impossible" only due to its monstrous unbounded complexity. But lower the complexity a hundred times (with the help of tools and a smart process organization), and the achievement moves from the "impossible" category to just "hard" one.

+


+
+

+

+

+

The History section is located below the Bookmarks.

+

Taseditor keeps strict accounting of all operations in the current project. Every user's action that changes an Input, Markers or Bookmarks is recorded to the log displayed in this section.

+

The current item of the History Log is highlighted blue. Other items have white background if they aren't related to the current item, or purple background if they represent the changes made in the same place as the current item. For example, if current History Log item was created by changing the Input of frame 27, all other items affecting that frame will be highlighted purple.

+

To undo logged operations you can either use the Ctrl + Z and Ctrl + Y keys, or simply click any line in the History Log with the left mouse button, thus returning the movie to the time when the clicked item was created.

+

You may notice the purple cursor line appearing in the Piano Roll for a short moment. It's supposed to stress your attention on the place of the undone changes.

+

The maximum number of undo levels can be set in the Config menu, that value defines the maximum size of the History Log and therefore the amount of used memory.

+

The full list of all possible records in the History Log can be found in the Reference.

+


+
+

+

+

+

At the very bottom of the Toolbox there are 4 buttons controlling the Selection cursor.

+

The meaning of the "<<" and ">>" buttons can be easily guessed by analogy with the upper "<<" and ">>" buttons in the Playback section. The upper part of TAS Editor window contains the Playback cursor-related elements, and the lower window part contains Selection cursor-related elements.

+

The "<<" button (jump back) moves the Selection cursor to the frame where the nearest upper Marker is located. In the above picture it will jump from frame 27 to frame 22 where the Marker 2 is set. Using this button you can quickly return the selection to the beginning of the edited segment or to any marked segment. This button has its keyboard analog: Ctrl + Page Up. You can hold this button to let the dark-blue cursor rapidly jump on Markers up in the Piano Roll.

+

The ">>" button (jump forward) moves the Selection cursor to the nearest marked frame below it. In the above picture it will jump from frame 27 to a frame outside the visible area (where the next Marker is set), and Piano Roll will automatically scroll after the Selection cursor. Using this button you can quickly navigate down through the movie. This button has its keyboard analog: Ctrl + Page Down. You can hold this button as well.

+

Since the Selection cursor isn't tied to the game emulation, its jumps on Markers always happen instantly, regardless of the Greenzone presence on the target frame. So it's useful to read the Marker Notes one by one this way, watching them in the lower edit field and pressing Ctrl + Page Down to make an instant jump to the next Note. Besides Page Up / Page Down keys you can roll the mouse wheel while holding the Ctrl key.

+


+

The buttons "Similar" and "More" are used for searching similar Notes. This is another experimental feature of Taseditor, and it will be described later.

+


+
+


+

Now you are familiar with fundamental principles of the program usage.

+

In the next chapter: systematic approach to TASing.

+


+
+ + + +

PRACTICE: Beat the World 1-1 in Super Mario Bros (or any other game) using only the mouse, without Recording.

+

No need to do a speedrun, just make yourself familiar with the routine of Input drawing / erasing and watching the results using the mouse wheel / middle mouse button.

+

Estimated time: 20-30 minutes.

+
+
+


+


+


+


+


+

+

Created with the Personal Edition of HelpNDoc: Easily create Help documents

+
+ + + + + + diff --git a/help/taseditor/TraditionalTASing.html b/help/taseditor/TraditionalTASing.html new file mode 100644 index 00000000..eb5a3515 --- /dev/null +++ b/help/taseditor/TraditionalTASing.html @@ -0,0 +1,147 @@ + + + + 4.1. Traditional TASing + + + + + + + + + + + + + + +
+
+

4.1. Traditional TASing

+ + +
+
+ Parent + + Previous + + Next + +
+
+
+
+ +

+

Traditional TASing

+


+


+

+

This method is similar in form to normal videogames playing, however it is completely different in content and requires different way of thinking.

+

Editing Input is done here by recording a new Input over existing Input.

+

To switch between movie watching and editing you have to turn the Recording mode on and off (default hotkey is Q). It's recommended to enable the "Follow cursor" checkbox, in order to observe the recorded Input in the Piano Roll.

+


+

General activity:

+


+
    +
  1. Put the Playback cursor at the beginning of the edited segment, create a Bookmark, define the goal.
  2. +
  3. Suppose there's a mistake in the segment, weigh known factors of optimality and figure out the way to fix the mistake.
  4. +
  5. Navigate to the place of fixing the mistake (load a Bookmark and, if necessary, quickly repeat the existing Input up to the needed frame).
  6. +
  7. Play the game in Read+Write mode up to the moment when the target event occurs. The newly recorded Input should be different from old Input in this segment. While recording, create Bookmarks in free slots from time to time to speed up navigation.
  8. +
  9. If you make a mistake while typing the Input, return to step 3. If you can not reach the target event using the chosen approach, you can retreat and go to step 8.
  10. +
  11. [optional step] Save the finished approach to a temporary Bookmark, e.g. to slot 8.
  12. +
  13. If this isn't the first approach to the segment, compare the new result to the best old result, using the optimality criterion. If the new approach is better (or it's the first approach), save the result to the Bookmark 9. The slot 9 will be used for keeping the best result of polishing the segment.
  14. +
  15. If you still want to try different approaches, return to step 2, until you run out of ideas.
  16. +
  17. [optional step] If you need more ideas, you can get some information from the past by replaying the old segments of the movie (e.g. load the Bookmark 0 left at the beginning of current level). Also you can get some food for the mind from the future, by playing with the game events happening after the current segment.
  18. +
  19. When there's no more ideas, restore the best approach from the Bookmark 9 into the current movie and proceed to the next segment.
  20. +
+


+
+


+

When you're making a test playthrough of the game (i.e. playing with savestates, but without polishing), you only do steps 3 – 5. And you are satisfied with any successful accomplishment of a segment, so after reaching the target for the first time you proceed to the next segment right away. In this kind of playing you only use savestates to speed up navigation in case you make a fatal mistake (e.g. didn't press the A button in time and fell into the pit), because you don't want to rewrite existing Input from the very beginning of the game.

+

But when you're seriously TASing the game, you need to try many different approaches in order to find the best one. So you have to repeat steps 2 – 8 many times, until you think the segment is played perfectly. The steps 6 – 9 are what distinguishes real TASing from casual playing with savestates.

+

The process of Input Recording (step 4) means that you're editing the Input right while watching the results. That is, when watching the game state at the frame 200 you prepare the Input for the frame 201 (lay fingers on necessary buttons) and then pass the Input to the game using Frame Advance, and immediately see the outcome – the game state at the frame 201 (granted that you look at the Memory Watch, because the game screen rendering is one frame behind). Usually this outcome is only an intermediate result, which means you can use it to estimate your progress (step 5) but should not use it to compare current and previous approaches of playing the segment (step 7). So you shouldn't apply the optimality criterion after every frame. Even if at the beginning of the segment you outrun the previous approach, you may fall behind somewhere in the middle. Only when you reach the end of the segment (step 6) you get an objective base for comparing.

+

Steps 3 and 4 take the most of time in this cycle. Often before reaching the target event you have to repeat steps 3, 5 and 5 several times in a row, recording and discarding decisions that are obviously wrong even without comparing them to old approaches. For example, if in the middle of acceleration Mario gets killed by an enemy, there's no point in entering the remaining buttons needed for acceleration. You have to return back and rewrite the Input in such a way that the enemy misses. In a tough situation it's even better to break current segment into two subsegments (before and after the interaction with the enemy), in order to optimize them separately. If you don't do so, you will probably become tired after finishing the first approach, and you'll decide to leave the segment as it is. See, you've got to manage your effort optimally as well!

+

+

+

Since the Input editing in this method is done using the Playback cursor (and not the mouse cursor), for an effective work you must learn to quickly deliver the light-blue cursor to any frame necessary. Upon gaining an experience, TASers accustom themselves to "juggle" with Bookmarks using the motor memory. They mechanically create intermediate and auxillary Bookmarks while recording the Input, and find the necessary Bookmark slot without looking.

+

This virtuosity comes with time, usually after having finished a couple of TASes. You cultivate certain habits, one finger adheres to Frame Advance, Bookmark slots become logically distributed according to their duties, so that fingers press right keys at right moments. For example, that's how some TASers distribute 10 slots:

+


+

+


+ +


+

This skill is very similar to the skill of playing a musical instrument. The quicker you work it out, the better, because until you master it you will think the traditional TASing is too tiresome. That's why many people consider the bar to be too high. But once you master the technique of rapid savestates usage, other intricacies of TASing will come easier.

+

However, now there is Taseditor. It revokes the need to train fingers, allowing to quickly navigate the movie without using Bookmarks. Also, you don't need to accustom to constant backups into F1, since there is the History Log. So technically you can forget about the traditional method and right away start editing the movie and testing approaches using the nonlinear method of TASing.

+

Anyway, Taseditor slightly expands possibilities of the traditional method:

+ +


+
+


+

Pros of the method:

+

+ The process is intuitive for any gamer.

+

+ Constant feedback allows to adapt to the game while editing the Input, adjust your decisions and discard incorrect approaches prematurely.

+

+ The boundaries of current segment are always marked with Bookmarks (for navigation), thus training TASer to be orderly.

+


+

Cons of the method:

+

The insistent game feedback provokes TASer to discard some illogical but potentially advantageous approaches.

+

Slow navigation may distract and increase fatigability.

+

Since the number of Bookmarks is limited, the markings of previous segments are lost when creating a new segment, so you have to write down some things in a text file.

+


+

When the method is recommended to use: never. You can use the Recording to make the first test playthrough of a segment (or the whole game), i.e. when you don't need precision. But for polishing a segment this method is inferior. Yet it's reasonable to learn it, because many modern emulators have sufficient tools for applying the method, while Taseditor is only in FCEUX as yet.

+


+

The next method is more effective, but it even less resembles a normal gaming.

+


+


+


+


+


+

+

Created with the Personal Edition of HelpNDoc: Easily create CHM Help documents

+
+ + + + + + diff --git a/help/taseditor/css/base.css b/help/taseditor/css/base.css new file mode 100644 index 00000000..e3b8b2dc --- /dev/null +++ b/help/taseditor/css/base.css @@ -0,0 +1,111 @@ +body { + background-color: #fff; + overflow: auto; + width: 100%; +} + +.clear { + border: 0; + clear: both; + margin: 0; + padding: 0; +} + +#topic_header, #topic_footer, +#toc_header, #toc_footer { + padding: 10px; +} + +#topic_content, +#toc_content{ + margin: 10px; +} + +/* Backgrounds */ + +#topic_header { + background: #fff url(../img/header-bg.png) repeat-x left top; + border-bottom: 1px solid #ccc; + margin-bottom: 15px; +} + +#topic_footer{ + background: #fff url(../img/footer-bg.png) repeat-x left top; + margin-top: 20px; +} + +/* Topic */ + +#topic_header #topic_header_content { + float: left; +} + +#topic_header #topic_header_nav { + float: right; +} + +#topic_header #topic_header_nav img { + margin-left: 5px; +} + +#topic_header a, +#topic_footer a, +#search_results a, +#popupMenu a { + color: #333; + text-decoration: none; +} + +#topic_header a:hover, +#topic_footer a:hover, +#search_results a:hover, +#popupMenu a:hover{ + text-decoration: underline; +} + +#topic_header h1 { + color: #333; + font-size: 18px; +} + +#topic_footer { + font-size: 11px; +} + +#topic_breadcrumb { + font-size: 11px; +} + +/* Popup */ + +#popupMenu { + background-color: #eee; + border: 1px solid #999; + position: absolute; + padding: 5px; + webkit-box-shadow: 0px 0px 5px #cccccc; + -moz-box-shadow: 0px 0px 5px #cccccc; + box-shadow: 0px 0px 5px #cccccc; +} + +#popupMenu a{ + display: block; + margin: 5px 10px 2px 5px; +} + +.close-button{ + color: #666; + cursor: hand; + cursor: pointer; + float: right; + font-size: 10px; + position: relative; + top: -5px; + right: -3px; +} + +/* Search highlight */ + +.highlight { + background-color: yellow; +} \ No newline at end of file diff --git a/help/taseditor/css/dynatree/chm/0.png b/help/taseditor/css/dynatree/chm/0.png new file mode 100644 index 00000000..0189cda7 Binary files /dev/null and b/help/taseditor/css/dynatree/chm/0.png differ diff --git a/help/taseditor/css/dynatree/chm/1.png b/help/taseditor/css/dynatree/chm/1.png new file mode 100644 index 00000000..01335b02 Binary files /dev/null and b/help/taseditor/css/dynatree/chm/1.png differ diff --git a/help/taseditor/css/dynatree/chm/10.png b/help/taseditor/css/dynatree/chm/10.png new file mode 100644 index 00000000..86c1b70c Binary files /dev/null and b/help/taseditor/css/dynatree/chm/10.png differ diff --git a/help/taseditor/css/dynatree/chm/11.png b/help/taseditor/css/dynatree/chm/11.png new file mode 100644 index 00000000..60da1797 Binary files /dev/null and b/help/taseditor/css/dynatree/chm/11.png differ diff --git a/help/taseditor/css/dynatree/chm/12.png b/help/taseditor/css/dynatree/chm/12.png new file mode 100644 index 00000000..7977cad2 Binary files /dev/null and b/help/taseditor/css/dynatree/chm/12.png differ diff --git a/help/taseditor/css/dynatree/chm/13.png b/help/taseditor/css/dynatree/chm/13.png new file mode 100644 index 00000000..2d6b99eb Binary files /dev/null and b/help/taseditor/css/dynatree/chm/13.png differ diff --git a/help/taseditor/css/dynatree/chm/14.png b/help/taseditor/css/dynatree/chm/14.png new file mode 100644 index 00000000..c6150b5f Binary files /dev/null and b/help/taseditor/css/dynatree/chm/14.png differ diff --git a/help/taseditor/css/dynatree/chm/15.png b/help/taseditor/css/dynatree/chm/15.png new file mode 100644 index 00000000..58f205ff Binary files /dev/null and b/help/taseditor/css/dynatree/chm/15.png differ diff --git a/help/taseditor/css/dynatree/chm/16.png b/help/taseditor/css/dynatree/chm/16.png new file mode 100644 index 00000000..746f6c4e Binary files /dev/null and b/help/taseditor/css/dynatree/chm/16.png differ diff --git a/help/taseditor/css/dynatree/chm/17.png b/help/taseditor/css/dynatree/chm/17.png new file mode 100644 index 00000000..e450e6b6 Binary files /dev/null and b/help/taseditor/css/dynatree/chm/17.png differ diff --git a/help/taseditor/css/dynatree/chm/18.png b/help/taseditor/css/dynatree/chm/18.png new file mode 100644 index 00000000..fae8d066 Binary files /dev/null and b/help/taseditor/css/dynatree/chm/18.png differ diff --git a/help/taseditor/css/dynatree/chm/19.png b/help/taseditor/css/dynatree/chm/19.png new file mode 100644 index 00000000..557aa37b Binary files /dev/null and b/help/taseditor/css/dynatree/chm/19.png differ diff --git a/help/taseditor/css/dynatree/chm/2.png b/help/taseditor/css/dynatree/chm/2.png new file mode 100644 index 00000000..38870794 Binary files /dev/null and b/help/taseditor/css/dynatree/chm/2.png differ diff --git a/help/taseditor/css/dynatree/chm/20.png b/help/taseditor/css/dynatree/chm/20.png new file mode 100644 index 00000000..cb6845bc Binary files /dev/null and b/help/taseditor/css/dynatree/chm/20.png differ diff --git a/help/taseditor/css/dynatree/chm/21.png b/help/taseditor/css/dynatree/chm/21.png new file mode 100644 index 00000000..bfb11c91 Binary files /dev/null and b/help/taseditor/css/dynatree/chm/21.png differ diff --git a/help/taseditor/css/dynatree/chm/22.png b/help/taseditor/css/dynatree/chm/22.png new file mode 100644 index 00000000..17ed9c5b Binary files /dev/null and b/help/taseditor/css/dynatree/chm/22.png differ diff --git a/help/taseditor/css/dynatree/chm/23.png b/help/taseditor/css/dynatree/chm/23.png new file mode 100644 index 00000000..1c4a863b Binary files /dev/null and b/help/taseditor/css/dynatree/chm/23.png differ diff --git a/help/taseditor/css/dynatree/chm/24.png b/help/taseditor/css/dynatree/chm/24.png new file mode 100644 index 00000000..e91b518c Binary files /dev/null and b/help/taseditor/css/dynatree/chm/24.png differ diff --git a/help/taseditor/css/dynatree/chm/25.png b/help/taseditor/css/dynatree/chm/25.png new file mode 100644 index 00000000..00d2d5d3 Binary files /dev/null and b/help/taseditor/css/dynatree/chm/25.png differ diff --git a/help/taseditor/css/dynatree/chm/26.png b/help/taseditor/css/dynatree/chm/26.png new file mode 100644 index 00000000..4952af63 Binary files /dev/null and b/help/taseditor/css/dynatree/chm/26.png differ diff --git a/help/taseditor/css/dynatree/chm/27.png b/help/taseditor/css/dynatree/chm/27.png new file mode 100644 index 00000000..a61fe9bd Binary files /dev/null and b/help/taseditor/css/dynatree/chm/27.png differ diff --git a/help/taseditor/css/dynatree/chm/28.png b/help/taseditor/css/dynatree/chm/28.png new file mode 100644 index 00000000..52160f07 Binary files /dev/null and b/help/taseditor/css/dynatree/chm/28.png differ diff --git a/help/taseditor/css/dynatree/chm/29.png b/help/taseditor/css/dynatree/chm/29.png new file mode 100644 index 00000000..06aa97cb Binary files /dev/null and b/help/taseditor/css/dynatree/chm/29.png differ diff --git a/help/taseditor/css/dynatree/chm/3.png b/help/taseditor/css/dynatree/chm/3.png new file mode 100644 index 00000000..b1c94138 Binary files /dev/null and b/help/taseditor/css/dynatree/chm/3.png differ diff --git a/help/taseditor/css/dynatree/chm/30.png b/help/taseditor/css/dynatree/chm/30.png new file mode 100644 index 00000000..7b52276d Binary files /dev/null and b/help/taseditor/css/dynatree/chm/30.png differ diff --git a/help/taseditor/css/dynatree/chm/31.png b/help/taseditor/css/dynatree/chm/31.png new file mode 100644 index 00000000..02283dbb Binary files /dev/null and b/help/taseditor/css/dynatree/chm/31.png differ diff --git a/help/taseditor/css/dynatree/chm/32.png b/help/taseditor/css/dynatree/chm/32.png new file mode 100644 index 00000000..875843c5 Binary files /dev/null and b/help/taseditor/css/dynatree/chm/32.png differ diff --git a/help/taseditor/css/dynatree/chm/33.png b/help/taseditor/css/dynatree/chm/33.png new file mode 100644 index 00000000..d64f1371 Binary files /dev/null and b/help/taseditor/css/dynatree/chm/33.png differ diff --git a/help/taseditor/css/dynatree/chm/34.png b/help/taseditor/css/dynatree/chm/34.png new file mode 100644 index 00000000..a6d94c5d Binary files /dev/null and b/help/taseditor/css/dynatree/chm/34.png differ diff --git a/help/taseditor/css/dynatree/chm/35.png b/help/taseditor/css/dynatree/chm/35.png new file mode 100644 index 00000000..dfc87bf7 Binary files /dev/null and b/help/taseditor/css/dynatree/chm/35.png differ diff --git a/help/taseditor/css/dynatree/chm/36.png b/help/taseditor/css/dynatree/chm/36.png new file mode 100644 index 00000000..ce6235b2 Binary files /dev/null and b/help/taseditor/css/dynatree/chm/36.png differ diff --git a/help/taseditor/css/dynatree/chm/37.png b/help/taseditor/css/dynatree/chm/37.png new file mode 100644 index 00000000..01203304 Binary files /dev/null and b/help/taseditor/css/dynatree/chm/37.png differ diff --git a/help/taseditor/css/dynatree/chm/38.png b/help/taseditor/css/dynatree/chm/38.png new file mode 100644 index 00000000..5334faee Binary files /dev/null and b/help/taseditor/css/dynatree/chm/38.png differ diff --git a/help/taseditor/css/dynatree/chm/39.png b/help/taseditor/css/dynatree/chm/39.png new file mode 100644 index 00000000..06e446b8 Binary files /dev/null and b/help/taseditor/css/dynatree/chm/39.png differ diff --git a/help/taseditor/css/dynatree/chm/4.png b/help/taseditor/css/dynatree/chm/4.png new file mode 100644 index 00000000..6e5cfc09 Binary files /dev/null and b/help/taseditor/css/dynatree/chm/4.png differ diff --git a/help/taseditor/css/dynatree/chm/40.png b/help/taseditor/css/dynatree/chm/40.png new file mode 100644 index 00000000..6d744dbe Binary files /dev/null and b/help/taseditor/css/dynatree/chm/40.png differ diff --git a/help/taseditor/css/dynatree/chm/41.png b/help/taseditor/css/dynatree/chm/41.png new file mode 100644 index 00000000..476edf46 Binary files /dev/null and b/help/taseditor/css/dynatree/chm/41.png differ diff --git a/help/taseditor/css/dynatree/chm/5.png b/help/taseditor/css/dynatree/chm/5.png new file mode 100644 index 00000000..1df634fe Binary files /dev/null and b/help/taseditor/css/dynatree/chm/5.png differ diff --git a/help/taseditor/css/dynatree/chm/6.png b/help/taseditor/css/dynatree/chm/6.png new file mode 100644 index 00000000..947d9c40 Binary files /dev/null and b/help/taseditor/css/dynatree/chm/6.png differ diff --git a/help/taseditor/css/dynatree/chm/7.png b/help/taseditor/css/dynatree/chm/7.png new file mode 100644 index 00000000..a3628866 Binary files /dev/null and b/help/taseditor/css/dynatree/chm/7.png differ diff --git a/help/taseditor/css/dynatree/chm/8.png b/help/taseditor/css/dynatree/chm/8.png new file mode 100644 index 00000000..5bcd3eca Binary files /dev/null and b/help/taseditor/css/dynatree/chm/8.png differ diff --git a/help/taseditor/css/dynatree/chm/9.png b/help/taseditor/css/dynatree/chm/9.png new file mode 100644 index 00000000..3b4991d8 Binary files /dev/null and b/help/taseditor/css/dynatree/chm/9.png differ diff --git a/help/taseditor/css/dynatree/chm/icons.gif b/help/taseditor/css/dynatree/chm/icons.gif new file mode 100644 index 00000000..c0ccac1b Binary files /dev/null and b/help/taseditor/css/dynatree/chm/icons.gif differ diff --git a/help/taseditor/css/dynatree/chm/loading.gif b/help/taseditor/css/dynatree/chm/loading.gif new file mode 100644 index 00000000..251df054 Binary files /dev/null and b/help/taseditor/css/dynatree/chm/loading.gif differ diff --git a/help/taseditor/css/dynatree/chm/ui.dynatree.css b/help/taseditor/css/dynatree/chm/ui.dynatree.css new file mode 100644 index 00000000..8da01f51 --- /dev/null +++ b/help/taseditor/css/dynatree/chm/ui.dynatree.css @@ -0,0 +1,440 @@ +/******************************************************************************* + * Tree container + */ +ul.dynatree-container +{ + font-family: tahoma, arial, helvetica; + font-size: 10pt; /* font size should not be too big */ + white-space: nowrap; + padding: 3px; + margin: 0; /* issue 201 */ + background-color: white; + border: 1px dotted gray; + overflow: auto; + height: 100%; /* issue 263 */ +} + +ul.dynatree-container ul +{ + padding: 0 0 0 16px; + margin: 0; +} + +ul.dynatree-container li +{ + list-style-image: none; + list-style-position: outside; + list-style-type: none; + -moz-background-clip:border; + -moz-background-inline-policy: continuous; + -moz-background-origin: padding; + background-attachment: scroll; + background-color: transparent; + background-repeat: repeat-y; + background-image: url("vline.gif"); + background-position: 0 0; + /* + background-image: url("icons_96x256.gif"); + background-position: -80px -64px; + */ + margin: 0; + padding: 1px 0 0 0; +} +/* Suppress lines for last child node */ +ul.dynatree-container li.dynatree-lastsib +{ + background-image: none; +} +/* Suppress lines if level is fixed expanded (option minExpandLevel) */ +ul.dynatree-no-connector > li +{ + background-image: none; +} + +/* Style, when control is disabled */ +.ui-dynatree-disabled ul.dynatree-container +{ + opacity: 0.5; +/* filter: alpha(opacity=50); /* Yields a css warning */ + background-color: silver; +} + +/******************************************************************************* + * Common icon definitions + */ +span.dynatree-empty, +span.dynatree-vline, +span.dynatree-connector, +span.dynatree-expander, +span.dynatree-icon, +span.dynatree-checkbox, +span.dynatree-radio, +span.dynatree-drag-helper-img, +#dynatree-drop-marker +{ + width: 16px; + height: 16px; +/* display: -moz-inline-box; /* @ FF 1+2 removed for issue 221 */ +/* -moz-box-align: start; /* issue 221 */ + display: inline-block; /* Required to make a span sizeable */ + vertical-align: top; + background-repeat: no-repeat; + background-position: left; + background-image: url("icons.gif"); + background-position: 0 0; +} + +/** Used by 'icon' node option: */ +ul.dynatree-container img +{ + width: 16px; + height: 16px; + margin-left: 3px; + vertical-align: top; + border-style: none; +} + + +/******************************************************************************* + * Lines and connectors + */ + +span.dynatree-connector +{ + background-position: -16px -64px; +} + +/******************************************************************************* + * Expander icon + * Note: IE6 doesn't correctly evaluate multiples class names, + * so we create combined class names that can be used in the CSS. + * + * Prefix: dynatree-exp- + * 1st character: 'e': expanded, 'c': collapsed + * 2nd character (optional): 'd': lazy (Delayed) + * 3rd character (optional): 'l': Last sibling + */ + +span.dynatree-expander +{ + background-position: 0px -80px; + cursor: pointer; +} +.dynatree-exp-cl span.dynatree-expander /* Collapsed, not delayed, last sibling */ +{ + background-position: 0px -96px; +} +.dynatree-exp-cd span.dynatree-expander /* Collapsed, delayed, not last sibling */ +{ + background-position: -64px -80px; +} +.dynatree-exp-cdl span.dynatree-expander /* Collapsed, delayed, last sibling */ +{ + background-position: -64px -96px; +} +.dynatree-exp-e span.dynatree-expander, /* Expanded, not delayed, not last sibling */ +.dynatree-exp-ed span.dynatree-expander /* Expanded, delayed, not last sibling */ +{ + background-position: -32px -80px; +} +.dynatree-exp-el span.dynatree-expander, /* Expanded, not delayed, last sibling */ +.dynatree-exp-edl span.dynatree-expander /* Expanded, delayed, last sibling */ +{ + background-position: -32px -96px; +} +.dynatree-loading span.dynatree-expander /* 'Loading' status overrides all others */ +{ + background-position: 0 0; + background-image: url("loading.gif"); +} + + +/******************************************************************************* + * Checkbox icon + */ +span.dynatree-checkbox +{ + margin-left: 3px; + background-position: 0px -32px; +} +span.dynatree-checkbox:hover +{ + background-position: -16px -32px; +} + +.dynatree-partsel span.dynatree-checkbox +{ + background-position: -64px -32px; +} +.dynatree-partsel span.dynatree-checkbox:hover +{ + background-position: -80px -32px; +} + +.dynatree-selected span.dynatree-checkbox +{ + background-position: -32px -32px; +} +.dynatree-selected span.dynatree-checkbox:hover +{ + background-position: -48px -32px; +} + +/******************************************************************************* + * Radiobutton icon + * This is a customization, that may be activated by overriding the 'checkbox' + * class name as 'dynatree-radio' in the tree options. + */ +span.dynatree-radio +{ + margin-left: 3px; + background-position: 0px -48px; +} +span.dynatree-radio:hover +{ + background-position: -16px -48px; +} + +.dynatree-partsel span.dynatree-radio +{ + background-position: -64px -48px; +} +.dynatree-partsel span.dynatree-radio:hover +{ + background-position: -80px -48px; +} + +.dynatree-selected span.dynatree-radio +{ + background-position: -32px -48px; +} +.dynatree-selected span.dynatree-radio:hover +{ + background-position: -48px -48px; +} + +/******************************************************************************* + * Node type icon + * Note: IE6 doesn't correctly evaluate multiples class names, + * so we create combined class names that can be used in the CSS. + * + * Prefix: dynatree-ico- + * 1st character: 'e': expanded, 'c': collapsed + * 2nd character (optional): 'f': folder + */ + +span.dynatree-icon /* Default icon */ +{ + margin-left: 3px; + background-position: 0px 0px; +} + +.dynatree-ico-cf span.dynatree-icon /* Collapsed Folder */ +{ + background-position: 0px -16px; +} + +.dynatree-ico-ef span.dynatree-icon /* Expanded Folder */ +{ + background-position: -64px -16px; +} + +/* Status node icons */ + +.dynatree-statusnode-wait span.dynatree-icon +{ + background-image: url("loading.gif"); +} + +.dynatree-statusnode-error span.dynatree-icon +{ + background-position: 0px -112px; +/* background-image: url("ltError.gif");*/ +} + +/******************************************************************************* + * Node titles + */ + +/* @Chrome: otherwise hit area of node titles is broken (issue 133) + Removed again for issue 165; (133 couldn't be reproduced) */ +span.dynatree-node +{ +/* display: -moz-inline-box; /* issue 133, 165, 172, 192. removed for issue 221*/ +/* -moz-box-align: start; /* issue 221 */ +/* display: inline-block; /* Required to make a span sizeable */ +} + + +/* Remove blue color and underline from title links */ +ul.dynatree-container a +/*, ul.dynatree-container a:visited*/ +{ + color: black; /* inherit doesn't work on IE */ + text-decoration: none; + vertical-align: top; + margin: 0px; + margin-left: 3px; +/* outline: 0; /* @ Firefox, prevent dotted border after click */ +} + +ul.dynatree-container a:hover +{ +/* text-decoration: underline; */ + background-color: #F2F7FD; /* light blue */ + border-color: #B8D6FB; /* darker light blue */ +} + +span.dynatree-node a +{ + font-size: 10pt; /* required for IE, quirks mode */ + display: inline-block; /* Better alignment, when title contains
*/ +/* vertical-align: top;*/ + padding-left: 3px; + padding-right: 3px; /* Otherwise italic font will be outside bounds */ + /* line-height: 16px; /* should be the same as img height, in case 16 px */ +} +span.dynatree-folder a +{ + font-weight: bold; +} + +ul.dynatree-container a:focus, +span.dynatree-focused a:link /* @IE */ +{ + background-color: #EFEBDE; /* gray */ +} + +span.dynatree-has-children a +{ +} + +span.dynatree-expanded a +{ +} + +span.dynatree-selected a +{ + color: green; + font-style: italic; +} + +span.dynatree-active a +{ + background-color: #3169C6 !important; + color: white !important; /* @ IE6 */ +} + +/******************************************************************************* + * Drag'n'drop support + */ + +/*** Helper object ************************************************************/ +div.dynatree-drag-helper +{ +} +div.dynatree-drag-helper a +{ + border: 1px solid gray; + background-color: white; + padding-left: 5px; + padding-right: 5px; + opacity: 0.8; +} +span.dynatree-drag-helper-img +{ + /* + position: relative; + left: -16px; + */ +} +div.dynatree-drag-helper /*.dynatree-drop-accept*/ +{ + +/* border-color: green; + background-color: red;*/ +} +div.dynatree-drop-accept span.dynatree-drag-helper-img +{ + background-position: -32px -112px; +} +div.dynatree-drag-helper.dynatree-drop-reject +{ + border-color: red; +} +div.dynatree-drop-reject span.dynatree-drag-helper-img +{ + background-position: -16px -112px; +} + +/*** Drop marker icon *********************************************************/ + +#dynatree-drop-marker +{ + width: 24px; + position: absolute; + background-position: 0 -128px; + margin: 0; +/* border: 1px solid red; */ +} +#dynatree-drop-marker.dynatree-drop-after, +#dynatree-drop-marker.dynatree-drop-before +{ + width:64px; + background-position: 0 -144px; +} +#dynatree-drop-marker.dynatree-drop-copy +{ + background-position: -64px -128px; +} +#dynatree-drop-marker.dynatree-drop-move +{ + background-position: -64px -128px; +} + +/*** Source node while dragging ***********************************************/ + +span.dynatree-drag-source +{ + /* border: 1px dotted gray; */ + background-color: #e0e0e0; +} +span.dynatree-drag-source a +{ + color: gray; +} + +/*** Target node while dragging cursor is over it *****************************/ + +span.dynatree-drop-target +{ + /*border: 1px solid gray;*/ +} +span.dynatree-drop-target a +{ +} +span.dynatree-drop-target.dynatree-drop-accept a +{ + /*border: 1px solid green;*/ + background-color: #3169C6 !important; + color: white !important; /* @ IE6 */ + text-decoration: none; +} +span.dynatree-drop-target.dynatree-drop-reject +{ + /*border: 1px solid red;*/ +} +span.dynatree-drop-target.dynatree-drop-after a +{ +} + + +/******************************************************************************* + * Custom node classes (sample) + */ + +span.custom1 a +{ + background-color: maroon; + color: yellow; +} diff --git a/help/taseditor/css/dynatree/chm/vline.gif b/help/taseditor/css/dynatree/chm/vline.gif new file mode 100644 index 00000000..1b00ae50 Binary files /dev/null and b/help/taseditor/css/dynatree/chm/vline.gif differ diff --git a/help/taseditor/css/dynatree/folder/0.png b/help/taseditor/css/dynatree/folder/0.png new file mode 100644 index 00000000..0189cda7 Binary files /dev/null and b/help/taseditor/css/dynatree/folder/0.png differ diff --git a/help/taseditor/css/dynatree/folder/1.png b/help/taseditor/css/dynatree/folder/1.png new file mode 100644 index 00000000..01335b02 Binary files /dev/null and b/help/taseditor/css/dynatree/folder/1.png differ diff --git a/help/taseditor/css/dynatree/folder/10.png b/help/taseditor/css/dynatree/folder/10.png new file mode 100644 index 00000000..86c1b70c Binary files /dev/null and b/help/taseditor/css/dynatree/folder/10.png differ diff --git a/help/taseditor/css/dynatree/folder/11.png b/help/taseditor/css/dynatree/folder/11.png new file mode 100644 index 00000000..60da1797 Binary files /dev/null and b/help/taseditor/css/dynatree/folder/11.png differ diff --git a/help/taseditor/css/dynatree/folder/12.png b/help/taseditor/css/dynatree/folder/12.png new file mode 100644 index 00000000..7977cad2 Binary files /dev/null and b/help/taseditor/css/dynatree/folder/12.png differ diff --git a/help/taseditor/css/dynatree/folder/13.png b/help/taseditor/css/dynatree/folder/13.png new file mode 100644 index 00000000..2d6b99eb Binary files /dev/null and b/help/taseditor/css/dynatree/folder/13.png differ diff --git a/help/taseditor/css/dynatree/folder/14.png b/help/taseditor/css/dynatree/folder/14.png new file mode 100644 index 00000000..c6150b5f Binary files /dev/null and b/help/taseditor/css/dynatree/folder/14.png differ diff --git a/help/taseditor/css/dynatree/folder/15.png b/help/taseditor/css/dynatree/folder/15.png new file mode 100644 index 00000000..58f205ff Binary files /dev/null and b/help/taseditor/css/dynatree/folder/15.png differ diff --git a/help/taseditor/css/dynatree/folder/16.png b/help/taseditor/css/dynatree/folder/16.png new file mode 100644 index 00000000..746f6c4e Binary files /dev/null and b/help/taseditor/css/dynatree/folder/16.png differ diff --git a/help/taseditor/css/dynatree/folder/17.png b/help/taseditor/css/dynatree/folder/17.png new file mode 100644 index 00000000..e450e6b6 Binary files /dev/null and b/help/taseditor/css/dynatree/folder/17.png differ diff --git a/help/taseditor/css/dynatree/folder/18.png b/help/taseditor/css/dynatree/folder/18.png new file mode 100644 index 00000000..fae8d066 Binary files /dev/null and b/help/taseditor/css/dynatree/folder/18.png differ diff --git a/help/taseditor/css/dynatree/folder/19.png b/help/taseditor/css/dynatree/folder/19.png new file mode 100644 index 00000000..557aa37b Binary files /dev/null and b/help/taseditor/css/dynatree/folder/19.png differ diff --git a/help/taseditor/css/dynatree/folder/2.png b/help/taseditor/css/dynatree/folder/2.png new file mode 100644 index 00000000..38870794 Binary files /dev/null and b/help/taseditor/css/dynatree/folder/2.png differ diff --git a/help/taseditor/css/dynatree/folder/20.png b/help/taseditor/css/dynatree/folder/20.png new file mode 100644 index 00000000..cb6845bc Binary files /dev/null and b/help/taseditor/css/dynatree/folder/20.png differ diff --git a/help/taseditor/css/dynatree/folder/21.png b/help/taseditor/css/dynatree/folder/21.png new file mode 100644 index 00000000..bfb11c91 Binary files /dev/null and b/help/taseditor/css/dynatree/folder/21.png differ diff --git a/help/taseditor/css/dynatree/folder/22.png b/help/taseditor/css/dynatree/folder/22.png new file mode 100644 index 00000000..17ed9c5b Binary files /dev/null and b/help/taseditor/css/dynatree/folder/22.png differ diff --git a/help/taseditor/css/dynatree/folder/23.png b/help/taseditor/css/dynatree/folder/23.png new file mode 100644 index 00000000..1c4a863b Binary files /dev/null and b/help/taseditor/css/dynatree/folder/23.png differ diff --git a/help/taseditor/css/dynatree/folder/24.png b/help/taseditor/css/dynatree/folder/24.png new file mode 100644 index 00000000..e91b518c Binary files /dev/null and b/help/taseditor/css/dynatree/folder/24.png differ diff --git a/help/taseditor/css/dynatree/folder/25.png b/help/taseditor/css/dynatree/folder/25.png new file mode 100644 index 00000000..00d2d5d3 Binary files /dev/null and b/help/taseditor/css/dynatree/folder/25.png differ diff --git a/help/taseditor/css/dynatree/folder/26.png b/help/taseditor/css/dynatree/folder/26.png new file mode 100644 index 00000000..4952af63 Binary files /dev/null and b/help/taseditor/css/dynatree/folder/26.png differ diff --git a/help/taseditor/css/dynatree/folder/27.png b/help/taseditor/css/dynatree/folder/27.png new file mode 100644 index 00000000..a61fe9bd Binary files /dev/null and b/help/taseditor/css/dynatree/folder/27.png differ diff --git a/help/taseditor/css/dynatree/folder/28.png b/help/taseditor/css/dynatree/folder/28.png new file mode 100644 index 00000000..52160f07 Binary files /dev/null and b/help/taseditor/css/dynatree/folder/28.png differ diff --git a/help/taseditor/css/dynatree/folder/29.png b/help/taseditor/css/dynatree/folder/29.png new file mode 100644 index 00000000..06aa97cb Binary files /dev/null and b/help/taseditor/css/dynatree/folder/29.png differ diff --git a/help/taseditor/css/dynatree/folder/3.png b/help/taseditor/css/dynatree/folder/3.png new file mode 100644 index 00000000..b1c94138 Binary files /dev/null and b/help/taseditor/css/dynatree/folder/3.png differ diff --git a/help/taseditor/css/dynatree/folder/30.png b/help/taseditor/css/dynatree/folder/30.png new file mode 100644 index 00000000..7b52276d Binary files /dev/null and b/help/taseditor/css/dynatree/folder/30.png differ diff --git a/help/taseditor/css/dynatree/folder/31.png b/help/taseditor/css/dynatree/folder/31.png new file mode 100644 index 00000000..02283dbb Binary files /dev/null and b/help/taseditor/css/dynatree/folder/31.png differ diff --git a/help/taseditor/css/dynatree/folder/32.png b/help/taseditor/css/dynatree/folder/32.png new file mode 100644 index 00000000..875843c5 Binary files /dev/null and b/help/taseditor/css/dynatree/folder/32.png differ diff --git a/help/taseditor/css/dynatree/folder/33.png b/help/taseditor/css/dynatree/folder/33.png new file mode 100644 index 00000000..d64f1371 Binary files /dev/null and b/help/taseditor/css/dynatree/folder/33.png differ diff --git a/help/taseditor/css/dynatree/folder/34.png b/help/taseditor/css/dynatree/folder/34.png new file mode 100644 index 00000000..a6d94c5d Binary files /dev/null and b/help/taseditor/css/dynatree/folder/34.png differ diff --git a/help/taseditor/css/dynatree/folder/35.png b/help/taseditor/css/dynatree/folder/35.png new file mode 100644 index 00000000..dfc87bf7 Binary files /dev/null and b/help/taseditor/css/dynatree/folder/35.png differ diff --git a/help/taseditor/css/dynatree/folder/36.png b/help/taseditor/css/dynatree/folder/36.png new file mode 100644 index 00000000..ce6235b2 Binary files /dev/null and b/help/taseditor/css/dynatree/folder/36.png differ diff --git a/help/taseditor/css/dynatree/folder/37.png b/help/taseditor/css/dynatree/folder/37.png new file mode 100644 index 00000000..01203304 Binary files /dev/null and b/help/taseditor/css/dynatree/folder/37.png differ diff --git a/help/taseditor/css/dynatree/folder/38.png b/help/taseditor/css/dynatree/folder/38.png new file mode 100644 index 00000000..5334faee Binary files /dev/null and b/help/taseditor/css/dynatree/folder/38.png differ diff --git a/help/taseditor/css/dynatree/folder/39.png b/help/taseditor/css/dynatree/folder/39.png new file mode 100644 index 00000000..06e446b8 Binary files /dev/null and b/help/taseditor/css/dynatree/folder/39.png differ diff --git a/help/taseditor/css/dynatree/folder/4.png b/help/taseditor/css/dynatree/folder/4.png new file mode 100644 index 00000000..6e5cfc09 Binary files /dev/null and b/help/taseditor/css/dynatree/folder/4.png differ diff --git a/help/taseditor/css/dynatree/folder/40.png b/help/taseditor/css/dynatree/folder/40.png new file mode 100644 index 00000000..6d744dbe Binary files /dev/null and b/help/taseditor/css/dynatree/folder/40.png differ diff --git a/help/taseditor/css/dynatree/folder/41.png b/help/taseditor/css/dynatree/folder/41.png new file mode 100644 index 00000000..476edf46 Binary files /dev/null and b/help/taseditor/css/dynatree/folder/41.png differ diff --git a/help/taseditor/css/dynatree/folder/5.png b/help/taseditor/css/dynatree/folder/5.png new file mode 100644 index 00000000..1df634fe Binary files /dev/null and b/help/taseditor/css/dynatree/folder/5.png differ diff --git a/help/taseditor/css/dynatree/folder/6.png b/help/taseditor/css/dynatree/folder/6.png new file mode 100644 index 00000000..947d9c40 Binary files /dev/null and b/help/taseditor/css/dynatree/folder/6.png differ diff --git a/help/taseditor/css/dynatree/folder/7.png b/help/taseditor/css/dynatree/folder/7.png new file mode 100644 index 00000000..a3628866 Binary files /dev/null and b/help/taseditor/css/dynatree/folder/7.png differ diff --git a/help/taseditor/css/dynatree/folder/8.png b/help/taseditor/css/dynatree/folder/8.png new file mode 100644 index 00000000..5bcd3eca Binary files /dev/null and b/help/taseditor/css/dynatree/folder/8.png differ diff --git a/help/taseditor/css/dynatree/folder/9.png b/help/taseditor/css/dynatree/folder/9.png new file mode 100644 index 00000000..3b4991d8 Binary files /dev/null and b/help/taseditor/css/dynatree/folder/9.png differ diff --git a/help/taseditor/css/dynatree/folder/icons.gif b/help/taseditor/css/dynatree/folder/icons.gif new file mode 100644 index 00000000..a58eb93f Binary files /dev/null and b/help/taseditor/css/dynatree/folder/icons.gif differ diff --git a/help/taseditor/css/dynatree/folder/loading.gif b/help/taseditor/css/dynatree/folder/loading.gif new file mode 100644 index 00000000..251df054 Binary files /dev/null and b/help/taseditor/css/dynatree/folder/loading.gif differ diff --git a/help/taseditor/css/dynatree/folder/ui.dynatree.css b/help/taseditor/css/dynatree/folder/ui.dynatree.css new file mode 100644 index 00000000..8da01f51 --- /dev/null +++ b/help/taseditor/css/dynatree/folder/ui.dynatree.css @@ -0,0 +1,440 @@ +/******************************************************************************* + * Tree container + */ +ul.dynatree-container +{ + font-family: tahoma, arial, helvetica; + font-size: 10pt; /* font size should not be too big */ + white-space: nowrap; + padding: 3px; + margin: 0; /* issue 201 */ + background-color: white; + border: 1px dotted gray; + overflow: auto; + height: 100%; /* issue 263 */ +} + +ul.dynatree-container ul +{ + padding: 0 0 0 16px; + margin: 0; +} + +ul.dynatree-container li +{ + list-style-image: none; + list-style-position: outside; + list-style-type: none; + -moz-background-clip:border; + -moz-background-inline-policy: continuous; + -moz-background-origin: padding; + background-attachment: scroll; + background-color: transparent; + background-repeat: repeat-y; + background-image: url("vline.gif"); + background-position: 0 0; + /* + background-image: url("icons_96x256.gif"); + background-position: -80px -64px; + */ + margin: 0; + padding: 1px 0 0 0; +} +/* Suppress lines for last child node */ +ul.dynatree-container li.dynatree-lastsib +{ + background-image: none; +} +/* Suppress lines if level is fixed expanded (option minExpandLevel) */ +ul.dynatree-no-connector > li +{ + background-image: none; +} + +/* Style, when control is disabled */ +.ui-dynatree-disabled ul.dynatree-container +{ + opacity: 0.5; +/* filter: alpha(opacity=50); /* Yields a css warning */ + background-color: silver; +} + +/******************************************************************************* + * Common icon definitions + */ +span.dynatree-empty, +span.dynatree-vline, +span.dynatree-connector, +span.dynatree-expander, +span.dynatree-icon, +span.dynatree-checkbox, +span.dynatree-radio, +span.dynatree-drag-helper-img, +#dynatree-drop-marker +{ + width: 16px; + height: 16px; +/* display: -moz-inline-box; /* @ FF 1+2 removed for issue 221 */ +/* -moz-box-align: start; /* issue 221 */ + display: inline-block; /* Required to make a span sizeable */ + vertical-align: top; + background-repeat: no-repeat; + background-position: left; + background-image: url("icons.gif"); + background-position: 0 0; +} + +/** Used by 'icon' node option: */ +ul.dynatree-container img +{ + width: 16px; + height: 16px; + margin-left: 3px; + vertical-align: top; + border-style: none; +} + + +/******************************************************************************* + * Lines and connectors + */ + +span.dynatree-connector +{ + background-position: -16px -64px; +} + +/******************************************************************************* + * Expander icon + * Note: IE6 doesn't correctly evaluate multiples class names, + * so we create combined class names that can be used in the CSS. + * + * Prefix: dynatree-exp- + * 1st character: 'e': expanded, 'c': collapsed + * 2nd character (optional): 'd': lazy (Delayed) + * 3rd character (optional): 'l': Last sibling + */ + +span.dynatree-expander +{ + background-position: 0px -80px; + cursor: pointer; +} +.dynatree-exp-cl span.dynatree-expander /* Collapsed, not delayed, last sibling */ +{ + background-position: 0px -96px; +} +.dynatree-exp-cd span.dynatree-expander /* Collapsed, delayed, not last sibling */ +{ + background-position: -64px -80px; +} +.dynatree-exp-cdl span.dynatree-expander /* Collapsed, delayed, last sibling */ +{ + background-position: -64px -96px; +} +.dynatree-exp-e span.dynatree-expander, /* Expanded, not delayed, not last sibling */ +.dynatree-exp-ed span.dynatree-expander /* Expanded, delayed, not last sibling */ +{ + background-position: -32px -80px; +} +.dynatree-exp-el span.dynatree-expander, /* Expanded, not delayed, last sibling */ +.dynatree-exp-edl span.dynatree-expander /* Expanded, delayed, last sibling */ +{ + background-position: -32px -96px; +} +.dynatree-loading span.dynatree-expander /* 'Loading' status overrides all others */ +{ + background-position: 0 0; + background-image: url("loading.gif"); +} + + +/******************************************************************************* + * Checkbox icon + */ +span.dynatree-checkbox +{ + margin-left: 3px; + background-position: 0px -32px; +} +span.dynatree-checkbox:hover +{ + background-position: -16px -32px; +} + +.dynatree-partsel span.dynatree-checkbox +{ + background-position: -64px -32px; +} +.dynatree-partsel span.dynatree-checkbox:hover +{ + background-position: -80px -32px; +} + +.dynatree-selected span.dynatree-checkbox +{ + background-position: -32px -32px; +} +.dynatree-selected span.dynatree-checkbox:hover +{ + background-position: -48px -32px; +} + +/******************************************************************************* + * Radiobutton icon + * This is a customization, that may be activated by overriding the 'checkbox' + * class name as 'dynatree-radio' in the tree options. + */ +span.dynatree-radio +{ + margin-left: 3px; + background-position: 0px -48px; +} +span.dynatree-radio:hover +{ + background-position: -16px -48px; +} + +.dynatree-partsel span.dynatree-radio +{ + background-position: -64px -48px; +} +.dynatree-partsel span.dynatree-radio:hover +{ + background-position: -80px -48px; +} + +.dynatree-selected span.dynatree-radio +{ + background-position: -32px -48px; +} +.dynatree-selected span.dynatree-radio:hover +{ + background-position: -48px -48px; +} + +/******************************************************************************* + * Node type icon + * Note: IE6 doesn't correctly evaluate multiples class names, + * so we create combined class names that can be used in the CSS. + * + * Prefix: dynatree-ico- + * 1st character: 'e': expanded, 'c': collapsed + * 2nd character (optional): 'f': folder + */ + +span.dynatree-icon /* Default icon */ +{ + margin-left: 3px; + background-position: 0px 0px; +} + +.dynatree-ico-cf span.dynatree-icon /* Collapsed Folder */ +{ + background-position: 0px -16px; +} + +.dynatree-ico-ef span.dynatree-icon /* Expanded Folder */ +{ + background-position: -64px -16px; +} + +/* Status node icons */ + +.dynatree-statusnode-wait span.dynatree-icon +{ + background-image: url("loading.gif"); +} + +.dynatree-statusnode-error span.dynatree-icon +{ + background-position: 0px -112px; +/* background-image: url("ltError.gif");*/ +} + +/******************************************************************************* + * Node titles + */ + +/* @Chrome: otherwise hit area of node titles is broken (issue 133) + Removed again for issue 165; (133 couldn't be reproduced) */ +span.dynatree-node +{ +/* display: -moz-inline-box; /* issue 133, 165, 172, 192. removed for issue 221*/ +/* -moz-box-align: start; /* issue 221 */ +/* display: inline-block; /* Required to make a span sizeable */ +} + + +/* Remove blue color and underline from title links */ +ul.dynatree-container a +/*, ul.dynatree-container a:visited*/ +{ + color: black; /* inherit doesn't work on IE */ + text-decoration: none; + vertical-align: top; + margin: 0px; + margin-left: 3px; +/* outline: 0; /* @ Firefox, prevent dotted border after click */ +} + +ul.dynatree-container a:hover +{ +/* text-decoration: underline; */ + background-color: #F2F7FD; /* light blue */ + border-color: #B8D6FB; /* darker light blue */ +} + +span.dynatree-node a +{ + font-size: 10pt; /* required for IE, quirks mode */ + display: inline-block; /* Better alignment, when title contains
*/ +/* vertical-align: top;*/ + padding-left: 3px; + padding-right: 3px; /* Otherwise italic font will be outside bounds */ + /* line-height: 16px; /* should be the same as img height, in case 16 px */ +} +span.dynatree-folder a +{ + font-weight: bold; +} + +ul.dynatree-container a:focus, +span.dynatree-focused a:link /* @IE */ +{ + background-color: #EFEBDE; /* gray */ +} + +span.dynatree-has-children a +{ +} + +span.dynatree-expanded a +{ +} + +span.dynatree-selected a +{ + color: green; + font-style: italic; +} + +span.dynatree-active a +{ + background-color: #3169C6 !important; + color: white !important; /* @ IE6 */ +} + +/******************************************************************************* + * Drag'n'drop support + */ + +/*** Helper object ************************************************************/ +div.dynatree-drag-helper +{ +} +div.dynatree-drag-helper a +{ + border: 1px solid gray; + background-color: white; + padding-left: 5px; + padding-right: 5px; + opacity: 0.8; +} +span.dynatree-drag-helper-img +{ + /* + position: relative; + left: -16px; + */ +} +div.dynatree-drag-helper /*.dynatree-drop-accept*/ +{ + +/* border-color: green; + background-color: red;*/ +} +div.dynatree-drop-accept span.dynatree-drag-helper-img +{ + background-position: -32px -112px; +} +div.dynatree-drag-helper.dynatree-drop-reject +{ + border-color: red; +} +div.dynatree-drop-reject span.dynatree-drag-helper-img +{ + background-position: -16px -112px; +} + +/*** Drop marker icon *********************************************************/ + +#dynatree-drop-marker +{ + width: 24px; + position: absolute; + background-position: 0 -128px; + margin: 0; +/* border: 1px solid red; */ +} +#dynatree-drop-marker.dynatree-drop-after, +#dynatree-drop-marker.dynatree-drop-before +{ + width:64px; + background-position: 0 -144px; +} +#dynatree-drop-marker.dynatree-drop-copy +{ + background-position: -64px -128px; +} +#dynatree-drop-marker.dynatree-drop-move +{ + background-position: -64px -128px; +} + +/*** Source node while dragging ***********************************************/ + +span.dynatree-drag-source +{ + /* border: 1px dotted gray; */ + background-color: #e0e0e0; +} +span.dynatree-drag-source a +{ + color: gray; +} + +/*** Target node while dragging cursor is over it *****************************/ + +span.dynatree-drop-target +{ + /*border: 1px solid gray;*/ +} +span.dynatree-drop-target a +{ +} +span.dynatree-drop-target.dynatree-drop-accept a +{ + /*border: 1px solid green;*/ + background-color: #3169C6 !important; + color: white !important; /* @ IE6 */ + text-decoration: none; +} +span.dynatree-drop-target.dynatree-drop-reject +{ + /*border: 1px solid red;*/ +} +span.dynatree-drop-target.dynatree-drop-after a +{ +} + + +/******************************************************************************* + * Custom node classes (sample) + */ + +span.custom1 a +{ + background-color: maroon; + color: yellow; +} diff --git a/help/taseditor/css/dynatree/folder/vline.gif b/help/taseditor/css/dynatree/folder/vline.gif new file mode 100644 index 00000000..1b00ae50 Binary files /dev/null and b/help/taseditor/css/dynatree/folder/vline.gif differ diff --git a/help/taseditor/css/dynatree/vista/0.png b/help/taseditor/css/dynatree/vista/0.png new file mode 100644 index 00000000..0189cda7 Binary files /dev/null and b/help/taseditor/css/dynatree/vista/0.png differ diff --git a/help/taseditor/css/dynatree/vista/1.png b/help/taseditor/css/dynatree/vista/1.png new file mode 100644 index 00000000..01335b02 Binary files /dev/null and b/help/taseditor/css/dynatree/vista/1.png differ diff --git a/help/taseditor/css/dynatree/vista/10.png b/help/taseditor/css/dynatree/vista/10.png new file mode 100644 index 00000000..86c1b70c Binary files /dev/null and b/help/taseditor/css/dynatree/vista/10.png differ diff --git a/help/taseditor/css/dynatree/vista/11.png b/help/taseditor/css/dynatree/vista/11.png new file mode 100644 index 00000000..60da1797 Binary files /dev/null and b/help/taseditor/css/dynatree/vista/11.png differ diff --git a/help/taseditor/css/dynatree/vista/12.png b/help/taseditor/css/dynatree/vista/12.png new file mode 100644 index 00000000..7977cad2 Binary files /dev/null and b/help/taseditor/css/dynatree/vista/12.png differ diff --git a/help/taseditor/css/dynatree/vista/13.png b/help/taseditor/css/dynatree/vista/13.png new file mode 100644 index 00000000..2d6b99eb Binary files /dev/null and b/help/taseditor/css/dynatree/vista/13.png differ diff --git a/help/taseditor/css/dynatree/vista/14.png b/help/taseditor/css/dynatree/vista/14.png new file mode 100644 index 00000000..c6150b5f Binary files /dev/null and b/help/taseditor/css/dynatree/vista/14.png differ diff --git a/help/taseditor/css/dynatree/vista/15.png b/help/taseditor/css/dynatree/vista/15.png new file mode 100644 index 00000000..58f205ff Binary files /dev/null and b/help/taseditor/css/dynatree/vista/15.png differ diff --git a/help/taseditor/css/dynatree/vista/16.png b/help/taseditor/css/dynatree/vista/16.png new file mode 100644 index 00000000..746f6c4e Binary files /dev/null and b/help/taseditor/css/dynatree/vista/16.png differ diff --git a/help/taseditor/css/dynatree/vista/17.png b/help/taseditor/css/dynatree/vista/17.png new file mode 100644 index 00000000..e450e6b6 Binary files /dev/null and b/help/taseditor/css/dynatree/vista/17.png differ diff --git a/help/taseditor/css/dynatree/vista/18.png b/help/taseditor/css/dynatree/vista/18.png new file mode 100644 index 00000000..fae8d066 Binary files /dev/null and b/help/taseditor/css/dynatree/vista/18.png differ diff --git a/help/taseditor/css/dynatree/vista/19.png b/help/taseditor/css/dynatree/vista/19.png new file mode 100644 index 00000000..557aa37b Binary files /dev/null and b/help/taseditor/css/dynatree/vista/19.png differ diff --git a/help/taseditor/css/dynatree/vista/2.png b/help/taseditor/css/dynatree/vista/2.png new file mode 100644 index 00000000..38870794 Binary files /dev/null and b/help/taseditor/css/dynatree/vista/2.png differ diff --git a/help/taseditor/css/dynatree/vista/20.png b/help/taseditor/css/dynatree/vista/20.png new file mode 100644 index 00000000..cb6845bc Binary files /dev/null and b/help/taseditor/css/dynatree/vista/20.png differ diff --git a/help/taseditor/css/dynatree/vista/21.png b/help/taseditor/css/dynatree/vista/21.png new file mode 100644 index 00000000..bfb11c91 Binary files /dev/null and b/help/taseditor/css/dynatree/vista/21.png differ diff --git a/help/taseditor/css/dynatree/vista/22.png b/help/taseditor/css/dynatree/vista/22.png new file mode 100644 index 00000000..17ed9c5b Binary files /dev/null and b/help/taseditor/css/dynatree/vista/22.png differ diff --git a/help/taseditor/css/dynatree/vista/23.png b/help/taseditor/css/dynatree/vista/23.png new file mode 100644 index 00000000..1c4a863b Binary files /dev/null and b/help/taseditor/css/dynatree/vista/23.png differ diff --git a/help/taseditor/css/dynatree/vista/24.png b/help/taseditor/css/dynatree/vista/24.png new file mode 100644 index 00000000..e91b518c Binary files /dev/null and b/help/taseditor/css/dynatree/vista/24.png differ diff --git a/help/taseditor/css/dynatree/vista/25.png b/help/taseditor/css/dynatree/vista/25.png new file mode 100644 index 00000000..00d2d5d3 Binary files /dev/null and b/help/taseditor/css/dynatree/vista/25.png differ diff --git a/help/taseditor/css/dynatree/vista/26.png b/help/taseditor/css/dynatree/vista/26.png new file mode 100644 index 00000000..4952af63 Binary files /dev/null and b/help/taseditor/css/dynatree/vista/26.png differ diff --git a/help/taseditor/css/dynatree/vista/27.png b/help/taseditor/css/dynatree/vista/27.png new file mode 100644 index 00000000..a61fe9bd Binary files /dev/null and b/help/taseditor/css/dynatree/vista/27.png differ diff --git a/help/taseditor/css/dynatree/vista/28.png b/help/taseditor/css/dynatree/vista/28.png new file mode 100644 index 00000000..52160f07 Binary files /dev/null and b/help/taseditor/css/dynatree/vista/28.png differ diff --git a/help/taseditor/css/dynatree/vista/29.png b/help/taseditor/css/dynatree/vista/29.png new file mode 100644 index 00000000..06aa97cb Binary files /dev/null and b/help/taseditor/css/dynatree/vista/29.png differ diff --git a/help/taseditor/css/dynatree/vista/3.png b/help/taseditor/css/dynatree/vista/3.png new file mode 100644 index 00000000..b1c94138 Binary files /dev/null and b/help/taseditor/css/dynatree/vista/3.png differ diff --git a/help/taseditor/css/dynatree/vista/30.png b/help/taseditor/css/dynatree/vista/30.png new file mode 100644 index 00000000..7b52276d Binary files /dev/null and b/help/taseditor/css/dynatree/vista/30.png differ diff --git a/help/taseditor/css/dynatree/vista/31.png b/help/taseditor/css/dynatree/vista/31.png new file mode 100644 index 00000000..02283dbb Binary files /dev/null and b/help/taseditor/css/dynatree/vista/31.png differ diff --git a/help/taseditor/css/dynatree/vista/32.png b/help/taseditor/css/dynatree/vista/32.png new file mode 100644 index 00000000..875843c5 Binary files /dev/null and b/help/taseditor/css/dynatree/vista/32.png differ diff --git a/help/taseditor/css/dynatree/vista/33.png b/help/taseditor/css/dynatree/vista/33.png new file mode 100644 index 00000000..d64f1371 Binary files /dev/null and b/help/taseditor/css/dynatree/vista/33.png differ diff --git a/help/taseditor/css/dynatree/vista/34.png b/help/taseditor/css/dynatree/vista/34.png new file mode 100644 index 00000000..a6d94c5d Binary files /dev/null and b/help/taseditor/css/dynatree/vista/34.png differ diff --git a/help/taseditor/css/dynatree/vista/35.png b/help/taseditor/css/dynatree/vista/35.png new file mode 100644 index 00000000..dfc87bf7 Binary files /dev/null and b/help/taseditor/css/dynatree/vista/35.png differ diff --git a/help/taseditor/css/dynatree/vista/36.png b/help/taseditor/css/dynatree/vista/36.png new file mode 100644 index 00000000..ce6235b2 Binary files /dev/null and b/help/taseditor/css/dynatree/vista/36.png differ diff --git a/help/taseditor/css/dynatree/vista/37.png b/help/taseditor/css/dynatree/vista/37.png new file mode 100644 index 00000000..01203304 Binary files /dev/null and b/help/taseditor/css/dynatree/vista/37.png differ diff --git a/help/taseditor/css/dynatree/vista/38.png b/help/taseditor/css/dynatree/vista/38.png new file mode 100644 index 00000000..5334faee Binary files /dev/null and b/help/taseditor/css/dynatree/vista/38.png differ diff --git a/help/taseditor/css/dynatree/vista/39.png b/help/taseditor/css/dynatree/vista/39.png new file mode 100644 index 00000000..06e446b8 Binary files /dev/null and b/help/taseditor/css/dynatree/vista/39.png differ diff --git a/help/taseditor/css/dynatree/vista/4.png b/help/taseditor/css/dynatree/vista/4.png new file mode 100644 index 00000000..6e5cfc09 Binary files /dev/null and b/help/taseditor/css/dynatree/vista/4.png differ diff --git a/help/taseditor/css/dynatree/vista/40.png b/help/taseditor/css/dynatree/vista/40.png new file mode 100644 index 00000000..6d744dbe Binary files /dev/null and b/help/taseditor/css/dynatree/vista/40.png differ diff --git a/help/taseditor/css/dynatree/vista/41.png b/help/taseditor/css/dynatree/vista/41.png new file mode 100644 index 00000000..476edf46 Binary files /dev/null and b/help/taseditor/css/dynatree/vista/41.png differ diff --git a/help/taseditor/css/dynatree/vista/5.png b/help/taseditor/css/dynatree/vista/5.png new file mode 100644 index 00000000..1df634fe Binary files /dev/null and b/help/taseditor/css/dynatree/vista/5.png differ diff --git a/help/taseditor/css/dynatree/vista/6.png b/help/taseditor/css/dynatree/vista/6.png new file mode 100644 index 00000000..947d9c40 Binary files /dev/null and b/help/taseditor/css/dynatree/vista/6.png differ diff --git a/help/taseditor/css/dynatree/vista/7.png b/help/taseditor/css/dynatree/vista/7.png new file mode 100644 index 00000000..a3628866 Binary files /dev/null and b/help/taseditor/css/dynatree/vista/7.png differ diff --git a/help/taseditor/css/dynatree/vista/8.png b/help/taseditor/css/dynatree/vista/8.png new file mode 100644 index 00000000..5bcd3eca Binary files /dev/null and b/help/taseditor/css/dynatree/vista/8.png differ diff --git a/help/taseditor/css/dynatree/vista/9.png b/help/taseditor/css/dynatree/vista/9.png new file mode 100644 index 00000000..3b4991d8 Binary files /dev/null and b/help/taseditor/css/dynatree/vista/9.png differ diff --git a/help/taseditor/css/dynatree/vista/icons.gif b/help/taseditor/css/dynatree/vista/icons.gif new file mode 100644 index 00000000..6e237a0f Binary files /dev/null and b/help/taseditor/css/dynatree/vista/icons.gif differ diff --git a/help/taseditor/css/dynatree/vista/loading.gif b/help/taseditor/css/dynatree/vista/loading.gif new file mode 100644 index 00000000..2a96840f Binary files /dev/null and b/help/taseditor/css/dynatree/vista/loading.gif differ diff --git a/help/taseditor/css/dynatree/vista/ui.dynatree.css b/help/taseditor/css/dynatree/vista/ui.dynatree.css new file mode 100644 index 00000000..3dc5fb7e --- /dev/null +++ b/help/taseditor/css/dynatree/vista/ui.dynatree.css @@ -0,0 +1,452 @@ +/******************************************************************************* + * Tree container + */ +ul.dynatree-container +{ + font-family: tahoma, arial, helvetica; + font-size: 10pt; /* font size should not be too big */ + white-space: nowrap; + padding: 3px; + margin: 0; /* issue 201 */ + background-color: white; + border: 1px dotted gray; + overflow: auto; + height: 100%; /* issue 263 */ +} + +ul.dynatree-container ul +{ + padding: 0 0 0 16px; + margin: 0; +} + +ul.dynatree-container li +{ + list-style-image: none; + list-style-position: outside; + list-style-type: none; + -moz-background-clip:border; + -moz-background-inline-policy: continuous; + -moz-background-origin: padding; + background-attachment: scroll; + background-color: transparent; + background-position: 0 0; + background-repeat: repeat-y; + background-image: none; /* no v-lines */ + + margin:0; + padding:1px 0 0 0; +} +/* Suppress lines for last child node */ +ul.dynatree-container li.dynatree-lastsib +{ + background-image: none; +} +/* Suppress lines if level is fixed expanded (option minExpandLevel) */ +ul.dynatree-no-connector > li +{ + background-image: none; +} + +/* Style, when control is disabled */ +.ui-dynatree-disabled ul.dynatree-container +{ + opacity: 0.5; +/* filter: alpha(opacity=50); /* Yields a css warning */ + background-color: silver; +} + + +/******************************************************************************* + * Common icon definitions + */ +span.dynatree-empty, +span.dynatree-vline, +span.dynatree-connector, +span.dynatree-expander, +span.dynatree-icon, +span.dynatree-checkbox, +span.dynatree-radio, +span.dynatree-drag-helper-img, +#dynatree-drop-marker +{ + width: 16px; + height: 16px; +/* display: -moz-inline-box; /* @ FF 1+2 removed for issue 221*/ +/* -moz-box-align: start; /* issue 221 */ + display: inline-block; /* Required to make a span sizeable */ + vertical-align: top; + background-repeat: no-repeat; + background-position: left; + background-image: url("icons.gif"); + background-position: 0 0; +} + +/** Used by 'icon' node option: */ +ul.dynatree-container img +{ + width: 16px; + height: 16px; + margin-left: 3px; + vertical-align: top; + border-style: none; +} + + +/******************************************************************************* + * Lines and connectors + */ + +/* +span.dynatree-empty +{ +} +span.dynatree-vline +{ +} +*/ +span.dynatree-connector +{ + background-image: none; +} +/* +.dynatree-lastsib span.dynatree-connector +{ +} +*/ +/******************************************************************************* + * Expander icon + * Note: IE6 doesn't correctly evaluate multiples class names, + * so we create combined class names that can be used in the CSS. + * + * Prefix: dynatree-exp- + * 1st character: 'e': expanded, 'c': collapsed + * 2nd character (optional): 'd': lazy (Delayed) + * 3rd character (optional): 'l': Last sibling + */ + +span.dynatree-expander +{ + background-position: 0px -80px; + cursor: pointer; +} +span.dynatree-expander:hover +{ + background-position: -16px -80px; +} +.dynatree-exp-cl span.dynatree-expander /* Collapsed, not delayed, last sibling */ +{ +} +.dynatree-exp-cd span.dynatree-expander /* Collapsed, delayed, not last sibling */ +{ +} +.dynatree-exp-cdl span.dynatree-expander /* Collapsed, delayed, last sibling */ +{ +} +.dynatree-exp-e span.dynatree-expander, /* Expanded, not delayed, not last sibling */ +.dynatree-exp-ed span.dynatree-expander, /* Expanded, delayed, not last sibling */ +.dynatree-exp-el span.dynatree-expander, /* Expanded, not delayed, last sibling */ +.dynatree-exp-edl span.dynatree-expander /* Expanded, delayed, last sibling */ +{ + background-position: -32px -80px; +} +.dynatree-exp-e span.dynatree-expander:hover, /* Expanded, not delayed, not last sibling */ +.dynatree-exp-ed span.dynatree-expander:hover, /* Expanded, delayed, not last sibling */ +.dynatree-exp-el span.dynatree-expander:hover, /* Expanded, not delayed, last sibling */ +.dynatree-exp-edl span.dynatree-expander:hover /* Expanded, delayed, last sibling */ +{ + background-position: -48px -80px; +} +.dynatree-loading span.dynatree-expander /* 'Loading' status overrides all others */ +{ + background-position: 0 0; + background-image: url("loading.gif"); +} + + +/******************************************************************************* + * Checkbox icon + */ +span.dynatree-checkbox +{ + margin-left: 3px; + background-position: 0px -32px; +} +span.dynatree-checkbox:hover +{ + background-position: -16px -32px; +} + +.dynatree-partsel span.dynatree-checkbox +{ + background-position: -64px -32px; +} +.dynatree-partsel span.dynatree-checkbox:hover +{ + background-position: -80px -32px; +} + +.dynatree-selected span.dynatree-checkbox +{ + background-position: -32px -32px; +} +.dynatree-selected span.dynatree-checkbox:hover +{ + background-position: -48px -32px; +} + +/******************************************************************************* + * Radiobutton icon + * This is a customization, that may be activated by overriding the 'checkbox' + * class name as 'dynatree-radio' in the tree options. + */ +span.dynatree-radio +{ + margin-left: 3px; + background-position: 0px -48px; +} +span.dynatree-radio:hover +{ + background-position: -16px -48px; +} + +.dynatree-partsel span.dynatree-radio +{ + background-position: -64px -48px; +} +.dynatree-partsel span.dynatree-radio:hover +{ + background-position: -80px -48px; +} + +.dynatree-selected span.dynatree-radio +{ + background-position: -32px -48px; +} +.dynatree-selected span.dynatree-radio:hover +{ + background-position: -48px -48px; +} + +/******************************************************************************* + * Node type icon + * Note: IE6 doesn't correctly evaluate multiples class names, + * so we create combined class names that can be used in the CSS. + * + * Prefix: dynatree-ico- + * 1st character: 'e': expanded, 'c': collapsed + * 2nd character (optional): 'f': folder + */ + +span.dynatree-icon /* Default icon */ +{ + margin-left: 3px; + background-position: 0px 0px; +} + +.dynatree-has-children span.dynatree-icon /* Default icon */ +{ +/* background-position: 0px -16px; */ +} + +.dynatree-ico-cf span.dynatree-icon /* Collapsed Folder */ +{ + background-position: 0px -16px; +} + +.dynatree-ico-ef span.dynatree-icon /* Expanded Folder */ +{ + background-position: -64px -16px; +} + +/* Status node icons */ + +.dynatree-statusnode-wait span.dynatree-icon +{ + background-image: url("loading.gif"); +} + +.dynatree-statusnode-error span.dynatree-icon +{ + background-position: 0px -112px; +/* background-image: url("ltError.gif");*/ +} + +/******************************************************************************* + * Node titles + */ + +/* @Chrome: otherwise hit area of node titles is broken (issue 133) + Removed again for issue 165; (133 couldn't be reproduced) */ +span.dynatree-node +{ +/* display: -moz-inline-box; /* issue 133, 165, 172, 192. removed for issue 221 */ +/* -moz-box-align: start; /* issue 221 */ +/* display: inline-block; /* Required to make a span sizeable */ +} + + +/* Remove blue color and underline from title links */ +ul.dynatree-container a +/*, ul.dynatree-container a:visited*/ +{ + color: black; /* inherit doesn't work on IE */ + text-decoration: none; + vertical-align: top; + margin: 0px; + margin-left: 3px; +/* outline: 0; /* @ Firefox, prevent dotted border after click */ + /* Set transparent border to prevent jumping when active node gets a border + (we can do this, because this theme doesn't use vertical lines) + */ + border: 1px solid white; /* Note: 'transparent' would not work in IE6 */ + +} + +ul.dynatree-container a:hover +{ +/* text-decoration: underline; */ + background: #F2F7FD; /* light blue */ + border-color: #B8D6FB; /* darker light blue */ +} + +span.dynatree-node a +{ + display: inline-block; /* Better alignment, when title contains
*/ +/* vertical-align: top;*/ + padding-left: 3px; + padding-right: 3px; /* Otherwise italic font will be outside bounds */ + /* line-height: 16px; /* should be the same as img height, in case 16 px */ +} +span.dynatree-folder a +{ +/* font-weight: bold; */ /* custom */ +} + +ul.dynatree-container a:focus, +span.dynatree-focused a:link /* @IE */ +{ + background-color: #EFEBDE; /* gray */ +} + +span.dynatree-has-children a +{ +/* font-style: oblique; /* custom: */ +} + +span.dynatree-expanded a +{ +} + +span.dynatree-selected a +{ +/* color: green; */ + font-style: italic; +} + +span.dynatree-active a +{ + border: 1px solid #99DEFD; + background-color: #D8F0FA; +} + +/******************************************************************************* + * Drag'n'drop support + */ + +/*** Helper object ************************************************************/ +div.dynatree-drag-helper +{ +} +div.dynatree-drag-helper a +{ + border: 1px solid gray; + background-color: white; + padding-left: 5px; + padding-right: 5px; + opacity: 0.8; +} +span.dynatree-drag-helper-img +{ + /* + position: relative; + left: -16px; + */ +} +div.dynatree-drag-helper /*.dynatree-drop-accept*/ +{ +/* border-color: green; + background-color: red;*/ +} +div.dynatree-drop-accept span.dynatree-drag-helper-img +{ + background-position: -32px -112px; +} +div.dynatree-drag-helper.dynatree-drop-reject +{ + border-color: red; +} +div.dynatree-drop-reject span.dynatree-drag-helper-img +{ + background-position: -16px -112px; +} + +/*** Drop marker icon *********************************************************/ + +#dynatree-drop-marker +{ + width: 24px; + position: absolute; + background-position: 0 -128px; + margin: 0; +} +#dynatree-drop-marker.dynatree-drop-after, +#dynatree-drop-marker.dynatree-drop-before +{ + width:64px; + background-position: 0 -144px; +} +#dynatree-drop-marker.dynatree-drop-copy +{ + background-position: -64px -128px; +} +#dynatree-drop-marker.dynatree-drop-move +{ + background-position: -64px -128px; +} + +/*** Source node while dragging ***********************************************/ + +span.dynatree-drag-source +{ + /* border: 1px dotted gray; */ + background-color: #e0e0e0; +} +span.dynatree-drag-source a +{ + color: gray; +} + +/*** Target node while dragging cursor is over it *****************************/ + +span.dynatree-drop-target +{ + /*border: 1px solid gray;*/ +} +span.dynatree-drop-target a +{ +} +span.dynatree-drop-target.dynatree-drop-accept a +{ + /*border: 1px solid green;*/ + background-color: #3169C6 !important; + color: white !important; /* @ IE6 */ + text-decoration: none; +} +span.dynatree-drop-target.dynatree-drop-reject +{ + /*border: 1px solid red;*/ +} +span.dynatree-drop-target.dynatree-drop-after a +{ +} diff --git a/help/taseditor/css/hnd.css b/help/taseditor/css/hnd.css new file mode 100644 index 00000000..34775c50 --- /dev/null +++ b/help/taseditor/css/hnd.css @@ -0,0 +1,599 @@ +/* ========== Text Styles ========== */ +hr { color: #000000} +body, table, span.rvts0 /* Normal text */ +{ + font-size: 10pt; + font-family: 'Arial', 'Helvetica', sans-serif; + font-style: normal; + font-weight: normal; + color: #000000; + text-decoration: none; +} +span.rvts1 /* Heading */ +{ + font-weight: bold; + color: #0000ff; +} +span.rvts2 /* Subheading */ +{ + font-weight: bold; + color: #000080; +} +span.rvts3 /* Keywords */ +{ + font-style: italic; + color: #800000; +} +a.rvts4, span.rvts4 /* Jump 1 */ +{ + color: #008000; + text-decoration: underline; +} +a.rvts5, span.rvts5 /* Jump 2 */ +{ + color: #008000; + text-decoration: underline; +} +span.rvts6 /* Font Style */ +{ +} +span.rvts7 /* Font Style */ +{ + font-size: 14pt; + font-weight: bold; + color: #365f91; +} +span.rvts8 +{ + font-size: 24pt; + font-weight: bold; +} +span.rvts9 +{ + font-size: 12pt; +} +span.rvts10 +{ + font-size: 14pt; +} +span.rvts11 +{ + font-size: 12pt; +} +a.rvts12, span.rvts12 +{ + font-size: 12pt; + font-weight: bold; + color: #0000ff; + text-decoration: underline; +} +a.rvts12:hover { color: #0000ff; } +a.rvts13, span.rvts13 +{ + font-size: 12pt; + font-weight: bold; + color: #0000ff; + text-decoration: underline; +} +a.rvts13:hover { color: #0000ff; } +span.rvts14 +{ + font-size: 9pt; +} +a.rvts15, span.rvts15 +{ + font-size: 14pt; + font-weight: bold; + color: #0000ff; + text-decoration: underline; +} +a.rvts15:hover { color: #0000ff; } +a.rvts16, span.rvts16 +{ + font-size: 14pt; + font-weight: bold; + color: #0000ff; + text-decoration: underline; +} +a.rvts16:hover { color: #0000ff; } +span.rvts17 /* Font Style */ +{ + font-family: 'Tahoma', 'Geneva', sans-serif; + font-style: italic; + color: #c0c0c0; +} +a.rvts18, span.rvts18 /* Font Style */ +{ + font-family: 'Tahoma', 'Geneva', sans-serif; + font-style: italic; + color: #6666ff; + text-decoration: underline; +} +span.rvts19 +{ + font-size: 24pt; + text-decoration: underline; +} +span.rvts20 /* Font Style */ +{ + font-size: 11pt; + font-family: 'Courier New', 'Courier', monospace; + color: #000080; +} +span.rvts21 /* Font Style */ +{ + font-size: 11pt; +} +span.rvts22 /* Font Style */ +{ + font-size: 12pt; + font-weight: bold; +} +a.rvts23, span.rvts23 +{ + font-size: 12pt; + font-weight: bold; + color: #0000ff; + text-decoration: underline; +} +a.rvts23:hover { color: #0000ff; } +span.rvts24 /* Font Style */ +{ + font-size: 11pt; +} +span.rvts25 +{ + font-size: 11pt; + font-weight: bold; +} +span.rvts26 /* Font Style */ +{ + font-size: 11pt; + font-weight: bold; + color: #0096bb; +} +a.rvts27, span.rvts27 +{ + font-size: 11pt; + color: #0000ff; + text-decoration: underline; +} +a.rvts27:hover { color: #0000ff; } +a.rvts28, span.rvts28 +{ + font-size: 11pt; + color: #0000ff; + text-decoration: underline; +} +a.rvts28:hover { color: #0000ff; } +span.rvts29 /* Font Style */ +{ + font-size: 11pt; + font-weight: bold; + color: #008817; +} +span.rvts30 /* Font Style */ +{ + font-size: 11pt; + color: #c10031; +} +a.rvts31, span.rvts31 +{ + font-size: 11pt; + color: #0000ff; + text-decoration: underline; +} +a.rvts31:hover { color: #0000ff; } +a.rvts32, span.rvts32 +{ + font-size: 11pt; + color: #0000ff; + text-decoration: underline; +} +a.rvts32:hover { color: #0000ff; } +a.rvts33, span.rvts33 +{ + font-size: 11pt; + color: #0000ff; + text-decoration: underline; +} +a.rvts33:hover { color: #0000ff; } +span.rvts34 +{ + font-size: 11pt; + text-decoration: underline; +} +a.rvts35, span.rvts35 +{ + font-size: 11pt; + color: #0000ff; + text-decoration: underline; +} +a.rvts35:hover { color: #0000ff; } +span.rvts36 +{ + font-size: 11pt; +} +span.rvts37 +{ + font-size: 11pt; + font-style: italic; +} +a.rvts38, span.rvts38 +{ + font-size: 11pt; + color: #0000ff; + text-decoration: underline; +} +a.rvts38:hover { color: #0000ff; } +span.rvts39 /* Font Style */ +{ + font-size: 9pt; + font-weight: bold; +} +span.rvts40 +{ + font-size: 11pt; + font-weight: bold; + color: #008817; + text-decoration: underline; +} +span.rvts41 +{ + font-weight: bold; +} +span.rvts42 +{ +} +a.rvts43, span.rvts43 +{ + font-size: 11pt; + font-weight: bold; + color: #0000ff; + text-decoration: underline; +} +a.rvts43:hover { color: #0000ff; } +a.rvts44, span.rvts44 +{ + font-size: 11pt; + font-weight: bold; + color: #0000ff; + text-decoration: underline; +} +a.rvts44:hover { color: #0000ff; } +a.rvts45, span.rvts45 +{ + font-size: 11pt; + font-weight: bold; + color: #0000ff; + text-decoration: underline; +} +a.rvts45:hover { color: #0000ff; } +span.rvts46 +{ + font-size: 12pt; + font-weight: bold; +} +span.rvts47 /* Font Style */ +{ + font-size: 11pt; + color: #4f81bd; +} +span.rvts48 +{ + font-size: 11pt; + font-weight: bold; +} +span.rvts49 +{ + font-size: 11pt; +} +span.rvts50 +{ + color: #004000; +} +a.rvts51, span.rvts51 +{ + color: #0000ff; + text-decoration: underline; +} +a.rvts51:hover { color: #0000ff; } +span.rvts52 +{ + font-size: 6pt; +} +span.rvts53 +{ + font-size: 16pt; + text-decoration: underline; +} +span.rvts54 +{ + color: #000000; +} +span.rvts55 +{ + font-size: 11pt; + font-weight: bold; + color: #000000; +} +a.rvts56, span.rvts56 +{ + font-size: 11pt; + color: #0000ff; + text-decoration: underline; +} +a.rvts56:hover { color: #0000ff; } +a.rvts57, span.rvts57 +{ + color: #0000ff; + text-decoration: underline; +} +a.rvts57:hover { color: #0000ff; } +a.rvts58, span.rvts58 +{ + color: #0000ff; + text-decoration: underline; +} +a.rvts58:hover { color: #0000ff; } +a.rvts59, span.rvts59 +{ + color: #0000ff; + text-decoration: underline; +} +a.rvts59:hover { color: #0000ff; } +a.rvts60, span.rvts60 +{ + color: #0000ff; + text-decoration: underline; +} +a.rvts60:hover { color: #0000ff; } +a.rvts61, span.rvts61 +{ + color: #0000ff; + text-decoration: underline; +} +a.rvts61:hover { color: #0000ff; } +span.rvts62 +{ + font-size: 11pt; + text-decoration: underline; +} +span.rvts63 +{ + font-size: 11pt; + color: #0a8200; +} +span.rvts64 +{ + font-size: 11pt; + color: #000000; +} +span.rvts65 +{ + font-size: 9pt; + font-weight: bold; +} +span.rvts66 +{ + font-weight: bold; + color: #ffffff; +} +a.rvts67, span.rvts67 +{ + font-size: 9pt; + font-weight: bold; + color: #0000ff; + text-decoration: underline; +} +a.rvts67:hover { color: #0000ff; } +span.rvts68 +{ + font-size: 12pt; + font-family: 'Courier New', 'Courier', monospace; + color: #000080; +} +span.rvts69 /* Font Style */ +{ + font-size: 11pt; + font-style: italic; + color: #243f60; +} +span.rvts70 /* Font Style */ +{ + font-size: 11pt; + color: #333399; +} +span.rvts71 +{ + font-size: 11pt; + color: #333399; +} +a.rvts72, span.rvts72 +{ + font-size: 11pt; + color: #0000ff; + text-decoration: underline; +} +a.rvts72:hover { color: #0000ff; } +span.rvts73 +{ + font-size: 11pt; + font-style: italic; + font-weight: bold; +} +span.rvts74 +{ + font-size: 24pt; + text-decoration: underline; +} +span.rvts75 +{ + font-size: 24pt; + text-decoration: underline; +} +a.rvts76, span.rvts76 +{ + color: #0000ff; + text-decoration: underline; +} +a.rvts76:hover { color: #0000ff; } +a.rvts77, span.rvts77 +{ + font-weight: bold; + color: #ffffff; + text-decoration: underline; +} +a.rvts77:hover { color: #0000ff; } +span.rvts78 +{ + color: #ffffff; +} +span.rvts79 +{ + color: #333399; +} +/* ========== Para Styles ========== */ +p,ul,ol /* Paragraph Style */ +{ + text-align: left; + text-indent: 0px; + padding: 0px 0px 0px 0px; + margin: 0px 0px 0px 0px; +} +.rvps1 /* Centered */ +{ + text-align: center; +} +.rvps2 /* Paragraph Style */ +{ +} +.rvps3 /* Paragraph Style */ +{ +} +.rvps4 +{ + text-align: center; +} +.rvps5 +{ + text-align: center; +} +.rvps6 +{ + text-align: center; + margin: 4px 0px 0px 0px; +} +.rvps7 +{ + text-align: center; + line-height: 21px; + margin: 0px 0px 10px 0px; +} +.rvps8 /* Paragraph Style */ +{ + text-align: center; + border-color: #c0c0c0; + border-style: solid; + border-width: 1px; + border-right: none; + border-left: none; + padding: 2px 0px 2px 0px; + margin: 7px 0px 7px 0px; +} +.rvps9 /* Paragraph Style */ +{ +} +.rvps10 /* Paragraph Style */ +{ + text-align: justify; + text-indent: 30px; +} +.rvps11 /* Paragraph Style */ +{ +} +.rvps12 /* Paragraph Style */ +{ + text-indent: 20px; + margin: 8px 0px 0px 30px; +} +.rvps13 /* Paragraph Style */ +{ +} +.rvps14 +{ + text-indent: 30px; +} +.rvps15 +{ + text-align: justify; + text-indent: 30px; + padding: 0px 0px 0px 0px; + margin: 0px 0px 0px 0px; +} +.rvps16 /* Paragraph Style */ +{ +} +.rvps17 +{ + text-indent: 30px; + margin: 0px 0px 6px 0px; +} +.rvps18 +{ + text-align: center; +} +.rvps19 +{ + text-align: right; +} +.rvps20 /* Paragraph Style */ +{ +} +.rvps21 +{ + text-align: center; + text-indent: 30px; +} +.rvps22 /* Paragraph Style */ +{ + margin: 0px 0px 0px 50px; +} +.rvps23 /* Paragraph Style */ +{ +} +.rvps24 +{ + text-align: justify; +} +.rvps25 +{ + text-align: justify; +} +.rvps26 +{ + text-align: justify; + margin: 0px 0px 0px 50px; +} +.rvps27 +{ + text-align: justify; + text-indent: 20px; +} +.rvps28 /* Paragraph Style */ +{ +} +.rvps29 /* Paragraph Style */ +{ +} +.rvps30 +{ + text-indent: 30px; + margin: 0px 0px 0px 30px; +} +.rvps31 +{ + text-align: justify; + text-indent: 30px; + margin: 0px 0px 0px 30px; +} diff --git a/help/taseditor/css/ielte8.css b/help/taseditor/css/ielte8.css new file mode 100644 index 00000000..db7f3702 --- /dev/null +++ b/help/taseditor/css/ielte8.css @@ -0,0 +1,3 @@ +.ui-tabs .ui-tabs-nav { + padding: 0; +} \ No newline at end of file diff --git a/help/taseditor/css/reset.css b/help/taseditor/css/reset.css new file mode 100644 index 00000000..391d3a30 --- /dev/null +++ b/help/taseditor/css/reset.css @@ -0,0 +1,48 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +img { + padding: 0; + border: 0; + font-size: 100%; + font: inherit; +} +table, caption, tbody, tfoot, thead, tr, th, td { + margin: 0; + font-size: 100%; + font: inherit; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} \ No newline at end of file diff --git a/help/taseditor/css/silver-theme/images/ui-bg_flat_0_aaaaaa_40x100.png b/help/taseditor/css/silver-theme/images/ui-bg_flat_0_aaaaaa_40x100.png new file mode 100644 index 00000000..5b5dab2a Binary files /dev/null and b/help/taseditor/css/silver-theme/images/ui-bg_flat_0_aaaaaa_40x100.png differ diff --git a/help/taseditor/css/silver-theme/images/ui-bg_flat_75_ffffff_40x100.png b/help/taseditor/css/silver-theme/images/ui-bg_flat_75_ffffff_40x100.png new file mode 100644 index 00000000..ac8b229a Binary files /dev/null and b/help/taseditor/css/silver-theme/images/ui-bg_flat_75_ffffff_40x100.png differ diff --git a/help/taseditor/css/silver-theme/images/ui-bg_glass_55_fbf9ee_1x400.png b/help/taseditor/css/silver-theme/images/ui-bg_glass_55_fbf9ee_1x400.png new file mode 100644 index 00000000..ad3d6346 Binary files /dev/null and b/help/taseditor/css/silver-theme/images/ui-bg_glass_55_fbf9ee_1x400.png differ diff --git a/help/taseditor/css/silver-theme/images/ui-bg_glass_65_ffffff_1x400.png b/help/taseditor/css/silver-theme/images/ui-bg_glass_65_ffffff_1x400.png new file mode 100644 index 00000000..42ccba26 Binary files /dev/null and b/help/taseditor/css/silver-theme/images/ui-bg_glass_65_ffffff_1x400.png differ diff --git a/help/taseditor/css/silver-theme/images/ui-bg_glass_75_dadada_1x400.png b/help/taseditor/css/silver-theme/images/ui-bg_glass_75_dadada_1x400.png new file mode 100644 index 00000000..5a46b47c Binary files /dev/null and b/help/taseditor/css/silver-theme/images/ui-bg_glass_75_dadada_1x400.png differ diff --git a/help/taseditor/css/silver-theme/images/ui-bg_glass_75_e6e6e6_1x400.png b/help/taseditor/css/silver-theme/images/ui-bg_glass_75_e6e6e6_1x400.png new file mode 100644 index 00000000..86c2baa6 Binary files /dev/null and b/help/taseditor/css/silver-theme/images/ui-bg_glass_75_e6e6e6_1x400.png differ diff --git a/help/taseditor/css/silver-theme/images/ui-bg_glass_95_fef1ec_1x400.png b/help/taseditor/css/silver-theme/images/ui-bg_glass_95_fef1ec_1x400.png new file mode 100644 index 00000000..4443fdc1 Binary files /dev/null and b/help/taseditor/css/silver-theme/images/ui-bg_glass_95_fef1ec_1x400.png differ diff --git a/help/taseditor/css/silver-theme/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/help/taseditor/css/silver-theme/images/ui-bg_highlight-soft_75_cccccc_1x100.png new file mode 100644 index 00000000..7c9fa6c6 Binary files /dev/null and b/help/taseditor/css/silver-theme/images/ui-bg_highlight-soft_75_cccccc_1x100.png differ diff --git a/help/taseditor/css/silver-theme/images/ui-bg_inset-soft_95_fef1ec_1x100.png b/help/taseditor/css/silver-theme/images/ui-bg_inset-soft_95_fef1ec_1x100.png new file mode 100644 index 00000000..0e05810f Binary files /dev/null and b/help/taseditor/css/silver-theme/images/ui-bg_inset-soft_95_fef1ec_1x100.png differ diff --git a/help/taseditor/css/silver-theme/images/ui-icons_222222_256x240.png b/help/taseditor/css/silver-theme/images/ui-icons_222222_256x240.png new file mode 100644 index 00000000..b273ff11 Binary files /dev/null and b/help/taseditor/css/silver-theme/images/ui-icons_222222_256x240.png differ diff --git a/help/taseditor/css/silver-theme/images/ui-icons_2e83ff_256x240.png b/help/taseditor/css/silver-theme/images/ui-icons_2e83ff_256x240.png new file mode 100644 index 00000000..09d1cdc8 Binary files /dev/null and b/help/taseditor/css/silver-theme/images/ui-icons_2e83ff_256x240.png differ diff --git a/help/taseditor/css/silver-theme/images/ui-icons_454545_256x240.png b/help/taseditor/css/silver-theme/images/ui-icons_454545_256x240.png new file mode 100644 index 00000000..59bd45b9 Binary files /dev/null and b/help/taseditor/css/silver-theme/images/ui-icons_454545_256x240.png differ diff --git a/help/taseditor/css/silver-theme/images/ui-icons_888888_256x240.png b/help/taseditor/css/silver-theme/images/ui-icons_888888_256x240.png new file mode 100644 index 00000000..6d02426c Binary files /dev/null and b/help/taseditor/css/silver-theme/images/ui-icons_888888_256x240.png differ diff --git a/help/taseditor/css/silver-theme/images/ui-icons_cd0a0a_256x240.png b/help/taseditor/css/silver-theme/images/ui-icons_cd0a0a_256x240.png new file mode 100644 index 00000000..2ab019b7 Binary files /dev/null and b/help/taseditor/css/silver-theme/images/ui-icons_cd0a0a_256x240.png differ diff --git a/help/taseditor/css/silver-theme/jquery-ui-1.8.12.custom.css b/help/taseditor/css/silver-theme/jquery-ui-1.8.12.custom.css new file mode 100644 index 00000000..d94b6b29 --- /dev/null +++ b/help/taseditor/css/silver-theme/jquery-ui-1.8.12.custom.css @@ -0,0 +1,103 @@ +/* + * jQuery UI CSS Framework 1.8.12 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + */ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { display: none; } +.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } +.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } +.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } +.ui-helper-clearfix { display: inline-block; } +/* required comment for clearfix to work in Opera \*/ +* html .ui-helper-clearfix { height:1%; } +.ui-helper-clearfix { display:block; } +/* end clearfix */ +.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { cursor: default !important; } + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } + + +/* + * jQuery UI CSS Framework 1.8.12 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=&fwDefault=normal&fsDefault=&cornerRadius=0&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=05_inset_soft.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px + */ + + +/* Component containers +----------------------------------*/ +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: ; font-size: 1em; } +.ui-widget-content { background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; } +.ui-widget-content a { color: #222222; } +.ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; } +.ui-widget-header a { color: #222222; } + +/* Interaction states +----------------------------------*/ +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; } +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; } +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } +.ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; } +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; } +.ui-widget :active { outline: none; } + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; } +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; } +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_inset-soft_95_fef1ec_1x100.png) 50% bottom repeat-x; color: #cd0a0a; } +.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; } +.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } + +/* + * jQuery UI Tabs 1.8.12 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Tabs#theming + */ +.ui-tabs { position: relative; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ +.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } +.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; } +.ui-tabs .ui-tabs-nav li a { float: left; padding: 2px 5px; text-decoration: none; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } +.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ +.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 10px; background: none; } +.ui-tabs .ui-tabs-hide { display: none !important; } diff --git a/help/taseditor/css/toc.css b/help/taseditor/css/toc.css new file mode 100644 index 00000000..9fff9af7 --- /dev/null +++ b/help/taseditor/css/toc.css @@ -0,0 +1,71 @@ +/* -- Body -- */ + +body { + overflow: hidden; +} + +/* -- UI Tabs -- */ + +ul.dynatree-container { + line-height: 1.5em; +} + +.ui-tabs { + position: static; +} + +#toc_header { + padding-bottom: 0; +} + +#tabs .ui-tabs-nav { + border: 0; + border-bottom: 1px solid #ccc; + padding-top: 19px; + position: absolute; + top: 0; + left: 0; + width: 100%; +} + +#tabs .ui-widget-header{ + background: #fff url(../img/header-bg.png) left bottom repeat-x; +} + +#tabs .ui-tabs-panel { + overflow: auto; + position: absolute; + top: 43px; + left: 0; + right: 0; + bottom: 0; +} + +/* Search */ + +#search_value { + width: 140px; +} + +#search_results { + padding-top: 10px; +} + +/* -- Tree -- */ + +ul.dynatree-container { + border: 0; + font-family: inherit; + overflow: visible; + padding: 0; +} + +/* Selection color */ +span.dynatree-active a { + background-color: #999999 !important; +} + +/* Remove folder boldness */ +span.dynatree-folder a { + font-weight: normal; +} \ No newline at end of file diff --git a/help/taseditor/img/arrow_left.png b/help/taseditor/img/arrow_left.png new file mode 100644 index 00000000..7270e0dc Binary files /dev/null and b/help/taseditor/img/arrow_left.png differ diff --git a/help/taseditor/img/arrow_right.png b/help/taseditor/img/arrow_right.png new file mode 100644 index 00000000..ca41e5d8 Binary files /dev/null and b/help/taseditor/img/arrow_right.png differ diff --git a/help/taseditor/img/arrow_up.png b/help/taseditor/img/arrow_up.png new file mode 100644 index 00000000..557d5e6a Binary files /dev/null and b/help/taseditor/img/arrow_up.png differ diff --git a/help/taseditor/img/book-closed.png b/help/taseditor/img/book-closed.png new file mode 100644 index 00000000..ad23b2ad Binary files /dev/null and b/help/taseditor/img/book-closed.png differ diff --git a/help/taseditor/img/book.png b/help/taseditor/img/book.png new file mode 100644 index 00000000..0a76cc17 Binary files /dev/null and b/help/taseditor/img/book.png differ diff --git a/help/taseditor/img/footer-bg.png b/help/taseditor/img/footer-bg.png new file mode 100644 index 00000000..5682c5f3 Binary files /dev/null and b/help/taseditor/img/footer-bg.png differ diff --git a/help/taseditor/img/header-bg.png b/help/taseditor/img/header-bg.png new file mode 100644 index 00000000..81d526d0 Binary files /dev/null and b/help/taseditor/img/header-bg.png differ diff --git a/help/taseditor/img/topic.png b/help/taseditor/img/topic.png new file mode 100644 index 00000000..3974bcaf Binary files /dev/null and b/help/taseditor/img/topic.png differ diff --git a/help/taseditor/img/treeview-default-line.gif b/help/taseditor/img/treeview-default-line.gif new file mode 100644 index 00000000..37114d30 Binary files /dev/null and b/help/taseditor/img/treeview-default-line.gif differ diff --git a/help/taseditor/img/treeview-default.gif b/help/taseditor/img/treeview-default.gif new file mode 100644 index 00000000..a12ac52f Binary files /dev/null and b/help/taseditor/img/treeview-default.gif differ diff --git a/help/taseditor/index.html b/help/taseditor/index.html new file mode 100644 index 00000000..a7e43e51 --- /dev/null +++ b/help/taseditor/index.html @@ -0,0 +1,30 @@ + + + + + + + + TAS Editor Manual + + + + + + + + diff --git a/help/taseditor/js/hnd.js b/help/taseditor/js/hnd.js new file mode 100644 index 00000000..7c3b9e4d --- /dev/null +++ b/help/taseditor/js/hnd.js @@ -0,0 +1 @@ +jQuery.fn.highlight=function(a){function d(b,a){var e=0;if(b.nodeType==3){var c=b.data.toUpperCase().indexOf(a);if(c>=0){e=document.createElement("span");e.className="highlight";c=b.splitText(c);c.splitText(a.length);var g=c.cloneNode(!0);e.appendChild(g);c.parentNode.replaceChild(e,c);e=1}}else if(b.nodeType==1&&b.childNodes&&!/(script|style)/i.test(b.tagName))for(c=0;c=0;c--)b=$.inArray(a[c][0],this.aResults),b>=0&&this.aResults.splice(b,1)},IntersectResultTopics:function(a){if(a&& a.length)for(var b=!1,c=this.aResults.length-1;c>=0;c--){for(var b=!1,d=0;d=0)&&c(a).is(":focusable")}}); +c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a",remove:null,select:null,show:null,spinner:"Loading…",tabTemplate:"
  • #{label}
  • "},_create:function(){this._tabify(true)},_setOption:function(b,e){if(b=="selected")this.options.collapsible&& +e==this.options.selected||this.select(e);else{this.options[b]=e;this._tabify()}},_tabId:function(b){return b.title&&b.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+u()},_sanitizeSelector:function(b){return b.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+w());return d.cookie.apply(null,[b].concat(d.makeArray(arguments)))},_ui:function(b,e){return{tab:b,panel:e,index:this.anchors.index(b)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b= +d(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(b){function e(g,f){g.css("display","");!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}var a=this,c=this.options,h=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=d(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);this.anchors.each(function(g,f){var i=d(f).attr("href"),l=i.split("#")[0],q;if(l&&(l===location.toString().split("#")[0]|| +(q=d("base")[0])&&l===q.href)){i=f.hash;f.href=i}if(h.test(i))a.panels=a.panels.add(a.element.find(a._sanitizeSelector(i)));else if(i&&i!=="#"){d.data(f,"href.tabs",i);d.data(f,"load.tabs",i.replace(/#.*$/,""));i=a._tabId(f);f.href="#"+i;f=a.element.find("#"+i);if(!f.length){f=d(c.panelTemplate).attr("id",i).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(a.panels[g-1]||a.list);f.data("destroy.tabs",true)}a.panels=a.panels.add(f)}else c.disabled.push(g)});if(b){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"); +this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(c.selected===p){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){c.selected=g;return false}});if(typeof c.selected!=="number"&&c.cookie)c.selected=parseInt(a._cookie(),10);if(typeof c.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)c.selected= +this.lis.index(this.lis.filter(".ui-tabs-selected"));c.selected=c.selected||(this.lis.length?0:-1)}else if(c.selected===null)c.selected=-1;c.selected=c.selected>=0&&this.anchors[c.selected]||c.selected<0?c.selected:0;c.disabled=d.unique(c.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return a.lis.index(g)}))).sort();d.inArray(c.selected,c.disabled)!=-1&&c.disabled.splice(d.inArray(c.selected,c.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active"); +if(c.selected>=0&&this.anchors.length){a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash)).removeClass("ui-tabs-hide");this.lis.eq(c.selected).addClass("ui-tabs-selected ui-state-active");a.element.queue("tabs",function(){a._trigger("show",null,a._ui(a.anchors[c.selected],a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash))[0]))});this.load(c.selected)}d(window).bind("unload",function(){a.lis.add(a.anchors).unbind(".tabs");a.lis=a.anchors=a.panels=null})}else c.selected=this.lis.index(this.lis.filter(".ui-tabs-selected")); +this.element[c.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");c.cookie&&this._cookie(c.selected,c.cookie);b=0;for(var j;j=this.lis[b];b++)d(j)[d.inArray(b,c.disabled)!=-1&&!d(j).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");c.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(c.event!=="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+ +g)};this.lis.bind("mouseover.tabs",function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(c.fx)if(d.isArray(c.fx)){m=c.fx[0];o=c.fx[1]}else m=o=c.fx;var r=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal", +function(){e(f,o);a._trigger("show",null,a._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");a._trigger("show",null,a._ui(g,f[0]))},s=m?function(g,f){f.animate(m,m.duration||"normal",function(){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);a.element.dequeue("tabs")})}:function(g,f){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");a.element.dequeue("tabs")}; +this.anchors.bind(c.event+".tabs",function(){var g=this,f=d(g).closest("li"),i=a.panels.filter(":not(.ui-tabs-hide)"),l=a.element.find(a._sanitizeSelector(g.hash));if(f.hasClass("ui-tabs-selected")&&!c.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||a.panels.filter(":animated").length||a._trigger("select",null,a._ui(this,l[0]))===false){this.blur();return false}c.selected=a.anchors.index(this);a.abort();if(c.collapsible)if(f.hasClass("ui-tabs-selected")){c.selected= +-1;c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){s(g,i)}).dequeue("tabs");this.blur();return false}else if(!i.length){c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this));this.blur();return false}c.cookie&&a._cookie(c.selected,c.cookie);if(l.length){i.length&&a.element.queue("tabs",function(){s(g,i)});a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier."; +d.browser.msie&&this.blur()});this.anchors.bind("click.tabs",function(){return false})},_getIndex:function(b){if(typeof b=="string")b=this.anchors.index(this.anchors.filter("[href$="+b+"]"));return b},destroy:function(){var b=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e= +d.data(this,"href.tabs");if(e)this.href=e;var a=d(this).unbind(".tabs");d.each(["href","load","cache"],function(c,h){a.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this,"destroy.tabs")?d(this).remove():d(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});b.cookie&&this._cookie(null,b.cookie);return this},add:function(b, +e,a){if(a===p)a=this.anchors.length;var c=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,b).replace(/#\{label\}/g,e));b=!b.indexOf("#")?b.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var j=c.element.find("#"+b);j.length||(j=d(h.panelTemplate).attr("id",b).data("destroy.tabs",true));j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(a>=this.lis.length){e.appendTo(this.list);j.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[a]); +j.insertBefore(this.panels[a])}h.disabled=d.map(h.disabled,function(k){return k>=a?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");j.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){c._trigger("show",null,c._ui(c.anchors[0],c.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[a],this.panels[a]));return this},remove:function(b){b=this._getIndex(b);var e=this.options,a=this.lis.eq(b).remove(),c=this.panels.eq(b).remove(); +if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(b+(b+1=b?--h:h});this._tabify();this._trigger("remove",null,this._ui(a.find("a")[0],c[0]));return this},enable:function(b){b=this._getIndex(b);var e=this.options;if(d.inArray(b,e.disabled)!=-1){this.lis.eq(b).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(a){return a!=b});this._trigger("enable",null, +this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(b){b=this._getIndex(b);var e=this.options;if(b!=e.selected){this.lis.eq(b).addClass("ui-state-disabled");e.disabled.push(b);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[b],this.panels[b]))}return this},select:function(b){b=this._getIndex(b);if(b==-1)if(this.options.collapsible&&this.options.selected!=-1)b=this.options.selected;else return this;this.anchors.eq(b).trigger(this.options.event+".tabs");return this}, +load:function(b){b=this._getIndex(b);var e=this,a=this.options,c=this.anchors.eq(b)[0],h=d.data(c,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(c,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(b).addClass("ui-state-processing");if(a.spinner){var j=d("span",c);j.data("label.tabs",j.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){e.element.find(e._sanitizeSelector(c.hash)).html(k);e._cleanup();a.cache&&d.data(c, +"cache.tabs",true);e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.error(k,n,b,c)}catch(m){}}}));e.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this}, +url:function(b,e){this.anchors.eq(b).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.12"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(b,e){var a=this,c=this.options,h=a._rotate||(a._rotate=function(j){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=c.selected;a.select(++k=0)&&c(b,!e)}}),a(function(){var b=document.body,c=b.appendChild(c=document.createElement("div"));a.extend(c.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0}),a.support.minHeight=c.offsetHeight===100,a.support.selectstart="onselectstart"in c,b.removeChild(c).style.display="none"}),a.extend(a.ui,{plugin:{add:function(b,c,d){var e=a.ui[b].prototype;for(var f in d)e.plugins[f]=e.plugins[f]||[],e.plugins[f].push([c,d[f]])},call:function(a,b,c){var d=a.plugins[b];if(!!d&&!!a.element[0].parentNode)for(var e=0;e0)return!0;b[d]=1,e=b[d]>0,b[d]=0;return e},isOverAxis:function(a,b,c){return a>b&&a=9)&&!b.button)return this._mouseUp(b);if(this._mouseStarted){this._mouseDrag(b);return b.preventDefault()}this._mouseDistanceMet(b)&&this._mouseDelayMet(b)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,b)!==!1,this._mouseStarted?this._mouseDrag(b):this._mouseUp(b));return!this._mouseStarted},_mouseUp:function(b){a(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,b.target==this._mouseDownEvent.target&&a.data(b.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(b));return!1},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(a){return this.mouseDelayMet},_mouseStart:function(a){},_mouseDrag:function(a){},_mouseStop:function(a){},_mouseCapture:function(a){return!0}})})(jQuery);/* + * jQuery UI Draggable 1.8.17 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Draggables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */(function(a,b){a.widget("ui.draggable",a.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1},_create:function(){this.options.helper=="original"&&!/^(?:r|a|f)/.test(this.element.css("position"))&&(this.element[0].style.position="relative"),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._mouseInit()},destroy:function(){if(!!this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._mouseDestroy();return this}},_mouseCapture:function(b){var c=this.options;if(this.helper||c.disabled||a(b.target).is(".ui-resizable-handle"))return!1;this.handle=this._getHandle(b);if(!this.handle)return!1;c.iframeFix&&a(c.iframeFix===!0?"iframe":c.iframeFix).each(function(){a('
    ').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1e3}).css(a(this).offset()).appendTo("body")});return!0},_mouseStart:function(b){var c=this.options;this.helper=this._createHelper(b),this._cacheHelperProportions(),a.ui.ddmanager&&(a.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(),this.offset=this.positionAbs=this.element.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this.position=this._generatePosition(b),this.originalPageX=b.pageX,this.originalPageY=b.pageY,c.cursorAt&&this._adjustOffsetFromHelper(c.cursorAt),c.containment&&this._setContainment();if(this._trigger("start",b)===!1){this._clear();return!1}this._cacheHelperProportions(),a.ui.ddmanager&&!c.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b),this.helper.addClass("ui-draggable-dragging"),this._mouseDrag(b,!0),a.ui.ddmanager&&a.ui.ddmanager.dragStart(this,b);return!0},_mouseDrag:function(b,c){this.position=this._generatePosition(b),this.positionAbs=this._convertPositionTo("absolute");if(!c){var d=this._uiHash();if(this._trigger("drag",b,d)===!1){this._mouseUp({});return!1}this.position=d.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";a.ui.ddmanager&&a.ui.ddmanager.drag(this,b);return!1},_mouseStop:function(b){var c=!1;a.ui.ddmanager&&!this.options.dropBehaviour&&(c=a.ui.ddmanager.drop(this,b)),this.dropped&&(c=this.dropped,this.dropped=!1);if((!this.element[0]||!this.element[0].parentNode)&&this.options.helper=="original")return!1;if(this.options.revert=="invalid"&&!c||this.options.revert=="valid"&&c||this.options.revert===!0||a.isFunction(this.options.revert)&&this.options.revert.call(this.element,c)){var d=this;a(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){d._trigger("stop",b)!==!1&&d._clear()})}else this._trigger("stop",b)!==!1&&this._clear();return!1},_mouseUp:function(b){this.options.iframeFix===!0&&a("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)}),a.ui.ddmanager&&a.ui.ddmanager.dragStop(this,b);return a.ui.mouse.prototype._mouseUp.call(this,b)},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(b){var c=!this.options.handle||!a(this.options.handle,this.element).length?!0:!1;a(this.options.handle,this.element).find("*").andSelf().each(function(){this==b.target&&(c=!0)});return c},_createHelper:function(b){var c=this.options,d=a.isFunction(c.helper)?a(c.helper.apply(this.element[0],[b])):c.helper=="clone"?this.element.clone().removeAttr("id"):this.element;d.parents("body").length||d.appendTo(c.appendTo=="parent"?this.element[0].parentNode:c.appendTo),d[0]!=this.element[0]&&!/(fixed|absolute)/.test(d.css("position"))&&d.css("position","absolute");return d},_adjustOffsetFromHelper:function(b){typeof b=="string"&&(b=b.split(" ")),a.isArray(b)&&(b={left:+b[0],top:+b[1]||0}),"left"in b&&(this.offset.click.left=b.left+this.margins.left),"right"in b&&(this.offset.click.left=this.helperProportions.width-b.right+this.margins.left),"top"in b&&(this.offset.click.top=b.top+this.margins.top),"bottom"in b&&(this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])&&(b.left+=this.scrollParent.scrollLeft(),b.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)b={top:0,left:0};return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var b=this.options;b.containment=="parent"&&(b.containment=this.helper[0].parentNode);if(b.containment=="document"||b.containment=="window")this.containment=[b.containment=="document"?0:a(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,b.containment=="document"?0:a(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,(b.containment=="document"?0:a(window).scrollLeft())+a(b.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(b.containment=="document"?0:a(window).scrollTop())+(a(b.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(b.containment)&&b.containment.constructor!=Array){var c=a(b.containment),d=c[0];if(!d)return;var e=c.offset(),f=a(d).css("overflow")!="hidden";this.containment=[(parseInt(a(d).css("borderLeftWidth"),10)||0)+(parseInt(a(d).css("paddingLeft"),10)||0),(parseInt(a(d).css("borderTopWidth"),10)||0)+(parseInt(a(d).css("paddingTop"),10)||0),(f?Math.max(d.scrollWidth,d.offsetWidth):d.offsetWidth)-(parseInt(a(d).css("borderLeftWidth"),10)||0)-(parseInt(a(d).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(f?Math.max(d.scrollHeight,d.offsetHeight):d.offsetHeight)-(parseInt(a(d).css("borderTopWidth"),10)||0)-(parseInt(a(d).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relative_container=c}else b.containment.constructor==Array&&(this.containment=b.containment)},_convertPositionTo:function(b,c){c||(c=this.position);var d=b=="absolute"?1:-1,e=this.options,f=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=/(html|body)/i.test(f[0].tagName);return{top:c.top+this.offset.relative.top*d+this.offset.parent.top*d-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():g?0:f.scrollTop())*d),left:c.left+this.offset.relative.left*d+this.offset.parent.left*d-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:f.scrollLeft())*d)}},_generatePosition:function(b){var c=this.options,d=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(d[0].tagName),f=b.pageX,g=b.pageY;if(this.originalPosition){var h;if(this.containment){if(this.relative_container){var i=this.relative_container.offset();h=[this.containment[0]+i.left,this.containment[1]+i.top,this.containment[2]+i.left,this.containment[3]+i.top]}else h=this.containment;b.pageX-this.offset.click.lefth[2]&&(f=h[2]+this.offset.click.left),b.pageY-this.offset.click.top>h[3]&&(g=h[3]+this.offset.click.top)}if(c.grid){var j=c.grid[1]?this.originalPageY+Math.round((g-this.originalPageY)/c.grid[1])*c.grid[1]:this.originalPageY;g=h?j-this.offset.click.toph[3]?j-this.offset.click.toph[2]?k-this.offset.click.left=0;k--){var l=d.snapElements[k].left,m=l+d.snapElements[k].width,n=d.snapElements[k].top,o=n+d.snapElements[k].height;if(!(l-f=k&&g<=l||h>=k&&h<=l||gl)&&(e>=i&&e<=j||f>=i&&f<=j||ej);default:return!1}},a.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(b,c){var d=a.ui.ddmanager.droppables[b.options.scope]||[],e=c?c.type:null,f=(b.currentItem||b.element).find(":data(droppable)").andSelf();droppablesLoop:for(var g=0;g').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("resizable",this.element.data("resizable")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=c.handles||(a(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se");if(this.handles.constructor==String){this.handles=="all"&&(this.handles="n,e,s,w,se,sw,ne,nw");var d=this.handles.split(",");this.handles={};for(var e=0;e');/sw|se|ne|nw/.test(f)&&h.css({zIndex:++c.zIndex}),"se"==f&&h.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[f]=".ui-resizable-"+f,this.element.append(h)}}this._renderAxis=function(b){b=b||this.element;for(var c in this.handles){this.handles[c].constructor==String&&(this.handles[c]=a(this.handles[c],this.element).show());if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var d=a(this.handles[c],this.element),e=0;e=/sw|ne|nw|se|n|s/.test(c)?d.outerHeight():d.outerWidth();var f=["padding",/ne|nw|n/.test(c)?"Top":/se|sw|s/.test(c)?"Bottom":/^e$/.test(c)?"Right":"Left"].join("");b.css(f,e),this._proportionallyResize()}if(!a(this.handles[c]).length)continue}},this._renderAxis(this.element),this._handles=a(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){if(!b.resizing){if(this.className)var a=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=a&&a[1]?a[1]:"se"}}),c.autoHide&&(this._handles.hide(),a(this.element).addClass("ui-resizable-autohide").hover(function(){c.disabled||(a(this).removeClass("ui-resizable-autohide"),b._handles.show())},function(){c.disabled||b.resizing||(a(this).addClass("ui-resizable-autohide"),b._handles.hide())})),this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(b){a(b).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){b(this.element);var c=this.element;c.after(this.originalElement.css({position:c.css("position"),width:c.outerWidth(),height:c.outerHeight(),top:c.css("top"),left:c.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle),b(this.originalElement);return this},_mouseCapture:function(b){var c=!1;for(var d in this.handles)a(this.handles[d])[0]==b.target&&(c=!0);return!this.options.disabled&&c},_mouseStart:function(b){var d=this.options,e=this.element.position(),f=this.element;this.resizing=!0,this.documentScroll={top:a(document).scrollTop(),left:a(document).scrollLeft()},(f.is(".ui-draggable")||/absolute/.test(f.css("position")))&&f.css({position:"absolute",top:e.top,left:e.left}),a.browser.opera&&/relative/.test(f.css("position"))&&f.css({position:"relative",top:"auto",left:"auto"}),this._renderProxy();var g=c(this.helper.css("left")),h=c(this.helper.css("top"));d.containment&&(g+=a(d.containment).scrollLeft()||0,h+=a(d.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:g,top:h},this.size=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalSize=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalPosition={left:g,top:h},this.sizeDiff={width:f.outerWidth()-f.width(),height:f.outerHeight()-f.height()},this.originalMousePosition={left:b.pageX,top:b.pageY},this.aspectRatio=typeof d.aspectRatio=="number"?d.aspectRatio:this.originalSize.width/this.originalSize.height||1;var i=a(".ui-resizable-"+this.axis).css("cursor");a("body").css("cursor",i=="auto"?this.axis+"-resize":i),f.addClass("ui-resizable-resizing"),this._propagate("start",b);return!0},_mouseDrag:function(b){var c=this.helper,d=this.options,e={},f=this,g=this.originalMousePosition,h=this.axis,i=b.pageX-g.left||0,j=b.pageY-g.top||0,k=this._change[h];if(!k)return!1;var l=k.apply(this,[b,i,j]),m=a.browser.msie&&a.browser.version<7,n=this.sizeDiff;this._updateVirtualBoundaries(b.shiftKey);if(this._aspectRatio||b.shiftKey)l=this._updateRatio(l,b);l=this._respectSize(l,b),this._propagate("resize",b),c.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"}),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),this._updateCache(l),this._trigger("resize",b,this.ui());return!1},_mouseStop:function(b){this.resizing=!1;var c=this.options,d=this;if(this._helper){var e=this._proportionallyResizeElements,f=e.length&&/textarea/i.test(e[0].nodeName),g=f&&a.ui.hasScroll(e[0],"left")?0:d.sizeDiff.height,h=f?0:d.sizeDiff.width,i={width:d.helper.width()-h,height:d.helper.height()-g},j=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,k=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;c.animate||this.element.css(a.extend(i,{top:k,left:j})),d.helper.height(d.size.height),d.helper.width(d.size.width),this._helper&&!c.animate&&this._proportionallyResize()}a("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",b),this._helper&&this.helper.remove();return!1},_updateVirtualBoundaries:function(a){var b=this.options,c,e,f,g,h;h={minWidth:d(b.minWidth)?b.minWidth:0,maxWidth:d(b.maxWidth)?b.maxWidth:Infinity,minHeight:d(b.minHeight)?b.minHeight:0,maxHeight:d(b.maxHeight)?b.maxHeight:Infinity};if(this._aspectRatio||a)c=h.minHeight*this.aspectRatio,f=h.minWidth/this.aspectRatio,e=h.maxHeight*this.aspectRatio,g=h.maxWidth/this.aspectRatio,c>h.minWidth&&(h.minWidth=c),f>h.minHeight&&(h.minHeight=f),ea.width,k=d(a.height)&&e.minHeight&&e.minHeight>a.height;j&&(a.width=e.minWidth),k&&(a.height=e.minHeight),h&&(a.width=e.maxWidth),i&&(a.height=e.maxHeight);var l=this.originalPosition.left+this.originalSize.width,m=this.position.top+this.size.height,n=/sw|nw|w/.test(g),o=/nw|ne|n/.test(g);j&&n&&(a.left=l-e.minWidth),h&&n&&(a.left=l-e.maxWidth),k&&o&&(a.top=m-e.minHeight),i&&o&&(a.top=m-e.maxHeight);var p=!a.width&&!a.height;p&&!a.left&&a.top?a.top=null:p&&!a.top&&a.left&&(a.left=null);return a},_proportionallyResize:function(){var b=this.options;if(!!this._proportionallyResizeElements.length){var c=this.helper||this.element;for(var d=0;d');var d=a.browser.msie&&a.browser.version<7,e=d?1:0,f=d?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+f,height:this.element.outerHeight()+f,position:"absolute",left:this.elementOffset.left-e+"px",top:this.elementOffset.top-e+"px",zIndex:++c.zIndex}),this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(a,b,c){return{width:this.originalSize.width+b}},w:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{left:f.left+b,width:e.width-b}},n:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{top:f.top+c,height:e.height-c}},s:function(a,b,c){return{height:this.originalSize.height+c}},se:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},sw:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,c,d]))},ne:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},nw:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,c,d]))}},_propagate:function(b,c){a.ui.plugin.call(this,b,[c,this.ui()]),b!="resize"&&this._trigger(b,c,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),a.extend(a.ui.resizable,{version:"1.8.17"}),a.ui.plugin.add("resizable","alsoResize",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=function(b){a(b).each(function(){var b=a(this);b.data("resizable-alsoresize",{width:parseInt(b.width(),10),height:parseInt(b.height(),10),left:parseInt(b.css("left"),10),top:parseInt(b.css("top"),10),position:b.css("position")})})};typeof e.alsoResize=="object"&&!e.alsoResize.parentNode?e.alsoResize.length?(e.alsoResize=e.alsoResize[0],f(e.alsoResize)):a.each(e.alsoResize,function(a){f(a)}):f(e.alsoResize)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.originalSize,g=d.originalPosition,h={height:d.size.height-f.height||0,width:d.size.width-f.width||0,top:d.position.top-g.top||0,left:d.position.left-g.left||0},i=function(b,e){a(b).each(function(){var b=a(this),f=a(this).data("resizable-alsoresize"),g={},i=e&&e.length?e:b.parents(c.originalElement[0]).length?["width","height"]:["width","height","top","left"];a.each(i,function(a,b){var c=(f[b]||0)+(h[b]||0);c&&c>=0&&(g[b]=c||null)}),a.browser.opera&&/relative/.test(b.css("position"))&&(d._revertToRelativePosition=!0,b.css({position:"absolute",top:"auto",left:"auto"})),b.css(g)})};typeof e.alsoResize=="object"&&!e.alsoResize.nodeType?a.each(e.alsoResize,function(a,b){i(a,b)}):i(e.alsoResize)},stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=function(b){a(b).each(function(){var b=a(this);b.css({position:b.data("resizable-alsoresize").position})})};d._revertToRelativePosition&&(d._revertToRelativePosition=!1,typeof e.alsoResize=="object"&&!e.alsoResize.nodeType?a.each(e.alsoResize,function(a){f(a)}):f(e.alsoResize)),a(this).removeData("resizable-alsoresize")}}),a.ui.plugin.add("resizable","animate",{stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d._proportionallyResizeElements,g=f.length&&/textarea/i.test(f[0].nodeName),h=g&&a.ui.hasScroll(f[0],"left")?0:d.sizeDiff.height,i=g?0:d.sizeDiff.width,j={width:d.size.width-i,height:d.size.height-h},k=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,l=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;d.element.animate(a.extend(j,l&&k?{top:l,left:k}:{}),{duration:e.animateDuration,easing:e.animateEasing,step:function(){var c={width:parseInt(d.element.css("width"),10),height:parseInt(d.element.css("height"),10),top:parseInt(d.element.css("top"),10),left:parseInt(d.element.css("left"),10)};f&&f.length&&a(f[0]).css({width:c.width,height:c.height}),d._updateCache(c),d._propagate("resize",b)}})}}),a.ui.plugin.add("resizable","containment",{start:function(b,d){var e=a(this).data("resizable"),f=e.options,g=e.element,h=f.containment,i=h instanceof a?h.get(0):/parent/.test(h)?g.parent().get(0):h;if(!!i){e.containerElement=a(i);if(/document/.test(h)||h==document)e.containerOffset={left:0,top:0},e.containerPosition={left:0,top:0},e.parentData={element:a(document),left:0,top:0,width:a(document).width(),height:a(document).height()||document.body.parentNode.scrollHeight};else{var j=a(i),k=[];a(["Top","Right","Left","Bottom"]).each(function(a,b){k[a]=c(j.css("padding"+b))}),e.containerOffset=j.offset(),e.containerPosition=j.position(),e.containerSize={height:j.innerHeight()-k[3],width:j.innerWidth()-k[1]};var l=e.containerOffset,m=e.containerSize.height,n=e.containerSize.width,o=a.ui.hasScroll(i,"left")?i.scrollWidth:n,p=a.ui.hasScroll(i)?i.scrollHeight:m;e.parentData={element:i,left:l.left,top:l.top,width:o,height:p}}}},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.containerSize,g=d.containerOffset,h=d.size,i=d.position,j=d._aspectRatio||b.shiftKey,k={top:0,left:0},l=d.containerElement;l[0]!=document&&/static/.test(l.css("position"))&&(k=g),i.left<(d._helper?g.left:0)&&(d.size.width=d.size.width+(d._helper?d.position.left-g.left:d.position.left-k.left),j&&(d.size.height=d.size.width/e.aspectRatio),d.position.left=e.helper?g.left:0),i.top<(d._helper?g.top:0)&&(d.size.height=d.size.height+(d._helper?d.position.top-g.top:d.position.top),j&&(d.size.width=d.size.height*e.aspectRatio),d.position.top=d._helper?g.top:0),d.offset.left=d.parentData.left+d.position.left,d.offset.top=d.parentData.top+d.position.top;var m=Math.abs((d._helper?d.offset.left-k.left:d.offset.left-k.left)+d.sizeDiff.width),n=Math.abs((d._helper?d.offset.top-k.top:d.offset.top-g.top)+d.sizeDiff.height),o=d.containerElement.get(0)==d.element.parent().get(0),p=/relative|absolute/.test(d.containerElement.css("position"));o&&p&&(m-=d.parentData.left),m+d.size.width>=d.parentData.width&&(d.size.width=d.parentData.width-m,j&&(d.size.height=d.size.width/d.aspectRatio)),n+d.size.height>=d.parentData.height&&(d.size.height=d.parentData.height-n,j&&(d.size.width=d.size.height*d.aspectRatio))},stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.position,g=d.containerOffset,h=d.containerPosition,i=d.containerElement,j=a(d.helper),k=j.offset(),l=j.outerWidth()-d.sizeDiff.width,m=j.outerHeight()-d.sizeDiff.height;d._helper&&!e.animate&&/relative/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m}),d._helper&&!e.animate&&/static/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m})}}),a.ui.plugin.add("resizable","ghost",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size;d.ghost=d.originalElement.clone(),d.ghost.css({opacity:.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof e.ghost=="string"?e.ghost:""),d.ghost.appendTo(d.helper)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.ghost.css({position:"relative",height:d.size.height,width:d.size.width})},stop:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.helper&&d.helper.get(0).removeChild(d.ghost.get(0))}}),a.ui.plugin.add("resizable","grid",{resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size,g=d.originalSize,h=d.originalPosition,i=d.axis,j=e._aspectRatio||b.shiftKey;e.grid=typeof e.grid=="number"?[e.grid,e.grid]:e.grid;var k=Math.round((f.width-g.width)/(e.grid[0]||1))*(e.grid[0]||1),l=Math.round((f.height-g.height)/(e.grid[1]||1))*(e.grid[1]||1);/^(se|s|e)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l):/^(ne)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l):/^(sw)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.left=h.left-k):(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l,d.position.left=h.left-k)}});var c=function(a){return parseInt(a,10)||0},d=function(a){return!isNaN(parseInt(a,10))}})(jQuery);/* + * jQuery UI Selectable 1.8.17 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Selectables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */(function(a,b){a.widget("ui.selectable",a.ui.mouse,{options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch"},_create:function(){var b=this;this.element.addClass("ui-selectable"),this.dragged=!1;var c;this.refresh=function(){c=a(b.options.filter,b.element[0]),c.addClass("ui-selectee"),c.each(function(){var b=a(this),c=b.offset();a.data(this,"selectable-item",{element:this,$element:b,left:c.left,top:c.top,right:c.left+b.outerWidth(),bottom:c.top+b.outerHeight(),startselected:!1,selected:b.hasClass("ui-selected"),selecting:b.hasClass("ui-selecting"),unselecting:b.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=c.addClass("ui-selectee"),this._mouseInit(),this.helper=a("
    ")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable"),this._mouseDestroy();return this},_mouseStart:function(b){var c=this;this.opos=[b.pageX,b.pageY];if(!this.options.disabled){var d=this.options;this.selectees=a(d.filter,this.element[0]),this._trigger("start",b),a(d.appendTo).append(this.helper),this.helper.css({left:b.clientX,top:b.clientY,width:0,height:0}),d.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var d=a.data(this,"selectable-item");d.startselected=!0,!b.metaKey&&!b.ctrlKey&&(d.$element.removeClass("ui-selected"),d.selected=!1,d.$element.addClass("ui-unselecting"),d.unselecting=!0,c._trigger("unselecting",b,{unselecting:d.element}))}),a(b.target).parents().andSelf().each(function(){var d=a.data(this,"selectable-item");if(d){var e=!b.metaKey&&!b.ctrlKey||!d.$element.hasClass("ui-selected");d.$element.removeClass(e?"ui-unselecting":"ui-selected").addClass(e?"ui-selecting":"ui-unselecting"),d.unselecting=!e,d.selecting=e,d.selected=e,e?c._trigger("selecting",b,{selecting:d.element}):c._trigger("unselecting",b,{unselecting:d.element});return!1}})}},_mouseDrag:function(b){var c=this;this.dragged=!0;if(!this.options.disabled){var d=this.options,e=this.opos[0],f=this.opos[1],g=b.pageX,h=b.pageY;if(e>g){var i=g;g=e,e=i}if(f>h){var i=h;h=f,f=i}this.helper.css({left:e,top:f,width:g-e,height:h-f}),this.selectees.each(function(){var i=a.data(this,"selectable-item");if(!!i&&i.element!=c.element[0]){var j=!1;d.tolerance=="touch"?j=!(i.left>g||i.righth||i.bottome&&i.rightf&&i.bottom *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3},_create:function(){var a=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?a.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):!1,this.offset=this.element.offset(),this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled"),this._mouseDestroy();for(var a=this.items.length-1;a>=0;a--)this.items[a].item.removeData(this.widgetName+"-item");return this},_setOption:function(b,c){b==="disabled"?(this.options[b]=c,this.widget()[c?"addClass":"removeClass"]("ui-sortable-disabled")):a.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(b,c){var d=this;if(this.reverting)return!1;if(this.options.disabled||this.options.type=="static")return!1;this._refreshItems(b);var e=null,f=this,g=a(b.target).parents().each(function(){if(a.data(this,d.widgetName+"-item")==f){e=a(this);return!1}});a.data(b.target,d.widgetName+"-item")==f&&(e=a(b.target));if(!e)return!1;if(this.options.handle&&!c){var h=!1;a(this.options.handle,e).find("*").andSelf().each(function(){this==b.target&&(h=!0)});if(!h)return!1}this.currentItem=e,this._removeCurrentsFromItems();return!0},_mouseStart:function(b,c,d){var e=this.options,f=this;this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(b),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this._generatePosition(b),this.originalPageX=b.pageX,this.originalPageY=b.pageY,e.cursorAt&&this._adjustOffsetFromHelper(e.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!=this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),e.containment&&this._setContainment(),e.cursor&&(a("body").css("cursor")&&(this._storedCursor=a("body").css("cursor")),a("body").css("cursor",e.cursor)),e.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",e.opacity)),e.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",e.zIndex)),this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",b,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions();if(!d)for(var g=this.containers.length-1;g>=0;g--)this.containers[g]._trigger("activate",b,f._uiHash(this));a.ui.ddmanager&&(a.ui.ddmanager.current=this),a.ui.ddmanager&&!e.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(b);return!0},_mouseDrag:function(b){this.position=this._generatePosition(b),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs);if(this.options.scroll){var c=this.options,d=!1;this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-b.pageY=0;e--){var f=this.items[e],g=f.item[0],h=this._intersectsWithPointer(f);if(!h)continue;if(g!=this.currentItem[0]&&this.placeholder[h==1?"next":"prev"]()[0]!=g&&!a.ui.contains(this.placeholder[0],g)&&(this.options.type=="semi-dynamic"?!a.ui.contains(this.element[0],g):!0)){this.direction=h==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(f))this._rearrange(b,f);else break;this._trigger("change",b,this._uiHash());break}}this._contactContainers(b),a.ui.ddmanager&&a.ui.ddmanager.drag(this,b),this._trigger("sort",b,this._uiHash()),this.lastPositionAbs=this.positionAbs;return!1},_mouseStop:function(b,c){if(!!b){a.ui.ddmanager&&!this.options.dropBehaviour&&a.ui.ddmanager.drop(this,b);if(this.options.revert){var d=this,e=d.placeholder.offset();d.reverting=!0,a(this.helper).animate({left:e.left-this.offset.parent.left-d.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:e.top-this.offset.parent.top-d.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){d._clear(b)})}else this._clear(b,c);return!1}},cancel:function(){var b=this;if(this.dragging){this._mouseUp({target:null}),this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("deactivate",null,b._uiHash(this)),this.containers[c].containerCache.over&&(this.containers[c]._trigger("out",null,b._uiHash(this)),this.containers[c].containerCache.over=0)}this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),a.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?a(this.domPosition.prev).after(this.currentItem):a(this.domPosition.parent).prepend(this.currentItem));return this},serialize:function(b){var c=this._getItemsAsjQuery(b&&b.connected),d=[];b=b||{},a(c).each(function(){var c=(a(b.item||this).attr(b.attribute||"id")||"").match(b.expression||/(.+)[-=_](.+)/);c&&d.push((b.key||c[1]+"[]")+"="+(b.key&&b.expression?c[1]:c[2]))}),!d.length&&b.key&&d.push(b.key+"=");return d.join("&")},toArray:function(b){var c=this._getItemsAsjQuery(b&&b.connected),d=[];b=b||{},c.each(function(){d.push(a(b.item||this).attr(b.attribute||"id")||"")});return d},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,d=this.positionAbs.top,e=d+this.helperProportions.height,f=a.left,g=f+a.width,h=a.top,i=h+a.height,j=this.offset.click.top,k=this.offset.click.left,l=d+j>h&&d+jf&&b+ka[this.floating?"width":"height"]?l:f0?"down":"up")},_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a),this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(b){var c=this,d=[],e=[],f=this._connectWith();if(f&&b)for(var g=f.length-1;g>=0;g--){var h=a(f[g]);for(var i=h.length-1;i>=0;i--){var j=a.data(h[i],this.widgetName);j&&j!=this&&!j.options.disabled&&e.push([a.isFunction(j.options.items)?j.options.items.call(j.element):a(j.options.items,j.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),j])}}e.push([a.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):a(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(var g=e.length-1;g>=0;g--)e[g][0].each(function(){d.push(this)});return a(d)},_removeCurrentsFromItems:function(){var a=this.currentItem.find(":data("+this.widgetName+"-item)");for(var b=0;b=0;g--){var h=a(f[g]);for(var i=h.length-1;i>=0;i--){var j=a.data(h[i],this.widgetName);j&&j!=this&&!j.options.disabled&&(e.push([a.isFunction(j.options.items)?j.options.items.call(j.element[0],b,{item:this.currentItem}):a(j.options.items,j.element),j]),this.containers.push(j))}}for(var g=e.length-1;g>=0;g--){var k=e[g][1],l=e[g][0];for(var i=0,m=l.length;i=0;c--){var d=this.items[c];if(d.instance!=this.currentContainer&&this.currentContainer&&d.item[0]!=this.currentItem[0])continue;var e=this.options.toleranceElement?a(this.options.toleranceElement,d.item):d.item;b||(d.width=e.outerWidth(),d.height=e.outerHeight());var f=e.offset();d.left=f.left,d.top=f.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(var c=this.containers.length-1;c>=0;c--){var f=this.containers[c].element.offset();this.containers[c].containerCache.left=f.left,this.containers[c].containerCache.top=f.top,this.containers[c].containerCache.width=this.containers[c].element.outerWidth(),this.containers[c].containerCache.height=this.containers[c].element.outerHeight()}return this},_createPlaceholder:function(b){var c=b||this,d=c.options;if(!d.placeholder||d.placeholder.constructor==String){var e=d.placeholder;d.placeholder={element:function(){var b=a(document.createElement(c.currentItem[0].nodeName)).addClass(e||c.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];e||(b.style.visibility="hidden");return b},update:function(a,b){if(!e||!!d.forcePlaceholderSize)b.height()||b.height(c.currentItem.innerHeight()-parseInt(c.currentItem.css("paddingTop")||0,10)-parseInt(c.currentItem.css("paddingBottom")||0,10)),b.width()||b.width(c.currentItem.innerWidth()-parseInt(c.currentItem.css("paddingLeft")||0,10)-parseInt(c.currentItem.css("paddingRight")||0,10))}}}c.placeholder=a(d.placeholder.element.call(c.element,c.currentItem)),c.currentItem.after(c.placeholder),d.placeholder.update(c,c.placeholder)},_contactContainers:function(b){var c=null,d=null;for(var e=this.containers.length-1;e>=0;e--){if(a.ui.contains(this.currentItem[0],this.containers[e].element[0]))continue;if(this._intersectsWith(this.containers[e].containerCache)){if(c&&a.ui.contains(this.containers[e].element[0],c.element[0]))continue;c=this.containers[e],d=e}else this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",b,this._uiHash(this)),this.containers[e].containerCache.over=0)}if(!!c)if(this.containers.length===1)this.containers[d]._trigger("over",b,this._uiHash(this)),this.containers[d].containerCache.over=1;else if(this.currentContainer!=this.containers[d]){var f=1e4,g=null,h=this.positionAbs[this.containers[d].floating?"left":"top"];for(var i=this.items.length-1;i>=0;i--){if(!a.ui.contains(this.containers[d].element[0],this.items[i].item[0]))continue;var j=this.items[i][this.containers[d].floating?"left":"top"];Math.abs(j-h)this.containment[2]&&(f=this.containment[2]+this.offset.click.left),b.pageY-this.offset.click.top>this.containment[3]&&(g=this.containment[3]+this.offset.click.top));if(c.grid){var h=this.originalPageY+Math.round((g-this.originalPageY)/c.grid[1])*c.grid[1];g=this.containment?h-this.offset.click.topthis.containment[3]?h-this.offset.click.topthis.containment[2]?i-this.offset.click.left=0;f--)a.ui.contains(this.containers[f].element[0],this.currentItem[0])&&!c&&(d.push(function(a){return function(b){a._trigger("receive",b,this._uiHash(this))}}.call(this,this.containers[f])),d.push(function(a){return function(b){a._trigger("update",b,this._uiHash(this))}}.call(this,this.containers[f])))}for(var f=this.containers.length-1;f>=0;f--)c||d.push(function(a){return function(b){a._trigger("deactivate",b,this._uiHash(this))}}.call(this,this.containers[f])),this.containers[f].containerCache.over&&(d.push(function(a){return function(b){a._trigger("out",b,this._uiHash(this))}}.call(this,this.containers[f])),this.containers[f].containerCache.over=0);this._storedCursor&&a("body").css("cursor",this._storedCursor),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex),this.dragging=!1;if(this.cancelHelperRemoval){if(!c){this._trigger("beforeStop",b,this._uiHash());for(var f=0;f",remove:null,select:null,show:null,spinner:"Loading…",tabTemplate:"
  • #{label}
  • "},_create:function(){this._tabify(!0)},_setOption:function(a,b){if(a=="selected"){if(this.options.collapsible&&b==this.options.selected)return;this.select(b)}else this.options[a]=b,this._tabify()},_tabId:function(a){return a.title&&a.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+e()},_sanitizeSelector:function(a){return a.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+f());return a.cookie.apply(null,[b].concat(a.makeArray(arguments)))},_ui:function(a,b){return{tab:a,panel:b,index:this.anchors.index(a)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b=a(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(c){function m(b,c){b.css("display",""),!a.support.opacity&&c.opacity&&b[0].style.removeAttribute("filter")}var d=this,e=this.options,f=/^#.+/;this.list=this.element.find("ol,ul").eq(0),this.lis=a(" > li:has(a[href])",this.list),this.anchors=this.lis.map(function(){return a("a",this)[0]}),this.panels=a([]),this.anchors.each(function(b,c){var g=a(c).attr("href"),h=g.split("#")[0],i;h&&(h===location.toString().split("#")[0]||(i=a("base")[0])&&h===i.href)&&(g=c.hash,c.href=g);if(f.test(g))d.panels=d.panels.add(d.element.find(d._sanitizeSelector(g)));else if(g&&g!=="#"){a.data(c,"href.tabs",g),a.data(c,"load.tabs",g.replace(/#.*$/,""));var j=d._tabId(c);c.href="#"+j;var k=d.element.find("#"+j);k.length||(k=a(e.panelTemplate).attr("id",j).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(d.panels[b-1]||d.list),k.data("destroy.tabs",!0)),d.panels=d.panels.add(k)}else e.disabled.push(b)}),c?(this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"),this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"),this.lis.addClass("ui-state-default ui-corner-top"),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom"),e.selected===b?(location.hash&&this.anchors.each(function(a,b){if(b.hash==location.hash){e.selected=a;return!1}}),typeof e.selected!="number"&&e.cookie&&(e.selected=parseInt(d._cookie(),10)),typeof e.selected!="number"&&this.lis.filter(".ui-tabs-selected").length&&(e.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"))),e.selected=e.selected||(this.lis.length?0:-1)):e.selected===null&&(e.selected=-1),e.selected=e.selected>=0&&this.anchors[e.selected]||e.selected<0?e.selected:0,e.disabled=a.unique(e.disabled.concat(a.map(this.lis.filter(".ui-state-disabled"),function(a,b){return d.lis.index(a)}))).sort(),a.inArray(e.selected,e.disabled)!=-1&&e.disabled.splice(a.inArray(e.selected,e.disabled),1),this.panels.addClass("ui-tabs-hide"),this.lis.removeClass("ui-tabs-selected ui-state-active"),e.selected>=0&&this.anchors.length&&(d.element.find(d._sanitizeSelector(d.anchors[e.selected].hash)).removeClass("ui-tabs-hide"),this.lis.eq(e.selected).addClass("ui-tabs-selected ui-state-active"),d.element.queue("tabs",function(){d._trigger("show",null,d._ui(d.anchors[e.selected],d.element.find(d._sanitizeSelector(d.anchors[e.selected].hash))[0]))}),this.load(e.selected)),a(window).bind("unload",function(){d.lis.add(d.anchors).unbind(".tabs"),d.lis=d.anchors=d.panels=null})):e.selected=this.lis.index(this.lis.filter(".ui-tabs-selected")),this.element[e.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible"),e.cookie&&this._cookie(e.selected,e.cookie);for(var g=0,h;h=this.lis[g];g++)a(h)[a.inArray(g,e.disabled)!=-1&&!a(h).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");e.cache===!1&&this.anchors.removeData("cache.tabs"),this.lis.add(this.anchors).unbind(".tabs");if(e.event!=="mouseover"){var i=function(a,b){b.is(":not(.ui-state-disabled)")&&b.addClass("ui-state-"+a)},j=function(a,b){b.removeClass("ui-state-"+a)};this.lis.bind("mouseover.tabs",function(){i("hover",a(this))}),this.lis.bind("mouseout.tabs",function(){j("hover",a(this))}),this.anchors.bind("focus.tabs",function(){i("focus",a(this).closest("li"))}),this.anchors.bind("blur.tabs",function(){j("focus",a(this).closest("li"))})}var k,l;e.fx&&(a.isArray(e.fx)?(k=e.fx[0],l=e.fx[1]):k=l=e.fx);var n=l?function(b,c){a(b).closest("li").addClass("ui-tabs-selected ui-state-active"),c.hide().removeClass("ui-tabs-hide").animate(l,l.duration||"normal",function(){m(c,l),d._trigger("show",null,d._ui(b,c[0]))})}:function(b,c){a(b).closest("li").addClass("ui-tabs-selected ui-state-active"),c.removeClass("ui-tabs-hide"),d._trigger("show",null,d._ui(b,c[0]))},o=k?function(a,b){b.animate(k,k.duration||"normal",function(){d.lis.removeClass("ui-tabs-selected ui-state-active"),b.addClass("ui-tabs-hide"),m(b,k),d.element.dequeue("tabs")})}:function(a,b,c){d.lis.removeClass("ui-tabs-selected ui-state-active"),b.addClass("ui-tabs-hide"),d.element.dequeue("tabs")};this.anchors.bind(e.event+".tabs",function(){var b=this,c=a(b).closest("li"),f=d.panels.filter(":not(.ui-tabs-hide)"),g=d.element.find(d._sanitizeSelector(b.hash));if(c.hasClass("ui-tabs-selected")&&!e.collapsible||c.hasClass("ui-state-disabled")||c.hasClass("ui-state-processing")||d.panels.filter(":animated").length||d._trigger("select",null,d._ui(this,g[0]))===!1){this.blur();return!1}e.selected=d.anchors.index(this),d.abort();if(e.collapsible){if(c.hasClass("ui-tabs-selected")){e.selected=-1,e.cookie&&d._cookie(e.selected,e.cookie),d.element.queue("tabs",function(){o(b,f)}).dequeue("tabs"),this.blur();return!1}if(!f.length){e.cookie&&d._cookie(e.selected,e.cookie),d.element.queue("tabs",function(){n(b,g)}),d.load(d.anchors.index(this)),this.blur();return!1}}e.cookie&&d._cookie(e.selected,e.cookie);if(g.length)f.length&&d.element.queue("tabs",function(){o(b,f)}),d.element.queue("tabs",function(){n(b,g)}),d.load(d.anchors.index(this));else throw"jQuery UI Tabs: Mismatching fragment identifier.";a.browser.msie&&this.blur()}),this.anchors.bind("click.tabs",function(){return!1})},_getIndex:function(a){typeof a=="string"&&(a=this.anchors.index(this.anchors.filter("[href$="+a+"]")));return a},destroy:function(){var b=this.options;this.abort(),this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs"),this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"),this.anchors.each(function(){var b=a.data(this,"href.tabs");b&&(this.href=b);var c=a(this).unbind(".tabs");a.each(["href","load","cache"],function(a,b){c.removeData(b+".tabs")})}),this.lis.unbind(".tabs").add(this.panels).each(function(){a.data(this,"destroy.tabs")?a(this).remove():a(this).removeClass(["ui-state-default","ui-corner-top","ui-tabs-selected","ui-state-active","ui-state-hover","ui-state-focus","ui-state-disabled","ui-tabs-panel","ui-widget-content","ui-corner-bottom","ui-tabs-hide"].join(" "))}),b.cookie&&this._cookie(null,b.cookie);return this},add:function(c,d,e){e===b&&(e=this.anchors.length);var f=this,g=this.options,h=a(g.tabTemplate.replace(/#\{href\}/g,c).replace(/#\{label\}/g,d)),i=c.indexOf("#")?this._tabId(a("a",h)[0]):c.replace("#","");h.addClass("ui-state-default ui-corner-top").data("destroy.tabs",!0);var j=f.element.find("#"+i);j.length||(j=a(g.panelTemplate).attr("id",i).data("destroy.tabs",!0)),j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide"),e>=this.lis.length?(h.appendTo(this.list),j.appendTo(this.list[0].parentNode)):(h.insertBefore(this.lis[e]),j.insertBefore(this.panels[e])),g.disabled=a.map(g.disabled,function(a,b){return a>=e?++a:a}),this._tabify(),this.anchors.length==1&&(g.selected=0,h.addClass("ui-tabs-selected ui-state-active"),j.removeClass("ui-tabs-hide"),this.element.queue("tabs",function(){f._trigger("show",null,f._ui(f.anchors[0],f.panels[0]))}),this.load(0)),this._trigger("add",null,this._ui(this.anchors[e],this.panels[e]));return this},remove:function(b){b=this._getIndex(b);var c=this.options,d=this.lis.eq(b).remove(),e=this.panels.eq(b).remove();d.hasClass("ui-tabs-selected")&&this.anchors.length>1&&this.select(b+(b+1=b?--a:a}),this._tabify(),this._trigger("remove",null,this._ui(d.find("a")[0],e[0]));return this},enable:function(b){b=this._getIndex(b);var c=this.options;if(a.inArray(b,c.disabled)!=-1){this.lis.eq(b).removeClass("ui-state-disabled"),c.disabled=a.grep(c.disabled,function(a,c){return a!=b}),this._trigger("enable",null,this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(a){a=this._getIndex(a);var b=this,c=this.options;a!=c.selected&&(this.lis.eq(a).addClass("ui-state-disabled"),c.disabled.push(a),c.disabled.sort(),this._trigger("disable",null,this._ui(this.anchors[a],this.panels[a])));return this},select:function(a){a=this._getIndex(a);if(a==-1)if(this.options.collapsible&&this.options.selected!=-1)a=this.options.selected;else return this;this.anchors.eq(a).trigger(this.options.event+".tabs");return this},load:function(b){b=this._getIndex(b);var c=this,d=this.options,e=this.anchors.eq(b)[0],f=a.data(e,"load.tabs");this.abort();if(!f||this.element.queue("tabs").length!==0&&a.data(e,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(b).addClass("ui-state-processing");if(d.spinner){var g=a("span",e);g.data("label.tabs",g.html()).html(d.spinner)}this.xhr=a.ajax(a.extend({},d.ajaxOptions,{url:f,success:function(f,g){c.element.find(c._sanitizeSelector(e.hash)).html(f),c._cleanup(),d.cache&&a.data(e,"cache.tabs",!0),c._trigger("load",null,c._ui(c.anchors[b],c.panels[b]));try{d.ajaxOptions.success(f,g)}catch(h){}},error:function(a,f,g){c._cleanup(),c._trigger("load",null,c._ui(c.anchors[b],c.panels[b]));try{d.ajaxOptions.error(a,f,b,e)}catch(g){}}})),c.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]),this.panels.stop(!1,!0),this.element.queue("tabs",this.element.queue("tabs").splice(-2,2)),this.xhr&&(this.xhr.abort(),delete this.xhr),this._cleanup();return this},url:function(a,b){this.anchors.eq(a).removeData("cache.tabs").data("load.tabs",b);return this},length:function(){return this.anchors.length}}),a.extend(a.ui.tabs,{version:"1.8.17"}),a.extend(a.ui.tabs.prototype,{rotation:null,rotate:function(a,b){var c=this,d=this.options,e=c._rotate||(c._rotate=function(b){clearTimeout(c.rotation),c.rotation=setTimeout(function(){var a=d.selected;c.select(++a1){res+=cache.tagConnector;}}else if(this.hasChildren()!==false){res+=cache.tagExpander;}else{res+=cache.tagConnector;} +if(opts.checkbox&&data.hideCheckbox!==true&&!data.isStatusNode){res+=cache.tagCheckbox;} +if(data.icon){res+="";}else if(data.icon===false){noop();}else{res+=cache.tagNodeIcon;} +var nodeTitle="";if(opts.onCustomRender){nodeTitle=opts.onCustomRender.call(tree,this)||"";} +if(!nodeTitle){var tooltip=data.tooltip?' title="'+data.tooltip.replace(/\"/g,'"')+'"':'',href=data.href||"#";if(opts.noLink||data.noLink){nodeTitle=''+data.title+'';}else{nodeTitle=''+data.title+'';}} +res+=nodeTitle;return res;},_fixOrder:function(){var cl=this.childList;if(!cl||!this.ul){return;} +var childLI=this.ul.firstChild;for(var i=0,l=cl.length-1;i1){this.ul.className=cn.container+" "+cn.noConnector;}else{this.ul.className=cn.container;}}else if(parent){if(!this.li){firstTime=true;this.li=document.createElement("li");this.li.dtnode=this;if(data.key&&opts.generateIds){this.li.id=opts.idPrefix+data.key;} +this.span=document.createElement("span");this.span.className=cn.title;this.li.appendChild(this.span);if(!parent.ul){parent.ul=document.createElement("ul");parent.ul.style.display="none";parent.li.appendChild(parent.ul);} +parent.ul.appendChild(this.li);} +this.span.innerHTML=this._getInnerHtml();var cnList=[];cnList.push(cn.node);if(data.isFolder){cnList.push(cn.folder);} +if(this.bExpanded){cnList.push(cn.expanded);} +if(this.hasChildren()!==false){cnList.push(cn.hasChildren);} +if(data.isLazy&&this.childList===null){cnList.push(cn.lazy);} +if(isLastSib){cnList.push(cn.lastsib);} +if(this.bSelected){cnList.push(cn.selected);} +if(this.hasSubSel){cnList.push(cn.partsel);} +if(tree.activeNode===this){cnList.push(cn.active);} +if(data.addClass){cnList.push(data.addClass);} +cnList.push(cn.combinedExpanderPrefix ++(this.bExpanded?"e":"c") ++(data.isLazy&&this.childList===null?"d":"") ++(isLastSib?"l":""));cnList.push(cn.combinedIconPrefix ++(this.bExpanded?"e":"c") ++(data.isFolder?"f":""));this.span.className=cnList.join(" ");this.li.className=isLastSib?cn.lastsib:"";if(firstTime&&opts.onCreate){opts.onCreate.call(tree,this,this.span);} +if(opts.onRender){opts.onRender.call(tree,this,this.span);}} +if((this.bExpanded||includeInvisible===true)&&this.childList){for(var i=0,l=this.childList.length;iy?1:-1;};cl.sort(cmp);if(deep){for(var i=0,l=cl.length;i0){this.childList[0].focus();}else{this.focus();}} +break;case DTNodeStatus_Loading:this._isLoading=true;$(this.span).addClass(this.tree.options.classNames.nodeLoading);if(!this.parent){this._setStatusNode({title:this.tree.options.strings.loading+info,tooltip:tooltip,addClass:this.tree.options.classNames.nodeWait});} +break;case DTNodeStatus_Error:this._isLoading=false;this._setStatusNode({title:this.tree.options.strings.loadError+info,tooltip:tooltip,addClass:this.tree.options.classNames.nodeError});break;default:throw"Bad LazyNodeStatus: '"+lts+"'.";}},_parentList:function(includeRoot,includeSelf){var l=[];var dtn=includeSelf?this:this.parent;while(dtn){if(includeRoot||dtn.parent){l.unshift(dtn);} +dtn=dtn.parent;} +return l;},getLevel:function(){var level=0;var dtn=this.parent;while(dtn){level++;dtn=dtn.parent;} +return level;},_getTypeForOuterNodeEvent:function(event){var cns=this.tree.options.classNames;var target=event.target;if(target.className.indexOf(cns.node)<0){return null;} +var eventX=event.pageX-target.offsetLeft;var eventY=event.pageY-target.offsetTop;for(var i=0,l=target.childNodes.length;i=x&&eventX<=(x+nx)&&eventY>=y&&eventY<=(y+ny)){if(cn.className==cns.title){return"title";}else if(cn.className==cns.expander){return"expander";}else if(cn.className==cns.checkbox){return"checkbox";}else if(cn.className==cns.nodeIcon){return"icon";}}} +return"prefix";},getEventTargetType:function(event){var tcn=event&&event.target?event.target.className:"",cns=this.tree.options.classNames;if(tcn===cns.title){return"title";}else if(tcn===cns.expander){return"expander";}else if(tcn===cns.checkbox){return"checkbox";}else if(tcn===cns.nodeIcon){return"icon";}else if(tcn===cns.empty||tcn===cns.vline||tcn===cns.connector){return"prefix";}else if(tcn.indexOf(cns.node)>=0){return this._getTypeForOuterNodeEvent(event);} +return null;},isVisible:function(){var parents=this._parentList(true,false);for(var i=0,l=parents.length;ia").focus();}catch(e){}},isFocused:function(){return(this.tree.tnFocused===this);},_activate:function(flag,fireEvents){this.tree.logDebug("dtnode._activate(%o, fireEvents=%o) - %o",flag,fireEvents,this);var opts=this.tree.options;if(this.data.isStatusNode){return;} +if(fireEvents&&opts.onQueryActivate&&opts.onQueryActivate.call(this.tree,flag,this)===false){return;} +if(flag){if(this.tree.activeNode){if(this.tree.activeNode===this){return;} +this.tree.activeNode.deactivate();} +if(opts.activeVisible){this.makeVisible();} +this.tree.activeNode=this;if(opts.persist){$.cookie(opts.cookieId+"-active",this.data.key,opts.cookie);} +this.tree.persistence.activeKey=this.data.key;$(this.span).addClass(opts.classNames.active);if(fireEvents&&opts.onActivate){opts.onActivate.call(this.tree,this);}}else{if(this.tree.activeNode===this){if(opts.onQueryActivate&&opts.onQueryActivate.call(this.tree,false,this)===false){return;} +$(this.span).removeClass(opts.classNames.active);if(opts.persist){$.cookie(opts.cookieId+"-active","",opts.cookie);} +this.tree.persistence.activeKey=null;this.tree.activeNode=null;if(fireEvents&&opts.onDeactivate){opts.onDeactivate.call(this.tree,this);}}}},activate:function(){this._activate(true,true);},activateSilently:function(){this._activate(true,false);},deactivate:function(){this._activate(false,true);},isActive:function(){return(this.tree.activeNode===this);},_userActivate:function(){var activate=true;var expand=false;if(this.data.isFolder){switch(this.tree.options.clickFolderMode){case 2:activate=false;expand=true;break;case 3:activate=expand=true;break;}} +if(this.parent===null){expand=false;} +if(expand){this.toggleExpand();this.focus();} +if(activate){this.activate();}},_setSubSel:function(hasSubSel){if(hasSubSel){this.hasSubSel=true;$(this.span).addClass(this.tree.options.classNames.partsel);}else{this.hasSubSel=false;$(this.span).removeClass(this.tree.options.classNames.partsel);}},_updatePartSelectionState:function(){var sel;if(!this.hasChildren()){sel=(this.bSelected&&!this.data.unselectable&&!this.data.isStatusNode);this._setSubSel(false);return sel;} +var i,l,cl=this.childList,allSelected=true,allDeselected=true;for(i=0,l=cl.length;i=0;i--){sib=parents[i].getNextSibling();if(sib){break;}}} +if(sib){sib.focus();} +break;default:handled=false;} +if(handled){event.preventDefault();}},_onKeypress:function(event){},_onFocus:function(event){var opts=this.tree.options;if(event.type=="blur"||event.type=="focusout"){if(opts.onBlur){opts.onBlur.call(this.tree,this);} +if(this.tree.tnFocused){$(this.tree.tnFocused.span).removeClass(opts.classNames.focused);} +this.tree.tnFocused=null;if(opts.persist){$.cookie(opts.cookieId+"-focus","",opts.cookie);}}else if(event.type=="focus"||event.type=="focusin"){if(this.tree.tnFocused&&this.tree.tnFocused!==this){this.tree.logDebug("dtnode.onFocus: out of sync: curFocus: %o",this.tree.tnFocused);$(this.tree.tnFocused.span).removeClass(opts.classNames.focused);} +this.tree.tnFocused=this;if(opts.onFocus){opts.onFocus.call(this.tree,this);} +$(this.tree.tnFocused.span).addClass(opts.classNames.focused);if(opts.persist){$.cookie(opts.cookieId+"-focus",this.data.key,opts.cookie);}}},visit:function(fn,includeSelf){var res=true;if(includeSelf===true){res=fn(this);if(res===false||res=="skip"){return res;}} +if(this.childList){for(var i=0,l=this.childList.length;i reloading %s...",this,keyPath,child);var self=this;child.reloadChildren(function(node,isOk){if(isOk){tree.logDebug("%s._loadKeyPath(%s) -> reloaded %s.",node,keyPath,node);callback.call(tree,child,"loaded");node._loadKeyPath(segList.join(tree.options.keyPathSeparator),callback);}else{tree.logWarning("%s._loadKeyPath(%s) -> reloadChildren() failed.",self,keyPath);callback.call(tree,child,"error");}});}else{callback.call(tree,child,"loaded");child._loadKeyPath(segList.join(tree.options.keyPathSeparator),callback);} +return;}} +tree.logWarning("Node not found: "+seg);return;},resetLazy:function(){if(this.parent===null){throw"Use tree.reload() instead";}else if(!this.data.isLazy){throw"node.resetLazy() requires lazy nodes.";} +this.expand(false);this.removeChildren();},_addChildNode:function(dtnode,beforeNode){var tree=this.tree,opts=tree.options,pers=tree.persistence;dtnode.parent=this;if(this.childList===null){this.childList=[];}else if(!beforeNode){if(this.childList.length>0){$(this.childList[this.childList.length-1].span).removeClass(opts.classNames.lastsib);}} +if(beforeNode){var iBefore=$.inArray(beforeNode,this.childList);if(iBefore<0){throw" must be a child of ";} +this.childList.splice(iBefore,0,dtnode);}else{this.childList.push(dtnode);} +var isInitializing=tree.isInitializing();if(opts.persist&&pers.cookiesFound&&isInitializing){if(pers.activeKey===dtnode.data.key){tree.activeNode=dtnode;} +if(pers.focusedKey===dtnode.data.key){tree.focusNode=dtnode;} +dtnode.bExpanded=($.inArray(dtnode.data.key,pers.expandedKeyList)>=0);dtnode.bSelected=($.inArray(dtnode.data.key,pers.selectedKeyList)>=0);}else{if(dtnode.data.activate){tree.activeNode=dtnode;if(opts.persist){pers.activeKey=dtnode.data.key;}} +if(dtnode.data.focus){tree.focusNode=dtnode;if(opts.persist){pers.focusedKey=dtnode.data.key;}} +dtnode.bExpanded=(dtnode.data.expand===true);if(dtnode.bExpanded&&opts.persist){pers.addExpand(dtnode.data.key);} +dtnode.bSelected=(dtnode.data.select===true);if(dtnode.bSelected&&opts.persist){pers.addSelect(dtnode.data.key);}} +if(opts.minExpandLevel>=dtnode.getLevel()){this.bExpanded=true;} +if(dtnode.bSelected&&opts.selectMode==3){var p=this;while(p){if(!p.hasSubSel){p._setSubSel(true);} +p=p.parent;}} +if(tree.bEnableUpdate){this.render();} +return dtnode;},addChild:function(obj,beforeNode){if(typeof(obj)=="string"){throw"Invalid data type for "+obj;}else if(!obj||obj.length===0){return;}else if(obj instanceof DynaTreeNode){return this._addChildNode(obj,beforeNode);} +if(!obj.length){obj=[obj];} +var prevFlag=this.tree.enableUpdate(false);var tnFirst=null;for(var i=0,l=obj.length;i=0){this.expandedKeyList.splice(idx,1);$.cookie(this.cookieId+"-expand",this.expandedKeyList.join(","),this.cookieOpts);}},addSelect:function(key){if($.inArray(key,this.selectedKeyList)<0){this.selectedKeyList.push(key);$.cookie(this.cookieId+"-select",this.selectedKeyList.join(","),this.cookieOpts);}},clearSelect:function(key){var idx=$.inArray(key,this.selectedKeyList);if(idx>=0){this.selectedKeyList.splice(idx,1);$.cookie(this.cookieId+"-select",this.selectedKeyList.join(","),this.cookieOpts);}},isReloading:function(){return this.cookiesFound===true;},toDict:function(){return{cookiesFound:this.cookiesFound,activeKey:this.activeKey,focusedKey:this.activeKey,expandedKeyList:this.expandedKeyList,selectedKeyList:this.selectedKeyList};},lastentry:undefined};var DynaTree=Class.create();DynaTree.version="$Version: 1.2.1_rc3$";DynaTree.prototype={initialize:function($widget){this.phase="init";this.$widget=$widget;this.options=$widget.options;this.$tree=$widget.element;this.timer=null;this.divTree=this.$tree.get(0);_initDragAndDrop(this);},_load:function(callback){var $widget=this.$widget;var opts=this.options,self=this;this.bEnableUpdate=true;this._nodeCount=1;this.activeNode=null;this.focusNode=null;if(opts.rootVisible!==undefined){this.logWarning("Option 'rootVisible' is no longer supported.");} +if(opts.minExpandLevel<1){this.logWarning("Option 'minExpandLevel' must be >= 1.");opts.minExpandLevel=1;} +if(opts.classNames!==$.ui.dynatree.prototype.options.classNames){opts.classNames=$.extend({},$.ui.dynatree.prototype.options.classNames,opts.classNames);} +if(opts.ajaxDefaults!==$.ui.dynatree.prototype.options.ajaxDefaults){opts.ajaxDefaults=$.extend({},$.ui.dynatree.prototype.options.ajaxDefaults,opts.ajaxDefaults);} +if(opts.dnd!==$.ui.dynatree.prototype.options.dnd){opts.dnd=$.extend({},$.ui.dynatree.prototype.options.dnd,opts.dnd);} +if(!opts.imagePath){$("script").each(function(){var _rexDtLibName=/.*dynatree[^\/]*\.js$/i;if(this.src.search(_rexDtLibName)>=0){if(this.src.indexOf("/")>=0){opts.imagePath=this.src.slice(0,this.src.lastIndexOf("/"))+"/skin/";}else{opts.imagePath="skin/";} +self.logDebug("Guessing imagePath from '%s': '%s'",this.src,opts.imagePath);return false;}});} +this.persistence=new DynaTreeStatus(opts.cookieId,opts.cookie);if(opts.persist){if(!$.cookie){_log("warn","Please include jquery.cookie.js to use persistence.");} +this.persistence.read();} +this.logDebug("DynaTree.persistence: %o",this.persistence.toDict());this.cache={tagEmpty:"",tagVline:"",tagExpander:"",tagConnector:"",tagNodeIcon:"",tagCheckbox:"",lastentry:undefined};if(opts.children||(opts.initAjax&&opts.initAjax.url)||opts.initId){$(this.divTree).empty();} +var $ulInitialize=this.$tree.find(">ul:first").hide();this.tnRoot=new DynaTreeNode(null,this,{});this.tnRoot.bExpanded=true;this.tnRoot.render();this.divTree.appendChild(this.tnRoot.ul);var root=this.tnRoot;var isReloading=(opts.persist&&this.persistence.isReloading());var isLazy=false;var prevFlag=this.enableUpdate(false);this.logDebug("Dynatree._load(): read tree structure...");if(opts.children){root.addChild(opts.children);}else if(opts.initAjax&&opts.initAjax.url){isLazy=true;root.data.isLazy=true;this._reloadAjax(callback);}else if(opts.initId){this._createFromTag(root,$("#"+opts.initId));}else{this._createFromTag(root,$ulInitialize);$ulInitialize.remove();} +this._checkConsistency();if(!isLazy&&opts.selectMode==3){root._updatePartSelectionState();} +this.logDebug("Dynatree._load(): render nodes...");this.enableUpdate(prevFlag);this.logDebug("Dynatree._load(): bind events...");this.$widget.bind();this.logDebug("Dynatree._load(): postInit...");this.phase="postInit";if(opts.persist){this.persistence.write();} +if(this.focusNode&&this.focusNode.isVisible()){this.logDebug("Focus on init: %o",this.focusNode);this.focusNode.focus();} +if(!isLazy){if(opts.onPostInit){opts.onPostInit.call(this,isReloading,false);} +if(callback){callback.call(this,"ok");}} +this.phase="idle";},_reloadAjax:function(callback){var opts=this.options;if(!opts.initAjax||!opts.initAjax.url){throw"tree.reload() requires 'initAjax' mode.";} +var pers=this.persistence;var ajaxOpts=$.extend({},opts.initAjax);if(ajaxOpts.addActiveKey){ajaxOpts.data.activeKey=pers.activeKey;} +if(ajaxOpts.addFocusedKey){ajaxOpts.data.focusedKey=pers.focusedKey;} +if(ajaxOpts.addExpandedKeyList){ajaxOpts.data.expandedKeyList=pers.expandedKeyList.join(",");} +if(ajaxOpts.addSelectedKeyList){ajaxOpts.data.selectedKeyList=pers.selectedKeyList.join(",");} +if(ajaxOpts.success){this.logWarning("initAjax: success callback is ignored; use onPostInit instead.");} +if(ajaxOpts.error){this.logWarning("initAjax: error callback is ignored; use onPostInit instead.");} +var isReloading=pers.isReloading();ajaxOpts.success=function(dtnode,data,textStatus){if(opts.selectMode==3){dtnode.tree.tnRoot._updatePartSelectionState();} +if(opts.onPostInit){opts.onPostInit.call(dtnode.tree,isReloading,false);} +if(callback){callback.call(dtnode.tree,"ok");}};ajaxOpts.error=function(dtnode,XMLHttpRequest,textStatus,errorThrown){if(opts.onPostInit){opts.onPostInit.call(dtnode.tree,isReloading,true,XMLHttpRequest,textStatus,errorThrown);} +if(callback){callback.call(dtnode.tree,"error",XMLHttpRequest,textStatus,errorThrown);}};this.logDebug("Dynatree._init(): send Ajax request...");this.tnRoot.appendAjax(ajaxOpts);},toString:function(){return"Dynatree '"+this.$tree.attr("id")+"'";},toDict:function(){return this.tnRoot.toDict(true);},serializeArray:function(stopOnParents){var nodeList=this.getSelectedNodes(stopOnParents),name=this.$tree.attr("name")||this.$tree.attr("id"),arr=[];for(var i=0,l=nodeList.length;i=2){Array.prototype.unshift.apply(arguments,["debug"]);_log.apply(this,arguments);}},logInfo:function(msg){if(this.options.debugLevel>=1){Array.prototype.unshift.apply(arguments,["info"]);_log.apply(this,arguments);}},logWarning:function(msg){Array.prototype.unshift.apply(arguments,["warn"]);_log.apply(this,arguments);},isInitializing:function(){return(this.phase=="init"||this.phase=="postInit");},isReloading:function(){return(this.phase=="init"||this.phase=="postInit")&&this.options.persist&&this.persistence.cookiesFound;},isUserEvent:function(){return(this.phase=="userEvent");},redraw:function(){this.tnRoot.render(false,false);},renderInvisibleNodes:function(){this.tnRoot.render(false,true);},reload:function(callback){this._load(callback);},getRoot:function(){return this.tnRoot;},enable:function(){this.$widget.enable();},disable:function(){this.$widget.disable();},getNodeByKey:function(key){var el=document.getElementById(this.options.idPrefix+key);if(el){return el.dtnode?el.dtnode:null;} +var match=null;this.visit(function(node){if(node.data.key==key){match=node;return false;}},true);return match;},getActiveNode:function(){return this.activeNode;},reactivate:function(setFocus){var node=this.activeNode;if(node){this.activeNode=null;node.activate();if(setFocus){node.focus();}}},getSelectedNodes:function(stopOnParents){var nodeList=[];this.tnRoot.visit(function(node){if(node.bSelected){nodeList.push(node);if(stopOnParents===true){return"skip";}}});return nodeList;},activateKey:function(key){var dtnode=(key===null)?null:this.getNodeByKey(key);if(!dtnode){if(this.activeNode){this.activeNode.deactivate();} +this.activeNode=null;return null;} +dtnode.focus();dtnode.activate();return dtnode;},loadKeyPath:function(keyPath,callback){var segList=keyPath.split(this.options.keyPathSeparator);if(segList[0]===""){segList.shift();} +if(segList[0]==this.tnRoot.data.key){this.logDebug("Removed leading root key.");segList.shift();} +keyPath=segList.join(this.options.keyPathSeparator);return this.tnRoot._loadKeyPath(keyPath,callback);},selectKey:function(key,select){var dtnode=this.getNodeByKey(key);if(!dtnode){return null;} +dtnode.select(select);return dtnode;},enableUpdate:function(bEnable){if(this.bEnableUpdate==bEnable){return bEnable;} +this.bEnableUpdate=bEnable;if(bEnable){this.redraw();} +return!bEnable;},count:function(){return this.tnRoot.countChildren();},visit:function(fn,includeRoot){return this.tnRoot.visit(fn,includeRoot);},_createFromTag:function(parentTreeNode,$ulParent){var self=this;$ulParent.find(">li").each(function(){var $li=$(this),$liSpan=$li.find(">span:first"),$liA=$li.find(">a:first"),title,href=null,target=null,tooltip;if($liSpan.length){title=$liSpan.html();}else if($liA.length){title=$liA.html();href=$liA.attr("href");target=$liA.attr("target");tooltip=$liA.attr("title");}else{title=$li.html();var iPos=title.search(/
      =0){title=$.trim(title.substring(0,iPos));}else{title=$.trim(title);}} +var data={title:title,tooltip:tooltip,isFolder:$li.hasClass("folder"),isLazy:$li.hasClass("lazy"),expand:$li.hasClass("expanded"),select:$li.hasClass("selected"),activate:$li.hasClass("active"),focus:$li.hasClass("focused"),noLink:$li.hasClass("noLink")};if(href){data.href=href;data.target=target;} +if($li.attr("title")){data.tooltip=$li.attr("title");} +if($li.attr("id")){data.key=$li.attr("id");} +if($li.attr("data")){var dataAttr=$.trim($li.attr("data"));if(dataAttr){if(dataAttr.charAt(0)!="{"){dataAttr="{"+dataAttr+"}";} +try{$.extend(data,eval("("+dataAttr+")"));}catch(e){throw("Error parsing node data: "+e+"\ndata:\n'"+dataAttr+"'");}}} +var childNode=parentTreeNode.addChild(data);var $ul=$li.find(">ul:first");if($ul.length){self._createFromTag(childNode,$ul);}});},_checkConsistency:function(){},_setDndStatus:function(sourceNode,targetNode,helper,hitMode,accept){var $source=sourceNode?$(sourceNode.span):null,$target=$(targetNode.span);if(!this.$dndMarker){this.$dndMarker=$("
      ").hide().prependTo($(this.divTree).parent());} +if(hitMode==="after"||hitMode==="before"||hitMode==="over"){var pos=$target.offset();switch(hitMode){case"before":this.$dndMarker.removeClass("dynatree-drop-after dynatree-drop-over");this.$dndMarker.addClass("dynatree-drop-before");pos.top-=8;break;case"after":this.$dndMarker.removeClass("dynatree-drop-before dynatree-drop-over");this.$dndMarker.addClass("dynatree-drop-after");pos.top+=8;break;default:this.$dndMarker.removeClass("dynatree-drop-after dynatree-drop-before");this.$dndMarker.addClass("dynatree-drop-over");$target.addClass("dynatree-drop-target");pos.left+=8;} +this.$dndMarker.css({"left":pos.left,"top":pos.top,"z-index":1000}).show();}else{$target.removeClass("dynatree-drop-target");this.$dndMarker.hide();} +if(hitMode==="after"){$target.addClass("dynatree-drop-after");}else{$target.removeClass("dynatree-drop-after");} +if(hitMode==="before"){$target.addClass("dynatree-drop-before");}else{$target.removeClass("dynatree-drop-before");} +if(accept===true){if($source){$source.addClass("dynatree-drop-accept");} +$target.addClass("dynatree-drop-accept");helper.addClass("dynatree-drop-accept");}else{if($source){$source.removeClass("dynatree-drop-accept");} +$target.removeClass("dynatree-drop-accept");helper.removeClass("dynatree-drop-accept");} +if(accept===false){if($source){$source.addClass("dynatree-drop-reject");} +$target.addClass("dynatree-drop-reject");helper.addClass("dynatree-drop-reject");}else{if($source){$source.removeClass("dynatree-drop-reject");} +$target.removeClass("dynatree-drop-reject");helper.removeClass("dynatree-drop-reject");}},_onDragEvent:function(eventName,node,otherNode,event,ui,draggable){var opts=this.options,dnd=this.options.dnd,res=null,nodeTag=$(node.span),hitMode;switch(eventName){case"helper":var $helper=$("
      ").append($(event.target).closest('a').clone());$("ul.dynatree-container",node.tree.divTree).append($helper);$helper.data("dtSourceNode",node);res=$helper;break;case"start":if(node.isStatusNode()){res=false;}else if(dnd.onDragStart){res=dnd.onDragStart(node);} +if(res===false){this.logDebug("tree.onDragStart() cancelled");ui.helper.trigger("mouseup");ui.helper.hide();}else{nodeTag.addClass("dynatree-drag-source");} +break;case"enter":res=dnd.onDragEnter?dnd.onDragEnter(node,otherNode):null;res={over:(res!==false)&&((res===true)||(res==="over")||$.inArray("over",res)>=0),before:(res!==false)&&((res===true)||(res==="before")||$.inArray("before",res)>=0),after:(res!==false)&&((res===true)||(res==="after")||$.inArray("after",res)>=0)};ui.helper.data("enterResponse",res);break;case"over":var enterResponse=ui.helper.data("enterResponse");hitMode=null;if(enterResponse===false){break;}else if(typeof enterResponse==="string"){hitMode=enterResponse;}else{var nodeOfs=nodeTag.offset();var relPos={x:event.pageX-nodeOfs.left,y:event.pageY-nodeOfs.top};var relPos2={x:relPos.x/nodeTag.width(),y:relPos.y/nodeTag.height()};if(enterResponse.after&&relPos2.y>0.75){hitMode="after";}else if(!enterResponse.over&&enterResponse.after&&relPos2.y>0.5){hitMode="after";}else if(enterResponse.before&&relPos2.y<=0.25){hitMode="before";}else if(!enterResponse.over&&enterResponse.before&&relPos2.y<=0.5){hitMode="before";}else if(enterResponse.over){hitMode="over";} +if(dnd.preventVoidMoves){if(node===otherNode){hitMode=null;}else if(hitMode==="before"&&otherNode&&node===otherNode.getNextSibling()){hitMode=null;}else if(hitMode==="after"&&otherNode&&node===otherNode.getPrevSibling()){hitMode=null;}else if(hitMode==="over"&&otherNode&&otherNode.parent===node&&otherNode.isLastSibling()){hitMode=null;}} +ui.helper.data("hitMode",hitMode);} +if(hitMode==="over"&&dnd.autoExpandMS&&node.hasChildren()!==false&&!node.bExpanded){node.scheduleAction("expand",dnd.autoExpandMS);} +if(hitMode&&dnd.onDragOver){res=dnd.onDragOver(node,otherNode,hitMode);} +this._setDndStatus(otherNode,node,ui.helper,hitMode,res!==false);break;case"drop":hitMode=ui.helper.data("hitMode");if(hitMode&&dnd.onDrop){dnd.onDrop(node,otherNode,hitMode,ui,draggable);} +break;case"leave":node.scheduleAction("cancel");ui.helper.data("enterResponse",null);ui.helper.data("hitMode",null);this._setDndStatus(otherNode,node,ui.helper,"out",undefined);if(dnd.onDragLeave){dnd.onDragLeave(node,otherNode);} +break;case"stop":nodeTag.removeClass("dynatree-drag-source");if(dnd.onDragStop){dnd.onDragStop(node);} +break;default:throw"Unsupported drag event: "+eventName;} +return res;},cancelDrag:function(){var dd=$.ui.ddmanager.current;if(dd){dd.cancel();}},lastentry:undefined};$.widget("ui.dynatree",{_init:function(){if(parseFloat($.ui.version)<1.8){if(this.options.debugLevel>=0){_log("warn","ui.dynatree._init() was called; you should upgrade to jquery.ui.core.js v1.8 or higher.");} +return this._create();} +if(this.options.debugLevel>=2){_log("debug","ui.dynatree._init() was called; no current default functionality.");}},_create:function(){var opts=this.options;if(opts.debugLevel>=1){logMsg("Dynatree._create(): version='%s', debugLevel=%o.",$.ui.dynatree.version,this.options.debugLevel);} +this.options.event+=".dynatree";var divTree=this.element.get(0);this.tree=new DynaTree(this);this.tree._load();this.tree.logDebug("Dynatree._init(): done.");},bind:function(){this.unbind();var eventNames="click.dynatree dblclick.dynatree";if(this.options.keyboard){eventNames+=" keypress.dynatree keydown.dynatree";} +this.element.bind(eventNames,function(event){var dtnode=$.ui.dynatree.getNode(event.target);if(!dtnode){return true;} +var tree=dtnode.tree;var o=tree.options;tree.logDebug("event(%s): dtnode: %s",event.type,dtnode);var prevPhase=tree.phase;tree.phase="userEvent";try{switch(event.type){case"click":return(o.onClick&&o.onClick.call(tree,dtnode,event)===false)?false:dtnode._onClick(event);case"dblclick":return(o.onDblClick&&o.onDblClick.call(tree,dtnode,event)===false)?false:dtnode._onDblClick(event);case"keydown":return(o.onKeydown&&o.onKeydown.call(tree,dtnode,event)===false)?false:dtnode._onKeydown(event);case"keypress":return(o.onKeypress&&o.onKeypress.call(tree,dtnode,event)===false)?false:dtnode._onKeypress(event);}}catch(e){var _=null;tree.logWarning("bind(%o): dtnode: %o, error: %o",event,dtnode,e);}finally{tree.phase=prevPhase;}});function __focusHandler(event){event=$.event.fix(event||window.event);var dtnode=$.ui.dynatree.getNode(event.target);return dtnode?dtnode._onFocus(event):false;} +var div=this.tree.divTree;if(div.addEventListener){div.addEventListener("focus",__focusHandler,true);div.addEventListener("blur",__focusHandler,true);}else{div.onfocusin=div.onfocusout=__focusHandler;}},unbind:function(){this.element.unbind(".dynatree");},enable:function(){this.bind();$.Widget.prototype.enable.apply(this,arguments);},disable:function(){this.unbind();$.Widget.prototype.disable.apply(this,arguments);},getTree:function(){return this.tree;},getRoot:function(){return this.tree.getRoot();},getActiveNode:function(){return this.tree.getActiveNode();},getSelectedNodes:function(){return this.tree.getSelectedNodes();},lastentry:undefined});if(parseFloat($.ui.version)<1.8){$.ui.dynatree.getter="getTree getRoot getActiveNode getSelectedNodes";} +$.ui.dynatree.version="$Version: 1.2.1_rc3$";$.ui.dynatree.getNode=function(el){if(el instanceof DynaTreeNode){return el;} +if(el.selector!==undefined){el=el[0];} +while(el){if(el.dtnode){return el.dtnode;} +el=el.parentNode;} +return null;} +$.ui.dynatree.getPersistData=DynaTreeStatus._getTreePersistData;$.ui.dynatree.prototype.options={title:"Dynatree",minExpandLevel:1,imagePath:null,children:null,initId:null,initAjax:null,autoFocus:true,keyboard:true,persist:false,autoCollapse:false,clickFolderMode:3,activeVisible:true,checkbox:false,selectMode:2,fx:null,noLink:false,onClick:null,onDblClick:null,onKeydown:null,onKeypress:null,onFocus:null,onBlur:null,onQueryActivate:null,onQuerySelect:null,onQueryExpand:null,onPostInit:null,onActivate:null,onDeactivate:null,onSelect:null,onExpand:null,onLazyRead:null,onCustomRender:null,onCreate:null,onRender:null,dnd:{onDragStart:null,onDragStop:null,autoExpandMS:1000,preventVoidMoves:true,onDragEnter:null,onDragOver:null,onDrop:null,onDragLeave:null},ajaxDefaults:{cache:false,timeout:0,dataType:"json"},strings:{loading:"Loading…",loadError:"Load error!"},generateIds:false,idPrefix:"dynatree-id-",keyPathSeparator:"/",cookieId:"dynatree",cookie:{expires:null},classNames:{container:"dynatree-container",node:"dynatree-node",folder:"dynatree-folder",empty:"dynatree-empty",vline:"dynatree-vline",expander:"dynatree-expander",connector:"dynatree-connector",checkbox:"dynatree-checkbox",nodeIcon:"dynatree-icon",title:"dynatree-title",noConnector:"dynatree-no-connector",nodeError:"dynatree-statusnode-error",nodeWait:"dynatree-statusnode-wait",hidden:"dynatree-hidden",combinedExpanderPrefix:"dynatree-exp-",combinedIconPrefix:"dynatree-ico-",nodeLoading:"dynatree-loading",hasChildren:"dynatree-has-children",active:"dynatree-active",selected:"dynatree-selected",expanded:"dynatree-expanded",lazy:"dynatree-lazy",focused:"dynatree-focused",partsel:"dynatree-partsel",lastsib:"dynatree-lastsib"},debugLevel:1,lastentry:undefined};if(parseFloat($.ui.version)<1.8){$.ui.dynatree.defaults=$.ui.dynatree.prototype.options;} +$.ui.dynatree.nodedatadefaults={title:null,key:null,isFolder:false,isLazy:false,tooltip:null,href:null,icon:null,addClass:null,noLink:false,activate:false,focus:false,expand:false,select:false,hideCheckbox:false,unselectable:false,children:null,lastentry:undefined};function _initDragAndDrop(tree){var dnd=tree.options.dnd||null;if(dnd&&(dnd.onDragStart||dnd.onDrop)){_registerDnd();} +if(dnd&&dnd.onDragStart){tree.$tree.draggable({addClasses:false,appendTo:"body",containment:false,delay:0,distance:4,revert:false,scroll:true,scrollSpeed:7,scrollSensitivity:10,connectToDynatree:true,helper:function(event){var sourceNode=$.ui.dynatree.getNode(event.target);if(!sourceNode){return"
      ";} +return sourceNode.tree._onDragEvent("helper",sourceNode,null,event,null,null);},start:function(event,ui){},_last:null});} +if(dnd&&dnd.onDrop){tree.$tree.droppable({addClasses:false,tolerance:"intersect",greedy:false,_last:null});}} +var didRegisterDnd=false;var _registerDnd=function(){if(didRegisterDnd){return;} +$.ui.plugin.add("draggable","connectToDynatree",{start:function(event,ui){var draggable=$(this).data("draggable"),sourceNode=ui.helper.data("dtSourceNode")||null;if(sourceNode){draggable.offset.click.top=-2;draggable.offset.click.left=+16;return sourceNode.tree._onDragEvent("start",sourceNode,null,event,ui,draggable);}},drag:function(event,ui){var draggable=$(this).data("draggable"),sourceNode=ui.helper.data("dtSourceNode")||null,prevTargetNode=ui.helper.data("dtTargetNode")||null,targetNode=$.ui.dynatree.getNode(event.target);if(event.target&&!targetNode){var isHelper=$(event.target).closest("div.dynatree-drag-helper,#dynatree-drop-marker").length>0;if(isHelper){return;}} +ui.helper.data("dtTargetNode",targetNode);if(prevTargetNode&&prevTargetNode!==targetNode){prevTargetNode.tree._onDragEvent("leave",prevTargetNode,sourceNode,event,ui,draggable);} +if(targetNode){if(!targetNode.tree.options.dnd.onDrop){noop();}else if(targetNode===prevTargetNode){targetNode.tree._onDragEvent("over",targetNode,sourceNode,event,ui,draggable);}else{targetNode.tree._onDragEvent("enter",targetNode,sourceNode,event,ui,draggable);}}},stop:function(event,ui){var draggable=$(this).data("draggable"),sourceNode=ui.helper.data("dtSourceNode")||null,targetNode=ui.helper.data("dtTargetNode")||null,mouseDownEvent=draggable._mouseDownEvent,eventType=event.type,dropped=(eventType=="mouseup"&&event.which==1);if(!dropped){logMsg("Drag was cancelled");} +if(targetNode){if(dropped){targetNode.tree._onDragEvent("drop",targetNode,sourceNode,event,ui,draggable);} +targetNode.tree._onDragEvent("leave",targetNode,sourceNode,event,ui,draggable);} +if(sourceNode){sourceNode.tree._onDragEvent("stop",sourceNode,null,event,ui,draggable);}}});didRegisterDnd=true;};})(jQuery); \ No newline at end of file diff --git a/help/taseditor/js/jquery.min.js b/help/taseditor/js/jquery.min.js new file mode 100644 index 00000000..ee023370 --- /dev/null +++ b/help/taseditor/js/jquery.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.7.1 jquery.com | jquery.org/license */ +(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"":"")+""),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;g=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
      a",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="
      "+""+"
      ",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="
      t
      ",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="
      ",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")}; +f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&i.push({elem:this,matches:d.slice(e)});for(j=0;j0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

      ";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
      ";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
      ","
      "],thead:[1,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],col:[2,"","
      "],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
      ","
      "]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function() +{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
      ").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file diff --git a/help/taseditor/js/jquery.treeview.min.js b/help/taseditor/js/jquery.treeview.min.js new file mode 100644 index 00000000..9dec513e --- /dev/null +++ b/help/taseditor/js/jquery.treeview.min.js @@ -0,0 +1,15 @@ +/* + * Treeview pre-1.4.1 - jQuery plugin to hide and show branches of a tree + * + * http://bassistance.de/jquery-plugins/jquery-plugin-treeview/ + * http://docs.jquery.com/Plugins/Treeview + * + * Copyright (c) 2007 Jörn Zaefferer + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * Revision: $Id: jquery.treeview.js 4684 2008-02-07 19:08:06Z joern.zaefferer $ + * + */;(function($){$.extend($.fn,{swapClass:function(c1,c2){var c1Elements=this.filter('.'+c1);this.filter('.'+c2).removeClass(c2).addClass(c1);c1Elements.removeClass(c1).addClass(c2);return this;},replaceClass:function(c1,c2){return this.filter('.'+c1).removeClass(c1).addClass(c2).end();},hoverClass:function(className){className=className||"hover";return this.hover(function(){$(this).addClass(className);},function(){$(this).removeClass(className);});},heightToggle:function(animated,callback){animated?this.animate({height:"toggle"},animated,callback):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();if(callback)callback.apply(this,arguments);});},heightHide:function(animated,callback){if(animated){this.animate({height:"hide"},animated,callback);}else{this.hide();if(callback)this.each(callback);}},prepareBranches:function(settings){if(!settings.prerendered){this.filter(":last-child:not(ul)").addClass(CLASSES.last);this.filter((settings.collapsed?"":"."+CLASSES.closed)+":not(."+CLASSES.open+")").find(">ul").hide();}return this.filter(":has(>ul)");},applyClasses:function(settings,toggler){this.filter(":has(>ul):not(:has(>a))").find(">span").click(function(event){if(this==event.target)toggler.apply($(this).next());}).add($("a",this)).hoverClass();if(!settings.prerendered){this.filter(":has(>ul:hidden)").addClass(CLASSES.expandable).replaceClass(CLASSES.last,CLASSES.lastExpandable);this.not(":has(>ul:hidden)").addClass(CLASSES.collapsable).replaceClass(CLASSES.last,CLASSES.lastCollapsable);this.prepend("
      ").find("div."+CLASSES.hitarea).each(function(){var classes="";$.each($(this).parent().attr("class").split(" "),function(){classes+=this+"-hitarea ";});$(this).addClass(classes);});}this.find("div."+CLASSES.hitarea).click(toggler);},treeview:function(settings){settings=$.extend({cookieId:"treeview"},settings);if(settings.add){return this.trigger("add",[settings.add]);}if(settings.toggle){var callback=settings.toggle;settings.toggle=function(){return callback.apply($(this).parent()[0],arguments);};}function treeController(tree,control){function handler(filter){return function(){toggler.apply($("div."+CLASSES.hitarea,tree).filter(function(){return filter?$(this).parent("."+filter).length:true;}));return false;};}$("a:eq(0)",control).click(handler(CLASSES.collapsable));$("a:eq(1)",control).click(handler(CLASSES.expandable));$("a:eq(2)",control).click(handler());}function toggler(){$(this).parent().find(">.hitarea").swapClass(CLASSES.collapsableHitarea,CLASSES.expandableHitarea).swapClass(CLASSES.lastCollapsableHitarea,CLASSES.lastExpandableHitarea).end().swapClass(CLASSES.collapsable,CLASSES.expandable).swapClass(CLASSES.lastCollapsable,CLASSES.lastExpandable).find(">ul").heightToggle(settings.animated,settings.toggle);if(settings.unique){$(this).parent().siblings().find(">.hitarea").replaceClass(CLASSES.collapsableHitarea,CLASSES.expandableHitarea).replaceClass(CLASSES.lastCollapsableHitarea,CLASSES.lastExpandableHitarea).end().replaceClass(CLASSES.collapsable,CLASSES.expandable).replaceClass(CLASSES.lastCollapsable,CLASSES.lastExpandable).find(">ul").heightHide(settings.animated,settings.toggle);}}function serialize(){function binary(arg){return arg?1:0;}var data=[];branches.each(function(i,e){data[i]=$(e).is(":has(>ul:visible)")?1:0;});$.cookie(settings.cookieId,data.join(""));}function deserialize(){var stored=$.cookie(settings.cookieId);if(stored){var data=stored.split("");branches.each(function(i,e){$(e).find(">ul")[parseInt(data[i])?"show":"hide"]();});}}this.addClass("treeview");var branches=this.find("li").prepareBranches(settings);switch(settings.persist){case"cookie":var toggleCallback=settings.toggle;settings.toggle=function(){serialize();if(toggleCallback){toggleCallback.apply(this,arguments);}};deserialize();break;case"location":var current=this.find("a").filter(function(){return this.href.toLowerCase()==location.href.toLowerCase();});if(current.length){current.addClass("selected").parents("ul, li").add(current.next()).show();}break;}branches.applyClasses(settings,toggler);if(settings.control){treeController(this,settings.control);$(settings.control).show();}return this.bind("add",function(event,branches){$(branches).prev().removeClass(CLASSES.last).removeClass(CLASSES.lastCollapsable).removeClass(CLASSES.lastExpandable).find(">.hitarea").removeClass(CLASSES.lastCollapsableHitarea).removeClass(CLASSES.lastExpandableHitarea);$(branches).find("li").andSelf().prepareBranches(settings).applyClasses(settings,toggler);});}});var CLASSES=$.fn.treeview.classes={open:"open",closed:"closed",expandable:"expandable",expandableHitarea:"expandable-hitarea",lastExpandableHitarea:"lastExpandable-hitarea",collapsable:"collapsable",collapsableHitarea:"collapsable-hitarea",lastCollapsableHitarea:"lastCollapsable-hitarea",lastCollapsable:"lastCollapsable",lastExpandable:"lastExpandable",last:"last",hitarea:"hitarea"};$.fn.Treeview=$.fn.treeview;})(jQuery); \ No newline at end of file diff --git a/help/taseditor/js/searchdata.js b/help/taseditor/js/searchdata.js new file mode 100644 index 00000000..ae93daaf --- /dev/null +++ b/help/taseditor/js/searchdata.js @@ -0,0 +1 @@ +var aTl=[['Title.html','Title'],['BeginnersGuide.html','Beginner%27s%20Guide'],['Introduction.html','1%2E%20Introduction'],['ProgramInterface.html','2%2E%20Program%20Interface'],['PianoRoll.html','2%2E1%2E%20Piano%20Roll'],['Toolbox.html','2%2E2%2E%20Toolbox'],['TASingProcess.html','3%2E%20TASing%20Process'],['TASingMethodology.html','4%2E%20TASing%20Methodology'],['TraditionalTASing.html','4%2E1%2E%20Traditional%20TASing'],['NonlinearTASing.html','4%2E2%2E%20Nonlinear%20TASing'],['SemiautomaticTASing.html','4%2E3%2E%20Semiautomatic%20TASing'],['ProgramCustomization.html','5%2E%20Program%20customization'],['AdvancedFeatures.html','6%2E%20Advanced%20Features'],['Reference.html','Reference'],['Glossary.html','Glossary'],['Controls.html','Controls'],['Navigation.html','Navigation'],['Operations.html','Operations'],['LuaAPI.html','Lua%20API'],['FAQ.html','FAQ'],['SpeedrunningSynopsis.html','Speedrunning%20synopsis'],['TASEditorInside.html','TAS%20Editor%20Inside'],['Ideas.html','Ideas'],['Implementation.html','Implementation'],['MistakeProofing.html','Mistake%2Dproofing'],['FM3format.html','FM3%20format']];var oWl= {'widths':[[23,2]],'relation':[[2,2]],'otherwise':[[4,2],[17,2],[18,2],[11,4],[5,2]],'content':[[8,2],[5,2]],'comma':[[15,2]],'differ':[[4,2],[12,2],[11,2],[24,2]],'emerging':[[20,2]],'become':[[5,2],[11,4],[15,6],[14,2],[18,2],[6,4],[2,4],[4,10],[10,4],[7,2],[8,4]],'остальные':[[22,8]],'создаёт':[[22,2]],'decreases':[[6,2],[11,2]],'алгоритм':[[22,2]],'суммарная':[[22,2]],'implements':[[8,2],[23,76]],'rightclick':[[24,6]],'greenzoning':[[11,2]],'rare':[[7,4],[11,2]],'bookmark7':[[17,2]],'погаснут':[[22,2]],'especially':[[15,2],[14,2],[20,2],[6,6],[11,2]],'Чтобы':[[22,10]],'speedrunning':[[0,2],[13,2],[20,4],[7,2],[2,2]],'templates':[[3,2],[2,2]],'buttons':[[19,2],[12,8],[8,4],[5,38],[17,10],[9,2],[14,2],[15,6],[23,18],[6,4],[2,4],[4,10],[25,6],[11,24],[18,14]],'roll':[[19,10],[12,16],[16,56],[20,4],[8,2],[5,30],[17,36],[9,6],[14,32],[15,84],[22,130],[2,2],[23,24],[4,44],[24,8],[25,8],[3,6],[10,4],[11,40],[7,2]],'application':[[20,2],[5,2]],'precision':[[15,2],[14,2],[8,2],[11,2]],'dark':[[4,6],[14,2],[5,2]],'submitinputchange':[[17,2],[12,2],[22,2],[18,4]],'let':[[11,2],[9,4],[6,6],[4,4],[12,4],[3,2],[7,2],[5,2]],'фичу':[[22,2]],'первую':[[22,2]],'realize':[[10,2],[2,2]],'key':[[12,4],[16,8],[5,16],[17,12],[9,4],[15,18],[23,6],[25,8],[6,4],[2,6],[4,18],[24,2],[3,2],[10,2],[11,18],[7,4]],'practical':[[15,2],[14,2],[10,2],[6,2]],'тонах':[[22,2]],'любую':[[22,4]],'друга':[[22,4]],'reverts':[[5,2]],'пустая':[[22,2]],'byte':[[25,18],[18,2]],'confirming':[[20,2]],'текущему':[[22,4]],'узкой':[[22,2]],'выделенный':[[22,6]],'config':[[15,2],[22,2],[23,8],[19,8],[24,10],[3,2],[11,44],[5,2]],'entails':[[7,2]],'reference':[[23,2],[0,2],[4,2],[12,2],[13,4],[11,2],[5,2]],'Вся':[[22,2]],'текущая':[[22,4]],'известное':[[22,2]],'позиция':[[22,6]],'from':[[18,6],[19,4],[12,34],[16,18],[8,18],[5,52],[17,30],[9,16],[14,14],[15,52],[21,2],[6,42],[2,22],[4,20],[23,64],[24,30],[25,6],[3,4],[10,10],[11,34],[7,30]],'intricate':[[6,2],[7,2]],'speeding':[[9,2],[14,6],[3,2],[20,2]],'одновременно':[[22,14]],'postponed':[[6,2],[12,2]],'covers':[[11,2]],'никакой':[[22,2]],'конец':[[22,4]],'dissipate':[[2,2]],'incorrect':[[10,2],[8,2]],'10001000':[[17,2],[11,2]],'cleans':[[11,2]],'все':[[22,32]],'sensibly':[[6,2],[12,2]],'compact':[[12,28],[23,2],[25,2]],'зажатых':[[22,4]],'размеру':[[22,2]],'запускает':[[22,4]],'ресурсоёмким':[[22,2]],'номеру':[[22,10]],'category':[[17,60],[14,2],[5,2]],'правом':[[22,2]],'рисуются':[[22,2]],'subdividing':[[12,2]],'следования':[[22,8]],'000001':[[22,2]],'fed':[[4,2]],'specifying':[[11,2]],'холста':[[22,2]],'reproduce':[[19,2],[7,4],[8,2]],'port1':[[25,14],[24,2]],'201':[[8,4]],'disadvantage':[[9,2]],'внопок':[[22,2]],'module':[[25,12]],'hand':[[4,2],[15,4],[10,2],[6,2],[24,2]],'scrolling':[[9,2],[15,8],[23,10],[19,2],[6,2],[4,2],[12,4],[16,8],[5,2]],'api':[[21,2],[14,2],[22,4],[0,2],[13,2],[18,4]],'interdependency':[[10,2]],'each':[[7,4],[12,12],[20,4],[5,8],[14,2],[23,2],[25,10],[6,4],[2,2],[4,8],[24,2],[3,2],[11,8],[18,4]],'shoot':[[9,2],[20,2],[6,4],[5,4]],'sound':[[15,8],[12,2],[14,2],[23,2]],'старого':[[22,2]],'нижнюю':[[22,2]],'другими':[[22,2]],'forget':[[4,2],[18,2],[6,4],[8,2]],'информации':[[22,10]],'rldutsba':[[25,2]],'set':[[18,8],[19,4],[12,8],[16,12],[5,30],[17,22],[9,4],[14,4],[15,24],[22,6],[6,12],[2,4],[4,24],[23,10],[24,6],[25,2],[10,6],[11,36],[7,2]],'finding':[[23,2],[14,2],[2,2],[6,8],[16,4],[20,4]],'подряд':[[22,8]],'средней':[[22,2]],'keys':[[5,14],[17,6],[9,2],[15,14],[22,4],[19,2],[24,4],[25,4],[4,4],[11,40],[8,2]],'Скриншоты':[[22,2]],'newline':[[25,2]],'следующему':[[22,4]],'рекордер':[[22,4]],'unrelated':[[4,2]],'pixels':[[6,2]],'gathered':[[6,2]],'listed':[[4,2],[12,2],[11,2]],'смещения':[[22,2]],'currently':[[17,4],[15,10],[14,2],[23,2],[24,6],[4,2],[16,16],[18,8],[5,4]],'пикселей':[[22,6]],'проецировать':[[22,2]],'access':[[12,2],[14,2],[23,6],[11,4]],'ближайший':[[22,2]],'выделение':[[22,10]],'laconic':[[4,2]],'necessary':[[19,2],[12,6],[16,2],[8,10],[5,6],[9,6],[14,6],[23,4],[6,4],[2,2],[4,2],[24,6],[10,4],[11,10],[7,6]],'allotted':[[14,2],[8,2],[5,2]],'strings':[[20,2]],'unsigned':[[25,6]],'feasible':[[14,2]],'shiny':[[7,2]],'clicks':[[15,2],[14,2],[23,16],[24,4],[4,6],[12,4],[10,2],[11,4]],'некоторые':[[22,2]],'placed':[[15,2],[14,2],[11,2]],'сигнал':[[22,4]],'released':[[4,4],[12,4],[16,2],[24,4],[5,2]],'regardless':[[5,2]],'Каждая':[[22,6]],'окон':[[22,8]],'leave':[[9,2],[15,2],[22,2],[6,2],[4,2],[12,10],[16,2],[10,6],[20,2],[11,10],[8,2]],'definitions':[[14,2]],'satisfying':[[9,2]],'reach':[[11,2],[9,4],[6,12],[4,2],[10,2],[8,4],[5,2]],'saves':[[14,2],[23,24],[25,6],[11,2],[5,4]],'reaches':[[6,2],[24,2]],'мгновенный':[[22,6]],'intentionally':[[14,2]],'simple':[[12,8],[20,4],[8,4],[5,4],[9,2],[14,2],[25,2],[6,10],[2,6],[3,2],[10,4],[11,4],[7,2]],'type':[[19,2],[12,2],[20,2],[5,6],[17,6],[9,2],[14,2],[23,6],[25,6],[6,2],[4,4],[11,4]],'revolutionary':[[7,6]],'ограниченное':[[22,2]],'invalidate':[[23,2]],'blue':[[5,36],[15,2],[14,6],[24,4],[4,24],[16,2],[10,2],[11,6],[8,2]],'disabling':[[11,2],[24,2]],'object':[[15,2],[14,4],[2,2]],'задания':[[22,2]],'away':[[8,4],[9,2],[15,2],[19,2],[6,20],[2,4],[24,2],[16,2],[10,2],[7,4],[5,2]],'changing':[[15,2],[14,2],[23,10],[2,2],[24,2],[4,2],[12,2],[10,2],[11,2],[5,2]],'late':[[5,2]],'основано':[[22,2]],'reaction':[[2,4]],'induces':[[10,2]],'storage':[[14,6]],'отредактировать':[[22,2]],'train':[[8,2]],'interconnected':[[14,2]],'рабочий':[[22,2]],'Одним':[[22,2]],'invokes':[[23,2]],'well':[[11,4],[17,4],[9,2],[21,2],[23,2],[6,10],[2,4],[12,2],[20,2],[8,2],[5,6]],'отпускания':[[22,2]],'переменной':[[22,2]],'getsuperimpose':[[18,4]],'comments':[[4,2],[2,6]],'serve':[[8,2]],'желательно':[[22,4]],'эмулируемыми':[[22,2]],'advised':[[7,2]],'освобождённое':[[22,2]],'soulless':[[9,2]],'уменьшения':[[22,2]],'acceptable':[[6,2]],'possibility':[[9,4],[12,2],[10,2],[24,2]],'reality':[[10,2]],'отображаться':[[22,8]],'учёт':[[22,4]],'предшествующий':[[22,2]],'линию':[[22,2]],'cpp':[[23,44]],'popup_display':[[23,2]],'under':[[5,4],[15,2],[21,4],[24,6],[18,2],[11,2]],'recall':[[11,6]],'carefully':[[12,2],[16,4],[5,2]],'зависит':[[22,12]],'kind':[[4,2],[7,2],[8,2],[2,2],[6,4]],'selected':[[17,20],[18,6],[15,42],[14,4],[23,10],[19,6],[24,2],[4,18],[12,12],[11,8],[5,14]],'straightforwardly':[[5,2]],'1st':[[5,2],[25,6],[7,2],[6,8]],'engaging':[[10,2]],'registerauto':[[18,6]],'themselves':[[8,2],[11,2],[2,2]],'мигающий':[[22,2]],'внёс':[[22,2]],'альтернативных':[[22,2]],'behavior':[[14,2],[6,6],[24,6],[2,2],[12,2],[11,10]],'Может':[[22,4]],'него':[[22,8]],'obstacle':[[9,2]],'neighborhood':[[15,2]],'истории':[[22,10]],'принципе':[[22,2]],'superimposing':[[8,2]],'большинства':[[22,4]],'distant':[[9,2],[10,4],[7,2],[5,2]],'decides':[[7,2]],'detail':[[3,2],[5,2]],'pointless':[[11,2]],'invoking':[[15,2]],'находился':[[22,2]],'attempt':[[5,2],[24,6],[11,2],[7,2]],'big':[[12,2],[6,2],[11,2]],'briefly':[[17,4]],'лучшего':[[22,2]],'importantly':[[12,2]],'trembling':[[11,2]],'возможность':[[22,12]],'seeing':[[0,2],[9,2],[10,2],[7,4],[5,2]],'единой':[[22,2]],'свои':[[22,2]],'writes':[[25,2],[23,2]],'особым':[[22,2]],'операцией':[[22,4]],'transforms':[[24,2]],'перетаскиванием':[[22,4]],'address':[[12,4],[14,2],[6,2]],'отличались':[[22,2]],'становится':[[22,12]],'символов':[[22,4]],'item':[[18,2],[9,14],[15,2],[23,4],[12,2],[3,12],[11,16],[5,16]],'automatically':[[12,6],[16,8],[20,4],[8,2],[5,12],[17,2],[9,4],[14,4],[15,6],[23,2],[24,2],[4,12],[3,2],[10,4],[11,8],[7,4]],'psx':[[22,2]],'reselectclipboard':[[24,2]],'Журналу':[[22,6]],'expects':[[25,2],[24,2]],'experience':[[6,2],[12,4],[8,2],[2,4]],'Заголовок':[[22,2]],'крайне':[[22,2]],'suggests':[[24,4]],'resort':[[7,2]],'drawbox':[[12,4]],'nowadays':[[14,2]],'unpaused':[[18,4],[15,2],[7,2],[5,2]],'pointing':[[15,6],[16,4],[25,2],[11,2],[5,2]],'несколькими':[[22,2]],'fit':[[18,6],[16,2]],'commented':[[12,2],[21,2]],'judging':[[6,2],[20,2]],'followed':[[6,2]],'imported':[[17,4],[19,2]],'classification':[[13,2]],'привязан':[[22,2]],'вертикальный':[[22,4]],'burst':[[12,2]],'short':[[5,6],[6,4],[4,2],[12,4],[16,4],[8,2],[11,2]],'final':[[21,2],[14,2],[6,16],[20,2],[10,2],[7,4],[5,2]],'сделать':[[22,10]],'догадаться':[[22,2]],'операциях':[[22,6]],'disposal':[[5,2]],'minor':[[23,2],[6,2],[7,2]],'shade':[[11,2]],'действуют':[[22,2]],'romchecksum':[[25,2]],'Списке':[[22,6]],'signal':[[24,2]],'while':[[18,4],[19,2],[12,16],[20,2],[8,14],[5,10],[9,4],[14,6],[15,14],[23,2],[6,10],[2,6],[4,12],[24,14],[3,2],[10,4],[11,24],[7,6]],'gameplay':[[4,2],[6,6],[7,2],[2,8],[5,4]],'alone':[[6,2]],'time':[[18,6],[0,2],[12,20],[13,2],[16,8],[20,22],[8,12],[5,50],[17,6],[9,24],[14,28],[15,10],[23,12],[6,32],[2,12],[4,10],[10,16],[11,22],[7,12]],'height':[[2,2],[9,2]],'fds':[[15,8],[25,4],[24,4],[18,4]],'Журналом':[[22,2]],'duration':[[10,4],[2,2],[6,2]],'such':[[18,12],[19,2],[12,8],[20,4],[8,2],[5,10],[17,4],[9,4],[14,4],[15,2],[23,6],[6,40],[2,6],[4,4],[24,10],[3,2],[10,4],[11,10],[7,12]],'количеством':[[22,2]],'synchronization':[[24,2]],'func':[[18,8]],'lack':[[9,2]],'listing':[[11,2]],'самые':[[22,2]],'masterfully':[[2,2]],'side':[[15,14],[25,4],[24,4],[6,4],[18,2],[7,2]],'erroneously':[[7,2]],'кнопки':[[22,42]],'crossing':[[15,6],[16,4]],'unfinished':[[6,2]],'реализовано':[[22,2]],'колонкам':[[22,2]],'demand':[[23,20]],'memo':[[25,2]],'modification':[[17,6],[9,6],[14,4],[21,2],[23,8],[10,12],[7,8],[5,2]],'вне':[[22,2]],'written':[[23,2],[14,2],[6,2]],'occurrence':[[23,4],[20,12]],'paste':[[7,2],[17,10],[15,6],[22,2],[23,2],[19,2],[2,2],[12,6],[8,2],[5,4]],'finish':[[4,2],[15,2],[2,2],[6,4]],'moving':[[12,2],[16,6],[5,2],[17,2],[9,2],[15,12],[23,2],[6,4],[24,2],[4,2],[10,4],[11,2],[7,2]],'строка':[[22,8]],'белым':[[22,2]],'тучки':[[22,4]],'старых':[[22,4]],'easier':[[11,4],[23,2],[6,6],[2,6],[12,6],[8,2],[5,6]],'confirm':[[9,2],[11,2]],'модификаторов':[[22,6]],'формируется':[[22,2]],'закладки':[[22,4]],'disregard':[[2,2]],'creating':[[19,2],[12,4],[20,6],[8,4],[5,2],[17,4],[15,2],[14,6],[23,20],[2,4],[24,2],[4,2],[3,2],[11,2],[7,6]],'disabled':[[9,6],[19,2],[24,4],[10,2],[11,26],[5,2]],'reader':[[6,2]],'replace':[[24,2],[12,2],[18,4],[11,2]],'цвет':[[22,12]],'outran':[[9,2]],'Вводом':[[22,16]],'far':[[9,4],[6,2],[2,2],[4,2],[24,2],[12,2],[16,2],[11,4],[5,2]],'потребуется':[[22,2]],'сохранение':[[22,4]],'incompatible':[[24,2]],'priorities':[[4,2],[14,2]],'щелчки':[[22,2]],'experimentally':[[7,2]],'subforum':[[19,2]],'properly':[[9,2],[5,2]],'breakthrough':[[2,2],[7,2]],'позволяющий':[[22,2]],'proofing':[[15,2],[21,2],[23,2],[24,4],[0,2],[11,2]],'restored':[[3,2],[11,2]],'pop':[[11,14],[5,2]],'340':[[6,4]],'trap':[[6,2]],'joypad1data':[[12,6]],'back':[[5,22],[9,2],[15,2],[23,2],[25,2],[2,4],[24,4],[4,6],[16,2],[7,6],[8,2]],'lengthy':[[19,2]],'upper':[[17,2],[15,6],[14,2],[23,8],[19,2],[4,8],[12,2],[16,4],[11,4],[5,10]],'соответствующий':[[22,8]],'box':[[12,2]],'section':[[12,2],[16,2],[5,36],[17,2],[15,2],[14,2],[21,2],[25,4],[6,2],[2,4],[4,4],[7,2],[11,2]],'digits':[[5,2]],'индикатором':[[22,2]],'клавишу':[[22,12]],'ability':[[6,2],[24,2],[7,2],[2,4]],'носит':[[22,2]],'only':[[18,10],[19,4],[12,24],[16,6],[20,12],[8,10],[5,20],[17,4],[9,10],[14,8],[15,10],[21,2],[6,24],[2,14],[4,2],[23,4],[24,10],[10,16],[11,32],[7,24]],'alt':[[17,10],[15,16],[22,20],[23,2],[24,2],[12,8],[16,2],[11,2]],'визуальной':[[22,2]],'states':[[14,2],[23,2],[25,2],[4,6],[12,2],[5,2]],'opens':[[24,2]],'corrupted':[[24,4]],'unbounded':[[5,2]],'according':[[8,2],[23,8],[19,2],[12,6],[10,2],[11,4],[7,2]],'requests':[[12,2],[18,12]],'Вверх':[[22,4]],'терминология':[[22,2]],'обнаружилось':[[22,2]],'occasionally':[[15,2]],'bros':[[4,2],[12,2],[14,2],[6,6],[5,2]],'именно':[[22,8]],'joypads':[[23,2],[19,2],[11,4]],'depend':[[25,2],[18,2]],'увидеть':[[22,6]],'cards':[[4,2],[5,2]],'paging':[[16,4]],'останавливает':[[22,2]],'txt':[[12,2],[24,2]],'assistance':[[0,2]],'heavy':[[11,2]],'enemies':[[6,6],[20,4]],'swap':[[17,6]],'keeping':[[9,2],[10,2],[8,4]],'svn':[[21,6]],'si_zapper':[[25,8]],'tree':[[17,6],[15,6],[23,10],[19,2],[2,4],[24,8],[16,4],[5,14]],'library':[[12,2],[13,2],[23,4],[18,4]],'thanks':[[24,4],[6,2],[2,8],[20,2],[11,6],[5,4]],'something':[[6,4],[12,4],[11,2],[2,4]],'эмуляцией':[[22,2]],'сравнения':[[22,2]],'falling':[[6,2]],'effort':[[7,4],[8,2],[2,2]],'discomfort':[[4,2]],'spot':[[5,2]],'reading':[[23,14],[19,2],[6,2],[12,2],[20,2],[7,2],[11,2]],'obstructing':[[11,2]],'500':[[11,2]],'rows':[[15,8],[14,2],[22,2],[23,8],[5,4]],'fceux':[[19,8],[12,26],[16,2],[20,6],[8,2],[5,20],[9,4],[15,14],[21,2],[22,12],[2,4],[23,14],[4,10],[24,12],[25,2],[3,2],[10,12],[11,22],[18,22]],'чем':[[22,4]],'быстрой':[[22,6]],'поставил':[[22,2]],'tasks':[[12,6],[14,2],[10,2],[20,2],[6,6]],'twin':[[12,2]],'looks':[[12,2]],'dozens':[[12,2]],'markedframe':[[18,4]],'enjoy':[[6,4]],'набор':[[22,6]],'выбранного':[[22,6]],'stumble':[[6,2]],'graph':[[5,6]],'observing':[[19,2],[16,2]],'5000':[[24,2]],'bit6':[[25,4]],'hud':[[22,2],[14,2],[23,2],[11,2]],'jumps':[[7,2],[9,2],[15,4],[6,2],[11,4],[5,6]],'probably':[[2,2],[6,2],[4,2],[12,6],[16,2],[8,2]],'зато':[[22,2]],'region':[[15,4],[23,8]],'следующей':[[22,4]],'размеров':[[22,2]],'предыдущим':[[22,2]],'public':[[12,2],[23,4]],'emulator':[[18,4],[19,2],[12,10],[16,6],[5,28],[17,12],[9,8],[14,8],[15,14],[21,2],[6,2],[2,6],[4,16],[23,48],[24,20],[25,10],[3,8],[10,8],[11,26],[7,6]],'Фаербол':[[22,4]],'новый':[[22,8]],'макросов':[[22,2]],'smart':[[12,2],[6,2],[5,2]],'функций':[[22,8]],'joining':[[2,2]],'рекомендуемые':[[22,2]],'toolset':[[2,2]],'across':[[4,2],[23,2]],'session':[[4,2],[11,2]],'пересекать':[[22,4]],'component':[[5,2]],'Объём':[[22,2]],'received':[[14,4]],'иконку':[[22,2]],'мышкой':[[22,2]],'newcomer':[[2,2]],'Рекордер':[[22,10]],'определяется':[[22,2]],'aren':[[8,2],[14,2],[6,4],[12,2],[11,4],[5,2]],'теряют':[[22,6]],'вертикальной':[[22,2]],'напротив':[[22,2]],'convenient':[[12,2],[6,2],[5,2]],'clipboard':[[17,12],[15,10],[23,10],[12,6],[16,6],[5,14]],'revert':[[17,2],[5,2],[9,2],[23,2],[16,4],[11,4],[7,2]],'запущено':[[22,2]],'Выделении':[[22,14]],'тех':[[22,10]],'отпущенной':[[22,6]],'библиотеки':[[22,2]],'yes':[[12,2],[24,8]],'хоткей':[[22,8]],'родительских':[[22,2]],'одна':[[22,2]],'bit2':[[25,4]],'conducting':[[7,2]],'pass':[[8,2],[11,2]],'mind':[[5,2],[9,2],[6,16],[2,4],[4,8],[12,8],[20,8],[10,2],[7,2],[8,2]],'moved':[[23,4],[5,2]],'device':[[25,6],[14,2]],'running':[[18,4],[15,2],[14,2],[6,2],[24,2],[4,4],[12,4],[11,4],[5,4]],'labels':[[15,2],[23,2]],'отображают':[[22,2]],'любых':[[22,4]],'насколько':[[22,2]],'convention':[[25,4]],'avoids':[[6,2]],'темы':[[22,2]],'terms':[[9,2],[14,6],[6,4],[12,2],[13,2],[3,2],[7,2]],'функции':[[22,10]],'непротиворечивой':[[22,2]],'broken':[[6,2]],'записаны':[[22,6]],'совпадать':[[22,2]],'unknown':[[7,4],[5,2]],'skills':[[21,2],[16,2],[14,2],[6,4]],'предыдущий':[[22,6]],'альфа':[[22,2]],'disappears':[[17,2],[11,4]],'self':[[4,2]],'resave':[[11,2]],'bits':[[25,6],[18,2]],'main':[[19,4],[12,12],[16,2],[5,8],[9,4],[14,4],[15,4],[23,6],[6,2],[2,2],[4,2],[24,2],[3,4],[10,4],[11,10]],'хоть':[[22,2]],'repository':[[2,2],[21,2]],'principal':[[7,2]],'значениями':[[22,2]],'конечного':[[22,2]],'порядка':[[22,2]],'differs':[[17,2],[24,2],[5,2]],'modes':[[7,2],[23,2]],'reassign':[[11,4]],'изменения':[[22,28]],'clearinputchanges':[[18,4]],'труд':[[22,2]],'yyy':[[25,4]],'gamers':[[7,2]],'вставка':[[22,4]],'master':[[8,4],[12,6]],'illogical':[[10,2],[8,2]],'Журнал':[[22,22]],'invent':[[12,4],[14,2],[7,2]],'methodically':[[14,2]],'контекстного':[[22,2]],'vision':[[23,2],[1,2]],'900':[[8,6]],'посылает':[[22,4]],'dealing':[[6,2],[11,2]],'unpredictable':[[14,2]],'передаёт':[[22,6]],'piece':[[6,4]],'различий':[[22,4]],'разным':[[22,2]],'persistence':[[7,2]],'удалении':[[22,6]],'уме':[[22,2]],'wasn':[[18,4],[23,2]],'массив':[[22,4]],'text':[[12,24],[16,10],[8,2],[5,2],[17,32],[15,18],[14,4],[23,12],[25,22],[6,10],[4,6],[3,8],[10,4],[11,18],[18,2]],'accomplishes':[[6,2]],'opinion':[[12,2]],'callback':[[18,20]],'restore':[[19,2],[12,4],[8,2],[5,6],[9,10],[15,20],[22,2],[23,2],[4,2],[10,6],[11,6],[7,2]],'пикселах':[[22,2]],'|commands|rldutsba|rldutsba|rldutsba|rldutsba|port2|':[[25,2]],'form':[[1,2],[14,10],[23,2],[25,4],[4,2],[12,6],[20,2],[10,2],[8,2]],'controlling':[[15,6],[16,2],[2,2],[5,4]],'registers':[[12,4],[18,4]],'вызове':[[22,2]],'Луа':[[22,4]],'вставить':[[22,4]],'мест':[[22,2]],'latter':[[11,2],[14,2]],'unnecessary':[[14,2]],'разместить':[[22,4]],'сжатый':[[22,2]],'intricacies':[[10,2],[8,2]],'найденном':[[22,2]],'нового':[[22,16]],'adv':[[15,2]],'with':[[18,10],[19,8],[12,42],[13,2],[16,18],[20,10],[8,22],[5,52],[17,18],[9,38],[14,20],[15,28],[21,4],[6,60],[2,24],[4,36],[23,18],[24,34],[25,16],[3,6],[10,16],[11,60],[7,14]],'systematizes':[[19,2]],'Обмена':[[22,6]],'between':[[19,2],[12,4],[20,2],[8,4],[5,14],[9,6],[14,14],[15,6],[22,2],[6,18],[2,4],[4,4],[23,18],[24,4],[3,2],[10,6],[11,6],[7,10]],'working':[[1,2],[19,2],[12,4],[20,6],[5,12],[9,4],[23,28],[25,2],[6,12],[2,4],[4,4],[24,2],[10,4],[11,6]],'chronology':[[5,4]],'Эта':[[22,2]],'Виртуальном':[[22,2]],'быстрый':[[22,2]],'иерархическую':[[22,2]],'набрать':[[22,2]],'указывал':[[22,2]],'обогнать':[[22,2]],'записывает':[[22,6]],'intensified':[[7,2]],'Гринзоны':[[22,64]],'meet':[[12,2]],'flying':[[9,2]],'absolute':[[6,2]],'множеству':[[22,2]],'усечений':[[22,2]],'vertically':[[4,2],[6,2]],'saving':[[12,12],[5,6],[17,2],[9,2],[15,2],[23,12],[25,2],[6,2],[2,2],[24,14],[3,4],[11,16],[7,2]],'mathematical':[[12,2]],'принята':[[22,2]],'got':[[8,2],[12,2]],'maybe':[[6,2],[5,2]],'possible':[[19,4],[12,4],[13,2],[16,2],[20,8],[5,8],[17,2],[9,4],[14,14],[23,2],[6,22],[2,6],[24,6],[10,4],[11,6]],'omit':[[4,2]],'insert':[[17,24],[18,4],[9,4],[15,24],[25,4],[19,2],[6,2],[24,6],[10,6],[11,4],[5,24]],'intelligence':[[14,2]],'ещё':[[22,12]],'пустует':[[22,2]],'передвинуть':[[22,2]],'scrolled':[[4,2]],'реального':[[22,2]],'like':[[7,4],[12,12],[16,6],[5,8],[9,6],[14,2],[21,2],[23,4],[6,18],[2,4],[4,4],[24,4],[3,4],[11,6],[18,4]],'Значение':[[22,2]],'recalculates':[[23,2]],'particular':[[23,2]],'transparent':[[23,2]],'фильтр':[[22,2]],'Объединение':[[22,2]],'interacting':[[3,2]],'целевому':[[22,2]],'range':[[5,2],[2,2],[24,2],[4,2],[12,8],[11,4],[18,16]],'команд':[[22,4]],'cloning':[[23,2]],'occurs':[[7,2],[20,2],[8,2],[6,4]],'похож':[[22,2]],'keypresses':[[5,2],[11,4],[7,2]],'role':[[15,2],[2,2],[7,2]],'economy':[[11,2]],'screen':[[12,12],[20,6],[8,2],[5,8],[9,6],[14,6],[25,4],[6,6],[2,2],[4,8],[10,18],[11,2]],'запускается':[[22,6]],'file':[[19,8],[12,82],[8,2],[5,2],[17,6],[21,2],[14,2],[23,48],[25,30],[24,52],[3,12],[11,6]],'year':[[7,2]],'symbol':[[17,6],[15,12],[14,2],[4,2],[12,2],[11,8]],'Теплокарта':[[22,4]],'простой':[[22,2]],'вылилась':[[22,2]],'расстоянии':[[22,2]],'ячейке':[[22,16]],'Миникарты':[[22,16]],'паузы':[[22,2]],'сентябре':[[22,2]],'movies':[[14,6],[19,6],[24,2],[4,2],[12,4],[5,4]],'paragraphs':[[6,2]],'pacifist':[[14,2]],'net':[[21,2]],'Тасэдитора':[[22,40]],'specific':[[17,2],[23,6],[6,4],[12,2],[16,4],[3,2],[20,2],[18,2]],'port':[[25,6],[19,2],[24,2]],'Первые':[[22,2]],'consuming':[[2,2]],'lots':[[2,2],[11,2]],'указателя':[[22,2]],'утерянная':[[22,2]],'transmission':[[7,2]],'существенные':[[22,2]],'узнавать':[[22,2]],'переход':[[22,4]],'fractional':[[14,2]],'большинстве':[[22,6]],'unused':[[8,2],[14,4]],'просто':[[22,4]],'вплоть':[[22,4]],'взятого':[[22,2]],'снизу':[[22,2]],'makes':[[11,2],[9,6],[23,6],[6,8],[2,2],[24,2],[12,2],[7,12],[5,2]],'fancy':[[10,2]],'finishing':[[8,2],[14,2]],'basic':[[21,2],[14,2],[6,4],[7,4]],'нужд':[[22,2]],'decompression':[[23,8]],'сработали':[[22,2]],'recommended':[[19,8],[12,18],[16,2],[20,12],[8,4],[5,6],[9,10],[14,4],[15,4],[23,2],[6,2],[24,4],[4,4],[3,2],[10,6],[11,42],[18,2]],'последней':[[22,4]],'Причём':[[22,2]],'строчке':[[22,2]],'любое':[[22,2]],'protection':[[24,2]],'1200':[[22,8]],'shortly':[[20,2]],'surrounding':[[15,2]],'want':[[18,2],[19,2],[12,10],[16,12],[8,4],[5,8],[9,4],[15,2],[6,2],[2,2],[4,2],[10,2],[11,14],[7,4]],'dispatch':[[23,2]],'redone':[[2,2]],'понятной':[[22,2]],'зелёной':[[22,8]],'Текущий':[[22,2]],'movement':[[23,6],[7,2],[5,4]],'данным':[[22,4]],'установлена':[[22,18]],'cause':[[9,2],[2,2],[5,2]],'ранний':[[22,2]],'Счётчик':[[22,12]],'common':[[12,2],[23,4]],'inventiveness':[[6,4]],'shaping':[[6,2],[12,2]],'проэмулировать':[[22,4]],'different':[[12,10],[16,2],[8,10],[5,8],[17,4],[9,6],[14,8],[15,4],[6,6],[2,2],[4,6],[24,2],[10,8],[11,8],[7,4]],'соответствует':[[22,12]],'activating':[[12,2]],'tortoisesvn':[[21,2]],'waves':[[6,2]],'позволяет':[[22,14]],'repeats':[[7,2]],'изменённого':[[22,2]],'лета':[[22,2]],'интерпретатор':[[22,6]],'Иначе':[[22,2]],'semiautomatic':[[14,2],[10,10],[7,2]],'появился':[[22,2]],'mouseover':[[23,8]],'options':[[7,2],[9,2],[19,2],[6,2],[10,2],[11,4],[5,2]],'force':[[6,4]],'urges':[[10,2]],'Вместе':[[22,2]],'study':[[3,2],[0,2]],'commenting':[[12,2]],'shortest':[[20,2]],'letter':[[4,4]],'purpose':[[14,2],[11,2],[5,4]],'slash':[[15,2]],'сколько':[[22,4]],'операция':[[22,10]],'critically':[[6,2]],'ill':[[6,2]],'leaves':[[11,2]],'eventually':[[4,2],[6,2]],'номер':[[22,42]],'miscellaneous':[[25,2]],'interpret':[[4,2],[25,2],[18,2]],'zero':[[6,6],[18,4],[2,2]],'manner':[[12,2],[15,2],[19,2]],'раза':[[22,4]],'Количество':[[22,8]],'нормальным':[[22,2]],'push':[[24,2],[23,2]],'dozen':[[6,4],[5,2]],'над':[[22,4]],'0000005':[[4,2]],'win':[[12,2]],'color':[[15,4],[14,6],[4,16],[12,2],[11,12],[5,2]],'изменению':[[22,2]],'flashings':[[23,8]],'drop':[[9,2],[11,2],[7,2]],'motor':[[8,2]],'фиксированную':[[22,2]],'inspects':[[23,2]],'accidentally':[[9,2],[24,6],[5,2]],'меньшей':[[22,2]],'guide':[[1,4],[14,2],[19,2],[6,2],[2,4],[4,2],[0,2],[12,2],[3,4],[10,2]],'divides':[[6,2]],'возможных':[[22,2]],'accessed':[[3,2]],'постоянно':[[22,4]],'dividing':[[9,2],[10,2],[2,2],[6,4]],'port2':[[25,6],[24,2]],'fork':[[5,2]],'gets':[[14,2],[6,2],[4,2],[12,2],[10,2],[8,2]],'mid':[[15,6]],'трудозатрат':[[22,2]],'books':[[6,2]],'обычным':[[22,2]],'patern':[[23,2]],'speedrunners':[[20,2],[14,2]],'rationally':[[5,2]],'download':[[21,2]],'minutes':[[11,8],[10,4],[6,2],[5,2]],'Курсор':[[22,68]],'Горячими':[[22,2]],'команды':[[22,4]],'означает':[[22,4]],'activity':[[9,2],[14,2],[20,2],[10,4],[7,2],[8,2]],'сэйвов':[[22,6]],'unnoticeable':[[7,2],[14,2]],'начинающийся':[[22,2]],'байте':[[22,2]],'break':[[4,2],[11,2],[12,2],[6,2],[8,2]],'визуализирует':[[22,2]],'разделяется':[[22,2]],'seldom':[[7,2]],'conflicting':[[5,2]],'head':[[12,2],[24,2],[11,4]],'дополнение':[[22,2]],'card':[[5,8]],'dedicated':[[4,2],[0,2],[11,2],[7,2],[5,4]],'remain':[[6,2],[12,2]],'которые':[[22,4]],'автоматизировать':[[22,2]],'believe':[[6,2]],'previously':[[4,2],[16,4],[20,2],[11,4],[18,10]],'отгринзоненном':[[22,2]],'will':[[18,82],[1,2],[19,6],[12,74],[16,2],[20,4],[8,8],[5,66],[9,12],[14,4],[15,62],[23,4],[6,20],[2,6],[4,60],[24,24],[25,8],[3,8],[10,20],[11,110],[7,8]],'spontaneously':[[6,2]],'huge':[[4,2],[12,8],[14,2],[23,2],[2,2]],'else':[[15,2],[14,4],[10,2],[8,2],[11,4]],'accessible':[[11,2]],'Маркеры':[[22,50]],'cross':[[4,2]],'state':[[18,8],[12,6],[16,6],[20,14],[8,8],[5,20],[17,8],[9,2],[14,12],[15,50],[23,36],[6,6],[2,2],[4,4],[24,24],[25,10],[10,2],[11,16],[7,2]],'populated':[[3,2]],'Панель':[[22,2]],'отображаемой':[[22,2]],'lua':[[0,2],[12,28],[13,4],[20,4],[5,8],[17,36],[15,6],[14,10],[22,22],[23,18],[24,2],[3,2],[18,10],[11,4]],'checked':[[15,2],[23,2],[12,6],[16,2],[18,8],[5,4]],'thing':[[12,2],[14,2],[2,2]],'упоминания':[[22,2]],'slowdown':[[2,4]],'highlighted':[[15,4],[14,2],[5,4]],'объединяться':[[22,2]],'glossary':[[12,2],[13,2],[3,2],[14,6],[0,2]],'признано':[[22,2]],'unwittingly':[[7,2]],'bonus':[[6,2],[9,2]],'прыжках':[[22,2]],'not':[[18,50],[19,4],[12,34],[16,4],[20,6],[8,6],[5,14],[17,30],[9,14],[14,10],[15,12],[23,16],[6,34],[2,26],[4,10],[24,18],[25,18],[10,16],[11,20],[7,14]],'anymore':[[2,2]],'свою':[[22,2]],'одних':[[22,2]],'log':[[18,4],[12,10],[16,2],[20,2],[8,2],[5,14],[17,8],[9,10],[14,4],[15,18],[22,2],[2,4],[23,12],[24,2],[25,22],[10,2],[7,2],[11,22]],'гибко':[[22,4]],'maximum':[[5,6],[12,2],[14,4],[11,14],[6,4]],'implementing':[[6,4]],'Зелёная':[[22,8]],'sooner':[[5,2]],'saved':[[12,12],[20,6],[8,2],[5,6],[17,6],[9,2],[14,2],[15,6],[25,20],[24,2],[4,2],[3,2],[11,10],[7,2]],'shrink':[[6,2],[23,2]],'refer':[[18,2],[20,2]],'висит':[[22,2]],'provokes':[[10,2],[8,2]],'сдвигает':[[22,2]],'safely':[[9,2],[24,2],[7,2]],'gather':[[14,2]],'точнее':[[22,2]],'conversion':[[23,2]],'design':[[6,2]],'senses':[[6,2]],'повышения':[[22,2]],'относятся':[[22,4]],'becomes':[[5,2],[17,4],[6,6],[2,2],[4,4],[20,2],[7,4],[11,2]],'raw':[[2,2]],'pit':[[5,2],[12,2],[10,4],[8,2],[6,8]],'integral':[[2,2]],'remote':[[2,2],[5,2]],'Запись':[[22,6]],'отмечен':[[22,2]],'Основообразующей':[[22,2]],'express':[[6,2]],'перенести':[[22,2]],'met':[[6,4]],'мувику':[[22,8]],'поставить':[[22,6]],'сразу':[[22,20]],'foresight':[[6,2]],'ТАСер':[[22,30]],'изменил':[[22,4]],'кадрами':[[22,2]],'отличающегося':[[22,2]],'всплывающих':[[22,8]],'representing':[[23,2],[14,2],[18,12],[24,2]],'прослеживание':[[22,2]],'harder':[[2,4]],'автоматически':[[22,24]],'notice':[[6,8],[24,2],[4,2],[2,6],[11,2],[5,4]],'explain':[[19,2],[2,2]],'basics':[[2,2]],'Когда':[[22,14]],'beyond':[[9,2],[23,2],[6,2]],'сохраняемые':[[22,2]],'entangle':[[14,2]],'уже':[[22,16]],'shall':[[3,2]],'значение':[[22,26]],'остаются':[[22,2]],'discuss':[[20,2]],'determining':[[25,2]],'existing':[[5,8],[18,2],[9,2],[14,4],[15,4],[19,2],[12,2],[3,2],[8,6],[7,2]],'удаления':[[22,2]],'записок':[[22,2]],'page':[[15,4],[16,12],[22,4],[24,6],[5,18]],'aid':[[2,2],[6,2]],'intermediaries':[[10,2]],'раз':[[22,16]],'rather':[[11,2],[9,2],[6,4],[2,4],[4,2],[24,2],[12,6],[10,2],[7,4],[5,4]],'instances':[[17,58]],'щелчками':[[22,2]],'deleting':[[17,2],[14,2],[23,6],[19,2]],'unconsciously':[[6,2]],'изменяться':[[22,2]],'prepare':[[4,2],[12,2],[7,2],[8,2]],'избирательно':[[22,2]],'precise':[[4,2],[10,2],[6,2]],'harmful':[[2,2]],'line':[[17,6],[14,2],[25,6],[24,2],[4,22],[12,8],[11,6],[5,14]],'onto':[[6,2]],'кнопочных':[[22,2]],'подтверждает':[[22,2]],'thousands':[[16,4]],'храниться':[[22,4]],'Курсору':[[22,6]],'вариант':[[22,2]],'подсветка':[[22,4]],'around':[[11,2]],'thousand':[[6,6]],'подобная':[[22,2]],'goes':[[4,2],[6,2],[20,6],[2,2],[5,4]],'Заголовка':[[22,2]],'автором':[[22,2]],'send':[[15,12],[23,4],[24,2],[12,2],[16,4],[11,2],[5,8]],'соответствующих':[[22,2]],'scalable':[[23,2]],'jumpnextmarker':[[24,2]],'zapper':[[25,8]],'shouldn':[[23,4],[10,2],[6,2],[8,2]],'confinement':[[15,2]],'устанавливать':[[22,8]],'interaction':[[9,2],[14,4],[24,2],[2,2],[10,2],[8,2]],'destination':[[7,4],[12,2]],'такой':[[22,4]],'inexactitude':[[19,2]],'джойстиков':[[22,6]],'Ответвлений':[[22,2]],'tough':[[8,2]],'cached_timelines':[[23,2]],'повторных':[[22,2]],'rules':[[12,2],[2,12],[7,2]],'draw':[[17,2],[9,4],[14,2],[15,2],[4,4],[12,2],[10,8],[11,12],[5,4]],'statement':[[6,2],[7,2]],'sorted':[[18,4]],'загораться':[[22,4]],'поэтому':[[22,16]],'неравного':[[22,2]],'высота':[[22,2]],'held':[[15,4],[23,2],[6,2],[2,2],[4,4],[24,4],[16,2],[5,2]],'automate':[[18,2],[5,2]],'simplest':[[20,2]],'влияют':[[22,2]],'called':[[18,10],[14,6],[6,2],[4,6],[12,4],[16,2],[11,2],[5,2]],'коротких':[[22,2]],'progressing':[[8,2]],'сохраняет':[[22,2]],'seekng':[[23,2]],'newly':[[5,2],[11,2],[8,4]],'incomplete':[[6,2]],'interrupting':[[16,2]],'experimenting':[[7,2]],'port0':[[25,14],[24,2]],'testing':[[17,4],[14,2],[6,6],[0,2],[20,2],[8,2]],'post':[[12,2],[19,2],[2,2]],'tangible':[[7,2]],'software':[[5,2]],'вручную':[[22,2]],'hide':[[15,6],[12,2],[22,2],[24,2],[5,2]],'пор':[[22,2]],'Интерпретатор':[[22,2]],'определённые':[[22,2]],'similar':[[19,2],[12,22],[16,8],[8,4],[5,10],[9,2],[14,2],[15,2],[22,2],[6,6],[2,2],[4,4],[23,4],[3,2],[10,2]],'finally':[[20,2],[3,2],[11,8],[5,2]],'Главный':[[22,2]],'иконкам':[[22,4]],'subpixel':[[2,2]],'запустил':[[22,2]],'выделениям':[[22,2]],'начинается':[[22,14]],'несколько':[[22,12]],'turns':[[5,2],[14,2],[2,2],[24,2],[4,2],[7,2],[11,2]],'лаг':[[22,8]],'emphasizing':[[2,2]],'etc':[[9,2],[14,10],[23,4],[6,2],[12,2],[3,2],[8,4],[5,2]],'Исходя':[[22,2]],'места':[[22,6]],'sensible':[[12,2]],'deleted':[[17,2],[19,2]],'digit':[[4,2]],'standard':[[5,2],[15,2],[2,2],[24,4],[4,4],[12,6],[3,2],[7,2],[11,4]],'overwriting':[[11,2],[5,2]],'сверху':[[22,4]],'noticing':[[6,2],[12,2]],'нижнего':[[22,2]],'bullet':[[6,2],[9,8]],'win32':[[21,2]],'загружаемой':[[22,2]],'стрелка':[[22,18]],'отпускать':[[22,2]],'hash':[[25,2]],'delays':[[14,2]],'использованных':[[22,2]],'write':[[18,2],[7,12],[22,2],[25,4],[2,2],[12,12],[8,4],[5,2]],'blank':[[17,10],[18,4],[9,4],[15,4],[24,4],[12,2],[11,8],[5,4]],'grasp':[[6,2]],'means':[[7,6],[19,4],[12,2],[16,2],[20,6],[8,4],[9,2],[14,2],[23,4],[25,4],[2,4],[6,10],[4,2],[11,4],[18,2]],'выше':[[22,4]],'marked':[[5,4],[17,12],[18,8],[14,2],[19,2],[4,8],[12,4],[16,4],[11,2],[8,2]],'equal':[[5,4],[18,6],[6,2],[2,2]],'оценивая':[[22,2]],'сообщающий':[[22,2]],'preferences':[[3,2]],'persistent':[[7,2]],'значением':[[22,4]],'routine':[[12,2],[5,2]],'визуального':[[22,2]],'derived':[[14,2]],'action':[[7,2],[9,2],[15,2],[12,2],[8,2],[5,2]],'версию':[[22,4]],'games':[[11,8],[14,8],[6,12],[2,2],[12,8],[10,8],[7,2],[5,6]],'pastes':[[5,2]],'drawn':[[4,2],[12,4],[11,2]],'your':[[18,10],[12,28],[20,2],[8,6],[5,28],[9,14],[14,4],[6,28],[2,8],[4,14],[24,2],[3,2],[10,14],[11,24],[7,20]],'exhausted':[[20,4]],'battletoads':[[17,2]],'linearity':[[2,2]],'spatial':[[5,4]],'calling':[[12,2],[25,2],[18,4]],'генерация':[[22,2]],'checkboxes':[[9,2],[15,2],[23,4],[19,2],[10,2],[11,6],[5,6]],'ранее':[[22,4]],'simultaneously':[[9,2],[14,2],[20,4],[2,2]],'частично':[[22,4]],'невыделенных':[[22,2]],'распаковывает':[[22,2]],'processor':[[14,2]],'branching':[[19,2],[11,2]],'examined':[[20,2]],'загрузку':[[22,2]],'unprohibited':[[14,2]],'treated':[[18,2]],'эмулируемой':[[22,8]],'pause':[[9,6],[15,14],[23,6],[4,6],[11,8],[5,6]],'latest':[[4,4],[9,2],[6,2],[7,6]],'shift':[[17,20],[9,10],[15,50],[22,12],[4,8],[12,2],[16,26],[10,8],[11,6],[5,32]],'fall':[[8,2]],'gridview':[[22,2]],'сравнить':[[22,2]],'требовалось':[[22,2]],'traverse':[[16,2]],'somebody':[[11,2],[14,2]],'линиями':[[22,8]],'init':[[23,2]],'within':[[9,4],[14,4],[23,4],[2,2],[6,8],[4,2],[12,2],[16,4],[11,2]],'damaged':[[12,2]],'редактировании':[[22,4]],'различия':[[22,2]],'indicator':[[15,2],[23,2],[5,2]],'separate':[[11,4],[9,2],[6,4],[2,2],[12,2],[7,2],[5,2]],'hollow':[[11,4]],'framenum':[[17,4]],'redo':[[15,6],[22,2],[23,4],[6,10],[24,4],[10,2],[11,2]],'Аналогично':[[22,6]],'difference':[[14,2],[23,6],[19,2],[2,2],[4,2],[10,2],[11,2],[5,2]],'besides':[[19,2],[6,2],[2,2],[4,4],[24,2],[12,2],[3,4],[10,2],[11,6],[5,6]],'increases':[[5,2],[11,2],[9,2],[6,2],[2,2]],'названия':[[22,8]],'nothing':[[4,2],[15,2],[14,2],[18,16]],'ставятся':[[22,2]],'window':[[19,6],[12,22],[16,6],[20,2],[5,16],[15,14],[14,2],[23,22],[6,4],[2,2],[4,12],[24,18],[3,24],[10,12],[18,2],[11,20]],'Автоматическое':[[22,2]],'справа':[[22,2]],'миникарте':[[22,2]],'выделен':[[22,2]],'Невыделенные':[[22,2]],'affected':[[9,2],[16,2],[6,2],[5,2]],'bit1':[[25,4]],'верхний':[[22,6]],'длительного':[[22,4]],'stopping':[[9,2],[20,2]],'удаляя':[[22,2]],'точности':[[22,2]],'heart':[[7,2]],'word':[[17,2],[25,2],[6,2],[12,12],[3,2],[5,2]],'strategy':[[11,2],[5,2]],'system':[[15,4],[14,4],[25,2],[0,2]],'occurred':[[4,2],[18,2],[24,2]],'achievement':[[5,2]],'grows':[[6,4]],'меняется':[[22,8]],'разреживается':[[22,2]],'отвязаны':[[22,2]],'development':[[0,2],[10,2],[6,2],[2,6]],'imply':[[4,2]],'activities':[[2,2]],'detecting':[[7,2]],'fm2':[[17,4],[14,2],[25,16],[2,6],[24,18],[12,24]],'astounding':[[7,2]],'recorded':[[8,4],[7,2],[25,2],[12,2],[11,2],[5,8]],'majority':[[7,4],[11,2],[6,2]],'peculiarities':[[14,2]],'doubt':[[7,2]],'transposed':[[19,2]],'fastest':[[13,2],[14,4],[20,6],[6,2],[24,2]],'tapping':[[4,4],[12,2]],'immensely':[[5,2]],'следующим':[[22,2]],'содержащий':[[22,2]],'увеличивается':[[22,14]],'среди':[[22,2]],'procedure':[[23,2]],'ordinary':[[14,4]],'strategies':[[8,2],[24,2],[14,2],[11,6],[7,2]],'bird':[[2,2]],'записывать':[[22,2]],'располагается':[[22,6]],'showing':[[4,2]],'нумеруются':[[22,2]],'traditional':[[8,12],[11,12],[9,6],[14,4],[19,4],[6,6],[2,6],[12,4],[10,4],[7,12],[5,4]],'laziness':[[6,2]],'ins':[[5,2]],'символы':[[22,4]],'клавиатуре':[[22,4]],'работе':[[22,2]],'Интернете':[[22,2]],'снят':[[22,2]],'totally':[[4,2],[24,2],[2,2],[5,2]],'implementation':[[24,2],[21,4],[23,4],[7,2],[0,2]],'bit4':[[25,4]],'walkthroughs':[[14,2]],'придумано':[[22,2]],'instant':[[9,4],[12,2],[10,4],[11,8],[5,2]],'reconsider':[[6,2]],'Закладках':[[22,4]],'however':[[8,4],[9,6],[14,2],[6,2],[12,2],[10,2],[11,6],[5,2]],'stop':[[9,2],[15,2],[6,2],[2,2],[4,2],[24,4],[10,2],[5,4]],'sends':[[23,14],[24,4],[18,8]],'creative':[[6,2]],'информацию':[[22,10]],'отображалось':[[22,2]],'half':[[17,4],[18,2],[15,2],[6,10],[5,8]],'influence':[[10,2],[2,2],[6,4]],'хранит':[[22,2]],'пункты':[[22,6]],'subclasses':[[23,2]],'earlier':[[20,2],[6,6],[11,4]],'explore':[[16,4]],'экрана':[[22,10]],'indicates':[[25,2]],'популярность':[[22,2]],'ask':[[12,4],[23,2],[19,2]],'reappear':[[11,2]],'inserted':[[17,10],[15,2]],'комбинации':[[22,4]],'warning':[[24,2],[23,12]],'slower':[[6,2]],'flaws':[[6,2],[7,2]],'тегов':[[22,2]],'doing':[[24,2],[20,2],[6,2],[11,2]],'слотов':[[22,6]],'less':[[11,2],[18,4],[23,4],[2,4],[6,12],[4,2],[24,4],[12,8],[10,6],[7,6],[8,4]],'throughout':[[13,2],[16,2],[14,2]],'single':[[12,8],[16,2],[5,6],[9,6],[14,4],[15,2],[22,2],[6,6],[2,2],[4,10],[23,2],[24,2],[10,2],[11,10],[7,2]],'pasteinsert':[[17,10],[15,2]],'construction':[[2,2]],'another':[[12,12],[20,2],[5,10],[17,8],[9,4],[14,10],[15,4],[21,2],[6,14],[23,4],[4,2],[24,2],[10,2],[11,10],[7,8]],'Помимо':[[22,8]],'Выделением':[[22,8]],'disk':[[5,2],[15,22],[25,12],[24,10],[12,6],[18,2],[11,10]],'emptiness':[[15,2],[16,2]],'редактированием':[[22,2]],'усечения':[[22,12]],'slot':[[20,12],[8,10],[5,8],[17,12],[9,6],[15,66],[23,2],[6,2],[24,16],[10,4],[7,12],[11,4]],'выделяется':[[22,2]],'размер':[[22,2]],'checkbox':[[5,26],[17,4],[9,6],[15,6],[18,4],[24,6],[12,10],[16,2],[10,8],[11,2],[8,2]],'одной':[[22,8]],'горизонтали':[[22,2]],'обоих':[[22,2]],'ширине':[[22,6]],'heartedly':[[6,2]],'follows':[[14,2],[25,2],[7,2]],'caused':[[17,2],[14,2]],'строчка':[[22,2]],'столбцам':[[22,2]],'emuversion':[[25,2]],'accomplishment':[[8,2]],'intellectual':[[6,2]],'оттенком':[[22,8]],'equalizing':[[6,2]],'управление':[[22,10]],'этапами':[[22,2]],'отсутствии':[[22,2]],'distinct':[[12,2]],'300':[[6,2],[11,2]],'useless':[[9,4],[14,2],[10,2],[24,2]],'suppose':[[9,2],[12,2],[10,2],[6,2],[8,2]],'теряются':[[22,2]],'отражалась':[[22,2]],'confine':[[2,2],[12,2]],'above':[[9,4],[15,4],[19,2],[4,18],[12,4],[16,12],[20,6],[11,16],[5,12]],'fix':[[7,6],[9,2],[2,4],[12,2],[10,2],[8,2],[5,2]],'exists':[[4,4],[11,2],[24,2]],'содержащихся':[[22,6]],'selects':[[6,4]],'figure':[[4,2],[9,2],[10,2],[8,2]],'нажатие':[[22,2]],'branch6':[[17,4]],'luck':[[9,2],[14,6],[10,2],[20,2]],'virtuosity':[[8,2]],'реальное':[[22,2]],'сдвигающих':[[22,2]],'assigned':[[17,12],[7,2],[9,2],[5,4],[11,10],[18,2]],'platform':[[19,2],[6,2]],'hitbox':[[12,4]],'contained':[[4,2],[12,2]],'rerecording':[[14,2],[24,2],[2,2]],'столбец':[[22,22]],'extent':[[14,2]],'вызывает':[[22,8]],'Щелчок':[[22,8]],'Дереву':[[22,2]],'эффект':[[22,2]],'small':[[7,4],[14,4],[6,24],[24,6],[20,2],[11,4],[5,6]],'wise':[[6,2],[7,2]],'стоят':[[22,2]],'просмотр':[[22,6]],'period':[[14,2],[23,2],[6,2],[11,12]],'скриншот':[[22,4]],'sstart':[[25,2]],'Закладку':[[22,16]],'simultaneous':[[10,2]],'вывод':[[22,2]],'Большинство':[[22,2]],'пастельных':[[22,2]],'choose':[[5,6],[17,36],[15,2],[19,6],[6,14],[4,4],[12,10],[20,6],[7,4],[11,8]],'controller':[[11,8]],'exact':[[4,2],[12,6],[2,2]],'laws':[[14,2]],'идут':[[22,2]],'treat':[[5,2]],'adheres':[[8,2]],'field':[[17,8],[15,10],[23,12],[25,16],[4,12],[16,4],[11,4],[5,2]],'очищенной':[[22,2]],'аналогично':[[22,6]],'resume':[[4,2],[24,4],[7,2],[5,4]],'indulge':[[6,2]],'steps':[[5,4],[11,2],[9,6],[4,2],[10,2],[8,10],[7,2]],'branch7':[[17,4]],'зависят':[[22,2]],'input':[[18,38],[1,2],[19,24],[12,68],[16,8],[20,6],[8,42],[5,76],[17,136],[9,32],[14,86],[15,56],[22,4],[6,32],[2,32],[4,32],[23,72],[24,10],[25,32],[3,4],[10,32],[11,118],[7,90]],'fledged':[[10,2],[6,2]],'trailing':[[9,2]],'немалое':[[22,2]],'abstract':[[12,2],[13,2],[10,2],[2,2],[7,2]],'handling':[[6,2],[11,2],[2,2]],'dirty':[[12,2]],'registermanual':[[12,4],[18,8]],'deeper':[[10,2]],'drag':[[17,12],[9,2],[15,6],[23,2],[24,6],[4,4],[16,4],[7,2],[11,4]],'seriously':[[8,2]],'backslash':[[15,2]],'утерянной':[[22,4]],'пиксель':[[22,4]],'отдельно':[[22,2]],'инициализации':[[22,2]],'travels':[[4,2]],'copying':[[19,2],[23,16]],'seems':[[6,2]],'отложенных':[[22,2]],'порядок':[[22,8]],'rebuilt':[[5,2]],'actual':[[21,2],[6,4],[2,2],[4,4],[12,4],[18,10],[5,6]],'megaman':[[12,2]],'тому':[[22,2]],'promising':[[9,2],[20,2]],'заканчивающийся':[[22,2]],'цифрами':[[22,2]],'srt':[[12,4]],'соответствующими':[[22,4]],'scripting':[[5,4]],'найти':[[22,6]],'Расположение':[[22,2]],'improvements':[[14,2],[6,4],[7,2]],'700':[[8,2]],'branch5':[[17,4]],'Любой':[[22,2]],'просмотреть':[[22,2]],'элементу':[[22,2]],'свой':[[22,2]],'keyword':[[25,6]],'без':[[22,22]],'игрового':[[22,4]],'recording':[[19,6],[12,2],[8,18],[5,36],[17,10],[9,2],[14,10],[15,6],[23,12],[6,4],[2,4],[24,12],[3,4],[10,2],[11,30],[7,10]],'unimplemented':[[6,2]],'100':[[22,2],[10,4],[25,4],[6,4],[11,10]],'events':[[19,2],[12,6],[16,10],[8,2],[5,14],[9,6],[14,14],[6,6],[2,10],[4,10],[10,6],[11,6],[7,6]],'names':[[23,4],[24,2],[2,2]],'check':[[7,2],[19,2],[12,2],[5,2],[9,2],[15,6],[21,2],[23,2],[25,2],[3,2],[18,2],[11,2]],'aforementioned':[[9,2],[11,2]],'сначала':[[22,2]],'пробегает':[[22,2]],'suffix':[[12,2]],'располагаться':[[22,2]],'detects':[[25,2],[23,4]],'реализованных':[[22,2]],'configuration':[[11,2],[24,2]],'cheating':[[2,2]],'bytes':[[25,26]],'selectbetweenmarkers':[[24,2]],'font':[[4,2]],'optimize':[[8,2]],'everyframe':[[12,8]],'разбив':[[22,2]],'questions':[[19,2],[13,2]],'установке':[[22,4]],'tests':[[11,2],[14,2],[10,2],[2,2],[6,2]],'icons':[[15,4],[24,4],[4,2],[12,2],[16,6],[20,2],[11,2],[5,2]],'smooth':[[7,2]],'striving':[[6,2],[16,2]],'eight':[[25,2]],'нововведение':[[22,2]],'быстрого':[[22,4]],'pointers':[[25,2],[14,2]],'предшествующей':[[22,4]],'determinism':[[14,2]],'cloudlet':[[16,2],[23,2],[5,6]],'coordinate':[[6,16],[14,2]],'названием':[[22,2]],'максимально':[[22,2]],'newcomers':[[2,4]],'glitch':[[6,2],[14,2]],'gaps':[[15,4],[16,4],[23,2],[11,2]],'проектов':[[22,2]],'auxillary':[[8,2],[14,2]],'уведении':[[22,4]],'скроллинг':[[22,6]],'linear':[[5,4],[12,2],[7,2],[2,4]],'emulating':[[11,2],[16,2]],'последовательности':[[22,4]],'going':[[9,4],[6,8],[4,4],[12,8],[16,4],[10,2],[11,2],[5,2]],'seeks':[[10,2]],'requires':[[14,2],[6,2],[2,2],[12,4],[10,2],[11,2],[8,2]],'hands':[[11,2],[5,2]],'compares':[[24,2]],'imperfect':[[6,8]],'один':[[22,22]],'straightforward':[[12,2]],'место':[[22,8]],'рабочих':[[22,2]],'rendering':[[8,2]],'recognize':[[11,2]],'algorithm':[[12,4],[14,2]],'сможет':[[22,2]],'Графически':[[22,2]],'modifiers':[[15,4]],'reconfigure':[[11,2]],'следующего':[[22,4]],'processed':[[4,4]],'рекорд':[[22,2]],'дополнительными':[[22,2]],'лага':[[22,16]],'Содержимое':[[22,4]],'day':[[11,2]],'serializes':[[25,2]],'учитываться':[[22,4]],'glance':[[4,2],[9,4],[3,2]],'клавишами':[[22,2]],'newbies':[[11,2]],'одинарном':[[22,2]],'История':[[22,6]],'removes':[[5,4],[24,2],[18,2]],'масштабируется':[[22,2]],'проходится':[[22,2]],'drastically':[[2,2]],'intuitive':[[8,2]],'дать':[[22,2]],'provided':[[17,2],[9,2],[16,4],[18,4]],'вставленных':[[22,2]],'находящихся':[[22,2]],'синяя':[[22,2]],'году':[[22,4]],'многогранную':[[22,2]],'mood':[[12,2]],'самым':[[22,2]],'traps':[[6,2]],'during':[[12,14],[8,2],[5,12],[9,2],[14,4],[6,4],[2,6],[4,4],[24,4],[3,4],[11,10],[18,8]],'training':[[8,2]],'моменты':[[22,2]],'accumulate':[[6,2]],'собираются':[[22,2]],'виртуальные':[[22,4]],'aspects':[[18,2],[12,4],[14,4],[2,6],[6,2]],'simply':[[11,2],[9,6],[25,2],[6,8],[2,4],[4,4],[20,4],[7,2],[5,4]],'realizing':[[7,2]],'satisfactory':[[7,2]],'следующем':[[22,2]],'modifier':[[24,2]],'редактирование':[[22,2]],'hurrying':[[20,2]],'возможна':[[22,2]],'undefined':[[17,6]],'производится':[[22,12]],'tune':[[19,2],[5,2]],'например':[[22,26]],'dramatically':[[6,2],[12,2]],'repeat':[[12,4],[7,2],[8,6]],'cold':[[11,2]],'создастся':[[22,2]],'trying':[[11,2],[10,2],[2,2],[7,2]],'palflag':[[25,2]],'calls':[[25,4]],'filter':[[9,2],[12,2],[10,2],[24,2]],'всей':[[22,2]],'текстов':[[22,2]],'текущие':[[22,4]],'Предоставляет':[[22,2]],'использует':[[22,4]],'precious':[[10,2]],'видимую':[[22,2]],'vague':[[4,2],[12,2],[23,2],[6,2]],'repetition':[[12,2]],'intuition':[[6,4],[14,2]],'related':[[24,4],[12,6],[23,2],[11,2],[5,6]],'anything':[[15,2],[6,2],[7,2]],'product':[[14,2]],'создания':[[22,14]],'ширина':[[22,4]],'памяти':[[22,12]],'limitation':[[24,2],[16,2]],'100001000':[[11,2]],'stack':[[23,4]],'inability':[[7,2]],'walk':[[6,2]],'picture':[[9,2],[6,6],[2,2],[4,8],[12,4],[3,2],[10,2],[11,6],[5,10]],'delivered':[[7,2]],'2012':[[1,2],[19,2],[0,2],[16,2],[9,2],[14,2],[15,2],[23,2],[2,2],[24,2],[4,2],[10,2],[18,2],[7,2],[12,2],[13,2],[20,2],[8,2],[5,2],[17,2],[21,2],[22,4],[25,2],[6,2],[3,2],[11,2]],'расширится':[[22,2]],'assumes':[[15,2],[24,2]],'stopseeking':[[18,4]],'второстепенных':[[22,2]],'unskippable':[[6,2]],'causing':[[12,2]],'features':[[1,4],[19,6],[0,2],[12,4],[16,2],[5,2],[14,20],[23,6],[2,6],[4,2],[3,2],[18,2],[11,6]],'introduces':[[16,2]],'helping':[[11,2],[5,2]],'play':[[8,2],[11,2],[15,4],[14,4],[6,10],[2,8],[24,6],[16,2],[20,2],[7,6],[5,10]],'aggregate':[[20,2]],'summary':[[13,2],[20,2]],'experimental':[[4,2],[23,2],[5,2]],'этих':[[22,8]],'bookmarks':[[19,6],[12,6],[16,6],[20,20],[8,22],[5,54],[17,6],[9,6],[14,6],[15,16],[23,30],[6,4],[24,6],[4,2],[25,10],[11,16],[7,6]],'discretion':[[6,2]],'error':[[23,24],[14,2],[25,2],[24,6]],'Выделения':[[22,36]],'желании':[[22,2]],'distributing':[[23,2]],'rollback':[[23,6]],'constitute':[[25,2]],'client':[[21,2]],'rolls':[[14,2]],'левую':[[22,8]],'изменённые':[[22,4]],'400':[[11,2]],'Макроса':[[22,2]],'insert#4':[[17,2]],'перемещается':[[22,4]],'скриншоты':[[22,4]],'projects':[[23,2],[25,2],[2,4],[24,4],[12,10],[3,2],[11,6],[7,2]],'нашлось':[[22,2]],'последний':[[22,2]],'fight':[[12,2]],'relations':[[23,4]],'alternately':[[7,4]],'beating':[[2,2]],'suited':[[12,2]],'authorship':[[12,2],[2,2],[6,2]],'vulnerabilities':[[2,2]],'cooling':[[11,2]],'номеров':[[22,6]],'offsets':[[25,8],[23,2]],'functions':[[5,6],[18,10],[15,4],[23,2],[2,2],[24,2],[12,8],[13,2],[3,4],[7,2],[11,2]],'similarly':[[4,2],[12,2],[24,2]],'текущим':[[22,4]],'together':[[5,4],[11,4],[7,2],[6,2]],'compatible':[[5,2]],'increasing':[[11,2],[14,2]],'содержимым':[[22,2]],'separated':[[6,4]],'самого':[[22,2]],'добавлять':[[22,4]],'instrument':[[8,2]],'синхронизирован':[[22,2]],'предлагать':[[22,2]],'newppu':[[25,2]],'третьем':[[22,4]],'Многие':[[22,6]],'скрывается':[[22,4]],'getinput':[[12,2],[18,4]],'for':[[19,12],[0,2],[16,12],[9,26],[14,72],[15,32],[23,84],[2,16],[24,22],[4,28],[10,28],[18,12],[7,22],[12,100],[13,2],[20,24],[8,56],[5,48],[17,2],[21,2],[22,4],[25,18],[6,60],[3,8],[11,108]],'deciphering':[[12,2]],'fun':[[12,2],[6,2],[11,2]],'различием':[[22,2]],'urgently':[[6,2]],'platformer':[[6,2]],'booleans':[[25,2],[20,4]],'occupied':[[4,4],[17,6],[15,4],[6,2],[11,4]],'appropriate':[[18,4],[14,2],[2,2],[5,2]],'radio':[[5,4]],'executed':[[9,2],[23,2],[12,10]],'subpixels':[[14,4]],'teleporter':[[6,2]],'инвертировать':[[22,2]],'rerecordcount':[[25,2]],'users':[[4,2],[19,2],[5,2]],'realm':[[2,2]],'obstacles':[[6,6]],'номера':[[22,10]],'applying':[[11,2],[7,2],[9,2],[14,4],[18,4],[6,2],[8,2],[5,2]],'permitted':[[14,2]],'anticipation':[[6,2]],'could':[[5,4],[9,2],[14,2],[6,2],[4,2],[12,2],[7,2],[8,2]],'serious':[[5,2]],'hello':[[17,2]],'1000':[[8,4],[22,6],[23,2],[6,8],[11,4],[5,2]],'sorts':[[7,2]],'название':[[22,4]],'devised':[[2,2]],'exempts':[[14,2]],'хранение':[[22,2]],'distracted':[[6,2]],'ушёл':[[22,2]],'subtask':[[6,4],[14,2]],'freely':[[11,2],[15,2]],'содержащиеся':[[22,2]],'dream':[[2,2]],'концепцию':[[22,2]],'essentially':[[4,2],[9,2]],'historx':[[25,2]],'weeks':[[10,2]],'Поддержка':[[22,6]],'нём':[[22,2]],'macros':[[2,2]],'нарисована':[[22,2]],'записать':[[22,2]],'days':[[4,2],[6,2]],'screenshot':[[15,8],[14,6],[23,10],[19,2],[11,6],[5,2]],'suboptimal':[[2,2],[9,2]],'root':[[5,2]],'skillful':[[6,2]],'конечное':[[22,4]],'resizing':[[23,2]],'sequential':[[23,2]],'каком':[[22,2]],'redefine':[[15,2]],'waste':[[2,2],[23,2]],'export':[[12,6],[23,2],[19,2],[2,2]],'new_set':[[18,4]],'родителя':[[22,4]],'replay':[[19,2],[12,2],[16,2],[20,2],[5,4],[9,6],[14,2],[23,4],[6,2],[4,2],[10,4],[11,2],[7,6]],'теми':[[22,2]],'couple':[[4,2],[8,2],[12,2],[7,2],[5,2]],'lose':[[9,6],[10,2],[18,4]],'дня':[[22,2]],'ascii':[[25,2]],'убегать':[[22,2]],'соседних':[[22,4]],'return':[[7,8],[12,4],[16,8],[8,8],[5,8],[9,4],[15,2],[2,2],[4,2],[10,4],[11,6],[18,6]],'accelerate':[[12,6]],'whole':[[0,2],[12,8],[20,4],[8,4],[5,4],[15,2],[14,2],[6,10],[2,4],[24,2],[11,6],[7,6]],'staying':[[2,2]],'branch3':[[17,4]],'evolved':[[2,4]],'too':[[8,4],[9,2],[14,2],[15,2],[23,4],[6,18],[24,2],[10,2],[11,14],[5,4]],'номере':[[22,2]],'caller':[[23,14]],'laying':[[9,2]],'mechanism':[[7,2],[1,2]],'spacebar':[[15,4],[9,2],[23,2],[25,2],[24,2],[11,4]],'удаляются':[[22,2]],'synchronously':[[10,2]],'нажатий':[[22,6]],'call':[[4,4],[12,2],[23,6],[18,22]],'optimality':[[7,8],[9,10],[14,2],[6,36],[12,2],[20,4],[10,12],[8,6],[5,2]],'motion':[[10,2],[14,2]],'belong':[[15,2]],'подразумевается':[[22,4]],'дождался':[[22,2]],'modifications':[[17,2],[9,2],[23,6],[6,2],[10,2],[11,2],[7,4]],'слота':[[22,8]],'naked':[[14,2]],'областью':[[22,2]],'заполнение':[[22,2]],'leftmost':[[11,2],[16,2]],'markerx':[[25,2]],'premise':[[6,2],[23,2]],'viewer':[[15,4]],'Заготовленные':[[22,2]],'позволит':[[22,4]],'usual':[[15,2],[23,2],[25,2],[19,4],[2,2],[5,2]],'provide':[[12,4],[23,4],[18,6],[8,2]],'logic':[[14,2],[23,2],[6,4],[2,2],[10,2],[8,2]],'overview':[[1,2]],'этот':[[22,22]],'attack':[[12,2],[14,2]],'silently':[[11,2]],'исчезают':[[22,2]],'представление':[[22,2]],'respects':[[24,2]],'those':[[19,2],[12,6],[5,8],[17,6],[9,2],[14,10],[15,10],[25,2],[6,6],[2,2],[4,4],[3,6],[18,4],[11,8]],'наоборот':[[22,2]],'всплывают':[[22,2]],'logging':[[2,2]],'verbal':[[6,2]],'untouched':[[11,2]],'хранящемуся':[[22,2]],'emancipates':[[2,2]],'prolific':[[2,2]],'varies':[[6,2]],'trackers':[[14,2]],'using':[[18,4],[1,2],[19,6],[12,22],[16,4],[20,16],[8,14],[5,24],[17,12],[9,8],[14,16],[15,14],[23,2],[6,12],[2,12],[4,2],[24,2],[25,2],[10,8],[11,10],[7,20]],'мере':[[22,4]],'relying':[[9,2]],'акцентировать':[[22,4]],'~17':[[22,2]],'drawing':[[9,2],[14,2],[15,4],[23,2],[0,2],[4,4],[12,8],[10,2],[11,8],[5,2]],'although':[[17,2],[14,2],[6,2],[12,4],[20,2],[7,2]],'пополам':[[22,2]],'нему':[[22,4]],'suddenly':[[6,2]],'turbo':[[9,10],[14,6],[15,6],[23,4],[2,2],[10,12],[5,4]],'describing':[[12,2],[1,2],[6,2]],'engaged':[[15,2],[19,2],[24,16],[12,2],[11,4],[18,54]],'передвигает':[[22,2]],'устанавливаемые':[[22,2]],'счётчик':[[22,16]],'усечении':[[22,6]],'конца':[[22,2]],'committed':[[7,2]],'si_none':[[25,8]],'bookmark4':[[17,2]],'imagine':[[12,2]],'comfort':[[10,2],[2,2],[11,4]],'switched':[[2,2],[11,2]],'spend':[[9,2],[12,2],[10,4],[14,2],[7,4]],'icon':[[17,6],[15,10],[23,2],[24,6],[16,2],[20,2]],'criteria':[[7,2],[20,4]],'самую':[[22,2]],'состоящее':[[22,2]],'автоматическая':[[22,4]],'клавиатурного':[[22,2]],'установлен':[[22,2]],'rolled':[[15,2]],'текущей':[[22,26]],'призвано':[[22,2]],'фоном':[[22,2]],'параболе':[[22,2]],'изменится':[[22,10]],'decision':[[23,4],[10,6],[6,2]],'optionally':[[15,2],[23,2]],'точное':[[22,2]],'items':[[15,4],[23,8],[19,2],[11,2],[5,4]],'specifics':[[11,2]],'инструмент':[[22,2]],'курсор':[[22,18]],'тёмными':[[22,2]],'такое':[[22,2]],'реальному':[[22,2]],'technically':[[8,2],[9,4]],'speak':[[5,2]],'stereotypes':[[2,4]],'останется':[[22,2]],'customize':[[11,2],[14,2]],'Буфер':[[22,4]],'interacts':[[23,2]],'основе':[[22,2]],'объёмы':[[22,2]],'coin':[[24,2]],'любой':[[22,16]],'записываемых':[[22,4]],'structures':[[2,2]],'Функции':[[22,2]],'отменяется':[[22,2]],'следствие':[[22,2]],'exiting':[[15,2],[23,2]],'Гринзона':[[22,26]],'скроллинга':[[22,6]],'bar':[[12,2],[8,2],[5,10]],'stay':[[6,2],[11,2]],'может':[[22,50]],'based':[[4,2],[23,2],[6,2]],'basically':[[5,4],[19,2],[11,2],[7,4]],'indeed':[[7,2],[24,2],[6,2]],'container':[[14,4]],'нет':[[22,12]],'chapter':[[11,10],[15,4],[6,4],[2,2],[12,2],[16,2],[3,6],[10,2],[7,2],[5,2]],'stretch':[[4,2],[15,2],[5,2]],'rewritten':[[6,2],[23,2]],'границу':[[22,2]],'другой':[[22,6]],'производятся':[[22,2]],'ride':[[5,2]],'мувика':[[22,120]],'remained':[[2,2]],'точного':[[22,2]],'разделе':[[22,4]],'awareness':[[4,2]],'middle':[[5,6],[9,18],[15,14],[23,6],[6,4],[24,8],[4,6],[12,2],[8,4],[11,10]],'until':[[7,2],[12,2],[20,16],[8,6],[5,2],[9,6],[14,2],[6,10],[2,2],[24,2],[3,2],[10,8],[11,12],[18,10]],'pauses':[[20,2],[3,2],[18,4],[5,2]],'unlock':[[6,2]],'tremendous':[[7,2]],'potentially':[[10,2],[8,2]],'autopause':[[11,4],[22,2]],'respectively':[[15,4],[20,2]],'frames':[[18,12],[19,2],[12,16],[16,16],[8,2],[5,54],[17,86],[9,6],[14,16],[15,48],[23,16],[6,18],[2,4],[4,50],[24,10],[25,2],[11,76],[7,8]],'также':[[22,30]],'эмуляторах':[[22,4]],'Хранятся':[[22,2]],'отображаемым':[[22,2]],'Историю':[[22,6]],'оставляет':[[22,2]],'неактивным':[[22,2]],'виду':[[22,2]],'хранящемся':[[22,2]],'выходе':[[22,2]],'refresh':[[4,2],[2,2]],'expand':[[18,6]],'наличии':[[22,2]],'delay':[[23,2],[14,2],[7,2]],'corners':[[4,2]],'portrayed':[[6,2]],'чёрным':[[22,2]],'Виртуального':[[22,14]],'tactic':[[6,2]],'string':[[20,2],[25,8],[18,26]],'must':[[7,2],[19,2],[12,2],[8,2],[5,4],[23,6],[25,12],[6,4],[2,2],[24,2],[11,8],[18,2]],'столбцов':[[22,44]],'тот':[[22,10]],'принимаемый':[[22,4]],'closer':[[14,2],[6,4],[7,2]],'показа':[[22,2]],'измененять':[[22,2]],'arrow':[[9,10],[14,2],[15,8],[24,4],[4,4],[20,8],[5,2]],'tried':[[11,2]],'teleport':[[7,2]],'inspiration':[[7,2]],'emphasis':[[10,2],[9,2]],'terminated':[[25,2]],'turned':[[25,2]],'либо':[[22,40]],'ячейкой':[[22,4]],'affecting':[[5,2],[7,2],[6,2]],'the':[[1,22],[19,158],[0,8],[16,312],[9,554],[14,248],[15,404],[23,256],[2,250],[24,436],[4,580],[10,478],[18,90],[7,448],[12,706],[13,4],[20,292],[8,322],[5,1138],[17,406],[21,32],[22,2],[25,284],[6,784],[3,100],[11,744]],'thumb':[[16,2]],'Основа':[[22,2]],'off':[[7,2],[19,6],[8,2],[5,4],[9,2],[23,2],[25,2],[6,2],[24,4],[4,2],[3,2],[10,4],[11,6],[18,2]],'physics':[[6,2]],'better':[[12,4],[16,2],[20,10],[8,8],[5,4],[9,12],[14,6],[6,18],[2,2],[3,2],[10,6],[11,4],[7,4]],'optimum':[[14,2]],'посылается':[[22,8]],'изменяется':[[22,4]],'очередь':[[22,2]],'изменять':[[22,14]],'новыми':[[22,2]],'bear':[[6,2]],'correlate':[[4,2],[12,2]],'readbyte':[[12,6]],'player':[[12,8],[5,12],[9,2],[14,28],[15,2],[23,4],[6,14],[2,4],[4,2],[25,8],[11,6],[7,8]],'automatism':[[12,2]],'minimal':[[6,6],[12,2]],'modern':[[8,2]],'invalid':[[18,4]],'allowed':[[6,4]],'passing':[[6,2],[12,2]],'анализировать':[[22,2]],'управления':[[22,6]],'located':[[18,2],[4,6],[12,2],[16,2],[10,2],[20,6],[7,2],[5,8]],'popup':[[23,12]],'sifc_none':[[25,2]],'alive':[[18,4]],'generic':[[20,2]],'При':[[22,116]],'прототипу':[[22,2]],'balance':[[6,2],[20,2]],'disappear':[[4,2],[17,8],[12,2],[10,2]],'detaching':[[11,4]],'images':[[12,2],[14,2],[23,2],[5,2]],'english':[[0,2]],'navigate':[[7,4],[15,2],[12,2],[13,2],[8,6],[5,4]],'applychanges':[[23,2]],'отсутствует':[[22,6]],'распаковываются':[[22,2]],'proceed':[[9,2],[2,2],[6,2],[4,2],[20,2],[3,2],[10,2],[8,4]],'tens':[[16,2]],'everything':[[2,2],[6,2],[12,2],[3,2],[10,2],[7,2]],'specifications':[[13,2],[21,2],[25,2],[19,4],[0,2]],'2nd':[[7,4],[25,6],[19,2],[6,10],[10,2],[11,4],[5,6]],'загрузки':[[22,12]],'preset':[[15,6]],'прыжок':[[22,8]],'половине':[[22,8]],'rendered':[[5,2]],'turning':[[6,2]],'заполняется':[[22,2]],'сэйвам':[[22,2]],'bind':[[22,2],[11,2],[18,4]],'произвести':[[22,2]],'текстовые':[[22,2]],'радиокнопкой':[[22,2]],'zone':[[23,2],[14,2],[2,2]],'making':[[11,4],[18,4],[9,2],[14,10],[23,8],[6,8],[2,2],[12,8],[10,4],[8,2],[7,14]],'pressed':[[5,2],[25,10],[4,6],[12,4],[16,4],[18,6],[11,2]],'roulette':[[7,2]],'imperceptibly':[[11,2]],'его':[[22,26]],'lag':[[17,14],[15,6],[14,16],[23,10],[2,6],[4,2],[12,2],[11,32],[8,2]],'операциям':[[22,2]],'состояниях':[[22,4]],'Миникарту':[[22,2]],'весь':[[22,8]],'endeavours':[[19,2]],'note':[[19,2],[12,18],[16,14],[5,2],[17,16],[15,26],[14,6],[22,2],[23,8],[6,4],[4,16],[3,2],[18,6],[11,18]],'simplify':[[12,2],[20,2],[6,2],[5,2]],'release':[[17,6],[15,14],[25,2],[6,4],[24,2],[12,2],[10,2]],'automation':[[14,2]],'cover':[[16,2]],'отдельный':[[22,4]],'refuses':[[25,4]],'function':[[17,10],[5,2],[15,2],[23,30],[24,2],[12,28],[18,52],[11,14]],'режиме':[[22,6]],'образом':[[22,28]],'contents':[[17,2],[5,8],[23,4],[24,2],[4,2],[20,2],[3,4],[11,4],[8,4]],'behind':[[4,2],[8,4],[11,2]],'dissection':[[1,2]],'designed':[[23,2],[14,2],[2,2]],'synchronize':[[12,2]],'given':[[18,66],[15,2],[14,4],[23,6],[25,2],[2,2],[12,2],[16,6],[7,4],[11,4]],'Миникарта':[[22,8]],'encouraged':[[10,2],[24,2]],'scenery':[[10,2]],'радиокнопка':[[22,2]],'перерисовывается':[[22,2]],'improve':[[9,2],[1,2],[14,2],[2,2],[6,4],[4,2],[24,2],[12,2],[20,2],[11,2]],'initialize':[[12,4]],'начиная':[[22,6]],'экран':[[22,4]],'сейчас':[[22,2]],'перетаскивание':[[22,10]],'выделением':[[22,2]],'rest':[[24,6],[3,2],[6,2],[11,6]],'perfect':[[12,2],[20,4],[10,2],[6,22],[7,6]],'exempt':[[7,2]],'concept':[[12,2],[23,2],[14,2]],'algorithms':[[14,4]],'usb':[[11,2],[5,2]],'describe':[[2,2],[12,4]],'inherent':[[9,2],[5,2]],'along':[[7,2],[5,2],[4,2],[12,2],[8,2],[11,6]],'examine':[[7,2],[9,2]],'who':[[7,2],[1,4],[6,6],[2,2]],'human':[[14,4],[20,4],[2,2],[6,6]],'fundamental':[[5,2]],'осуществляться':[[22,4]],'конвертирует':[[22,2]],'отправить':[[22,2]],'каждая':[[22,2]],'зажаты':[[22,2]],'диске':[[22,2]],'усовершенствовать':[[22,2]],'returns':[[5,2],[23,2],[18,70],[7,4]],'provides':[[23,6],[5,2]],'иерархию':[[22,2]],'sitting':[[5,2]],'shortcuts':[[19,2],[2,2]],'existed':[[11,2],[12,4]],'listbox':[[11,2],[24,6]],'little':[[4,2],[12,4],[20,2],[2,2],[6,2]],'improvement':[[9,2],[1,2],[14,4],[6,12],[20,2],[8,2]],'déformation':[[2,2]],'attention':[[14,2],[24,2],[2,2],[10,4],[11,2],[5,2]],'shooting':[[9,8],[12,4],[6,2],[5,2]],'choice':[[11,2],[20,2]],'determine':[[14,2]],'taseditor_lua':[[22,2],[23,2]],'Каждый':[[22,2]],'формат':[[22,10]],'Закладка':[[22,26]],'gain':[[2,2],[12,4]],'двойным':[[22,2]],'triangle':[[4,2],[24,2]],'ячейках':[[22,6]],'изменён':[[22,2]],'измеряемое':[[22,2]],'providing':[[14,2]],'осталась':[[22,2]],'difficult':[[6,8],[7,4],[2,2]],'enjoyment':[[6,2]],'хочет':[[22,2]],'classes':[[23,2]],'ячеек':[[22,22]],'building':[[23,2]],'постоянного':[[22,2]],'join':[[6,4]],'approve':[[24,2]],'middleclick':[[24,6]],'specified':[[25,4]],'logged':[[24,2],[5,2]],'submitinsertframes':[[17,2],[22,2],[18,4]],'позициях':[[22,2]],'assisted':[[20,2],[14,4]],'compress':[[24,2]],'fixes':[[9,2],[12,2]],'autoscrolling':[[11,2]],'ticks':[[15,2]],'giving':[[10,2],[2,2]],'правая':[[22,2]],'landed':[[6,2]],'older':[[2,2]],'inserts':[[17,4],[5,6]],'truncate':[[17,10],[8,2],[15,2],[19,2],[11,2],[5,2]],'definite':[[6,2],[20,2]],'effectively':[[9,2],[24,2]],'boss':[[12,10]],'равно':[[22,2]],'eyes':[[3,2]],'сохранённому':[[22,2]],'enabling':[[11,2]],'six':[[25,2]],'nil':[[12,2],[18,14]],'джойстики':[[22,4]],'label':[[4,12],[12,4],[15,2],[16,4],[5,4]],'rewrite':[[7,2],[8,4]],'applied':[[17,2],[14,2],[23,2],[6,4],[12,4],[5,2]],'syncing':[[14,2]],'номером':[[22,26]],'arbitrary':[[2,4]],'setting':[[15,6],[14,2],[23,10],[6,6],[4,6],[11,6],[5,4]],'hampered':[[6,2]],'мыши':[[22,68]],'supporting':[[24,2]],'настройка':[[22,10]],'improved':[[6,2]],'constantly':[[9,2],[23,2],[6,2],[2,2],[24,2],[16,2],[10,2],[7,2]],'occupies':[[6,2],[11,2]],'getmarker':[[18,4]],'displaying':[[15,6],[14,2],[3,2],[24,2],[5,4]],'food':[[8,2]],'расстояние':[[22,2]],'размерами':[[22,2]],'найденную':[[22,2]],'lead':[[9,2],[15,2]],'строку':[[22,2]],'programmer':[[14,2]],'detached':[[11,2]],'том':[[22,16]],'recordings':[[22,2],[19,2],[11,6],[5,2]],'branch8':[[17,4]],'самой':[[22,2]],'descriptions':[[15,2],[6,2],[11,8]],'organism':[[2,2]],'list':[[19,2],[12,4],[13,2],[16,8],[5,28],[17,8],[15,16],[21,2],[23,28],[24,2],[4,4],[18,10],[11,4]],'позволяют':[[22,2]],'porting':[[21,2],[24,2]],'крайнем':[[22,2]],'считающихся':[[22,2]],'оба':[[22,2]],'втоматически':[[22,2]],'record':[[12,12],[8,2],[5,12],[17,88],[15,4],[14,4],[22,10],[25,24],[6,6],[2,2],[24,4],[11,14]],'powerful':[[24,4],[5,2]],'Усовершенствование':[[22,6]],'cocktail':[[2,2]],'под':[[22,34]],'Мультитрекинг':[[22,6]],'Связи':[[22,2]],'фильтруется':[[22,2]],'stream':[[5,2],[7,2],[25,16],[6,2],[2,4]],'fps':[[15,2],[18,2]],'mouse':[[19,8],[0,2],[12,6],[16,34],[20,2],[8,2],[5,36],[17,6],[9,28],[14,2],[15,106],[22,2],[2,8],[23,10],[4,22],[24,18],[25,12],[3,2],[10,10],[11,26],[7,12]],'jumping':[[5,2],[15,2],[23,6],[6,8],[24,2],[4,2],[12,6],[16,40],[7,2],[11,4]],'cutscenes':[[6,2]],'идей':[[22,8]],'любым':[[22,2]],'which':[[18,4],[19,4],[12,16],[16,10],[20,8],[8,2],[5,2],[17,4],[9,6],[14,8],[21,2],[23,8],[6,26],[25,26],[4,8],[10,2],[11,16],[7,2]],'stores':[[9,2],[14,2],[23,76],[25,2],[24,2],[12,2],[20,2],[3,4],[8,2]],'навигацию':[[22,8]],'throws':[[6,2]],'переведя':[[22,2]],'review':[[13,2],[1,2],[7,2]],'reflects':[[12,2],[23,2],[19,2]],'minus':[[15,2]],'comparison':[[20,2]],'множество':[[22,6]],'mistakes':[[6,8],[7,24],[2,6]],'license':[[21,4]],'start':[[7,6],[19,2],[12,16],[20,2],[8,2],[5,4],[9,6],[15,4],[23,6],[25,6],[6,12],[2,2],[4,4],[24,6],[10,22],[11,6],[18,4]],'правой':[[22,16]],'установить':[[22,2]],'title':[[4,2],[10,6],[0,2]],'himself':[[2,2],[6,2]],'lines':[[17,4],[25,4],[6,2],[4,14],[12,4],[11,16],[5,4]],'Несжатый':[[22,2]],'Поэтому':[[22,8]],'dash':[[4,2],[19,2],[11,4]],'urging':[[3,2]],'ingenious':[[6,2]],'require':[[12,2],[14,4],[6,8],[24,2]],'отменить':[[22,2]],'superstructure':[[24,2]],'deliberately':[[14,2]],'оперативной':[[22,4]],'unparalleled':[[2,2]],'инпута':[[22,8]],'decimal':[[25,4]],'press':[[19,2],[12,16],[16,30],[8,4],[5,24],[17,38],[9,10],[15,12],[6,8],[2,2],[4,10],[24,2],[10,10],[11,34],[7,2]],'областям':[[22,2]],'trouble':[[6,2]],'work':[[12,16],[8,4],[5,4],[15,10],[14,4],[21,2],[23,4],[6,16],[2,6],[4,4],[24,10],[3,2],[10,2],[11,24],[7,6]],'fits':[[7,2],[11,2],[6,2]],'compression':[[11,2],[23,6]],'которому':[[22,4]],'называется':[[22,2]],'нажатием':[[22,2]],'speedruns':[[20,4],[14,4]],'minuses':[[14,4]],'wait':[[5,4],[20,2],[11,6],[6,2]],'deletion':[[18,2],[23,2]],'добавление':[[22,4]],'unset':[[17,6],[15,2],[22,2],[11,4]],'hours':[[11,2]],'ширины':[[22,4]],'neighbors':[[14,2]],'линий':[[22,4]],'bookmark':[[19,6],[12,2],[16,6],[20,10],[8,18],[5,104],[17,26],[9,10],[14,6],[15,34],[22,6],[6,14],[23,14],[24,12],[10,6],[11,36]],'therefore':[[24,2],[12,2],[6,2],[5,2]],'continuum':[[2,2]],'arrange':[[4,2]],'maps':[[23,2]],'you':[[18,46],[19,26],[0,6],[12,202],[16,80],[20,66],[8,98],[5,198],[17,4],[9,130],[14,16],[15,92],[21,6],[6,240],[2,84],[4,142],[24,6],[25,2],[3,26],[10,88],[11,280],[7,110]],'left':[[7,2],[12,16],[16,2],[8,6],[5,22],[15,36],[25,6],[6,4],[2,2],[4,28],[24,8],[3,2],[11,12],[18,4]],'happening':[[8,2]],'immediately':[[16,10],[8,2],[5,2],[9,8],[15,2],[23,2],[6,4],[2,2],[4,2],[24,2],[10,4],[7,6]],'sight':[[19,2],[9,2]],'limitations':[[11,2],[14,2]],'memory':[[12,16],[16,2],[20,18],[8,4],[5,2],[9,2],[14,4],[15,2],[22,2],[6,10],[23,4],[24,4],[10,2],[7,2],[11,18]],'used':[[12,10],[13,2],[8,18],[5,18],[17,60],[9,4],[14,24],[15,10],[23,8],[6,2],[2,4],[4,6],[24,16],[25,32],[3,6],[10,2],[11,18],[7,16]],'frequently':[[12,2]],'Номер':[[22,4]],'Заметка':[[22,6]],'внутри':[[22,4]],'целевого':[[22,2]],'эмулятору':[[22,2]],'появилась':[[22,2]],'нагляден':[[22,2]],'шлюз':[[22,4]],'waiting':[[14,4],[11,2],[5,2]],'информативно':[[22,2]],'segment':[[12,42],[13,2],[16,38],[20,22],[8,56],[5,36],[9,68],[14,14],[15,2],[6,152],[2,2],[4,4],[10,54],[11,14],[7,42]],'marker':[[19,4],[12,14],[16,30],[20,8],[5,20],[17,114],[9,12],[14,4],[15,28],[23,18],[6,10],[4,40],[3,2],[18,20],[11,38]],'назван':[[22,2]],'служат':[[22,6]],'intent':[[12,2]],'edited':[[5,10],[9,2],[23,2],[4,4],[12,2],[16,14],[10,2],[11,8],[8,2]],'programmed':[[12,2]],'enables':[[11,2]],'разработки':[[22,2]],'hundreds':[[11,2],[12,2]],'настройки':[[22,8]],'прыжки':[[22,2]],'игры':[[22,36]],'спидранов':[[22,2]],'repetitive':[[6,2]],'выстраиваются':[[22,2]],'полсекунды':[[22,4]],'удобнее':[[22,2]],'предоставить':[[22,8]],'ratio':[[9,2]],'orderly':[[8,2]],'ожидания':[[22,2]],'текущий':[[22,10]],'предоставляет':[[22,6]],'взятой':[[22,2]],'процесса':[[22,2]],'динамике':[[22,2]],'такого':[[22,4]],'приобретёт':[[22,2]],'documentation':[[15,4],[1,2],[21,2],[6,2],[12,4],[13,2],[16,2]],'shifted':[[17,4],[11,2],[5,2]],'fires':[[15,6]],'phenomenon':[[6,2]],'misses':[[8,2]],'mario':[[5,2],[9,4],[14,2],[6,32],[4,6],[12,6],[10,4],[7,2],[8,2]],'rough':[[4,2],[9,2],[14,2],[10,2]],'negative':[[18,8]],'why':[[11,2],[9,2],[19,8],[2,2],[6,2],[4,4],[10,2],[7,2],[8,2]],'column':[[15,16],[22,2],[25,4],[19,2],[24,8],[4,16],[12,8],[16,10],[20,2],[11,10],[5,4]],'physical':[[5,2]],'сработает':[[22,2]],'которое':[[22,2]],'Массив':[[22,2]],'layer':[[23,2]],'Например':[[22,20]],'Отдельный':[[22,2]],'erased':[[17,4]],'функция':[[22,8]],'bring':[[9,2],[15,4],[6,4],[24,2],[4,2],[12,4],[7,2]],'момента':[[22,2]],'Далее':[[22,4]],'number':[[19,4],[12,2],[16,4],[20,10],[8,2],[5,24],[17,42],[9,4],[14,2],[15,14],[23,2],[6,6],[2,2],[4,20],[24,4],[25,20],[3,2],[10,2],[11,14],[18,42]],'corruption':[[14,2]],'rom':[[15,2],[25,2],[24,20],[12,2],[3,4],[11,10]],'sprite':[[10,2],[14,4]],'megabytes':[[11,2],[12,4]],'opposite':[[6,2]],'имеющихся':[[22,4]],'known':[[9,2],[14,2],[19,2],[2,2],[10,4],[8,2]],'attached':[[25,10],[11,4]],'adjusting':[[11,2]],'Курсором':[[22,18]],'между':[[22,28]],'temporarily':[[4,2],[8,2],[11,2]],'4th':[[10,2],[25,2]],'but':[[19,2],[12,44],[16,4],[20,6],[8,16],[5,30],[17,4],[9,18],[14,12],[15,2],[23,2],[6,46],[2,22],[4,24],[24,6],[25,2],[10,16],[11,36],[7,26]],'изменение':[[22,12]],'индикатора':[[22,2]],'may':[[7,8],[12,24],[20,6],[8,10],[5,18],[9,16],[14,4],[23,8],[25,4],[6,38],[2,8],[4,18],[24,2],[10,6],[11,30],[18,10]],'данные':[[22,52]],'nes':[[15,8],[22,4],[19,2],[24,8],[12,2],[11,6]],'Иконка':[[22,2]],'clearing':[[4,2],[17,2],[23,2]],'запуска':[[22,2]],'casual':[[6,2],[8,2]],'marioheight':[[12,6]],'улучшении':[[22,4]],'усечена':[[22,4]],'отношений':[[22,2]],'затемнённым':[[22,2]],'visually':[[6,2],[20,2]],'wip':[[6,2]],'redoing':[[6,2]],'Подробнее':[[22,16]],'observe':[[5,2],[14,2],[2,2],[4,6],[8,2],[11,2]],'любому':[[22,2]],'joyful':[[6,2]],'неактуальными':[[22,2]],'передаются':[[22,2]],'подсветку':[[22,2]],'automates':[[2,2]],'файле':[[22,10]],'slowing':[[2,2],[14,2]],'default':[[16,2],[8,2],[5,14],[15,6],[23,10],[25,4],[6,2],[24,6],[4,4],[3,2],[18,2],[11,62]],'store':[[11,4],[7,2],[14,6],[23,4],[6,2],[24,2],[20,2],[8,2],[5,2]],'average':[[16,2]],'втором':[[22,2]],'normal':[[8,4],[9,2],[14,2],[15,4],[23,2],[2,2],[12,2],[7,2],[11,4]],'filters':[[23,2]],'tasvideos':[[12,10],[19,4],[2,4],[6,2]],'slip':[[6,2]],'branch0':[[17,4]],'вместе':[[22,6]],'binary':[[25,10],[12,6]],'скриншотами':[[22,2]],'вперёд':[[22,2]],'performing':[[5,2]],'creates':[[23,4],[25,4],[24,2],[12,6],[10,2],[7,4]],'plain':[[25,2]],'removemarker':[[17,4],[18,4]],'копирования':[[22,2]],'high':[[14,2],[2,2],[4,2],[12,2],[10,6],[11,2],[8,2]],'can':[[18,34],[19,16],[12,62],[16,18],[20,18],[8,16],[5,96],[17,6],[9,44],[14,46],[15,36],[21,2],[6,64],[2,24],[4,54],[23,12],[24,34],[25,10],[3,12],[10,24],[11,66],[7,32]],'recreate':[[19,2],[12,2]],'редактированию':[[22,2]],'base64':[[25,2]],'fireball':[[16,2],[23,2],[5,4]],'Хранит':[[22,4]],'programs':[[4,2],[14,2]],'примерно':[[22,8]],'illusions':[[2,2]],'устанавливается':[[22,4]],'getselection':[[12,2],[18,4]],'abandon':[[6,2]],'отличаются':[[22,2]],'important':[[7,4],[9,2],[14,2],[19,2],[6,2],[12,4],[20,8],[11,2],[5,2]],'silent':[[11,6]],'менее':[[22,2]],'fm2s':[[25,2]],'отвязанный':[[22,2]],'follow':[[8,2],[9,8],[15,10],[22,2],[23,2],[2,2],[24,2],[16,6],[10,4],[11,4],[5,4]],'bookmark5':[[17,2]],'meaningful':[[11,2]],'Заметки':[[22,8]],'Данные':[[22,4]],'trends':[[1,2]],'выделению':[[22,2]],'workflow':[[11,2]],'sequencers':[[14,2]],'представляет':[[22,6]],'эту':[[22,12]],'Раскраска':[[22,2]],'hedgehog':[[14,2]],'пропусков':[[22,2]],'идущих':[[22,2]],'заданной':[[22,2]],'effective':[[14,2],[19,2],[6,2],[4,2],[12,4],[8,4],[7,2]],'подаёт':[[22,2]],'leftclick':[[24,2]],'требуемое':[[22,2]],'finishes':[[12,2],[23,2]],'включен':[[22,2]],'абстрактные':[[22,2]],'undone':[[4,2],[12,2],[2,2],[5,2]],'усечением':[[22,2]],'офисным':[[22,2]],'заполнения':[[22,6]],'multiple':[[2,2],[5,4]],'this':[[1,2],[19,8],[0,4],[16,14],[9,34],[14,22],[15,44],[23,4],[2,16],[24,24],[4,48],[10,28],[18,22],[7,36],[12,60],[13,2],[20,18],[8,30],[5,70],[17,6],[21,2],[25,12],[6,40],[3,6],[11,120]],'impulse':[[12,2]],'polling':[[14,4]],'more':[[18,2],[12,14],[16,2],[20,6],[8,8],[5,6],[17,4],[9,12],[14,44],[15,2],[21,2],[6,22],[2,14],[4,8],[22,2],[23,2],[24,2],[10,14],[11,22],[7,16]],'dead':[[14,2]],'understood':[[11,2]],'frequency':[[8,2]],'docs':[[12,2],[0,2]],'link':[[3,2]],'изменившимся':[[22,2]],'factor':[[12,2],[14,2],[10,2],[6,12]],'1010':[[17,2],[11,2],[5,2]],'теории':[[22,2]],'ignored':[[25,4]],'information':[[12,4],[8,2],[5,2],[9,4],[14,6],[15,4],[2,2],[24,2],[4,2],[3,2],[10,4],[11,4],[7,6]],'Истории':[[22,54]],'forces':[[6,2],[5,2]],'нулевого':[[22,4]],'lot':[[12,2],[10,2],[6,2],[11,4]],'кадром':[[22,2]],'работают':[[22,2]],'recorder':[[12,2],[22,2],[23,14],[18,4],[5,18]],'состоянию':[[22,6]],'жёлтым':[[22,4]],'правую':[[22,4]],'intended':[[12,2],[14,2],[21,2],[2,2],[11,8]],'affects':[[7,2],[16,2],[11,2],[6,2]],'ней':[[22,4]],'rotated':[[24,2]],'решает':[[22,2]],'greenzonx':[[25,2]],'опрашивает':[[22,2]],'прямоугольный':[[22,2]],'растягивать':[[22,10]],'местами':[[22,6]],'Закладок':[[22,56]],'what':[[4,2],[12,2],[19,2],[6,2],[8,2]],'have':[[18,2],[19,2],[12,16],[20,8],[8,14],[5,12],[17,4],[9,8],[14,14],[15,4],[23,8],[6,44],[2,12],[4,12],[24,4],[25,2],[3,2],[10,2],[11,48],[7,30]],'script':[[17,10],[12,32],[15,4],[18,14]],'третий':[[22,6]],'obeying':[[2,2]],'клавишей':[[22,2]],'position':[[12,10],[16,6],[5,16],[17,2],[9,8],[15,10],[22,2],[23,6],[6,2],[24,6],[25,12],[3,2],[10,4],[18,4],[11,6]],'попавшегося':[[22,2]],'Либо':[[22,2]],'abilities':[[2,2]],'собирается':[[22,2]],'Расцветка':[[22,2]],'crash':[[24,2]],'paths':[[3,2]],'возможно':[[22,6]],'efficient':[[10,2]],'зелёным':[[22,4]],'moments':[[6,6],[8,2],[12,2],[7,4],[2,2]],'other':[[18,4],[19,10],[12,10],[16,12],[20,2],[8,6],[5,24],[17,10],[9,2],[14,4],[15,14],[23,4],[6,8],[2,4],[4,8],[24,8],[25,2],[3,4],[10,2],[11,4],[7,2]],'created':[[18,2],[12,8],[8,2],[5,6],[17,62],[9,2],[14,6],[15,2],[25,2],[2,2],[11,4],[7,6]],'четвёртого':[[22,2]],'изредка':[[22,2]],'separately':[[8,2],[14,2],[11,2],[2,2]],'пользователю':[[22,26]],'quickly':[[19,2],[12,2],[16,4],[8,8],[5,8],[9,2],[15,4],[6,4],[2,10],[4,4],[10,4],[11,10]],'offers':[[2,2]],'добавляемые':[[22,2]],'интуитивности':[[22,2]],'selection_table':[[12,6]],'insert#':[[17,4]],'append':[[6,2],[15,2]],'rooms':[[6,2]],'representation':[[25,2],[14,2]],'trail':[[4,4]],'inactive':[[5,2]],'put':[[5,2],[11,2],[9,2],[21,2],[6,2],[4,10],[12,4],[3,2],[10,2],[7,2],[8,2]],'sprouted':[[6,2]],'thoughts':[[12,2],[10,2],[2,2],[7,2]],'individually':[[6,4]],'request':[[18,18],[24,2]],'идеи':[[22,6]],'flower':[[6,4]],'meta':[[6,2]],'alternatively':[[15,2],[20,2],[5,2]],'шрифтом':[[22,2]],'past':[[9,2],[10,2],[8,2],[5,2]],'int':[[22,4],[20,2],[18,96]],'требуемого':[[22,2]],'комментариев':[[22,2]],'давности':[[22,2]],'программы':[[22,14]],'функцию':[[22,8]],'специализированной':[[22,2]],'изменить':[[22,8]],'красных':[[22,4]],'одному':[[22,2]],'caches':[[23,2]],'snapshots':[[23,6]],'mentally':[[4,2],[2,4]],'съёмка':[[22,2]],'должны':[[22,2]],'ключевом':[[22,4]],'dashes':[[11,2]],'organized':[[6,2],[12,2]],'investigation':[[12,2]],'capture':[[11,4]],'видимой':[[22,4]],'ячейка':[[22,8]],'accompanying':[[14,2]],'presses':[[18,2],[9,2],[14,2],[23,2],[6,2],[12,6],[10,2],[11,2],[5,4]],'ppu':[[15,2],[25,2],[24,6]],'taken':[[11,2]],'scenes':[[10,2],[9,2]],'промежутки':[[22,4]],'луа':[[22,16]],'platforms':[[21,2],[24,2]],'нажать':[[22,4]],'invulnerability':[[12,2]],'Маркерам':[[22,4]],'rate':[[5,2]],'соответствовали':[[22,2]],'example':[[18,4],[12,36],[20,6],[8,8],[5,18],[17,58],[9,8],[14,6],[23,2],[25,4],[6,22],[2,4],[4,14],[24,4],[10,8],[11,16],[7,6]],'cheat':[[12,2]],'because':[[19,2],[12,8],[20,2],[8,8],[5,16],[17,2],[9,8],[14,4],[15,2],[23,6],[6,28],[2,10],[4,16],[24,8],[25,4],[10,10],[11,20],[7,20]],'одинаковых':[[22,2]],'judge':[[9,2],[20,4]],'lands':[[6,4]],'иконок':[[22,12]],'Если':[[22,48]],'проверяет':[[22,2]],'spontaneous':[[6,2]],'preparation':[[12,2]],'insistent':[[10,2],[8,2]],'behave':[[9,2]],'reset':[[15,10],[23,4],[25,4],[19,8],[6,2],[24,4],[3,2],[18,2],[11,2]],'repeated':[[12,2],[6,2],[7,2]],'uploading':[[2,2]],'corresponding':[[17,2],[25,2],[4,8],[12,4],[16,2],[11,12],[5,10]],'data':[[18,2],[19,2],[12,20],[16,16],[20,2],[8,2],[5,22],[17,14],[9,2],[14,24],[15,2],[23,102],[6,2],[2,2],[4,8],[24,12],[25,50],[3,2],[11,18],[7,6]],'group':[[6,4],[16,2]],'Всплывающие':[[22,4]],'vary':[[7,2],[14,2]],'мелком':[[22,2]],'изменённых':[[22,2]],'weigh':[[9,2],[20,2],[10,2],[8,2]],'selected_frame':[[12,6]],'worth':[[6,2]],'обнаружены':[[22,2]],'descending':[[5,2]],'bots':[[11,2],[14,10]],'groundwork':[[2,2]],'bright':[[4,4],[19,2],[11,8]],'озвучены':[[22,2]],'единицу':[[22,4]],'substituted':[[17,8]],'pointer':[[4,10],[14,2],[23,10],[11,4],[5,4]],'основных':[[22,2]],'sentences':[[6,2]],'reside':[[23,2]],'disadvantages':[[7,2]],'precisely':[[12,2],[23,2],[19,2],[8,2],[24,2]],'screenshots':[[15,2],[20,6],[22,2],[11,12]],'tables':[[23,2]],'encompasses':[[7,2]],'contradict':[[6,6],[24,2]],'knowledge':[[9,2],[1,2],[14,10],[6,2],[12,4],[11,2],[7,2]],'touching':[[7,2],[14,2]],'contexts':[[7,2]],'chain':[[9,2]],'usefulness':[[14,2]],'полученные':[[22,2]],'developers':[[6,2],[14,2]],'due':[[12,2],[10,2],[5,2]],'contain':[[15,2],[14,2],[25,14],[6,6],[24,2],[4,2],[12,2]],'developed':[[2,2]],'methodical':[[23,2],[2,2],[6,2]],'maintain':[[6,2],[12,2]],'курсором':[[22,22]],'прыжками':[[22,2]],'Закладке':[[22,14]],'applies':[[15,2],[14,2],[23,2],[18,2],[5,2]],'включающий':[[22,2]],'самый':[[22,4]],'повлияла':[[22,2]],'idle':[[11,2]],'applyinputchanges':[[17,8],[12,4],[22,2],[18,20]],'настроить':[[22,2]],'played':[[5,6],[9,2],[14,2],[25,2],[6,4],[2,4],[4,2],[24,2],[16,10],[7,2],[8,2]],'горизонтальными':[[22,4]],'случае':[[22,14]],'аналогового':[[22,4]],'responsible':[[4,2],[15,6],[3,2],[8,4]],'returning':[[16,4],[10,2],[11,2],[5,8]],'unneeded':[[20,2]],'месту':[[22,2]],'hex':[[2,2],[15,2]],'enter':[[17,6],[9,2],[15,4],[4,4],[12,2],[16,4],[3,2],[11,2],[5,2]],'располагаются':[[22,2]],'удалением':[[22,2]],'мечты':[[22,2]],'цветовое':[[22,2]],'racing':[[20,2]],'submits':[[12,2]],'вставкой':[[22,2]],'Тасэдитор':[[22,20]],'восстанавливается':[[22,2]],'named':[[17,2],[23,2],[2,2]],'pageup':[[15,6]],'вносить':[[22,2]],'processing':[[14,4]],'пользователь':[[22,36]],'заполнен':[[22,2]],'assign':[[2,2]],'используются':[[22,2]],'efficiently':[[2,2]],'ассоциацию':[[22,2]],'ready':[[11,2],[10,4],[2,2],[5,2]],'regular':[[11,6],[23,2],[6,10],[2,4],[24,4],[12,4],[7,6],[5,4]],'отображение':[[22,10]],'success':[[20,2],[25,2],[6,2],[7,2]],'codebase':[[23,2]],'одном':[[22,8]],'analog':[[14,2],[5,14]],'произошёл':[[22,2]],'ctrl':[[12,10],[16,22],[5,36],[17,12],[9,6],[14,2],[15,86],[22,38],[24,22],[4,10],[3,4],[10,6],[11,10]],'triggers':[[5,2]],'consume':[[9,2]],'numpad':[[11,2]],'enforcing':[[2,2]],'global':[[12,2]],'loading':[[11,10],[7,8],[17,2],[23,10],[25,10],[2,2],[24,24],[12,6],[8,4],[5,4]],'problem':[[9,2],[12,4],[20,4],[19,2]],'columns':[[15,4],[22,2],[23,4],[19,4],[4,4],[5,6]],'resize':[[15,2]],'стандартизации':[[22,2]],'уровень':[[22,16]],'рисовать':[[22,6]],'out':[[7,4],[9,4],[23,2],[2,4],[24,2],[10,4],[8,6],[5,2]],'похоже':[[22,2]],'эволюции':[[22,2]],'branch9':[[17,4]],'predictable':[[2,2],[14,2]],'никак':[[22,2]],'exporting':[[3,2]],'#selection_table':[[12,2]],'полная':[[22,2]],'invented':[[4,2],[2,4]],'intend':[[6,2]],'autosaving':[[11,2]],'кадры':[[22,14]],'flashing':[[23,4],[5,2]],'memorable':[[12,2]],'neighbor':[[11,2],[5,2]],'текстовую':[[22,2]],'think':[[9,6],[19,4],[6,8],[12,4],[10,4],[7,2],[8,4]],'topic':[[19,2]],'необходимо':[[22,20]],'перезаписей':[[22,16]],'наклона':[[22,4]],'bookmark3':[[17,2]],'accounting':[[5,2]],'Оба':[[22,4]],'texts':[[6,2],[23,2]],'виде':[[22,18]],'manager':[[23,18]],'fly':[[12,4],[10,2],[2,2],[5,2]],'entire':[[9,2],[25,2],[19,2],[2,2],[4,2],[11,4],[5,2]],'светом':[[22,2]],'dictate':[[2,2]],'response':[[23,2]],'outrun':[[8,2]],'требуемой':[[22,2]],'регион':[[22,8]],'могли':[[22,2]],'cached_first_difference':[[23,2]],'этом':[[22,28]],'beat':[[12,2],[20,6],[2,2],[5,2]],'сдвинувшимся':[[22,2]],'abstracting':[[2,2]],'setnote':[[17,4],[18,4]],'take':[[5,2],[11,6],[23,8],[6,10],[4,2],[12,2],[10,2],[7,2],[8,2]],'каждой':[[22,10]],'cases':[[11,8],[9,2],[14,2],[23,2],[6,6],[2,2],[24,2],[12,10],[10,4],[7,4],[5,2]],'produce':[[25,2],[7,2]],'unimportant':[[14,2]],'general':[[9,2],[1,2],[14,2],[2,2],[6,2],[4,2],[20,4],[10,4],[7,2],[8,2]],'reconfiguring':[[11,2]],'кодом':[[22,4]],'щёлкать':[[22,4]],'заданного':[[22,2]],'selectall':[[24,2]],'corresponds':[[14,2],[25,2],[18,2],[5,2]],'Выводе':[[22,2]],'resembles':[[8,2],[0,2]],'discrepancy':[[14,2],[19,2],[5,2]],'consider':[[8,2],[9,2],[6,8],[12,2],[10,4],[7,4],[11,2]],'values':[[14,4],[23,4],[25,10],[12,6],[20,2],[11,2]],'multi':[[22,2],[14,4]],'данный':[[22,18]],'списков':[[22,2]],'обычный':[[22,2]],'recipient':[[12,4]],'насыщенным':[[22,2]],'равным':[[22,2]],'способ':[[22,8]],'передвижения':[[22,2]],'Макросу1':[[22,2]],'alters':[[2,2]],'отметку':[[22,2]],'walks':[[6,2]],'lightning':[[7,2]],'gamer':[[6,2],[8,2],[2,4]],'unfeasible':[[23,2],[20,4]],'entertainment':[[20,4],[14,4]],'Закладкам':[[22,6]],'reason':[[2,4]],'достижении':[[22,4]],'dumped':[[15,2]],'bookmark9':[[17,2]],'obvious':[[6,12],[12,4],[10,2],[7,8],[2,2]],'rule':[[6,2],[12,2]],'пространство':[[22,2]],'Также':[[22,26]],'particularly':[[11,2],[24,2]],'кнопкой':[[22,28]],'изменяемыми':[[22,2]],'cool':[[4,2],[11,2]],'evaluated':[[6,2],[14,2]],'md5':[[25,2],[24,2]],'использования':[[22,2]],'methodicalness':[[6,2]],'mutual':[[2,2]],'brief':[[4,2],[11,2]],'После':[[22,12]],'становятся':[[22,2]],'равный':[[22,4]],'окне':[[22,18]],'autofire':[[12,2],[23,2],[2,2],[11,2]],'closest':[[6,2],[16,4]],'нужна':[[22,2]],'forcing':[[5,2]],'совпадает':[[22,6]],'macro':[[12,2]],'голубой':[[22,12]],'term':[[12,2],[14,4],[2,2],[6,4]],'tab':[[15,4]],'potential':[[6,6],[9,2]],'visible':[[15,8],[16,4],[23,2],[6,2],[5,4]],'entering':[[5,2],[15,2],[8,2],[7,2]],'generating':[[12,2],[23,2]],'truncates':[[23,4],[10,2],[5,2]],'accessing':[[19,2]],'submitdeleteframes':[[17,2],[22,2],[18,4]],'timeline':[[24,2],[15,4],[6,2],[5,4]],'accumulated':[[12,2]],'taseditor_config':[[23,8]],'кадров':[[22,62]],'program':[[1,6],[19,8],[0,4],[12,2],[20,4],[5,2],[15,4],[14,6],[21,10],[2,8],[24,2],[4,2],[3,12],[10,2],[11,6]],'establishes':[[14,2]],'table':[[15,2],[14,2],[23,2],[4,4],[3,2],[18,12]],'replacing':[[24,4],[20,4]],'doubting':[[6,2]],'Скроллинг':[[22,2]],'these':[[18,6],[0,2],[12,4],[20,2],[8,6],[5,20],[15,10],[14,2],[6,14],[2,4],[4,10],[24,4],[10,2],[11,8],[7,8]],'conventional':[[6,2],[1,2]],'определения':[[22,2]],'воспринимает':[[22,2]],'getlostplayback':[[18,4]],'опыт':[[22,2]],'объекта':[[22,2]],'finds':[[12,2],[14,2]],'combined':[[17,4],[5,2]],'это':[[22,32]],'операций':[[22,16]],'зажат':[[22,2]],'сэйв':[[22,8]],'параметров':[[22,2]],'Наконец':[[22,2]],'textbook':[[1,2]],'some':[[18,6],[19,2],[12,22],[13,2],[16,6],[20,4],[8,14],[5,22],[17,52],[9,4],[14,12],[15,10],[21,2],[6,30],[2,16],[4,12],[23,6],[24,4],[10,10],[11,16],[7,8]],'accepted':[[12,2]],'клавиатуры':[[22,2]],'objectively':[[2,2]],'model':[[6,2]],'constrained':[[11,2]],'открытии':[[22,2]],'gradients':[[23,2]],'ситуаций':[[22,2]],'parameter':[[17,2],[11,4]],'unique':[[12,10],[25,2],[2,2],[6,2]],'colors':[[4,2],[23,4],[11,2]],'convince':[[7,2]],'много':[[22,4]],'playthrough':[[8,4],[11,2],[9,2],[14,2],[6,22],[2,4],[12,2],[10,2],[7,4],[5,4]],'exactly':[[9,2],[6,6],[12,4],[16,2],[11,4],[7,4]],'complex':[[5,4],[12,2],[20,6],[6,8],[2,2]],'analyzing':[[6,4]],'получить':[[22,6]],'связано':[[22,2]],'этап':[[22,2]],'erase':[[4,2],[17,6],[15,2],[10,2],[11,4]],'modify':[[4,2],[12,10],[19,2],[6,2],[7,2]],'проекта':[[22,36]],'assumption':[[14,2]],'lesser':[[19,2]],'причём':[[22,6]],'achieved':[[2,4],[20,2]],'fine':[[19,2]],'отметок':[[22,2]],'тексту':[[22,2]],'тонкими':[[22,2]],'нить':[[22,2]],'skipped':[[24,2]],'quicker':[[2,2],[8,2]],'fill':[[12,2],[16,2],[5,2]],'буфера':[[22,2]],'пикселях':[[22,2]],'version':[[24,4],[14,2],[25,18],[2,2],[11,2]],'соответствующую':[[22,4]],'psychological':[[2,2]],'кнопок':[[22,22]],'усечению':[[22,2]],'consistent':[[6,2]],'пиксели':[[22,2]],'отпуская':[[22,4]],'slots':[[8,12],[7,12],[24,4],[20,2],[11,2],[5,4]],'шаблонами':[[22,2]],'piano_roll':[[25,2],[23,2]],'except':[[17,2],[15,2],[25,2],[4,2],[12,4],[16,2]],'control':[[14,2],[23,2],[19,2],[2,6],[4,4],[12,2],[11,4]],'unbound':[[20,2]],'высоты':[[22,4]],'ТАСеру':[[22,10]],'prohibit':[[23,2]],'xxx':[[25,4]],'bit7':[[25,4]],'кэшированные':[[22,2]],'отключение':[[22,2]],'exit':[[15,6],[23,6],[6,2]],'sessions':[[6,2]],'линейную':[[22,2]],'Размер':[[22,2]],'отпущена':[[22,6]],'bit5':[[25,4]],'assume':[[9,2],[2,2],[7,2]],'sat':[[5,2]],'supermariobros':[[12,2]],'once':[[18,2],[12,4],[16,2],[8,2],[5,6],[9,4],[14,4],[6,4],[2,2],[4,2],[24,2],[10,2],[11,4],[7,6]],'letters':[[4,6]],'участка':[[22,8]],'org':[[12,2],[2,2],[6,2]],'notion':[[2,2],[23,2]],'throw':[[6,4]],'отложенные':[[22,2]],'Маркером':[[22,6]],'призваны':[[22,4]],'различать':[[22,2]],'добавления':[[22,2]],'нажатая':[[22,2]],'deploy':[[23,2]],'storing':[[9,2],[14,6],[23,2],[6,2],[11,2],[8,8]],'начало':[[22,8]],'pushing':[[14,2]],'made':[[7,2],[18,10],[9,2],[14,8],[23,2],[6,10],[12,2],[16,2],[11,2],[5,6]],'discarding':[[8,2]],'желаемую':[[22,2]],'текущем':[[22,2]],'inconvenience':[[11,2]],'robot':[[12,4],[14,2]],'clarification':[[11,2]],'regularities':[[6,2],[9,2]],'Этому':[[22,2]],'misconception':[[24,2]],'cell':[[4,12],[17,16],[15,20],[16,10],[11,6]],'consolidate':[[4,2],[11,2]],'land':[[10,2],[6,2]],'changed':[[17,40],[18,8],[23,2],[6,2],[24,4],[4,4],[16,2],[10,6],[7,2],[5,10]],'minimized':[[12,2]],'copyright':[[1,2],[19,2],[0,2],[16,2],[9,2],[14,2],[15,2],[23,2],[2,2],[24,2],[4,2],[10,2],[18,2],[7,2],[12,2],[13,2],[20,2],[8,2],[5,2],[17,2],[21,2],[22,2],[25,2],[6,2],[3,2],[11,2]],'encouraging':[[2,2]],'scroll':[[5,6],[9,2],[15,22],[4,2],[16,22],[10,2],[11,4],[7,2]],'effect':[[4,2],[2,4],[6,2]],'unrealized':[[7,2]],'форуме':[[22,2]],'distribute':[[8,2]],'life':[[14,2],[10,2],[7,2]],'курсора':[[22,16]],'перенеся':[[22,2]],'полей':[[22,2]],'fullscreen':[[24,2]],'paid':[[2,2]],'semi':[[12,2]],'pros':[[11,2],[9,2],[10,2],[7,2],[8,2]],'установленному':[[22,2]],'высоте':[[22,10]],'списка':[[22,6]],'informational':[[4,2],[10,2],[2,2]],'through':[[11,6],[9,2],[6,6],[4,2],[12,6],[16,4],[3,2],[20,4],[7,6],[5,4]],'temptation':[[6,2],[9,2]],'publish':[[12,6]],'consequences':[[10,2],[2,2]],'фона':[[22,4]],'subtitles':[[12,10],[15,2],[25,2]],'расширить':[[22,4]],'scale':[[14,2],[3,2],[23,4],[6,6],[5,2]],'comprehending':[[6,2]],'accidental':[[11,2],[5,2]],'ранних':[[22,4]],'markers_manager':[[23,4]],'неудобно':[[22,2]],'сохраняются':[[22,16]],'ему':[[22,4]],'checks':[[23,8],[14,2]],'greatly':[[14,2],[23,2],[5,4]],'обеспечивает':[[22,2]],'deliver':[[8,2]],'Эмулятор':[[22,2]],'этому':[[22,10]],'предыдущего':[[22,6]],'5th':[[4,2]],'указка':[[22,2]],'leaving':[[4,2],[9,2],[10,2],[11,4]],'comparing':[[8,4],[20,24],[23,6],[11,2],[6,2]],'divergence':[[7,2]],'filename':[[17,2],[23,8],[19,2],[11,4]],'отображения':[[22,12]],'находится':[[22,18]],'valid':[[25,2]],'checkpoints':[[6,2]],'viewers':[[6,2],[12,4]],'шаблону':[[22,12]],'resources':[[12,2],[23,32],[6,2]],'bound':[[16,2]],'manipulation':[[9,2],[14,6],[10,2],[20,2]],'рамках':[[22,2]],'целиком':[[22,2]],'history':[[18,4],[12,14],[16,6],[20,2],[8,2],[5,14],[17,8],[9,8],[15,16],[23,20],[25,12],[2,2],[10,2],[7,2],[11,22]],'divided':[[3,2]],'regularly':[[11,2],[23,30]],'историю':[[22,2]],'results':[[12,2],[20,4],[8,4],[5,4],[9,2],[14,6],[23,2],[6,8],[2,2],[4,2],[11,2],[7,6]],'learns':[[7,2]],'альтернативой':[[22,2]],'early':[[10,2],[2,2],[6,4]],'fixing':[[7,16],[8,2],[6,4]],'дальнейший':[[22,2]],'local':[[3,2]],'вернуться':[[22,2]],'возрастать':[[22,2]],'удобном':[[22,2]],'limits':[[0,2],[14,4],[23,2],[6,4],[2,2]],'flow':[[9,2],[2,8],[6,6],[3,2],[7,4],[11,2]],'детерминизм':[[22,2]],'Текущее':[[22,4]],'шлюзом':[[22,2]],'верхнем':[[22,2]],'того':[[22,28]],'detect':[[9,2],[14,2],[10,2],[7,2]],'replaced':[[5,2],[14,2],[24,4],[4,2],[12,2],[11,2],[7,2]],'rapidly':[[5,10]],'начинает':[[22,8]],'сохранённая':[[22,2]],'Однако':[[22,8]],'cursors':[[4,2]],'extend':[[12,2]],'зелёная':[[22,10]],'pure':[[7,2]],'Вправо':[[22,4]],'попадает':[[22,4]],'принципы':[[22,2]],'confirms':[[11,2]],'разными':[[22,4]],'Влево':[[22,2]],'наравне':[[22,2]],'over':[[19,2],[12,12],[8,2],[5,6],[9,2],[15,24],[23,2],[6,24],[2,4],[4,2],[24,12],[10,6],[11,16],[7,2]],'больше':[[22,6]],'fact':[[17,2],[14,2],[6,6],[24,2],[12,4],[20,2],[7,2]],'содержит':[[22,2]],'устанавливаемой':[[22,4]],'definition':[[23,2]],'third':[[5,4],[12,2],[7,2],[6,2]],'кнопке':[[22,10]],'editors':[[3,2],[2,2]],'logically':[[4,2],[8,2]],'depicted':[[14,2]],'Второй':[[22,2]],'animation':[[6,2],[23,6]],'depending':[[17,4],[9,4],[25,2],[6,4],[4,4],[12,2],[16,2],[11,4],[5,2]],'non':[[17,4],[15,2],[6,2],[2,4],[12,4],[7,2],[5,4]],'attaches':[[11,2]],'fingers':[[8,6]],'impose':[[2,2]],'definitely':[[4,2],[14,2],[10,2]],'sense':[[12,2],[7,2],[11,2]],'clone':[[17,12],[15,4],[5,4]],'hits':[[9,2]],'description':[[15,4],[23,2],[6,4],[4,2],[12,4],[16,6],[3,4],[11,2]],'involuntarily':[[2,2]],'fire':[[12,2],[15,6]],'vibrating':[[14,2]],'callbacks':[[18,16]],'кадрах':[[22,26]],'valuable':[[2,2]],'duplicate':[[2,2]],'щелчков':[[22,6]],'галочкой':[[22,4]],'intersects':[[6,2]],'начальная':[[22,2]],'альтернативную':[[22,2]],'средствами':[[22,2]],'сложных':[[22,2]],'однократно':[[22,2]],'selecting':[[12,2],[15,4],[18,2],[24,2]],'much':[[23,4],[2,6],[6,12],[4,2],[24,2],[12,6],[10,4],[7,4],[11,10]],'erasing':[[4,2],[9,2],[15,4],[11,2],[5,4]],'корень':[[22,2]],'автоматический':[[22,2]],'fortification':[[12,2]],'properties':[[23,6],[20,8],[6,2]],'performance':[[14,2],[10,2],[11,2]],'методы':[[22,2]],'getplaybacktarget':[[18,4]],'evaluating':[[7,2],[14,2]],'initially':[[6,2]],'constant':[[6,4],[9,2],[10,2],[8,4],[2,2]],'hidden':[[12,4],[14,4],[6,4]],'включая':[[22,8]],'Ввода':[[22,102]],'выделенным':[[22,4]],'установлены':[[22,2]],'please':[[0,2]],'tedious':[[2,2],[14,2]],'случаев':[[22,12]],'иметься':[[22,2]],'numeration':[[4,2]],'ставится':[[22,4]],'пытается':[[22,2]],'смене':[[22,2]],'две':[[22,4]],'critical':[[6,4],[11,2]],'состояния':[[22,10]],'гибкая':[[22,2]],'evil':[[19,2]],'kick':[[23,2]],'журналируемых':[[22,2]],'been':[[11,2]],'responsive':[[4,2]],'напрямую':[[22,2]],'отключении':[[22,2]],'|commands|port0|port1|port2|':[[25,2]],'voiced':[[2,2]],'удалять':[[22,4]],'левой':[[22,28]],'resyincing':[[6,2]],'closing':[[6,2]],'helps':[[6,2],[2,4],[4,2],[12,2],[11,2],[5,4]],'poll':[[23,2],[14,4],[11,2]],'просмотра':[[22,8]],'were':[[11,8],[12,2],[16,2],[5,4],[17,8],[14,2],[25,8],[6,6],[2,8],[4,10],[24,2],[18,4],[7,2]],'просматривать':[[22,2]],'sides':[[6,2]],'subtasks':[[6,2],[14,2]],'будущее':[[22,6]],'обычными':[[22,2]],'shortage':[[14,2]],'содержащийся':[[22,4]],'tas':[[18,106],[25,4],[1,2],[19,8],[0,10],[12,22],[8,2],[5,8],[17,22],[9,4],[14,16],[15,16],[21,6],[2,20],[6,20],[4,6],[22,20],[23,34],[24,10],[3,14],[10,2],[11,16],[7,6]],'усовершенствований':[[22,2]],'meditating':[[2,2]],'порядке':[[22,2]],'command':[[12,2],[15,16],[19,4],[7,4],[5,2]],'stuck':[[6,2]],'existent':[[7,2]],'тучка':[[22,2]],'игровых':[[22,4]],'improves':[[6,2]],'откате':[[22,2]],'автоматическое':[[22,4]],'обычно':[[22,2]],'launching':[[12,2],[23,10],[2,2],[24,6]],'останавливать':[[22,2]],'копировании':[[22,4]],'monotonous':[[6,4],[5,2]],'occurring':[[10,2]],'aside':[[5,2]],'установки':[[22,6]],'файла':[[22,16]],'extra':[[14,2],[19,2],[11,2]],'reread':[[10,2],[12,2]],'frontier':[[6,2]],'прыжке':[[22,4]],'21060':[[25,2]],'love':[[7,2]],'find':[[18,2],[12,10],[16,18],[20,4],[8,4],[5,4],[17,2],[9,2],[14,4],[15,6],[22,2],[6,10],[23,2],[4,2],[3,2],[10,2],[11,6],[7,6]],'хронологии':[[22,8]],'moreover':[[4,2],[15,2],[6,2]],'search':[[9,2],[14,4],[15,2],[2,2],[6,2],[12,16],[16,4],[3,2],[10,2],[20,10]],'later':[[4,4],[9,10],[3,4],[24,2],[5,8]],'shot':[[4,2],[9,4],[20,2]],'limit':[[6,4],[9,2]],'dependence':[[6,4]],'limited':[[14,2],[6,4],[8,2]],'boost':[[14,2]],'manipulations':[[2,2],[14,2]],'scope':[[6,2]],'закладочном':[[22,2]],'show':[[15,6],[23,2],[6,2],[12,2],[10,4],[11,4]],'animates':[[23,2]],'author':[[1,2],[23,2],[19,4],[6,8],[0,4],[25,6],[12,2]],'mapping':[[11,2]],'синим':[[22,4]],'передают':[[22,2]],'core':[[23,2]],'dislocated':[[5,2]],'дошёл':[[22,2]],'будущем':[[22,2]],'cleaned':[[11,2]],'unpause':[[17,4],[9,2],[15,6],[4,4],[12,6],[7,2],[5,6]],'postpone':[[20,2],[6,2],[11,2]],'extremely':[[9,2],[6,2],[7,2]],'corner':[[4,4],[6,2],[12,2],[2,2],[5,2]],'wasting':[[7,2]],'intense':[[6,4],[11,2],[2,2]],'Список':[[22,12]],'si_gamepad':[[25,8]],'bookmark2':[[17,2]],'области':[[22,4]],'fined':[[2,2]],'relaxation':[[6,2]],'vertical':[[4,4],[12,2],[16,4],[23,2]],'learn':[[9,2],[1,2],[6,4],[2,4],[0,2],[12,2],[10,2],[8,4]],'complicated':[[12,2],[2,2],[6,2]],'inbuilt':[[2,2]],'hotkeys':[[9,6],[15,20],[23,2],[24,6],[11,22],[5,4]],'simplifies':[[5,2],[11,2],[7,2]],'maximizing':[[6,4]],'superimposes':[[12,2]],'pal':[[25,2],[18,2],[24,2]],'understanding':[[6,2],[11,2]],'temporal':[[5,4]],'духе':[[22,2]],'является':[[22,16]],'джойстика':[[22,30]],'computer':[[24,2],[14,4],[10,2],[11,6],[5,2]],'эмуляция':[[22,4]],'паузе':[[22,6]],'столбца':[[22,12]],'смысла':[[22,6]],'считает':[[22,2]],'целевое':[[22,2]],'zipping':[[14,2]],'Обычно':[[22,8]],'произведена':[[22,2]],'meaning':[[12,2],[15,2],[23,2],[6,2],[5,2]],'рамки':[[22,6]],'having':[[8,2],[23,2]],'другим':[[22,2]],'Подразумевается':[[22,2]],'Левая':[[22,4]],'maximize':[[6,4]],'Проигрыватель':[[22,6]],'implement':[[23,2],[5,4]],'имеют':[[22,10]],'recharge':[[6,2]],'emotional':[[6,2],[7,2],[2,2]],'absolutely':[[4,2]],'cuts':[[6,2],[14,2]],'gaining':[[8,2]],'Вводу':[[22,8]],'половину':[[22,2]],'produced':[[9,2]],'humans':[[14,4]],'numbers':[[15,2],[2,2],[4,14],[12,2],[20,4],[18,4],[5,2]],'truncated':[[17,60],[18,2],[12,2],[11,4],[5,4]],'energy':[[2,2],[14,2]],'recently':[[4,4],[3,2],[11,6]],'apply':[[8,2],[18,2],[15,4],[23,4],[6,2],[12,8],[10,2],[7,4],[11,2]],'inattention':[[6,2]],'unsetting':[[15,4]],'пересечение':[[22,2]],'disable':[[4,2],[23,2],[11,14]],'create':[[7,4],[19,6],[12,8],[8,8],[5,8],[9,2],[14,2],[23,6],[6,4],[2,2],[4,2],[24,6],[10,2],[11,10],[18,4]],'hints':[[3,2],[9,2]],'efforts':[[6,4]],'inaccessible':[[11,2]],'battles':[[12,2]],'шириной':[[22,4]],'находятся':[[22,4]],'нибудь':[[22,2]],'последующих':[[22,2]],'darker':[[11,2]],'почти':[[22,6]],'cells':[[4,8],[15,4],[11,2]],'выделять':[[22,2]],'hides':[[23,2]],'purple':[[4,2],[11,4],[5,6]],'mostly':[[11,2],[3,2],[6,2],[7,4]],'give':[[2,2],[6,4]],'Это':[[22,24]],'via':[[12,2],[15,2],[2,2],[5,2]],'фаербол':[[22,4]],'связывающих':[[22,2]],'перемещаются':[[22,2]],'продумать':[[22,2]],'suffixes':[[23,2]],'averts':[[6,2]],'successful':[[9,4],[14,2],[6,2],[20,2],[10,4],[7,4],[8,4]],'death':[[7,2],[9,2]],'repeatedly':[[7,2]],'recover':[[11,2]],'хранящимися':[[22,4]],'числе':[[22,8]],'перемещать':[[22,2]],'skidding':[[6,2]],'switches':[[23,2],[7,4],[11,2]],'выделенных':[[22,18]],'concepts':[[6,2]],'pasting':[[12,2]],'indicators':[[6,2]],'does':[[5,2],[25,2],[6,2],[2,4]],'ending':[[17,2],[9,4],[14,4],[25,2],[6,2]],'tricks':[[6,4],[14,6]],'цифрой':[[22,8]],'assess':[[6,2]],'get':[[12,8],[16,4],[8,8],[5,2],[9,2],[14,2],[23,2],[6,10],[2,10],[4,4],[10,4],[11,2],[18,10]],'overlapping':[[15,2]],'bool':[[20,2],[25,10],[18,8]],'enabled':[[9,2],[19,2],[4,2],[16,4],[10,2],[11,62],[5,2]],'поля':[[22,2]],'оценивать':[[22,2]],'reviewed':[[3,2]],'реальные':[[22,2]],'регистрация':[[22,2]],'расширяется':[[22,2]],'ручной':[[22,2]],'любом':[[22,16]],'recalling':[[12,2]],'реализуется':[[22,8]],'share':[[2,4],[12,14]],'удобство':[[22,2]],'cannot':[[15,2],[20,2],[25,2],[18,2],[24,2]],'locked':[[24,2]],'dummy':[[25,4]],'knows':[[4,2]],'расхождение':[[22,2]],'Списка':[[22,34]],'registerafter':[[12,4]],'воспринимать':[[22,4]],'air':[[6,2]],'purposely':[[12,2]],'sourceforge':[[21,2]],'заносится':[[22,2]],'содержимое':[[22,14]],'searches':[[23,2]],'Закладки':[[22,106]],'parsed':[[25,4]],'backup_current_branch':[[23,2]],'logical':[[4,2],[9,4],[12,2],[2,2],[6,4]],'influenced':[[6,4]],'timesaver':[[14,6]],'видеть':[[22,4]],'новое':[[22,2]],'Следующий':[[22,2]],'fresh':[[6,2]],'кадр':[[22,70]],'rerecord':[[7,2],[15,4],[23,2],[25,2],[6,2],[24,2],[8,2],[5,2]],'examples':[[18,2],[14,16]],'снятие':[[22,2]],'taseditor':[[1,2],[19,10],[0,4],[16,2],[9,10],[14,10],[15,6],[23,46],[2,28],[24,78],[4,20],[10,6],[18,114],[7,16],[12,52],[13,2],[20,4],[8,6],[5,28],[17,26],[21,12],[22,2],[25,20],[6,6],[3,14],[11,78]],'beginning':[[12,16],[16,42],[8,16],[5,14],[9,12],[14,2],[15,14],[23,6],[6,28],[24,4],[4,6],[25,6],[10,10],[11,2],[7,8]],'концом':[[22,2]],'recognized':[[4,2]],'линия':[[22,4]],'fortunately':[[10,2],[7,2]],'integer':[[25,12],[20,4]],'равен':[[22,4]],'few':[[4,4],[7,2],[9,2],[6,2],[5,4]],'поменяются':[[22,2]],'resyncing':[[10,2]],'row':[[17,6],[18,2],[15,18],[14,12],[23,2],[4,6],[10,2],[8,2],[5,2]],'combination':[[15,2],[2,2],[6,2],[4,2],[12,4],[10,6],[7,2],[11,2]],'itself':[[5,2],[11,4],[6,2]],'elements':[[24,6],[15,2],[11,4],[5,4]],'idea':[[11,4],[6,14],[2,2],[4,2],[12,2],[10,2],[7,4],[5,2]],'50000':[[11,2]],'configure':[[11,6]],'отображаемые':[[22,6]],'attempting':[[9,2]],'speed':[[12,6],[8,4],[5,10],[9,6],[14,16],[15,18],[23,2],[6,18],[2,2],[24,2],[10,4],[11,8],[7,4]],'перемещает':[[22,6]],'надеясь':[[22,2]],'caption':[[15,2],[23,10],[24,2],[12,2],[3,4],[11,2],[5,2]],'accustom':[[8,4]],'bullets':[[6,2]],'отступление':[[22,2]],'обнаружении':[[22,2]],'tied':[[4,2],[5,2]],'reduce':[[2,4]],'восстанавливает':[[22,6]],'величина':[[22,2]],'Видимая':[[22,4]],'pipe':[[25,6],[6,4]],'каждом':[[22,16]],'detailed':[[2,2],[1,2]],'when':[[18,20],[19,6],[0,4],[12,52],[13,2],[16,124],[20,16],[8,24],[5,52],[17,76],[9,30],[14,34],[15,38],[23,30],[6,80],[2,24],[4,26],[24,68],[25,18],[3,4],[10,30],[11,92],[7,26]],'shows':[[4,8],[17,4],[23,2],[10,4],[24,4]],'inevitable':[[6,2]],'stable':[[23,2],[6,2],[8,2]],'backward':[[14,2]],'отпущенная':[[22,2]],'forgetting':[[11,2],[5,2]],'redrawn':[[12,2]],'гарантированно':[[22,2]],'колонка':[[22,2]],'virtual':[[17,14],[15,6],[23,12],[2,2],[11,14]],'works':[[17,2],[15,2],[14,2],[6,2],[24,6],[12,2],[16,4],[10,4],[11,6],[5,2]],'segmentation':[[2,2],[6,2]],'place':[[19,2],[12,2],[16,6],[20,2],[8,4],[5,14],[17,2],[15,6],[6,8],[2,6],[4,4],[24,2],[10,2],[11,6],[7,16]],'never':[[17,2],[9,4],[11,2],[8,2]],'prompting':[[12,4]],'docopy':[[12,6]],'progressbars':[[15,2]],'другом':[[22,2]],'вверх':[[22,18]],'meant':[[4,2]],'загораживается':[[22,2]],'этой':[[22,24]],'Интерфейс':[[22,2]],'luascripts':[[12,2],[18,2]],'никогда':[[22,2]],'Вывод':[[22,2]],'обнуляется':[[22,2]],'передвигается':[[22,2]],'соответствующая':[[22,2]],'числа':[[22,2]],'whatsoever':[[6,2]],'compressing':[[23,2]],'decreased':[[9,2]],'situation':[[9,8],[19,2],[6,2],[2,2],[12,6],[16,2],[20,2],[8,4],[7,2]],'launches':[[23,4]],'videogame':[[6,4]],'Нумерация':[[22,2]],'сэйвы':[[22,2]],'Тогда':[[22,2]],'stretching':[[24,2]],'newlines':[[25,4]],'increased':[[6,2],[9,2]],'foresee':[[9,2]],'operate':[[14,4]],'сформированы':[[22,2]],'accessory':[[2,2]],'sequence':[[17,4],[18,2],[14,14],[6,6],[4,4],[12,24],[16,2],[10,2],[11,4],[7,4]],'uniqueness':[[12,2]],'выделения':[[22,8]],'enable':[[8,2],[15,4],[24,6],[12,2],[11,14],[5,2]],'ТАСеров':[[22,4]],'пункт':[[22,12]],'series':[[10,2]],'subtitle':[[25,8]],'differently':[[25,2],[5,2]],'operation':[[17,12],[15,2],[23,6],[19,2],[2,2],[24,2],[4,6],[12,2],[16,2],[11,2]],'seeking':[[18,12],[9,8],[14,2],[15,12],[23,8],[2,2],[24,12],[16,2],[10,6],[11,8],[5,18]],'task':[[12,10],[14,14],[16,2],[6,10],[7,4]],'division':[[6,2]],'горизонтально':[[22,2]],'profitable':[[7,2]],'honestly':[[12,2]],'хоткея':[[22,6]],'faq':[[13,2],[19,4],[0,2]],'encoded':[[12,4]],'predefined':[[14,2]],'прост':[[22,2]],'friendly':[[14,2]],'reproducible':[[14,4]],'comprehensive':[[14,2],[19,2],[0,2]],'обнуляют':[[22,2]],'found':[[7,2],[19,4],[12,6],[20,8],[5,2],[23,4],[6,8],[24,2],[4,2],[3,2],[10,2],[11,2],[18,4]],'освобождения':[[22,2]],'Выделений':[[22,12]],'заменой':[[22,2]],'wouldn':[[14,2]],'filler':[[6,2]],'versions':[[19,2],[24,2],[6,4],[2,4],[7,2],[5,4]],'сохраняется':[[22,14]],'выходит':[[22,2]],'образ':[[22,4]],'submissions':[[12,2]],'insignificantly':[[12,8]],'hottest':[[4,2]],'диска':[[22,2]],'pending':[[18,2],[23,2]],'expressions':[[12,2]],'реализуемых':[[22,2]],'acceleration':[[7,2],[12,12],[8,4],[6,10]],'описания':[[22,6]],'supposedly':[[9,2]],'выделении':[[22,2]],'measured':[[14,2]],'say':[[7,2],[11,2]],'retrieve':[[18,2]],'платформ':[[22,6]],'formalize':[[6,2],[14,2]],'source':[[17,4],[21,8],[14,4],[19,2],[12,4],[7,4]],'Автовосстановление':[[22,4]],'третьего':[[22,2]],'быть':[[22,22]],'отмеченного':[[22,2]],'buttonpress':[[9,12],[12,2],[16,2],[10,12],[20,2],[11,4]],'равное':[[22,2]],'сверка':[[22,4]],'publishing':[[2,2],[6,2]],'pasted':[[17,2],[5,2]],'ТАСов':[[22,2]],'найдено':[[22,2]],'greater':[[14,2],[5,2]],'выделенными':[[22,8]],'read':[[7,20],[0,2],[12,4],[8,2],[5,6],[15,2],[14,2],[22,2],[23,6],[6,4],[25,2],[3,4],[11,8],[18,4]],'juggle':[[7,2],[8,2]],'востребована':[[22,2]],'документом':[[22,2]],'колонке':[[22,2]],'таблицы':[[22,2]],'влияет':[[22,2]],'alternation':[[12,2],[9,2],[11,4]],'350':[[6,4]],'ans':[[1,2],[19,2],[0,8],[16,2],[9,2],[14,2],[15,2],[23,2],[2,2],[24,2],[4,2],[10,2],[18,2],[7,2],[12,2],[13,2],[20,2],[8,2],[5,2],[17,2],[21,2],[22,2],[25,4],[6,2],[3,2],[11,2]],'Реализованные':[[22,2]],'mute':[[15,2],[23,2]],'первый':[[22,10]],'промежуточными':[[22,2]],'Последовательно':[[22,2]],'took':[[2,2]],'direction':[[5,2],[24,2],[10,2],[7,2],[6,2]],'getting':[[12,2]],'race':[[14,2]],'uncontrollable':[[14,2]],'красным':[[22,2]],'целевом':[[22,2]],'stored':[[17,4],[5,2],[23,8],[25,6],[12,12],[20,8],[18,2],[11,8]],'keeps':[[2,2],[5,2]],'appears':[[19,2],[12,2],[17,6],[9,2],[14,2],[15,4],[6,12],[24,2],[4,2],[3,2],[10,2],[11,4]],'feedback':[[9,2],[10,4],[7,4],[8,4]],'резервная':[[22,2]],'Теплокарты':[[22,2]],'even':[[18,8],[19,2],[12,10],[8,8],[5,8],[9,6],[14,8],[15,2],[23,2],[6,42],[2,8],[4,4],[24,10],[3,2],[10,12],[11,12],[7,14]],'Продумать':[[22,4]],'кнопкам':[[22,10]],'наследников':[[22,2]],'network':[[12,2]],'установку':[[22,4]],'содержимому':[[22,2]],'forum':[[19,2]],'hovering':[[24,2]],'отображаются':[[22,36]],'revokes':[[8,2]],'difficulties':[[6,2]],'эмулятора':[[22,10]],'ячейки':[[22,54]],'равносильно':[[22,2]],'max':[[14,2],[23,6],[6,2],[11,4]],'exploiting':[[14,2]],'consequence':[[6,2]],'проделанный':[[22,2]],'haven':[[4,2],[10,2]],'strokes':[[2,2]],'установленное':[[22,2]],'центрирует':[[22,2]],'очистки':[[22,4]],'special':[[9,2],[14,2],[23,2],[2,2],[6,2],[12,2],[16,4]],'started':[[9,2],[11,2]],'continually':[[7,2]],'3100':[[11,2]],'копия':[[22,10]],'последующий':[[22,2]],'eject':[[15,6],[25,4],[24,4]],'сохранённые':[[22,2]],'including':[[14,2],[23,4],[19,2],[6,2],[12,2],[11,2]],'than':[[7,8],[19,2],[12,2],[20,12],[8,2],[9,4],[14,4],[23,6],[25,2],[2,18],[6,26],[4,2],[10,4],[11,6],[18,2]],'нужными':[[22,2]],'журналировать':[[22,2]],'пуст':[[22,2]],'space':[[23,4],[25,8],[6,2],[12,2],[3,2],[11,10],[5,2]],'spent':[[4,2],[9,2],[14,2],[2,2],[6,2]],'sounding':[[5,2]],'2008':[[22,2]],'оставив':[[22,2]],'пары':[[22,2]],'появление':[[22,2]],'sharing':[[12,2]],'hierarchy':[[5,4]],'навигации':[[22,10]],'сдвигается':[[22,6]],'аналогии':[[22,4]],'оставляя':[[22,2]],'begin':[[15,2],[22,2],[6,4],[4,4],[12,2],[10,4],[7,2]],'верхнего':[[22,2]],'нажатия':[[22,6]],'первое':[[22,6]],'represented':[[25,4]],'background':[[15,4],[11,2],[5,4]],'unchecked':[[12,2],[18,2],[5,2]],'diverse':[[20,2]],'оставаться':[[22,6]],'известны':[[22,2]],'hesitate':[[2,2]],'efficiency':[[2,2]],'beginner':[[1,4],[14,2],[19,2],[0,2]],'where':[[18,4],[19,2],[12,14],[16,10],[20,10],[5,20],[17,28],[9,12],[14,2],[15,8],[25,2],[6,16],[24,2],[4,8],[10,8],[11,6],[7,2]],'fell':[[8,2],[5,2]],'smaller':[[6,2]],'situations':[[7,2],[12,4],[20,2],[11,2],[6,2]],'reminding':[[11,2]],'encourage':[[21,2]],'calculate':[[6,2],[11,2]],'editing':[[18,2],[19,2],[12,10],[8,12],[5,12],[9,8],[14,14],[15,24],[23,14],[6,8],[2,6],[4,8],[24,4],[25,2],[10,16],[11,14],[7,8]],'усекается':[[22,12]],'всего':[[22,4]],'изменяемых':[[22,2]],'Переключение':[[22,2]],'шаблона':[[22,4]],'won':[[7,4],[19,4],[12,6],[20,2],[5,8],[17,2],[9,2],[15,4],[6,8],[2,4],[4,4],[24,4],[3,2],[11,16],[18,6]],'actively':[[24,2]],'editor':[[18,106],[1,2],[19,6],[0,12],[12,12],[8,2],[5,8],[17,22],[15,18],[14,2],[21,6],[22,18],[2,14],[23,40],[4,4],[24,10],[25,4],[3,8],[11,12],[7,2]],'addition':[[11,2],[5,4],[2,8],[4,2],[20,2],[7,2],[8,2]],'infinitely':[[11,2]],'меню':[[22,2]],'пришлось':[[22,2]],'quit':[[5,2]],'launch':[[15,8],[23,2],[24,4],[12,2],[20,2],[3,4],[11,6]],'isn':[[5,2],[11,2],[9,2],[18,4],[6,2],[4,2],[12,2],[10,2],[7,2],[8,2]],'500kb':[[12,2]],'вправо':[[22,2]],'отображает':[[22,6]],'Реализовано':[[22,2]],'explains':[[1,2]],'Как':[[22,6]],'double':[[4,10],[17,14],[15,6],[11,4],[5,2]],'карточку':[[22,2]],'moment':[[7,2],[16,4],[8,2],[5,4],[9,2],[14,6],[15,4],[23,4],[6,12],[24,2],[4,4],[10,4],[11,4],[18,10]],'submission':[[6,4],[12,2]],'did':[[11,2],[14,2]],'bug':[[19,2],[14,4]],'интуитивно':[[22,2]],'now':[[12,6],[8,2],[5,18],[9,8],[25,2],[6,12],[2,10],[4,4],[3,4],[10,4],[11,14],[7,10]],'соответствующей':[[22,12]],'текстовых':[[22,4]],'дополнительную':[[22,2]],'needed':[[19,2],[12,12],[16,4],[20,2],[8,8],[5,8],[9,4],[14,4],[15,6],[23,4],[6,4],[25,2],[4,4],[10,2],[11,10],[7,6]],'explicit':[[7,2]],'изменяются':[[22,4]],'некоторых':[[22,6]],'techniques':[[7,2],[20,2]],'стало':[[22,2]],'насильно':[[22,2]],'любые':[[22,6]],'update':[[4,2],[23,4],[14,2]],'appeared':[[2,2],[11,4]],'closes':[[24,2]],'pressing':[[9,14],[14,4],[15,14],[23,2],[6,2],[24,2],[4,2],[12,8],[10,4],[11,12],[5,12]],'chooses':[[14,2]],'rise':[[6,2]],'appearing':[[11,2],[9,2],[12,2],[6,2],[5,2]],'переработать':[[22,2]],'отметки':[[22,2]],'перемоткой':[[22,2]],'inputting':[[10,2]],'reads':[[6,2],[23,2]],'supersaturated':[[6,2]],'complicates':[[8,2]],'end':[[18,4],[19,2],[12,22],[16,28],[20,4],[8,4],[5,12],[17,6],[9,22],[14,2],[15,20],[22,6],[6,46],[2,2],[4,2],[23,10],[24,4],[25,4],[3,2],[10,20],[11,10],[7,4]],'был':[[22,12]],'более':[[22,26]],'инструмента':[[22,4]],'базовое':[[22,2]],'щелчка':[[22,12]],'возвращается':[[22,4]],'небольших':[[22,2]],'слоту':[[22,4]],'соответственно':[[22,6]],'телокарты':[[22,2]],'изменении':[[22,20]],'ноль':[[22,2]],'impossible':[[2,2],[5,6]],'selection':[[12,14],[16,52],[5,32],[17,8],[9,8],[14,14],[15,62],[22,2],[2,2],[23,36],[4,34],[24,12],[25,10],[18,4],[11,8]],'unfortunately':[[19,2],[6,4]],'right':[[18,6],[19,16],[12,12],[16,2],[8,10],[5,24],[17,26],[9,8],[14,2],[15,34],[23,4],[6,18],[24,8],[4,16],[25,10],[3,6],[10,4],[11,12],[7,6]],'найденный':[[22,4]],'desync':[[14,4]],'прыжка':[[22,2]],'way':[[19,8],[12,14],[16,4],[20,2],[8,6],[5,12],[9,10],[14,12],[15,10],[23,2],[6,18],[2,12],[4,18],[24,2],[10,10],[11,32],[7,8]],'raise':[[2,2]],'щелчке':[[22,28]],'записываемые':[[22,2]],'отслеживания':[[22,4]],'используется':[[22,8]],'момент':[[22,42]],'there':[[18,10],[19,8],[12,16],[16,2],[20,6],[8,10],[5,10],[17,16],[9,6],[14,2],[15,6],[23,10],[6,12],[2,4],[4,18],[24,4],[25,8],[3,6],[10,14],[11,18],[7,12]],'дальше':[[22,2]],'доступность':[[22,2]],'offered':[[12,2]],'автоматизация':[[22,4]],'settings':[[1,2],[19,2],[12,2],[5,2],[14,2],[23,18],[25,2],[2,2],[24,4],[4,2],[3,4],[11,16]],'appearance':[[12,4],[23,2],[3,2]],'further':[[24,2],[10,2],[6,2],[11,2]],'observed':[[14,2]],'добегание':[[22,20]],'состояние':[[22,40]],'нажатой':[[22,8]],'his':[[9,2],[14,4],[2,12],[6,8],[4,2],[24,2],[12,4],[10,4]],'независимо':[[22,2]],'отключать':[[22,2]],'иерархии':[[22,2]],'increase':[[15,2],[2,2],[6,2],[4,2],[12,14],[8,2],[11,6]],'sequences':[[12,10],[15,2],[6,2],[7,2]],'номерами':[[22,6]],'focus':[[24,2],[23,2],[10,2],[6,8],[5,2]],'stays':[[4,2],[9,2]],'pops':[[9,2],[5,2]],'oftentimes':[[12,2]],'infinite':[[12,2]],'немодальное':[[22,2]],'loop':[[12,6],[14,4],[7,2]],'мувиком':[[22,2]],'сохранениями':[[22,2]],'doesn':[[11,8],[19,4],[12,4],[16,2],[20,2],[8,2],[9,2],[14,4],[15,4],[23,6],[6,6],[24,14],[25,4],[10,4],[18,6],[7,2]],'указывает':[[22,10]],'поле':[[22,12]],'скорости':[[22,4]],'видах':[[22,2]],'расположению':[[22,2]],'dissect':[[14,2]],'Возможно':[[22,2]],'массово':[[22,2]],'distinction':[[7,2]],'evolutionary':[[7,2]],'остальных':[[22,6]],'Маркеров':[[22,14]],'операции':[[22,14]],'сформировалось':[[22,2]],'определённом':[[22,2]],'mentioned':[[23,2]],'retype':[[2,2]],'клавиатурные':[[22,4]],'цифровыми':[[22,4]],'3rd':[[20,2],[10,4],[25,2],[5,2]],'sorry':[[6,2]],'раздела':[[22,2]],'продуктивного':[[22,2]],'regain':[[6,2]],'modified':[[12,2],[10,2],[11,4],[18,2]],'закладками':[[22,2]],'higher':[[4,2],[7,2],[20,2],[2,2],[6,2]],'same':[[19,2],[12,8],[16,6],[20,12],[5,20],[17,2],[9,4],[14,2],[15,12],[23,2],[6,18],[2,8],[4,12],[24,6],[25,4],[10,6],[11,22],[7,14]],'satisfied':[[20,2],[6,2],[8,2]],'голову':[[22,2]],'atmosphere':[[2,2]],'кнопку':[[22,10]],'chosen':[[11,2],[5,6],[17,4],[21,2],[6,10],[4,6],[12,4],[7,2],[8,2]],'thorough':[[14,2]],'branch4':[[17,4]],'easiest':[[20,2]],'который':[[22,8]],'additionally':[[10,2],[7,2],[24,2]],'was':[[18,6],[19,6],[12,8],[16,4],[20,2],[5,20],[17,36],[9,6],[14,6],[15,12],[21,2],[6,10],[2,12],[4,10],[23,14],[24,6],[25,18],[10,8],[11,8],[7,2]],'manage':[[8,2]],'undoing':[[9,2]],'проигрываемый':[[22,2]],'yellow':[[4,4],[14,2],[11,4]],'pits':[[6,2]],'releases':[[12,4],[5,2]],'setplayback':[[18,4]],'elaborate':[[7,2]],'значения':[[22,18]],'romfilename':[[25,2]],'achieve':[[6,2],[7,2]],'sweat':[[6,4]],'tested':[[20,2],[5,2]],'has':[[12,2],[16,2],[20,2],[5,20],[17,2],[9,2],[14,2],[25,2],[6,10],[24,2],[4,4],[10,2],[18,4],[11,8]],'picked':[[15,2]],'создан':[[22,4]],'участков':[[22,4]],'которых':[[22,16]],'volume':[[9,2],[15,6]],'Для':[[22,44]],'нажатии':[[22,18]],'fast':[[7,2],[9,2],[14,2],[6,4],[12,2],[16,2],[20,2],[11,2],[5,6]],'двух':[[22,8]],'навигация':[[22,4]],'взаимосвязей':[[22,2]],'simulate':[[24,2]],'inaccuracy':[[14,2]],'данном':[[22,4]],'fully':[[24,2],[23,2]],'mechanisms':[[7,2]],'inevitably':[[6,2]],'again':[[9,4],[6,2],[24,2],[4,4],[12,2],[11,8],[5,6]],'thinking':[[6,4],[9,2],[8,2],[2,8]],'code':[[15,2],[14,4],[21,10],[19,6],[2,10],[23,18],[25,8],[12,20],[18,2]],'excessively':[[6,2]],'кадра':[[22,152]],'скроллироваться':[[22,2]],'время':[[22,40]],'Прототип':[[22,2]],'которой':[[22,10]],'несжатом':[[22,4]],'снимка':[[22,4]],'Теплокарту':[[22,2]],'выявления':[[22,2]],'второго':[[22,12]],'solved':[[12,2],[14,2]],'aimed':[[14,2]],'соседние':[[22,2]],'Отключение':[[22,2]],'внесения':[[22,2]],'eliminate':[[6,2],[14,2]],'shortcut':[[6,2]],'numeric':[[12,2],[11,6],[5,2]],'далее':[[22,2]],'devices':[[25,6]],'fixed':[[14,6],[25,2],[19,2],[6,2],[7,10]],'reports':[[25,4]],'область':[[22,6]],'reveals':[[6,2],[21,2]],'measuring':[[14,4],[6,2],[5,2]],'point':[[12,2],[16,2],[20,2],[8,2],[15,10],[23,12],[2,2],[6,6],[4,6],[10,2],[11,8],[7,4]],'respective':[[15,2],[14,6],[23,6],[25,2],[20,2],[11,6],[5,2]],'backup_bookmarks':[[23,2]],'beforehand':[[7,2],[5,2]],'старые':[[22,12]],'one':[[18,14],[19,2],[12,24],[16,6],[20,8],[8,14],[5,28],[17,34],[9,8],[14,22],[15,8],[23,10],[6,24],[2,8],[4,22],[24,8],[3,2],[10,6],[11,8],[7,14]],'signals':[[23,2]],'перетаскивать':[[22,4]],'unboundedness':[[14,2]],'variable':[[25,4],[12,2]],'помощью':[[22,28]],'нажата':[[22,6]],'мало':[[22,2]],'Файл':[[22,2]],'positioning':[[10,2]],'другое':[[22,2]],'меняет':[[22,8]],'Сохраняет':[[22,2]],'берёт':[[22,4]],'имеет':[[22,18]],'instead':[[11,6],[19,2],[20,2],[5,12],[17,2],[9,4],[14,2],[15,6],[23,2],[6,6],[24,2],[4,4],[18,2],[7,10]],'entertaining':[[7,2]],'скриптов':[[22,2]],'фиолетового':[[22,2]],'текущее':[[22,16]],'часть':[[22,12]],'guid':[[25,2]],'advisable':[[3,2]],'создаётся':[[22,4]],'поиск':[[22,14]],'property':[[20,6]],'кнопка':[[22,18]],'Ввод':[[22,66]],'speedrunner':[[6,2]],'order':[[7,2],[19,2],[12,12],[8,8],[9,14],[14,2],[23,2],[25,6],[2,8],[6,16],[4,4],[24,6],[10,2],[11,10],[18,4]],'fuzzy':[[4,2],[6,4]],'subsegment':[[6,2]],'youtube':[[12,2],[14,2]],'numbered':[[4,2],[14,2],[5,2]],'performed':[[14,2]],'levels':[[5,2],[22,2],[6,10],[2,4],[24,2],[12,2],[3,2],[8,2],[11,8]],'represents':[[14,2]],'после':[[22,44]],'tools':[[18,4],[14,6],[6,2],[2,12],[12,4],[3,2],[8,4],[5,2]],'polished':[[6,2],[12,2]],'скроллируется':[[22,10]],'chose':[[11,4],[23,2]],'claim':[[12,2]],'tags':[[12,2]],'занимает':[[22,8]],'головы':[[22,10]],'accuracy':[[2,2]],'contradicts':[[6,2]],'tweaking':[[10,2]],'начале':[[22,6]],'open':[[17,2],[15,24],[1,2],[14,2],[21,2],[6,4],[24,12],[12,14],[16,2],[3,6],[11,12]],'экономии':[[22,2]],'pagedown':[[15,6]],'новые':[[22,6]],'ближайшего':[[22,2]],'progress':[[5,10],[8,2],[7,4],[6,6]],'равного':[[22,2]],'button':[[18,12],[19,2],[12,50],[16,20],[8,2],[5,76],[17,12],[9,20],[14,10],[15,82],[23,12],[6,26],[2,4],[4,46],[24,16],[25,12],[10,22],[11,18],[7,4]],'yourself':[[9,2],[6,2],[2,2],[12,4],[7,2],[5,2]],'трёх':[[22,2]],'отдельном':[[22,2]],'одинаковое':[[22,2]],'смещается':[[22,2]],'timing':[[25,2],[23,2]],'contrary':[[6,4]],'сдвигать':[[22,2]],'conflict':[[24,2]],'watching':[[19,2],[12,2],[20,2],[8,8],[5,6],[9,20],[14,4],[6,8],[2,2],[4,2],[10,10],[11,6],[7,10]],'столбцами':[[22,4]],'традиционного':[[22,2]],'кадру':[[22,8]],'countdown':[[14,2]],'wrong':[[7,2],[6,4],[12,2],[10,2],[8,2],[5,2]],'inserting':[[9,2],[23,2],[19,2],[11,2]],'она':[[22,14]],'documented':[[2,2]],'шаблонов':[[22,4]],'resets':[[6,2],[23,2]],'kept':[[5,6],[11,2],[6,2]],'статике':[[22,2]],'keep':[[19,2],[12,10],[20,8],[5,2],[9,2],[6,10],[2,6],[4,2],[24,2],[3,2],[18,4],[7,6]],'hover':[[15,8],[11,4],[5,4]],'пропускам':[[22,2]],'strives':[[14,2]],'макроса':[[22,2]],'loads':[[23,24],[14,2],[7,8],[24,2]],'obsolete':[[10,2]],'following':[[19,2],[5,2],[17,8],[15,4],[14,2],[23,4],[25,14],[6,6],[2,4],[4,4],[24,8],[3,2],[18,2],[11,2]],'массиве':[[22,4]],'cutscene':[[6,2]],'последующие':[[22,2]],'значит':[[22,2]],'замедляет':[[22,2]],'programmers':[[2,2]],'subconsciously':[[9,2]],'intact':[[19,2],[11,2]],'Можно':[[22,8]],'skill':[[12,2],[6,4],[8,4]],'stumbling':[[7,2]],'exhaustive':[[13,2],[14,2]],'Благодаря':[[22,10]],'understand':[[12,4],[21,2],[10,2],[7,2]],'describes':[[21,2],[1,2],[6,2],[12,2],[3,2],[11,6]],'возможной':[[22,2]],'ensure':[[5,2],[24,2],[7,2],[6,2]],'Возможна':[[22,2]],'красиво':[[22,2]],'blinking':[[5,6]],'Блокноте':[[22,2]],'advantageous':[[20,2],[10,2],[7,4],[8,2]],'decisions':[[10,6],[6,4],[8,4]],'answers':[[13,2]],'disregarding':[[5,2]],'comment':[[25,6],[7,10]],'года':[[22,2]],'checksum':[[24,10]],'just':[[19,2],[12,8],[20,6],[5,14],[9,4],[14,2],[15,4],[25,2],[6,20],[2,16],[4,26],[24,2],[3,2],[10,6],[11,20],[7,18]],'synopsis':[[13,2],[20,4],[0,2]],'footage':[[14,2],[5,2]],'shouting':[[14,2]],'могут':[[22,6]],'такая':[[22,4]],'major':[[15,2],[16,2],[21,2],[2,2]],'obligatory':[[11,2]],'увеличится':[[22,2]],'laglog':[[23,10]],'option':[[11,72],[7,4],[23,2],[19,8],[12,12],[16,4],[18,4],[5,10]],'кадрам':[[22,2]],'sequencing':[[4,2]],'without':[[12,16],[16,2],[8,12],[5,6],[9,4],[14,8],[15,2],[23,2],[6,4],[2,6],[24,4],[11,12],[7,6]],'вставке':[[22,4]],'pretty':[[12,4],[20,2],[2,2]],'создавая':[[22,2]],'быстрее':[[22,2]],'snowslide':[[6,2]],'polishing':[[9,4],[14,2],[6,6],[12,2],[20,2],[10,4],[7,4],[8,6]],'gigantic':[[20,2]],'approaches':[[7,4],[11,6],[9,10],[14,4],[6,8],[20,32],[10,14],[8,14],[5,6]],'rely':[[9,2],[20,4],[6,2]],'thoughtful':[[7,2]],'playarounds':[[14,2]],'hardware':[[15,4],[14,2],[23,4],[19,2],[18,2]],'редакторе':[[22,2]],'запуская':[[22,2]],'denying':[[14,4]],'implemented':[[23,2],[10,2],[2,2]],'ответвлениях':[[22,4]],'containers':[[14,2]],'navigation':[[19,2],[0,2],[13,2],[16,20],[8,14],[5,6],[9,6],[14,10],[15,4],[23,4],[2,2],[24,4],[4,4],[10,6],[11,10],[7,16]],'ideas':[[5,2],[9,6],[21,4],[22,4],[6,4],[0,2],[2,2],[12,2],[10,8],[7,4],[8,6]],'confident':[[6,4]],'tutorial':[[19,2],[2,2]],'seek':[[9,4],[10,4],[25,2],[5,6]],'pays':[[10,2]],'activated':[[10,2],[12,2]],'poweron':[[18,2]],'других':[[22,6]],'impractical':[[9,2],[11,4]],'желаемому':[[22,4]],'следует':[[22,4]],'звучали':[[22,2]],'нижний':[[22,4]],'нужный':[[22,2]],'backups':[[8,4]],'эмулятор':[[22,12]],'скроллировать':[[22,4]],'нетронутыми':[[22,2]],'activate':[[4,6],[12,2],[15,2]],'умещалась':[[22,2]],'родителей':[[22,4]],'ключевого':[[22,2]],'региона':[[22,4]],'identification':[[2,2]],'experienced':[[6,4],[7,8],[1,2],[2,4],[5,2]],'emerged':[[6,2]],'containing':[[17,4],[15,8],[14,6],[6,2],[24,2],[4,2],[12,2],[16,2],[18,2],[5,2]],'dispirit':[[6,2]],'рисовании':[[22,6]],'reject':[[9,2]],'lists':[[24,2]],'сработать':[[22,2]],'trial':[[9,2],[14,2],[10,4]],'know':[[9,2],[6,4],[2,2],[0,2],[12,10],[3,2],[10,6],[7,4],[18,2]],'progression':[[14,2]],'определить':[[22,12]],'gradient':[[23,4]],'subsequent':[[7,2]],'заполняются':[[22,2]],'положение':[[22,12]],'reaching':[[23,2],[6,6],[8,4]],'prevent':[[24,2],[12,2],[3,2],[11,2],[5,4]],'рабочего':[[22,4]],'unselected':[[15,2]],'поиске':[[22,2]],'unless':[[12,2],[25,2],[11,6]],'inconvenient':[[7,2],[11,2]],'полученный':[[22,2]],'add':[[23,4],[6,2],[4,2],[12,2],[11,2],[5,2]],'issues':[[13,2]],'sounds':[[6,2],[7,2]],'понадобилось':[[22,2]],'combinations':[[12,2],[15,4],[3,2],[6,2],[5,4]],'лаге':[[22,16]],'described':[[5,6],[14,2],[6,2],[4,2],[12,4],[16,2],[3,6],[7,6],[11,2]],'discovered':[[14,2]],'recalculating':[[23,2]],'marking':[[6,4],[9,2]],'savestates':[[8,10],[11,4],[14,2],[23,18],[25,2],[6,4],[2,2],[24,10],[12,2],[7,10],[5,6]],'allowing':[[8,4],[11,6],[14,2],[6,2],[2,4],[12,4],[16,2],[10,2],[7,4],[5,4]],'выбранному':[[22,2]],'available':[[18,2],[24,2],[12,4],[7,2],[5,6]],'регулярно':[[22,2]],'format':[[21,2],[23,2],[25,30],[24,10],[2,2],[0,2],[12,18]],'кнопках':[[22,2]],'matter':[[5,2],[11,2],[15,2],[6,2],[2,2]],'done':[[8,4],[17,2],[15,6],[18,16],[23,2],[19,4],[2,2],[12,2],[7,4],[11,14]],'optimal':[[14,4],[6,4],[12,2],[20,4],[10,2],[7,4]],'участку':[[22,2]],'сброс':[[22,4]],'index':[[4,2],[18,22]],'several':[[7,10],[12,12],[8,2],[5,6],[17,18],[15,4],[25,4],[6,12],[2,4],[4,10],[10,4],[11,8],[18,6]],'hot':[[4,4],[23,14],[19,2],[11,14]],'need':[[0,2],[12,36],[16,42],[20,4],[8,10],[5,16],[9,10],[15,10],[21,4],[23,2],[6,10],[2,6],[4,6],[24,2],[25,2],[10,16],[11,28],[7,18]],'length':[[23,4],[25,10],[5,2]],'enrich':[[7,2]],'зажатой':[[22,2]],'subdivide':[[6,2]],'words':[[25,2],[12,12]],'resembling':[[12,2]],'don':[[18,6],[12,16],[8,8],[5,4],[17,2],[9,4],[14,6],[23,2],[6,32],[2,4],[4,10],[24,8],[3,2],[10,2],[11,18],[7,8]],'obstruct':[[19,2]],'перемещая':[[22,2]],'accounted':[[11,2]],'Тасэдиторе':[[22,12]],'ответвлениями':[[22,6]],'скроллбаров':[[22,2]],'readability':[[2,4]],'unbroken':[[6,2]],'stumbled':[[6,2]],'forums':[[2,4],[12,2]],'dialog':[[15,2],[23,4],[11,6],[24,12]],'каждого':[[22,26]],'голубого':[[22,8]],'rerecords':[[6,2],[14,2],[7,2],[2,2]],'sure':[[11,4],[18,2],[9,2],[19,2],[6,2],[12,4],[20,2],[3,2],[10,2],[7,4],[5,4]],'Многообразие':[[22,2]],'compared':[[6,2],[14,2]],'затем':[[22,16]],'этим':[[22,10]],'designers':[[6,2]],'Дерево':[[22,4]],'всем':[[22,2]],'всеми':[[22,2]],'всплывающее':[[22,2]],'mark':[[9,10],[14,4],[15,2],[19,2],[6,10],[23,2],[4,2],[24,2]],'arriving':[[7,2]],'inputlog':[[23,12]],'Строки':[[22,8]],'rewinding':[[15,2],[23,2],[16,4]],'cancel':[[15,4],[23,6],[24,14],[4,2],[11,4],[5,4]],'rename':[[17,12]],'muscle':[[16,2]],'soft':[[25,4]],'красную':[[22,2]],'pair':[[20,2]],'соответствуют':[[22,4]],'как':[[22,74]],'Виртуальный':[[22,12]],'updates':[[18,2],[23,36]],'stage':[[6,6]],'журналирование':[[22,4]],'Эти':[[22,4]],'conditions':[[12,2],[14,4],[23,2],[6,4]],'отображать':[[22,6]],'формате':[[22,2]],'span':[[11,2]],'workarounds':[[2,2]],'Столбцы':[[22,6]],'devote':[[4,2],[10,2]],'bored':[[10,2],[12,2]],'generated':[[25,2]],'проверку':[[22,4]],'amusement':[[6,2]],'200':[[8,2],[11,8],[6,6]],'Процесс':[[22,2]],'carelessly':[[7,2]],'repaid':[[12,2]],'disassembly':[[14,2]],'loses':[[23,2]],'колонки':[[22,22]],'bumping':[[9,2]],'соответствующие':[[22,10]],'направление':[[22,2]],'debugger':[[15,2]],'отдельные':[[22,2]],'case':[[11,6],[7,12],[14,2],[6,6],[24,6],[12,8],[20,2],[8,2],[5,6]],'gains':[[7,2],[23,2]],'http':[[12,2],[21,2]],'начал':[[22,2]],'clearly':[[12,2],[6,2],[7,2]],'исчезает':[[22,2]],'quantity':[[14,2]],'символом':[[22,2]],'сотней':[[22,2]],'настроил':[[22,2]],'always':[[12,6],[16,4],[20,6],[8,4],[5,10],[9,6],[14,2],[15,4],[23,4],[6,12],[2,4],[4,6],[24,8],[25,10],[10,2],[11,6],[7,10]],'wall':[[6,6],[9,4]],'preferred':[[4,2],[5,4]],'входные':[[22,2]],'intervals':[[6,6],[12,2]],'nuances':[[21,2]],'слишком':[[22,6]],'однако':[[22,10]],'хранящая':[[22,2]],'alternative':[[16,4],[20,2],[8,2],[5,12],[9,2],[14,2],[15,2],[23,2],[6,2],[2,2],[4,2],[24,2],[11,4],[7,6]],'поздние':[[22,2]],'каналу':[[22,2]],'minute':[[9,2],[11,4],[6,2]],'традиции':[[22,2]],'неопределёнными':[[22,2]],'следующее':[[22,2]],'придётся':[[22,2]],'workspace':[[3,2],[4,2]],'perfectly':[[12,2],[6,2],[8,2]],'Заголовке':[[22,12]],'desired':[[24,2],[16,4],[11,2],[5,8]],'dipswitch':[[24,2]],'someone':[[2,2],[8,2]],'flashes':[[17,4],[23,4],[11,2],[5,4]],'остановки':[[22,2]],'виртуальных':[[22,2]],'pairs':[[25,4]],'most':[[19,2],[12,18],[16,4],[20,6],[8,2],[5,6],[9,4],[14,6],[15,2],[6,16],[2,18],[4,10],[3,2],[10,2],[11,10],[7,6]],'occupy':[[11,2]],'since':[[19,6],[12,8],[8,6],[5,4],[9,6],[15,2],[23,4],[6,8],[2,4],[24,14],[10,4],[11,8],[7,4]],'leads':[[4,2],[14,2],[7,2]],'expect':[[6,2]],'getrecordermode':[[18,4]],'стирать':[[22,2]],'Кроме':[[22,20]],'были':[[22,18]],'остаётся':[[22,8]],'чертой':[[22,2]],'emulated':[[15,2],[14,8],[23,4],[6,2],[4,2],[12,2],[16,2],[11,4],[5,4]],'bookmark8':[[17,2]],'worse':[[9,6],[20,2],[7,2]],'partially':[[12,2],[24,2],[11,4]],'отключить':[[22,8]],'shifting':[[5,4],[17,8],[11,6],[6,2]],'assumed':[[20,2]],'view':[[22,2],[14,2],[19,4],[2,4],[24,4],[16,4],[3,2],[11,18],[5,14]],'stages':[[6,2]],'bottom':[[12,2],[16,2],[5,2]],'Пользователь':[[22,2]],'compensating':[[2,2]],'Записи':[[22,12]],'regard':[[6,4]],'process':[[1,4],[19,2],[0,2],[12,10],[20,8],[8,4],[5,14],[17,4],[9,4],[14,10],[23,6],[6,24],[2,12],[4,2],[10,8],[11,8],[7,10]],'counter':[[15,8],[14,2],[6,12],[2,6],[18,2],[11,2]],'родителем':[[22,4]],'formatting':[[12,2]],'unavailable':[[24,2]],'examination':[[10,2],[7,2]],'might':[[4,4],[20,2],[6,2],[5,2]],'strict':[[14,2],[2,2],[5,2]],'removing':[[4,4],[14,2],[23,2],[11,2],[5,4]],'pile':[[18,2]],'carefree':[[6,2]],'приставки':[[22,8]],'falls':[[10,2],[9,2]],'faster':[[15,4],[14,2],[23,2],[6,4],[2,4],[12,2],[20,6],[10,2],[8,2],[7,2]],'Столбец':[[22,2]],'documenting':[[11,2]],'accelerator':[[15,6],[23,2],[5,2]],'подучастке':[[22,2]],'увеличиваться':[[22,4]],'Джойстике':[[22,2]],'aim':[[24,2]],'начала':[[22,8]],'granted':[[17,10],[9,4],[6,2],[2,2],[12,2],[8,2],[5,2]],'удобного':[[22,2]],'раскрытии':[[22,2]],'соседствующих':[[22,2]],'output':[[22,2],[14,20],[23,2],[12,4],[20,2],[3,2],[11,6],[5,2]],'meditate':[[10,2]],'expands':[[8,2],[5,2]],'smoothly':[[2,2]],'surpass':[[7,2]],'прежнему':[[22,2]],'comfortable':[[23,2],[2,2],[6,4]],'excitement':[[6,2]],'coherent':[[2,2]],'мувик':[[22,34]],'сэйву':[[22,2]],'appending':[[15,2],[14,2]],'Загружаются':[[22,2]],'поиска':[[22,6]],'symbolizes':[[5,2]],'tell':[[4,2],[10,2],[5,2]],'Затем':[[22,6]],'files':[[14,4],[23,8],[19,2],[2,8],[24,6],[25,6],[12,8],[11,6],[5,2]],'первого':[[22,16]],'перетаскивании':[[22,4]],'даёт':[[22,2]],'ничем':[[22,2]],'Вызывается':[[22,4]],'tases':[[8,2],[11,2],[14,4],[6,4],[2,2],[7,2],[5,2]],'browse':[[12,2]],'unnoticed':[[7,2]],'sole':[[4,2]],'parts':[[15,2],[14,2],[25,2],[6,10],[4,2],[12,2],[3,2],[7,2]],'rarefication':[[11,2]],'0x3ad':[[12,4]],'outline':[[14,2]],'дальнейшем':[[22,4]],'опубликования':[[22,2]],'скриптам':[[22,2]],'ситуациях':[[22,2]],'trace':[[12,2],[15,2]],'marks':[[4,2],[14,4]],'зависимости':[[22,6]],'если':[[22,56]],'события':[[22,8]],'зажатым':[[22,2]],'edits':[[4,2],[11,6],[23,2],[2,2],[5,2]],'описан':[[22,2]],'пограничные':[[22,2]],'annoyed':[[11,4]],'coincide':[[14,2]],'данная':[[22,4]],'soon':[[4,2],[23,2],[10,2]],'save':[[19,4],[12,24],[20,8],[8,6],[5,8],[17,2],[9,6],[14,4],[15,28],[23,16],[2,4],[24,32],[25,8],[10,4],[7,6],[11,18]],'discover':[[6,4]],'buttonpresses':[[19,6],[12,4],[5,22],[17,18],[9,2],[15,2],[23,4],[6,6],[4,12],[10,4],[11,16],[7,8]],'конце':[[22,2]],'spectrum':[[10,2]],'0000020':[[4,2]],'modifying':[[9,6],[14,2],[23,2],[6,2],[7,2]],'correctly':[[7,2],[11,4]],'градаций':[[22,4]],'цветами':[[22,14]],'регистрируется':[[22,2]],'мультитач':[[22,2]],'intercepts':[[23,2]],'super':[[4,2],[12,2],[14,2],[6,6],[5,2]],'extension':[[12,2],[25,2],[24,2],[2,2]],'extreme':[[6,2]],'habitual':[[6,2],[7,2]],'question':[[15,2],[24,2],[6,2],[2,2],[7,4],[5,2]],'also':[[18,6],[19,4],[12,24],[16,8],[20,2],[8,7],[5,20],[9,4],[14,6],[15,10],[23,36],[6,20],[2,8],[4,14],[24,8],[25,2],[3,6],[10,8],[11,22],[7,8]],'хранятся':[[22,6]],'cursory':[[3,2],[4,2]],'timesavers':[[14,4]],'analysis':[[12,2],[14,2],[3,2],[16,2],[2,4]],'labeled':[[16,2],[5,2]],'положения':[[22,2]],'сверяет':[[22,2]],'overcoming':[[6,2]],'строк':[[22,28]],'замещаются':[[22,2]],'цветам':[[22,2]],'создаются':[[22,2]],'колеса':[[22,12]],'cut':[[17,10],[15,4],[5,2]],'rectangle':[[12,2]],'perfectness':[[6,6],[7,2]],'второй':[[22,8]],'replayed':[[9,2],[11,2]],'подучастка':[[22,2]],'down':[[19,2],[12,6],[16,24],[8,2],[5,36],[17,10],[9,8],[14,4],[15,32],[22,2],[6,4],[2,2],[4,24],[24,4],[25,6],[10,2],[11,16],[18,6]],'joysticks':[[23,2]],'Вниз':[[22,2]],'rapid':[[8,2]],'понадобиться':[[22,2]],'событие':[[22,6]],'Стобец':[[22,2]],'Выделенные':[[22,2]],'entitled':[[12,2]],'facepalms':[[6,2]],'cleaning':[[11,4],[23,6]],'hitting':[[5,2]],'graphical':[[20,2],[5,2]],'downside':[[7,2],[11,2]],'details':[[15,2],[21,4],[19,2],[24,2],[0,2],[4,2],[12,4],[20,8]],'предыдущему':[[22,2]],'видение':[[22,2]],'possibilities':[[11,2],[9,2],[1,2],[6,8],[0,2],[12,2],[7,2],[8,4]],'fm3':[[17,2],[21,2],[22,10],[23,2],[19,4],[2,4],[0,2],[24,18],[25,20],[12,34],[11,12]],'revealed':[[6,2],[7,2]],'decide':[[4,2],[20,4],[8,2],[11,4]],'tiny':[[3,2]],'unsuccessful':[[6,2]],'wrote':[[11,2],[12,2]],'идеей':[[22,2]],'даже':[[22,18]],'translation':[[0,2]],'navigating':[[16,2],[10,2],[7,6],[8,2]],'всё':[[22,6]],'минимум':[[22,8]],'обнаруживается':[[22,2]],'objectivity':[[2,2],[9,2]],'approach':[[12,8],[20,68],[8,20],[5,2],[9,18],[14,2],[15,2],[6,26],[2,4],[10,12],[11,10],[7,16]],'criterion':[[9,6],[14,4],[6,24],[10,4],[7,4],[8,4]],'вокруг':[[22,2]],'asked':[[18,2]],'добегания':[[22,18]],'Промежутки':[[22,2]],'представлять':[[22,2]],'bookmarkx':[[25,2]],'стрелкой':[[22,2]],'Информация':[[22,6]],'playing':[[5,12],[11,10],[9,2],[14,4],[6,16],[0,2],[2,2],[24,6],[20,8],[7,6],[8,14]],'срабатывающий':[[22,2]],'added':[[17,24],[25,8],[19,2],[4,2],[12,4],[3,2]],'intermediate':[[5,2],[8,4],[6,4]],'предыдущем':[[22,2]],'incites':[[10,2],[2,2]],'pipes':[[6,6]],'remove':[[17,14],[9,2],[15,14],[23,2],[6,2],[4,10],[10,2],[11,8]],'feature':[[5,4],[18,2],[15,4],[14,6],[23,4],[19,2],[4,6],[12,6],[11,20],[8,2]],'observations':[[6,2]],'mindset':[[6,2]],'convert':[[12,4]],'parameters':[[23,2]],'вспыхивают':[[22,2]],'event':[[12,4],[16,2],[20,34],[8,6],[5,2],[9,18],[14,4],[6,26],[2,2],[4,2],[10,4],[11,2],[7,2]],'aloof':[[6,2]],'shape':[[2,2]],'discoveries':[[6,4]],'capacity':[[23,2],[24,6],[11,10]],'внимание':[[22,6]],'лишь':[[22,2]],'старый':[[22,4]],'professionnelle':[[2,2]],'expected':[[14,2],[2,2],[6,4],[12,4],[13,2],[20,2]],'delayed':[[9,2],[14,4],[2,2]],'member':[[15,2]],'variations':[[10,2]],'наследникам':[[22,2]],'загружаются':[[22,6]],'высокий':[[22,2]],'fragment':[[6,2],[5,2]],'заданий':[[22,2]],'unregistered':[[6,2]],'последовательность':[[22,6]],'изменений':[[22,20]],'хронологическую':[[22,2]],'относительными':[[22,2]],'редких':[[22,2]],'copies':[[17,2],[12,2],[7,2],[5,6]],'продолжается':[[22,2]],'вполне':[[22,2]],'shown':[[4,2],[11,2],[18,2]],'walkthrough':[[6,6],[14,12]],'almost':[[9,2],[14,2],[2,4],[4,6],[10,2],[11,2],[7,4]],'connect':[[5,4]],'published':[[6,2],[12,2]],'standards':[[12,2]],'должно':[[22,2]],'fade':[[23,2]],'звёздочка':[[22,2]],'spirit':[[2,2]],'notepad':[[12,2],[3,2],[2,2]],'part':[[1,2],[19,2],[12,8],[16,2],[5,10],[9,2],[14,2],[6,12],[2,4],[4,8],[3,2],[11,6],[7,2]],'gives':[[11,2]],'html':[[12,2]],'forming':[[5,2]],'specs':[[14,12]],'игнорируя':[[22,2]],'скриншотов':[[22,2]],'shine':[[11,2]],'reload':[[15,8],[24,2],[11,8]],'launched':[[12,2],[10,2],[2,2]],'отката':[[22,8]],'tap':[[4,2],[15,4],[5,2]],'min':[[23,2]],'vice':[[15,2],[16,2]],'наведении':[[22,2]],'провести':[[22,2]],'segments':[[12,14],[16,6],[20,14],[8,6],[5,4],[9,6],[14,4],[15,2],[6,38],[2,2],[10,4],[11,2],[7,6]],'jumped':[[6,4]],'methods':[[5,2],[1,4],[6,2],[2,4],[7,8],[11,2]],'клавиши':[[22,2]],'Нажатая':[[22,2]],'combines':[[11,4]],'sweeping':[[11,2]],'direct':[[14,2],[6,2],[2,4],[3,2],[7,2],[5,2]],'mariox':[[12,6]],'stroke':[[17,2],[11,2],[5,2]],'formulating':[[23,2]],'animating':[[23,4]],'updated':[[9,2]],'просмотренном':[[22,2]],'неактуальное':[[22,2]],'Вносятся':[[22,2]],'сравнение':[[22,4]],'unpauses':[[7,2]],'pattern':[[17,20],[15,6],[14,2],[23,4],[25,2],[12,30],[3,4],[11,10],[5,12]],'videogames':[[14,6],[6,2],[0,2],[12,2],[10,2],[8,2],[7,2]],'начальное':[[22,2]],'Окончательное':[[22,2]],'videos':[[6,2],[14,4]],'Журнала':[[22,40]],'finished':[[5,2],[11,6],[9,4],[14,2],[6,6],[2,2],[4,2],[10,4],[7,2],[8,6]],'просматривая':[[22,4]],'пункта':[[22,30]],'существенных':[[22,2]],'Гринзону':[[22,8]],'f10':[[17,6],[8,2],[15,4],[7,2],[24,2],[11,6],[5,6]],'associated':[[9,2],[14,2],[25,2]],'очень':[[22,4]],'replaying':[[8,2],[25,2],[6,2],[12,4],[20,4],[11,2],[5,4]],'прямоугольника':[[22,2]],'выделенного':[[22,4]],'000020':[[22,2]],'менять':[[22,6]],'live':[[6,2],[14,2]],'cope':[[6,2]],'просмотру':[[22,6]],'Шаблоны':[[22,4]],'being':[[17,2],[15,2],[2,4],[12,4],[20,2],[7,6],[5,2]],'экране':[[22,8]],'бледно':[[22,2]],'brainer':[[12,2]],'полученных':[[22,2]],'conventions':[[2,2]],'усечение':[[22,8]],'нескольких':[[22,2]],'вида':[[22,4]],'последовательностей':[[22,2]],'submenu':[[11,6]],'Шаблонов':[[22,2]],'заголовку':[[22,2]],'Дерева':[[22,4]],'Состояние':[[22,2]],'peculiarity':[[6,2]],'rewatch':[[7,4],[9,2],[8,2],[6,2]],'fear':[[9,2]],'шлюза':[[22,2]],'comprehension':[[5,2]],'remind':[[25,2],[11,4]],'полусекунды':[[22,4]],'красные':[[22,4]],'перестают':[[22,2]],'facilitate':[[4,2],[19,4],[5,2]],'finger':[[4,4],[6,2],[8,2]],'today':[[12,2]],'completed':[[7,2]],'заменить':[[22,2]],'taseditor_project':[[23,2]],'ascending':[[18,2]],'keyboard':[[5,20],[15,14],[23,2],[19,2],[2,4],[4,6],[7,6],[11,10]],'radiobutton':[[11,2]],'дорабатывалось':[[22,2]],'rewind':[[9,6],[14,2],[15,4],[19,2],[4,2],[16,4],[11,6],[5,8]],'playthroughs':[[6,2],[5,4]],'эстетическую':[[22,2]],'future':[[9,2],[14,2],[6,2],[10,2],[11,2],[8,2]],'considerable':[[3,2],[6,4],[11,2]],'timings':[[23,10]],'наведя':[[22,2]],'аналогичен':[[22,4]],'кадре':[[22,80]],'бледным':[[22,2]],'tries':[[24,2],[23,2]],'watch':[[12,10],[16,4],[20,10],[8,2],[5,2],[9,12],[14,4],[15,6],[22,2],[6,12],[2,2],[4,2],[3,2],[10,4],[7,6]],'feel':[[9,2],[19,2],[6,8],[2,2],[12,2],[10,2],[7,2],[5,2]],'motivates':[[6,2],[7,2]],'remember':[[5,2],[6,2],[4,4],[12,6],[16,4],[7,2],[11,2]],'advanced':[[1,2],[14,8],[19,2],[0,2],[12,4],[16,2],[18,2],[5,2]],'orientation':[[12,2]],'них':[[22,4]],'откатах':[[22,2]],'organize':[[14,2]],'mechanically':[[6,2],[8,2],[7,2],[2,2]],'scrolls':[[23,4],[16,8],[11,6]],'максимальный':[[22,14]],'визуальное':[[22,2]],'location':[[2,2]],'pointed':[[7,2],[15,2]],'вероятнее':[[22,2]],'отводятся':[[22,2]],'tasers':[[5,6],[11,4],[1,2],[14,10],[6,16],[2,2],[12,2],[20,2],[7,16],[8,4]],'ids':[[17,2],[23,10]],'Заголовку':[[22,8]],'обнаруженным':[[22,2]],'looking':[[4,2],[8,2]],'reselect':[[15,2],[23,2]],'hourglass':[[24,2]],'retreat':[[7,2],[8,2]],'patience':[[2,2]],'defeating':[[6,2]],'powered':[[20,2]],'course':[[11,2],[1,2],[6,6],[2,2],[0,2],[10,2],[7,6],[5,2]],'иконкой':[[22,8]],'прямоугольной':[[22,4]],'сохранённой':[[22,2]],'элементы':[[22,6]],'просмотренного':[[22,2]],'offset':[[25,4]],'самом':[[22,4]],'plans':[[5,2],[6,2],[2,2]],'hacks':[[2,2]],'помещает':[[22,2]],'perfunctory':[[9,2]],'заканчивается':[[22,2]],'armed':[[12,2]],'players':[[5,2],[14,2],[19,2],[6,4],[2,2],[4,2],[12,4],[7,4],[11,2]],'оптимальности':[[22,4]],'нажатиях':[[22,4]],'relieved':[[12,2]],'supported':[[25,6],[19,2],[24,4]],'base':[[7,2],[12,2],[14,2],[8,2],[6,2]],'internal':[[25,8],[6,2]],'чётко':[[22,2]],'отсутствие':[[22,2]],'моменту':[[22,2]],'планируется':[[22,2]],'selectiox':[[25,2]],'gamepads':[[17,4],[25,2],[5,4]],'alternate':[[11,8],[12,2],[10,2],[8,2],[5,2]],'constitutes':[[12,2]],'mit':[[21,2]],'cultivate':[[8,2]],'количество':[[22,14]],'расположены':[[22,2]],'interactive':[[2,2],[0,2]],'issue':[[19,2],[6,2]],'worsening':[[9,2]],'int32':[[25,8]],'informs':[[4,2],[24,2]],'sequentially':[[7,2],[14,4]],'Формат':[[22,4]],'stick':[[12,2],[14,2],[10,2],[16,2],[5,2]],'настройках':[[22,4]],'goal':[[9,2],[14,2],[6,46],[2,4],[20,2],[10,2],[8,2],[7,10]],'whitish':[[4,2]],'defines':[[5,2],[11,10],[6,2]],'hotkey':[[5,16],[17,6],[9,6],[15,16],[24,2],[4,2],[12,2],[16,6],[11,16],[8,2]],'helper':[[12,2]],'usability':[[11,2]],'многих':[[22,2]],'никаких':[[22,4]],'draws':[[12,4],[19,2],[11,2],[24,2]],'Реального':[[22,2]],'человеческий':[[22,2]],'craftily':[[2,2]],'units':[[14,2]],'журналирования':[[22,2]],'writing':[[12,6],[23,4],[25,4],[6,2]],'learning':[[1,2],[3,2],[10,2],[2,4]],'resulting':[[5,4],[14,2],[11,2],[7,2]],'мультитрекинга':[[22,2]],'literary':[[6,2]],'дополнительных':[[22,2]],'проигрывание':[[22,2]],'messages':[[4,2],[12,4],[23,4],[11,2],[24,2]],'создании':[[22,18]],'glitches':[[6,2]],'profit':[[6,2]],'два':[[22,8]],'повторе':[[22,2]],'имя':[[22,2]],'reverse':[[18,2]],'Акселераторы':[[22,2]],'newbie':[[6,2],[7,2],[2,4]],'joypad':[[17,2],[18,20],[23,4],[25,4],[19,2],[2,2],[4,4],[12,8],[11,12],[7,6]],'регистрации':[[22,2]],'teacher':[[10,2]],'noticed':[[4,2],[6,4],[7,6]],'срабатывании':[[22,4]],'расцветка':[[22,2]],'integrity':[[25,2]],'отметить':[[22,2]],'implied':[[5,2]],'two':[[18,4],[19,4],[12,8],[20,12],[8,4],[5,4],[17,2],[9,2],[14,2],[15,4],[23,8],[6,12],[2,2],[4,4],[25,4],[10,4],[11,2],[7,4]],'привычки':[[22,2]],'reverting':[[11,2]],'cycle':[[8,2]],'automatic':[[12,4],[10,2],[11,2]],'разделение':[[22,2]],'загрузка':[[22,2]],'параметрами':[[22,2]],'модификаторы':[[22,2]],'customization':[[15,4],[1,2],[14,4],[0,2],[20,4],[11,6]],'fatal':[[7,2],[8,2],[6,2]],'Вводе':[[22,4]],'compresses':[[11,2],[23,2]],'оставшееся':[[22,2]],'паузу':[[22,2]],'needs':[[12,6],[16,2],[20,2],[5,2],[23,2],[6,4],[2,4],[4,2],[24,2],[10,2],[11,4],[7,2]],'specify':[[11,2]],'дюжины':[[22,2]],'слот':[[22,4]],'перед':[[22,18]],'unsystematic':[[2,2]],'цвету':[[22,6]],'info':[[23,18],[11,2],[5,8]],'carried':[[10,2],[2,2],[6,4]],'frequent':[[12,2]],'Гринзоне':[[22,16]],'хорошо':[[22,2]],'resend':[[23,2]],'patterns':[[15,2],[14,2],[23,6],[2,4],[24,6],[12,28],[3,2],[11,4],[5,2]],'loopholes':[[2,2]],'receive':[[4,2],[23,2],[7,2]],'desktop':[[3,4],[2,2]],'Рекордеру':[[22,2]],'Выделение':[[22,60]],'became':[[14,2],[23,2],[5,2]],'home':[[15,8],[16,6],[22,2],[24,2],[5,4]],'worked':[[10,2]],'opportunity':[[14,2]],'вращении':[[22,6]],'карты':[[22,2]],'avi':[[15,4],[14,2]],'избирательного':[[22,2]],'берётся':[[22,2]],'Джойстика':[[22,14]],'lower':[[17,2],[15,6],[23,8],[2,2],[4,10],[16,4],[11,4],[5,6]],'adjustlag':[[22,12]],'форме':[[22,2]],'доступном':[[22,2]],'counts':[[14,2]],'хранящимся':[[22,2]],'ones':[[4,2],[20,2],[2,2]],'every':[[18,4],[12,14],[20,12],[8,4],[5,18],[17,2],[9,6],[14,14],[15,2],[23,10],[6,22],[2,4],[4,8],[25,8],[10,10],[11,28],[7,4]],'roughness':[[6,2]],'periodically':[[18,2]],'pale':[[4,2],[24,2],[11,8],[5,2]],'openness':[[2,2]],'backtrack':[[11,2]],'20fps':[[18,2]],'contact':[[10,2]],'inferior':[[8,2]],'analogy':[[20,6],[5,2]],'fceultra':[[21,2]],'smallest':[[5,2]],'единую':[[22,2]],'tool':[[12,6],[14,6],[20,2],[23,10],[5,2]],'колесом':[[22,2]],'меньше':[[22,4]],'осуществляется':[[22,10]],'подразумевает':[[22,2]],'wm_mousewheel':[[23,2]],'violet':[[4,2]],'consisting':[[12,2]],'click':[[19,12],[12,22],[16,30],[5,42],[17,74],[9,2],[15,54],[23,4],[2,2],[24,12],[4,52],[10,2],[11,16]],'necessity':[[2,2],[6,2]],'compare':[[8,6],[9,4],[14,4],[19,2],[6,4],[20,10],[10,4],[11,2],[5,4]],'mashing':[[5,2]],'introduction':[[1,2],[2,6],[0,2]],'affect':[[4,4],[16,2],[2,2],[11,10]],'unobtrusively':[[4,2]],'edit':[[12,4],[16,4],[20,2],[5,8],[17,26],[9,6],[14,4],[15,6],[6,2],[2,2],[4,16],[3,4],[10,2],[11,10],[7,2]],'loaded':[[17,4],[20,2],[25,2],[11,4],[24,8]],'completion':[[14,4]],'промежутков':[[22,8]],'эмуляцию':[[22,2]],'caring':[[5,2],[24,2],[11,2],[2,2]],'конвертируя':[[22,2]],'сохранять':[[22,4]],'faded':[[6,2]],'наличие':[[22,4]],'Таким':[[22,14]],'assuming':[[23,2]],'clear':[[17,12],[15,6],[25,2],[2,6],[4,2],[18,6],[5,4]],'просматривает':[[22,4]],'consists':[[12,4],[14,8],[20,2],[25,10],[5,2]],'зарегистрирована':[[22,2]],'отображаемый':[[22,2]],'include':[[25,2]],'truth':[[2,2],[6,2]],'quitting':[[23,4]],'triggered':[[18,2]],'должна':[[22,8]],'structuring':[[4,2],[6,2]],'мигает':[[22,2]],'jumpprevmarker':[[24,2]],'вызывают':[[22,2]],'engine':[[14,2],[23,4],[6,4],[11,2]],'excel':[[6,2]],'distinctness':[[14,2]],'щелчок':[[22,8]],'Горячих':[[22,8]],'меняются':[[22,2]],'characters':[[25,4]],'menu':[[17,20],[15,16],[23,6],[19,18],[24,14],[4,4],[12,6],[3,6],[11,8],[5,12]],'bookmark0':[[17,2]],'проигрывателя':[[22,2]],'Этот':[[22,16]],'handles':[[23,2]],'independence':[[7,2]],'forced':[[6,4],[14,2]],'inputted':[[14,2]],'несмотря':[[22,2]],'случаях':[[22,4]],'ставшие':[[22,2]],'Запланировано':[[22,2]],'Представляет':[[22,2]],'speedrun':[[14,10],[6,10],[2,2],[20,2],[7,2],[5,2]],'заново':[[22,4]],'deserialize':[[25,2]],'nearest':[[11,2],[9,2],[14,2],[15,2],[6,2],[2,2],[16,2],[7,6],[5,6]],'suggest':[[23,2],[24,2],[6,2]],'accordingly':[[4,2]],'sections':[[4,2],[11,4],[2,2],[5,2]],'cons':[[11,2],[9,2],[10,2],[7,2],[8,2]],'creation':[[17,2],[12,2],[15,2],[3,2],[23,8]],'большинство':[[22,4]],'emu':[[12,2],[18,2]],'own':[[7,2],[12,6],[20,2],[5,4],[9,2],[14,4],[15,2],[23,2],[6,6],[2,6],[4,4],[25,4],[10,2],[11,2],[18,2]],'левая':[[22,4]],'ответвление':[[22,16]],'ниже':[[22,2]],'последним':[[22,2]],'bookmarked':[[5,8],[15,10],[16,6],[11,8],[8,2]],'назад':[[22,4]],'extraordinary':[[2,4],[14,2]],'есть':[[22,24]],'середине':[[22,4]],'изображение':[[22,2]],'привязаны':[[22,8]],'instance':[[4,2],[11,2],[2,2],[6,2]],'help':[[18,2],[23,2],[25,2],[19,2],[6,4],[2,2],[12,4],[3,2],[10,2],[11,6],[5,4]],'frame':[[18,100],[19,16],[12,36],[16,58],[20,34],[8,22],[5,120],[17,94],[9,38],[14,38],[15,72],[22,6],[6,42],[2,24],[4,74],[23,48],[24,18],[25,10],[10,36],[11,68],[7,30]],'empty':[[17,6],[15,8],[23,4],[25,2],[19,2],[4,8],[11,6],[18,2]],'composed':[[5,2]],'неотмеченным':[[22,2]],'moderately':[[17,14]],'correction':[[7,8]],'next':[[19,2],[12,2],[16,16],[20,4],[8,6],[5,14],[9,8],[14,2],[15,6],[25,4],[6,14],[2,4],[4,4],[24,2],[3,2],[10,4],[11,12],[7,6]],'kilobytes':[[11,2]],'newtext':[[17,2],[18,4]],'ruler':[[2,2],[5,2]],'накладывает':[[22,2]],'чередующимися':[[22,2]],'separator':[[25,8]],'connection':[[9,2]],'bit0':[[25,4]],'структуру':[[22,2]],'управлению':[[22,4]],'adjust':[[23,2],[2,2],[6,4],[12,2],[3,4],[10,2],[8,2],[11,6]],'detection':[[14,2]],'dragged':[[17,2]],'эмуляторы':[[22,2]],'invoked':[[19,2]],'нескольким':[[22,2]],'behaviors':[[23,2]],'instantly':[[7,2],[18,2],[14,2],[2,2],[12,8],[20,2],[10,2],[11,2],[5,8]],'обратно':[[22,4]],'folder':[[12,2],[18,4],[11,2]],'указанному':[[22,2]],'lights':[[23,4]],'всегда':[[22,16]],'nevertheless':[[2,2]],'interpreted':[[25,2],[2,2],[18,2]],'becoming':[[4,4]],'нарушать':[[22,2]],'thought':[[10,2],[6,2]],'beautiful':[[7,2]],'toolbox':[[14,12],[4,2],[12,2],[16,2],[3,2],[5,8]],'выбрана':[[22,2]],'troublesome':[[7,2]],'snapshot':[[12,4],[14,2],[23,34],[19,2],[11,2]],'нужно':[[22,20]],'звучит':[[22,2]],'ответвления':[[22,18]],'console':[[12,6],[14,4],[3,2],[15,2]],'быстро':[[22,14]],'fields':[[15,2],[10,2],[25,2],[11,2]],'had':[[4,2],[12,2],[2,4],[11,2]],'subfolder':[[12,4],[18,2]],'повторение':[[22,2]],'mini':[[12,2],[13,2]],'insertion':[[18,2],[23,2]],'Настройка':[[22,8]],'где':[[22,14]],'defined':[[14,4],[20,4],[6,2],[5,2]],'модификации':[[22,2]],'соответствующего':[[22,8]],'главным':[[22,2]],'illuminate':[[15,2]],'verify':[[7,2]],'вращения':[[22,8]],'отсутствующие':[[22,2]],'succession':[[12,2],[2,2],[6,2]],'resumption':[[4,2]],'dot':[[25,2],[15,2]],'frame#':[[4,2],[17,6],[15,4],[22,6],[24,2]],'одинаковой':[[22,2]],'already':[[18,4],[15,4],[1,2],[23,2],[2,2],[6,8],[4,12],[12,6],[10,6],[7,6],[11,8]],'столбцоа':[[22,2]],'отсутствуют':[[22,2]],'оценить':[[22,2]],'methodology':[[1,2],[14,6],[20,4],[7,4],[0,2]],'nice':[[2,2],[12,2]],'collision':[[9,2],[14,2]],'trick':[[14,2],[2,6],[6,18]],'interactivity':[[5,2]],'exist':[[12,2],[18,4],[11,2]],'минимальный':[[22,8]],'freeze':[[5,2]],'раньше':[[22,2]],'акцентирующий':[[22,2]],'особенных':[[22,2]],'Запланированные':[[22,2]],'unintended':[[24,2],[14,2]],'искомых':[[22,2]],'изменившегося':[[22,2]],'their':[[1,2],[12,12],[20,2],[8,2],[5,6],[9,2],[14,4],[15,4],[23,2],[6,4],[2,2],[4,2],[24,4],[25,4],[11,4],[7,2]],'Возможность':[[22,14]],'promptly':[[20,2]],'обозначены':[[22,2]],'emulate':[[15,2],[5,2]],'отмеченных':[[22,6]],'особенностям':[[22,2]],'solving':[[12,2],[14,2],[10,2],[6,2],[7,4]],'specifies':[[11,4]],'здесь':[[22,2]],'приобретают':[[22,6]],'evens':[[4,2]],'illuminating':[[15,2]],'solution':[[9,2],[12,4],[14,12],[6,2],[7,2]],'confirmation':[[12,2]],'типа':[[22,2]],'decrease':[[15,2],[6,2],[11,2]],'that':[[18,20],[19,10],[12,86],[13,2],[16,10],[20,12],[8,18],[5,50],[17,20],[9,24],[14,30],[15,16],[23,26],[6,70],[2,20],[4,44],[24,34],[25,16],[3,8],[10,14],[11,48],[7,44]],'соответствовать':[[22,2]],'Так':[[22,14]],'основную':[[22,2]],'Отсутствие':[[22,2]],'taseditor_window':[[23,2]],'area':[[15,8],[23,2],[24,2],[12,2],[16,4],[11,6],[5,2]],'enemy':[[9,14],[6,8],[8,6]],'arising':[[13,2]],'memorized':[[4,2]],'будет':[[22,66]],'setmarker':[[17,4],[18,4]],'reducing':[[14,2],[2,2],[5,2]],'first':[[18,6],[19,4],[0,2],[12,28],[16,2],[20,4],[8,10],[5,12],[17,28],[9,12],[23,8],[25,10],[6,16],[2,10],[4,18],[24,4],[10,14],[11,20],[7,10]],'запись':[[22,2]],'shades':[[11,2]],'строгое':[[22,2]],'care':[[20,2],[10,2],[11,2]],'сбрасывается':[[22,4]],'literature':[[12,2]],'points':[[9,2],[23,2],[24,4],[4,4],[20,2],[8,6]],'suggested':[[24,2]],'asking':[[11,2],[18,6]],'tag':[[6,2],[12,2]],'сжатой':[[22,2]],'используя':[[22,4]],'top':[[4,4],[12,2],[5,4]],'correct':[[6,4],[7,8]],'hardcore':[[6,2]],'цифровых':[[22,4]],'below':[[4,2],[9,2],[15,4],[16,4],[5,8]],'remapping':[[11,2]],'step':[[7,2],[9,6],[14,4],[15,4],[2,4],[20,4],[10,8],[8,20],[5,8]],'actually':[[11,8],[18,2],[15,2],[6,2],[2,2],[12,4],[10,2],[7,6],[5,2]],'concentrates':[[14,2]],'filled':[[4,2],[11,2],[24,2]],'abstraction':[[4,2]],'stands':[[5,2]],'often':[[18,2],[19,2],[12,6],[20,2],[8,4],[5,4],[17,14],[9,4],[14,2],[6,12],[2,2],[4,4],[24,6],[10,4],[11,2],[7,8]],'загружается':[[22,4]],'constructed':[[14,2]],'unpausing':[[4,2],[9,2],[10,2]],'plus':[[15,2],[5,2]],'formula':[[20,4]],'ячейку':[[22,12]],'заменяться':[[22,2]],'really':[[12,2],[10,2],[7,2]],'Маркеру':[[22,4]],'Вывода':[[22,18]],'подготавливает':[[22,2]],'исходя':[[22,2]],'фон':[[22,2]],'analyze':[[5,2],[9,2],[12,2],[6,2],[2,2]],'окна':[[22,32]],'настраивать':[[22,4]],'autosave':[[23,4],[24,2],[11,22]],'значительно':[[22,4]],'внешнему':[[22,2]],'отражает':[[22,2]],'ввода':[[22,2]],'которым':[[22,2]],'отсутствующих':[[22,2]],'20th':[[4,2]],'wasted':[[6,2]],'slowly':[[15,2]],'putting':[[9,2]],'критерием':[[22,4]],'запоминает':[[22,4]],'slow':[[9,2],[14,4],[15,2],[2,2],[10,2],[8,2],[5,4]],'bit':[[24,4],[9,4],[25,40],[18,44],[7,2]],'прятать':[[22,2]],'prefix':[[23,4]],'montage':[[23,2]],'world':[[14,2],[6,16],[2,8],[12,6],[10,6],[5,2]],'recent':[[9,2],[23,2],[6,2],[24,4],[4,2],[16,4],[3,2],[11,2],[8,2]],'killed':[[8,2]],'material':[[2,2]],'total':[[25,2],[11,4],[5,2]],'sets':[[18,4],[23,2]],'участком':[[22,4]],'ran':[[6,2]],'заголовке':[[22,2]],'ускорить':[[22,6]],'notify':[[24,2],[23,2]],'fcexp':[[25,2]],'usually':[[19,4],[12,16],[16,2],[20,2],[8,6],[5,6],[9,6],[14,10],[15,2],[25,4],[6,22],[2,2],[4,4],[24,2],[11,14],[7,14]],'todo':[[12,4]],'outsider':[[2,2],[7,2]],'partial':[[23,6],[20,2]],'сжатую':[[22,4]],'найдена':[[22,2]],'щелчком':[[22,14]],'намного':[[22,2]],'yet':[[7,6],[17,6],[18,2],[19,2],[2,2],[24,2],[4,2],[12,2],[10,2],[8,6],[11,2]],'stand':[[3,2],[4,2]],'improvable':[[7,2]],'prepared':[[5,2],[7,2],[6,2]],'avoid':[[24,4],[12,2],[14,2],[6,4],[11,4]],'опять':[[22,4]],'into':[[19,6],[12,10],[16,2],[20,8],[8,8],[5,14],[17,12],[9,8],[14,8],[15,8],[21,2],[6,28],[2,4],[4,6],[23,12],[24,6],[25,6],[3,2],[10,6],[11,10],[7,6]],'ground':[[9,2],[6,4],[7,2]],'timer':[[14,2],[3,2],[6,2]],'Данных':[[22,2]],'ним':[[22,6]],'supports':[[5,2],[12,2],[11,4],[2,4]],'удалить':[[22,2]],'нижнем':[[22,6]],'truncation':[[17,2]],'прыгать':[[22,2]],'удобен':[[22,2]],'действия':[[22,2]],'isolate':[[2,2],[6,2]],'windows':[[4,2],[15,6],[23,10],[3,2],[11,2]],'estimated':[[10,2],[6,2],[5,2]],'calculates':[[23,2]],'either':[[18,4],[12,2],[20,2],[5,12],[17,6],[9,4],[14,8],[15,2],[23,4],[6,8],[2,4],[4,4],[24,10],[25,6],[10,2],[11,6],[7,10]],'вниз':[[22,20]],'interprets':[[7,2],[11,2]],'двойном':[[22,4]],'rises':[[6,2]],'successfully':[[17,4],[23,2],[6,2],[24,2],[12,6],[20,2],[7,2],[8,2]],'fail':[[7,2]],'corruptor':[[17,2]],'мувиков':[[22,4]],'они':[[22,6]],'branch':[[17,16],[7,2],[15,10],[14,6],[18,2],[22,6],[23,4],[24,2],[11,20],[5,8]],'irrelevant':[[9,2],[23,2],[25,4],[6,2],[2,2],[4,2],[5,2]],'busy':[[6,2]],'сжимается':[[22,2]],'Слева':[[22,2]],'равна':[[22,4]],'холст':[[22,4]],'выделенному':[[22,2]],'mechanic':[[6,2],[14,2]],'user':[[7,2],[18,18],[15,2],[14,2],[23,22],[2,2],[24,58],[11,4],[5,2]],'выделено':[[22,4]],'детальностью':[[22,2]],'copy':[[19,6],[12,14],[16,2],[8,4],[5,6],[17,2],[15,8],[14,2],[23,4],[2,2],[3,2],[11,2],[7,8]],'треугольника':[[22,2]],'ходу':[[22,2]],'how':[[7,6],[19,10],[12,10],[8,4],[5,10],[9,4],[6,16],[2,8],[4,2],[24,2],[10,2],[11,10],[18,2]],'keypad':[[15,8]],'соответствующее':[[22,4]],'serves':[[4,2],[9,4],[14,2],[15,2]],'хотя':[[22,2]],'threshold':[[2,2],[7,2]],'external':[[14,2],[23,4],[25,2],[6,2],[2,2],[12,2],[8,2],[7,2]],'rides':[[5,2]],'criticize':[[6,2]],'certain':[[11,6],[9,2],[14,6],[23,2],[6,4],[2,2],[12,8],[10,2],[8,2],[5,2]],'branch2':[[17,4]],'delivers':[[12,2]],'колонок':[[22,10]],'событий':[[22,8]],'ход':[[22,2]],'окном':[[22,2]],'находящуюся':[[22,2]],'expanding':[[11,2],[14,2]],'огибающую':[[22,2]],'isolated':[[19,2]],'горячести':[[22,12]],'tracks':[[23,6]],'condition':[[24,2]],'fantasy':[[2,2]],'recurring':[[2,2]],'dropped':[[9,2]],'отвечает':[[22,4]],'трети':[[22,2]],'импорте':[[22,2]],'%01d':[[25,4]],'способа':[[22,2]],'фоне':[[22,4]],'gamepad':[[17,6],[15,6],[14,6],[6,2],[2,4],[11,20],[5,6]],'хвоста':[[22,2]],'pulled':[[24,2]],'wearing':[[20,2]],'процесс':[[22,10]],'зелёного':[[22,2]],'experiment':[[11,4],[9,2],[6,2],[2,2],[4,2],[10,2],[8,2],[5,4]],'ответвлений':[[22,20]],'deselect':[[4,2],[15,2]],'салфетках':[[22,2]],'ineffectively':[[2,2]],'black':[[4,2],[19,2],[11,6]],'name':[[19,2],[12,10],[5,2],[17,8],[15,2],[14,2],[23,2],[25,2],[6,2],[24,22],[3,6],[18,18],[11,2]],'micro':[[6,2]],'sent':[[14,2],[24,4],[7,4]],'commands':[[15,6],[23,14],[25,6],[19,4],[24,8],[18,2],[5,2]],'отображается':[[22,62]],'мгновенно':[[22,6]],'первым':[[22,2]],'match':[[12,6],[25,4],[19,2],[6,4],[24,4]],'Выделять':[[22,2]],'голубым':[[22,4]],'Заметок':[[22,6]],'восстанавливаются':[[22,4]],'стрелки':[[22,6]],'familiar':[[7,2],[5,6]],'principle':[[6,2]],'path':[[2,2]],'allot':[[9,2]],'theory':[[11,2],[24,2],[6,2]],'identical':[[17,4]],'пределами':[[22,10]],'всплывающие':[[22,2]],'данных':[[22,20]],'встроенных':[[22,2]],'adds':[[25,2]],'here':[[19,2],[0,2],[12,6],[20,6],[8,2],[5,6],[17,2],[9,6],[14,2],[23,10],[6,8],[2,4],[3,4],[10,6],[11,4],[7,4]],'выделить':[[22,6]],'scheme':[[5,2],[19,2],[11,6],[7,2]],'sync':[[12,2],[23,2],[6,4]],'Списком':[[22,2]],'зажатом':[[22,2]],'advantages':[[2,2],[12,2]],'substantial':[[11,2],[14,2]],'reached':[[2,2],[6,2]],'рассчитана':[[22,2]],'current':[[18,24],[19,6],[12,22],[16,16],[20,14],[8,28],[5,40],[17,14],[9,16],[14,20],[15,18],[23,52],[6,54],[2,6],[24,18],[25,6],[3,4],[10,16],[11,20],[7,22]],'nameless':[[24,6]],'internet':[[12,2]],'associates':[[2,2]],'окончания':[[22,6]],'предыдущих':[[22,2]],'decided':[[19,2]],'мувиками':[[22,2]],'blindly':[[9,2]],'объединяет':[[22,4]],'choosing':[[24,2],[20,2],[6,2],[5,2]],'emulation':[[7,2],[12,8],[20,2],[5,16],[9,12],[14,12],[15,4],[23,12],[2,2],[24,2],[4,6],[10,2],[11,4],[18,4]],'изменяет':[[22,8]],'character':[[9,2],[25,2],[6,10],[2,6],[4,2],[12,2],[7,2],[5,6]],'Текущая':[[22,2]],'processes':[[23,2]],'border':[[24,2]],'нуля':[[22,2]],'clearselection':[[24,2]],'Самый':[[22,6]],'прочерк':[[22,2]],'доступ':[[22,6]],'result':[[19,2],[12,10],[20,8],[8,16],[17,8],[9,22],[14,4],[6,8],[2,8],[24,2],[10,24],[11,8],[7,14]],'perform':[[4,2],[12,2]],'четвёртом':[[22,2]],'хранят':[[22,2]],'straight':[[4,2]],'времени':[[22,10]],'маркера':[[22,6]],'twice':[[4,4],[12,6],[15,4],[16,4]],'интерфейс':[[22,4]],'engage':[[3,2]],'green':[[9,10],[15,6],[4,8],[20,8],[11,8],[5,4]],'receives':[[11,2],[12,2]],'medium':[[14,2]],'careful':[[14,2]],'binding':[[2,2],[11,4]],'handy':[[5,6],[12,4],[11,2],[2,2]],'0xce':[[12,4]],'записанные':[[22,2]],'upcoming':[[9,2],[14,2],[10,2]],'interconnections':[[6,2]],'involvement':[[7,2]],'или':[[22,72]],'adjustment':[[12,2],[19,2],[8,2],[11,6]],'dump':[[4,2],[12,2]],'scenario':[[2,2]],'significantly':[[11,4],[24,2]],'true':[[14,2],[25,12],[18,4],[2,2]],'execution':[[2,2],[12,4]],'reflecting':[[23,2]],'previous':[[12,8],[16,14],[20,6],[8,6],[5,4],[9,10],[14,4],[15,10],[23,2],[6,14],[24,2],[4,4],[10,8],[11,6],[7,10]],'required':[[25,16],[19,2],[12,2],[20,2],[7,2],[5,2]],'narrow':[[4,2],[24,2]],'multitrack':[[5,2]],'plenty':[[2,2],[12,2]],'reverted':[[4,4],[17,2]],'level':[[12,14],[16,2],[20,4],[8,6],[5,16],[25,4],[6,32],[2,6],[4,6],[10,6],[11,6],[7,8]],'full':[[18,2],[9,2],[14,4],[15,4],[19,2],[6,2],[23,8],[25,2],[10,4],[11,2],[5,2]],'немного':[[22,4]],'мувике':[[22,14]],'Добегание':[[22,4]],'практически':[[22,2]],'вести':[[22,2]],'guessed':[[5,2]],'вслепую':[[22,2]],'каждый':[[22,8]],'для':[[22,124]],'секунду':[[22,2]],'movie':[[18,24],[19,18],[12,44],[13,4],[16,52],[20,6],[8,28],[5,106],[17,46],[9,16],[14,54],[15,38],[22,2],[6,46],[2,8],[4,48],[23,60],[24,46],[25,30],[3,2],[10,8],[11,66],[7,24]],'двойной':[[22,2]],'символ':[[22,6]],'приставок':[[22,2]],'taking':[[14,2]],'aims':[[2,2],[14,2]],'drag_mode_selection':[[24,2]],'пределы':[[22,2]],'seem':[[9,2],[14,2],[6,4],[7,4]],'guess':[[9,4],[2,2],[6,2]],'примерной':[[22,2]],'detected':[[9,4],[20,4],[19,2]],'quick':[[11,2],[9,2],[10,4],[7,2],[8,2]],'official':[[25,2],[21,2]],'соавторами':[[22,2]],'длинных':[[22,4]],'savestate':[[7,42],[15,24],[14,6],[23,14],[24,22],[12,8],[11,10],[5,4]],'результате':[[22,4]],'должен':[[22,2]],'horizontal':[[6,2],[15,2]],'achieving':[[7,2]],'logger':[[15,4]],'architecture':[[21,2],[23,2]],'зелёными':[[22,2]],'appear':[[7,2],[19,2],[12,8],[16,2],[5,10],[17,4],[9,2],[14,6],[6,4],[2,4],[4,6],[24,4],[11,12],[18,2]],'active':[[4,2],[24,2]],'temporary':[[8,2],[20,2]],'указывается':[[22,2]],'handle':[[5,2],[24,2],[18,2]],'shadow':[[5,2]],'столбцу':[[22,4]],'последнего':[[22,10]],'size':[[12,22],[16,2],[20,2],[5,6],[14,2],[23,10],[25,10],[6,4],[4,2],[3,6],[7,2],[11,6]],'allow':[[14,2],[10,4],[23,4],[11,2],[24,2]],'objective':[[6,4],[8,2],[2,2]],'unlike':[[4,4],[9,2],[12,2],[14,6],[5,4]],'useful':[[15,6],[1,2],[14,4],[6,10],[2,2],[12,10],[20,2],[10,4],[11,10],[5,2]],'noticeable':[[7,2]],'цвета':[[22,18]],'завершено':[[22,2]],'шлюзе':[[22,2]],'тип':[[22,4]],'reloads':[[2,2]],'Прыжок':[[22,2]],'project':[[19,10],[12,46],[5,10],[17,6],[9,2],[14,6],[15,6],[21,2],[6,4],[2,10],[4,4],[23,50],[24,66],[25,8],[3,6],[11,30],[7,2]],'Проигрывателя':[[22,104]],'данной':[[22,4]],'функционалом':[[22,2]],'Началом':[[22,2]],'imagination':[[2,2]],'обнаружено':[[22,4]],'detachment':[[9,2]],'rethink':[[6,2],[7,2]],'programming':[[21,2],[14,4],[2,4],[0,2],[12,4],[20,6]],'возрастут':[[22,2]],'free':[[9,2],[14,2],[19,2],[2,2],[10,2],[11,2],[8,2]],'manual':[[11,2],[19,6],[0,6],[12,4],[5,2],[15,4],[14,4],[23,4],[6,2],[4,4],[18,8],[7,2]],'imperfections':[[2,2],[6,2]],'данными':[[22,6]],'переработанный':[[22,2]],'come':[[7,2],[12,2],[8,2],[2,2]],'текст':[[22,8]],'которыми':[[22,2]],'окно':[[22,10]],'new':[[18,8],[1,2],[19,10],[12,16],[16,4],[20,48],[8,10],[5,18],[17,30],[9,12],[14,2],[15,2],[23,20],[6,34],[2,12],[4,8],[24,6],[25,2],[3,2],[10,6],[11,26],[7,6]],'jump':[[12,8],[5,50],[9,2],[14,2],[15,6],[23,6],[6,6],[2,2],[4,10],[24,6],[10,4],[11,4],[7,2]],'характеристики':[[22,2]],'practice':[[1,2],[3,2],[10,4],[6,2],[5,2]],'dragging':[[17,6],[9,2],[15,4],[19,2],[24,6],[4,6],[16,6],[3,2],[11,2],[5,2]],'adjacent':[[16,2],[6,2],[7,4]],'miss':[[3,2],[24,2]],'хранении':[[22,2]],'найдя':[[22,2]],'tasing':[[18,2],[1,10],[19,4],[0,6],[12,12],[16,2],[20,10],[8,14],[5,20],[9,16],[14,28],[15,2],[23,8],[2,48],[6,48],[4,2],[3,2],[10,16],[11,18],[7,32]],'reassigned':[[5,2]],'проявляется':[[22,2]],'ними':[[22,2]],'нужных':[[22,2]],'диск':[[22,4]],'register':[[12,2],[18,6]],'undos':[[11,2]],'мелочи':[[22,4]],'prematurely':[[10,2],[8,2]],'gameresources':[[12,2]],'ungreenzone':[[15,2]],'узнать':[[22,2]],'текстовое':[[22,2]],'scenarios':[[5,2]],'very':[[12,8],[16,2],[20,2],[8,4],[5,6],[17,16],[9,4],[23,4],[6,12],[2,6],[4,8],[24,2],[3,2],[10,6],[11,4],[7,8]],'щелчкам':[[22,4]],'resumes':[[24,2],[5,2]],'количества':[[22,8]],'modules':[[25,14],[23,8]],'feos':[[0,4]],'physically':[[2,2]],'spending':[[6,2]],'accounts':[[11,2]],'evaluate':[[20,4],[5,2]],'playback':[[18,16],[19,6],[12,12],[16,50],[20,4],[8,6],[5,66],[17,8],[9,32],[14,12],[15,60],[23,24],[2,2],[24,24],[4,34],[10,24],[11,32],[7,10]],'low':[[4,2],[6,2]],'image':[[4,8],[14,2],[10,2],[20,2],[6,2]],'paranoid':[[8,2]],'kills':[[2,4]],'though':[[24,4],[12,4],[19,2],[2,2],[6,4]],'opening':[[23,4],[3,2],[24,4]],'visual':[[4,2],[14,2]],'learned':[[20,2]],'когда':[[22,38]],'оставить':[[22,4]],'собрание':[[22,4]],'functional':[[11,4],[24,2]],'поверх':[[22,2]],'использовать':[[22,10]],'killing':[[2,2],[9,2]],'результат':[[22,2]],'bitmap':[[22,2]],'long':[[11,10],[15,6],[19,2],[6,8],[2,4],[4,2],[12,6],[10,2],[7,6],[5,4]],'принцип':[[22,2]],'longer':[[4,2],[2,2],[7,2]],'places':[[17,2],[15,2],[23,2],[19,2],[12,10],[7,2]],'отличных':[[22,4]],'divide':[[4,2],[6,6]],'optimizing':[[13,2],[14,2],[6,6]],'registered':[[17,2],[12,4],[23,4],[10,2],[18,20]],'проекте':[[22,12]],'раскрашивании':[[22,2]],'переключать':[[22,4]],'синими':[[22,2]],'выделены':[[22,2]],'cleared':[[4,2],[11,6]],'optimization':[[12,4],[14,4],[6,6],[7,4]],'superimpose':[[17,4],[22,2],[2,2],[12,4],[18,2],[5,8]],'работать':[[22,4]],'positions':[[16,2]],'losing':[[14,2],[6,6],[8,2]],'Маркерами':[[22,22]],'клетке':[[22,2]],'внесены':[[22,4]],'configured':[[11,2]],'Необходимо':[[22,2]],'Изменение':[[22,2]],'consecutive':[[11,4],[19,2],[18,4],[6,2]],'streamlines':[[23,4]],'moves':[[10,4],[25,2],[6,4],[5,16]],'прогрессбар':[[22,2]],'people':[[1,2],[6,8],[2,4],[12,4],[7,6],[8,4]],'practically':[[10,2],[9,2]],'second':[[19,2],[12,14],[5,2],[9,2],[14,2],[23,2],[6,6],[2,2],[4,2],[10,4],[18,10],[11,8]],'commonly':[[12,2]],'transpose':[[15,2],[16,2],[24,2]],'джойстике':[[22,2]],'suitable':[[10,4],[6,4]],'and':[[1,8],[19,26],[0,4],[16,30],[9,100],[14,78],[15,82],[23,180],[2,86],[24,56],[4,106],[10,88],[18,28],[7,110],[12,190],[13,2],[20,48],[8,66],[5,174],[17,118],[21,8],[25,50],[6,238],[3,26],[11,148]],'происходит':[[22,14]],'credible':[[2,2]],'still':[[7,8],[19,2],[12,10],[8,2],[5,2],[17,2],[9,6],[6,8],[2,10],[4,2],[24,2],[10,4],[11,4],[18,4]],'meaningless':[[25,2],[14,2]],'stops':[[18,2],[24,2],[12,2],[7,2],[11,2]],'convenience':[[4,2],[19,2],[2,2],[5,2]],'formulate':[[2,2]],'before':[[18,8],[19,4],[12,8],[16,4],[20,2],[8,4],[5,16],[17,6],[9,12],[14,4],[15,8],[23,2],[6,2],[2,4],[4,8],[24,8],[25,4],[3,2],[10,8],[11,14],[7,10]],'overtakes':[[6,2]],'ignore':[[6,2],[18,12],[11,2],[2,2]],'lock':[[9,2]],'implies':[[6,4]],'которого':[[22,24]],'various':[[9,2],[2,2],[6,4],[4,4],[12,6],[8,2],[11,4]],'polish':[[9,2],[10,4],[7,6]],'пустовать':[[22,2]],'registering':[[18,8]],'forth':[[4,2],[2,2]],'Все':[[22,10]],'нажав':[[22,2]],'ТАСинге':[[22,8]],'starts':[[15,4],[23,4],[25,6],[24,2],[4,6],[12,2],[10,6],[18,2],[5,6]],'запуске':[[22,4]],'branch1':[[17,8]],'adding':[[4,2],[12,2],[14,2],[23,2]],'желаемых':[[22,2]],'menus':[[19,2],[15,2]],'ТАСинга':[[22,8]],'чтение':[[22,2]],'recalculate':[[12,2]],'fading':[[23,2]],'Тем':[[22,2]],'gaming':[[6,2],[11,2],[8,2],[2,2]],'controls':[[9,2],[14,2],[15,12],[19,2],[23,4],[0,2],[4,2],[13,4],[10,4],[11,10],[5,4]],'highest':[[5,2]],'предоставив':[[22,2]],'фиксированы':[[22,2]],'switch':[[18,4],[19,16],[12,2],[20,2],[8,2],[5,8],[17,8],[9,4],[14,2],[15,18],[25,4],[2,2],[24,6],[3,2],[10,4],[11,2],[7,4]],'обдумывания':[[22,2]],'ТАСерских':[[22,2]],'смещению':[[22,2]],'версии':[[22,2]],'легко':[[22,4]],'losses':[[6,4]],'являются':[[22,6]],'10000':[[11,2]],'greenzone':[[18,6],[19,4],[12,16],[16,2],[5,20],[17,58],[9,2],[14,6],[15,2],[23,22],[2,2],[24,16],[4,14],[25,10],[10,2],[11,44],[7,2]],'запакованном':[[22,2]],'чуть':[[22,2]],'скроллингом':[[22,2]],'centering':[[23,2]],'Тасэдитору':[[22,2]],'традиционными':[[22,2]],'mushroom':[[6,2]],'stopped':[[9,2],[18,4]],'subject':[[25,2],[14,2]],'initialization':[[17,6],[23,4]],'accompany':[[6,2]],'anyway':[[8,2],[12,2],[11,4],[6,2]],'длинный':[[22,2]],'появляются':[[22,2]],'eye':[[2,2],[14,2]],'nearby':[[23,2],[16,4],[11,2]],'deploying':[[23,2]],'accentuate':[[6,2]],'formatted':[[12,2]],'marioy':[[12,6]],'invalidation':[[18,2]],'подобных':[[22,2]],'давно':[[22,2]],'фича':[[22,8]],'вид':[[22,2]],'suboptimally':[[7,2]],'trivial':[[4,2],[2,2],[6,2]],'its':[[18,2],[19,2],[12,12],[16,6],[5,18],[17,8],[9,6],[14,10],[15,4],[23,4],[6,14],[2,6],[4,4],[24,8],[25,6],[3,2],[10,4],[11,18],[7,8]],'графическое':[[22,2]],'deal':[[10,2],[6,2]],'2011':[[1,2],[19,2],[0,2],[16,2],[9,2],[14,2],[15,2],[23,2],[2,2],[24,2],[4,2],[10,2],[18,2],[7,2],[12,2],[13,2],[20,2],[8,2],[5,2],[17,2],[21,2],[22,4],[25,2],[6,2],[3,2],[11,2]],'mobile':[[6,2]],'slipped':[[6,2]],'interrupted':[[11,2]],'adequate':[[6,6],[23,4]],'останутся':[[22,2]],'tenfold':[[5,2]],'периодически':[[22,2]],'present':[[6,2],[11,2]],'individuality':[[6,2]],'cursor':[[18,6],[19,8],[12,16],[16,86],[20,6],[8,12],[5,108],[17,10],[9,44],[14,18],[15,122],[22,2],[23,24],[24,38],[4,60],[10,30],[11,48],[7,10]],'accustomed':[[6,2]],'маленького':[[22,2]],'records':[[5,2],[17,2],[25,4],[6,2],[4,2],[12,2],[7,4],[11,2]],'react':[[10,2]],'обо':[[22,2]],'distract':[[8,2]],'Исчезают':[[22,2]],'eraser':[[4,2]],'prudence':[[7,2]],'sometimes':[[5,2],[11,2],[9,2],[14,4],[19,4],[6,16],[4,2],[12,2],[16,2],[7,12],[8,2]],'imitating':[[11,2]],'responses':[[10,2]],'выделенные':[[22,6]],'didn':[[20,2],[8,2],[5,2],[17,2],[9,2],[14,2],[25,2],[2,4],[4,4],[10,2],[11,2],[18,2]],'happens':[[4,4],[20,2],[7,2]],'nullifies':[[9,2]],'курсоров':[[22,2]],'идёт':[[22,8]],'выбран':[[22,2]],'columnset':[[23,2]],'advantage':[[5,2]],'importing':[[3,2]],'breaking':[[14,2]],'prompt':[[19,2]],'context':[[15,8],[14,2],[23,2],[19,10],[2,2],[6,2],[4,4],[24,4],[16,6],[11,6]],'инструментов':[[22,2]],'соответствии':[[22,6]],'close':[[24,8],[6,6],[3,2],[10,4],[11,6],[5,2]],'edges':[[3,2],[6,2]],'route':[[5,2]],'возвращает':[[22,6]],'make':[[18,2],[19,2],[12,10],[16,2],[20,2],[8,6],[5,24],[17,2],[15,4],[14,6],[23,6],[6,14],[2,2],[4,2],[3,2],[11,12],[7,14]],'wip1':[[17,2]],'imagining':[[6,2]],'установка':[[22,4]],'далеко':[[22,6]],'принципу':[[22,2]],'lay':[[7,2],[8,2]],'unmark':[[23,2]],'truncating':[[23,6]],'редактировать':[[22,2]],'таким':[[22,12]],'Маркера':[[22,26]],'голова':[[22,2]],'proper':[[12,2]],'минимального':[[22,2]],'стоит':[[22,6]],'addresses':[[12,6]],'research':[[23,2],[14,4],[6,2]],'writers':[[6,2]],'both':[[1,2],[19,4],[0,2],[12,6],[20,2],[5,4],[17,2],[9,6],[6,8],[2,4],[4,8],[24,2],[10,2],[11,8],[7,10]],'Полное':[[22,2]],'any':[[19,2],[12,14],[16,20],[20,6],[8,8],[5,46],[17,8],[9,6],[14,14],[15,18],[23,16],[6,26],[2,12],[4,28],[24,6],[25,8],[3,4],[10,10],[11,16],[7,10]],'typing':[[8,2],[15,4],[4,2],[12,4],[11,2],[7,2]],'указанной':[[22,8]],'Соответственно':[[22,2]],'structure':[[6,4]],'расположении':[[22,2]],'commonplace':[[12,2]],'appreciate':[[6,2]],'controllers':[[11,2]],'щёлкнув':[[22,2]],'информация':[[22,16]],'evolution':[[5,2]],'зажать':[[22,18]],'формирования':[[22,2]],'10th':[[4,2]],'competent':[[1,2]],'about':[[18,2],[0,2],[12,2],[16,2],[20,2],[8,2],[5,10],[9,6],[14,10],[15,2],[23,20],[6,14],[2,4],[4,10],[24,10],[3,2],[11,18],[7,4]],'нанизанные':[[22,2]],'наложенными':[[22,2]],'inconveniences':[[12,2]],'timers':[[12,2]],'manually':[[18,2],[9,4],[14,2],[19,2],[2,2],[4,4],[12,4],[20,6],[10,2],[11,6],[7,2]],'value':[[18,2],[14,2],[23,4],[25,28],[6,16],[2,2],[12,2],[20,10],[11,6],[5,2]],'whose':[[17,2]],'ограничен':[[22,2]],'imitates':[[11,2]],'частности':[[22,4]],'пункте':[[22,8]],'interesting':[[12,2],[20,2],[10,2],[2,2],[6,2]],'последовательностями':[[22,2]],'индивидуально':[[22,2]],'периодичностью':[[22,2]],'operations':[[17,6],[18,2],[15,6],[14,2],[23,22],[0,2],[4,2],[13,4],[3,2],[11,6],[5,6]],'overlooked':[[6,2]],'Теперь':[[22,2]],'положению':[[22,2]],'Буфера':[[22,2]],'beaten':[[12,2],[14,2]],'score':[[24,2],[14,2]],'takes':[[7,2],[14,2],[19,2],[6,2],[12,2],[16,4],[11,4],[5,2]],'zeroth':[[4,2],[17,2],[11,2],[18,2]],'plastic':[[4,2]],'controlled':[[2,2],[15,4]],'текстовом':[[22,10]],'goals':[[7,2],[12,2],[1,2],[6,4],[2,2]],'mistake':[[0,2],[8,10],[5,2],[9,4],[14,2],[15,2],[21,2],[6,4],[23,2],[24,4],[10,4],[11,2],[7,42]],'загрузке':[[22,6]],'receiving':[[2,2]],'subsegments':[[20,2],[6,6],[8,2]],'motions':[[11,2]],'move':[[19,2],[12,2],[16,26],[20,2],[5,8],[9,10],[14,4],[15,26],[23,2],[6,6],[2,4],[4,6],[24,2],[3,2],[10,2],[11,2],[18,4]],'была':[[22,4]],'наступающего':[[22,2]],'superplay':[[14,2]],'none':[[11,2],[24,2]],'обмена':[[22,2]],'afraid':[[4,2],[9,2]],'extensions':[[12,2]],'любого':[[22,2]],'Высота':[[22,2]],'слева':[[22,4]],'hard':[[11,2],[7,2],[6,2],[12,2],[8,2],[5,2]],'clicked':[[5,2]],'supposed':[[5,2],[14,2],[20,10],[7,6],[6,6]],'experiments':[[4,2],[14,2],[6,2],[7,8]],'disables':[[24,2]],'typical':[[15,2],[23,2],[2,2],[6,2],[12,6],[13,2]],'possess':[[6,2]],'редко':[[22,2]],'hint':[[12,2]],'отложить':[[22,2]],'одним':[[22,2]],'upon':[[7,2],[8,2],[6,2]],'covered':[[3,2],[5,2]],'runs':[[18,4],[23,2],[6,4],[4,2],[12,6],[10,2],[11,10],[5,2]],'переменных':[[22,2]],'diving':[[6,8]],'ситуация':[[22,2]],'listview':[[22,6]],'запускаться':[[22,2]],'searching':[[14,2],[23,8],[6,2],[12,4],[16,8],[10,4],[20,2],[11,4],[5,2]],'determined':[[14,2],[25,2],[2,2]],'essential':[[12,4],[2,2],[7,2]],'альфой':[[22,2]],'stress':[[2,2],[5,2]],'ago':[[4,2],[2,2],[11,8]],'focused':[[2,2],[24,2]],'balanced':[[6,2]],'associate':[[4,2],[2,2],[6,2]],'можно':[[22,98]],'через':[[22,4]],'represent':[[14,2],[25,6],[6,2],[5,4]],'canceled':[[11,2]],'глаз':[[22,2]],'use':[[18,10],[19,8],[12,26],[16,46],[20,8],[8,12],[5,18],[9,6],[14,12],[15,10],[21,2],[6,8],[2,6],[4,8],[22,4],[23,2],[24,4],[10,6],[11,36],[7,4]],'цветом':[[22,16]],'involving':[[12,2]],'esc':[[4,2],[15,4],[11,2],[5,4]],'acquire':[[2,2]],'течение':[[22,4]],'identifier':[[25,2]],'Правая':[[22,2]],'ram':[[15,4],[14,2],[22,6],[23,6],[6,4],[12,10],[20,2],[3,2],[11,2]],'наименьшим':[[22,2]],'header':[[17,16],[15,10],[23,12],[25,12],[4,6],[12,2],[11,6],[5,4]],'surroundings':[[11,2]],'refuse':[[23,2],[14,2],[6,2],[24,2]],'2005':[[22,2]],'начинающимися':[[22,2]],'contains':[[17,2],[14,6],[23,2],[19,4],[24,2],[4,6],[12,6],[16,4],[3,4],[11,2],[5,8]],'excessive':[[14,2]],'auto':[[19,2],[12,4],[8,2],[5,6],[9,2],[15,4],[22,2],[23,6],[2,6],[24,4],[4,2],[3,2],[10,4],[11,4],[18,12]],'Гибкая':[[22,4]],'tasedit':[[22,2],[23,4]],'Архитектура':[[22,2]],'advance':[[8,4],[17,2],[9,2],[14,4],[15,6],[19,2],[2,2],[12,4],[16,2],[11,6],[5,6]],'farther':[[15,2]],'years':[[6,2]],'Курсора':[[22,32]],'real':[[5,2],[11,8],[15,2],[14,10],[6,6],[2,2],[4,6],[12,2],[10,4],[7,8],[8,2]],'costs':[[11,2],[12,2]],'construct':[[6,2]],'ensures':[[15,2],[23,4],[6,2]],'нажимает':[[22,2]],'mod':[[14,2]],'element':[[4,2],[15,2],[24,4],[5,2]],'memorize':[[7,2],[20,2]],'symbols':[[4,10],[17,4],[15,6],[25,4],[11,4]],'functionality':[[21,2],[2,4],[5,2]],'добавлении':[[22,6]],'Откат':[[22,2]],'returned':[[18,2],[23,2]],'filesystem':[[23,2]],'многократно':[[22,2]],'обладающий':[[22,2]],'panel':[[12,2],[16,6],[23,4],[2,2]],'invoke':[[15,10],[23,2]],'надо':[[22,2]],'outcome':[[7,12],[9,12],[14,2],[8,4],[6,2]],'появляется':[[22,10]],'pluses':[[14,4]],'map':[[15,4],[23,4],[11,4]],'they':[[12,18],[8,4],[5,14],[9,6],[14,4],[15,6],[23,4],[6,16],[2,6],[4,16],[24,8],[25,2],[3,4],[11,10],[7,10]],'skim':[[12,2]],'complexity':[[4,2],[9,2],[20,2],[6,2],[5,4]],'coloring':[[4,2]],'language':[[12,4],[14,2],[2,2],[5,2]],'then':[[18,2],[19,4],[12,26],[16,2],[20,12],[8,4],[5,20],[17,50],[9,4],[14,6],[15,4],[23,6],[6,26],[2,10],[4,14],[24,2],[25,14],[10,4],[11,30],[7,12]],'системы':[[22,2]],'copied':[[17,2],[15,2],[16,2],[19,2],[5,4]],'requested':[[18,4]],'Щелчком':[[22,2]],'прогрессбаре':[[22,2]],'replacement':[[14,2]],'backup':[[8,2],[24,2]],'toggle':[[24,6],[15,30],[23,6],[11,4],[5,2]],'pad':[[4,8],[5,2]],'только':[[22,66]],'таком':[[22,2]],'saying':[[12,2]],'ways':[[12,2],[13,2],[16,4],[8,2],[9,6],[14,10],[15,2],[2,4],[6,4],[4,6],[3,2],[7,2]],'topical':[[12,2]],'наведения':[[22,2]],'различие':[[22,6]],'splicing':[[25,2],[5,2]],'builds':[[2,2]],'изменены':[[22,2]],'attach':[[9,2],[19,2],[24,2]],'менеджеру':[[22,2]],'essence':[[19,2],[2,2],[6,2]],'power':[[15,8],[23,2],[25,4],[19,2],[24,4],[5,2]],'копии':[[22,2]],'asterisk':[[12,2],[3,2],[11,2]],'восстановить':[[22,2]],'идея':[[22,2]],'mainly':[[7,2]],'которую':[[22,2]],'interim':[[9,2],[14,4],[2,2],[10,2],[7,6],[5,2]],'pictures':[[11,2]],'управляющего':[[22,2]],'имеется':[[22,2]],'столбце':[[22,10]],'статистику':[[22,2]],'взаимодействовать':[[22,2]],'ignoring':[[23,2]],'wheel':[[19,4],[12,2],[16,18],[5,14],[9,4],[15,32],[23,4],[24,14],[4,8],[10,4],[11,2],[7,2]],'предназначен':[[22,2]],'unnatural':[[4,2]],'rewriting':[[7,4],[14,2]],'additional':[[5,2],[1,2],[23,2],[19,2],[6,2],[10,2],[8,2],[11,6]],'полезно':[[22,4]],'translate':[[12,2]],'сохранения':[[22,12]],'normally':[[9,2],[14,6],[10,2],[5,2]],'средств':[[22,2]],'reflexes':[[14,2]],'так':[[22,36]],'облегчающий':[[22,2]],'Она':[[22,2]],'fourscore':[[25,14],[12,2]],'would':[[19,2],[12,6],[5,4],[9,2],[14,6],[15,2],[23,6],[6,6],[2,8],[10,4],[11,8],[7,6]],'improving':[[6,2],[9,2]],'mariowidth':[[12,6]],'эмулируемых':[[22,2]],'uncheck':[[12,8],[15,2],[11,2],[5,6]],'compound':[[20,2]],'скрытии':[[22,2]],'times':[[8,4],[11,2],[18,6],[14,2],[23,4],[6,6],[2,2],[12,8],[7,2],[5,4]],'target':[[18,2],[19,4],[12,2],[20,18],[8,8],[5,18],[9,12],[23,6],[6,6],[24,2],[10,4],[7,2],[11,2]],'закладок':[[22,2]],'association':[[10,4],[9,4]],'умещающийся':[[22,2]],'subtitled':[[12,2]],'authors':[[6,2],[14,2]],'Прочие':[[22,4]],'пустого':[[22,2]],'полупрозрачным':[[22,2]],'загружает':[[22,4]],'original':[[9,2],[6,2],[24,2],[2,2],[11,4],[7,2]],'four':[[24,2]],'позиции':[[22,12]],'narrows':[[10,2]],'иначе':[[22,2]],'применения':[[22,2]],'рамка':[[22,4]],'borrow':[[6,2]],'scrollbar':[[4,2],[15,2],[16,8]],'interest':[[4,2],[10,2],[7,2],[8,2]],'получает':[[22,2]],'Закладками':[[22,6]],'ntsc':[[18,2]],'mnemonics':[[25,2],[23,2]],'массива':[[22,8]],'activation':[[12,2]],'раскрашиваются':[[22,4]],'switching':[[7,4],[15,2],[8,2],[2,2]],'theoretically':[[14,2]],'bitwise':[[18,2]],'мог':[[22,4]],'periods':[[6,2]],'import':[[17,8],[22,2],[23,2],[19,10],[4,2],[12,4]],'remap':[[11,2]],'aspect':[[14,4],[2,2],[6,4]],'custom':[[12,2],[14,4],[2,4]],'grants':[[6,2]],'highly':[[12,2]],'unobvious':[[7,2],[21,2]],'looped':[[12,2]],'counters':[[12,2]],'distance':[[5,4],[7,2],[6,2]],'проверяется':[[22,2]],'Служат':[[22,2]],'Окно':[[22,4]],'альфу':[[22,4]],'столько':[[22,2]],'large':[[19,2],[6,14],[4,2],[12,4],[11,2],[7,4]],'saveas':[[24,2]],'insignificant':[[4,2]],'reveal':[[6,4],[14,2],[7,2],[2,2]],'objects':[[6,2],[14,6]],'sufficient':[[7,2],[8,4]],'неотмеченных':[[22,2]],'достаточно':[[22,8]],'Журнале':[[22,12]],'Заметку':[[22,6]],'нечёткий':[[22,2]],'skipping':[[14,2]],'trajectory':[[10,2],[7,2]],'applications':[[15,4]],'линии':[[22,4]],'минимальным':[[22,2]],'имитирует':[[22,2]],'damage':[[12,4],[14,2]],'Конкретная':[[22,2]],'count':[[25,2]],'see':[[19,4],[12,6],[16,14],[20,2],[8,4],[5,24],[9,10],[14,8],[15,14],[23,4],[6,16],[2,6],[4,10],[10,6],[11,12],[7,10]],'slowest':[[4,2],[15,2]],'скорость':[[22,2]],'устаревшей':[[22,2]],'служит':[[22,18]],'атрибут':[[22,2]],'taseditor_patterns':[[12,2],[24,2]],'singleton':[[23,34]],'uint64':[[25,2]],'hastily':[[7,2]],'optimally':[[12,2],[6,2],[8,2]],'Таблица':[[22,2]],'allows':[[16,6],[8,4],[5,16],[9,2],[14,8],[15,6],[21,2],[6,6],[2,6],[4,2],[24,2],[3,2],[10,4],[11,10]],'memories':[[4,2],[2,2]],'систему':[[22,2]],'despite':[[12,2],[6,2],[5,2]],'упрощения':[[22,2]],'иконками':[[22,4]],'перемещения':[[22,2]],'несёт':[[22,2]],'clears':[[23,6],[18,4],[5,4]],'каждому':[[22,2]],'Маркер':[[22,24]],'рисования':[[22,4]],'tyres':[[20,2]],'bot':[[14,2]],'mass':[[4,8],[23,2],[6,2],[11,4]],'hundred':[[11,6],[9,2],[10,2],[6,2],[5,2]],'forgotten':[[4,2],[20,2]],'splicer':[[22,2],[23,4],[5,10]],'emulators':[[18,2],[14,8],[19,2],[8,2],[11,2]],'150':[[10,4]],'пока':[[22,10]],'сбором':[[22,2]],'ended':[[11,2]],'управляющие':[[22,4]],'resist':[[2,2]],'ideal':[[6,4],[7,2]],'внешнем':[[22,4]],'выход':[[22,2]],'какой':[[22,4]],'легче':[[22,2]],'ярким':[[22,2]],'many':[[12,16],[16,4],[8,8],[5,6],[15,2],[14,14],[6,32],[2,10],[4,2],[24,2],[3,2],[10,6],[11,10]],'значений':[[22,6]],'happen':[[15,2],[20,2],[2,2],[5,2]],'возвращаться':[[22,2]],'taser':[[19,2],[12,10],[16,2],[20,6],[8,4],[5,10],[14,14],[6,20],[2,32],[4,8],[10,18],[11,4],[7,20]],'thrill':[[6,2]],'первом':[[22,8]],'autoscroll':[[5,2]],'хронологию':[[22,4]],'act':[[2,2],[12,2]],'dry':[[6,2]],'решено':[[22,2]],'нелинейным':[[22,2]],'reflected':[[4,2]],'замена':[[22,2]],'открытия':[[22,2]],'смысл':[[22,2]],'индикация':[[22,2]],'uses':[[12,2],[3,2],[25,4],[6,2],[11,2]],'microphone':[[24,2],[14,2]],'дополнительные':[[22,2]],'inspection':[[2,2]],'собой':[[22,8]],'flexibly':[[5,2]],'anytime':[[4,4],[5,2]],'subdivision':[[6,4]],'paper':[[14,2]],'dependencies':[[6,2],[14,2]],'символизирует':[[22,2]],'усовершенствует':[[22,2]],'возрастание':[[22,2]],'piano_rolx':[[25,2]],'unconventional':[[2,2]],'seen':[[4,2],[14,2],[5,2]],'cheats':[[15,2]],'combine':[[9,2],[19,2],[11,2],[5,4]],'количеству':[[22,6]],'variables':[[12,6],[14,2]],'compactly':[[17,2]],'materials':[[20,2]],'файл':[[22,4]],'inside':[[9,2],[21,4],[19,2],[0,2],[4,2],[12,6],[11,2],[5,2]],'сам':[[22,2]],'last':[[12,2],[16,2],[8,2],[5,8],[9,4],[15,8],[22,2],[23,12],[6,6],[24,2],[4,4],[25,4],[10,4],[11,10],[7,2]],'перспективных':[[22,2]],'Автосохранение':[[22,4]],'submitted':[[18,2]],'видны':[[22,2]],'пустые':[[22,4]],'качестве':[[22,14]],'starting':[[7,4],[16,2],[5,6],[17,4],[9,2],[14,4],[15,4],[24,2],[4,2],[3,2],[10,2],[11,4],[18,2]],'продолжено':[[22,2]],'визуально':[[22,4]],'пользователя':[[22,8]],'ключевой':[[22,4]],'red':[[15,2],[14,2],[19,2],[4,8],[12,2],[11,12],[5,8]],'explanations':[[19,2]],'запускать':[[22,2]],'ценность':[[22,2]],'определённых':[[22,2]],'document':[[2,2],[6,4]],'collecting':[[11,2]],'serving':[[12,2]],'minimize':[[14,2]],'deterministic':[[23,2],[14,4]],'фиолетовый':[[22,2]],'conclusion':[[6,2]],'участке':[[22,24]],'somewhat':[[6,2],[9,4]],'try':[[19,4],[12,6],[20,2],[8,4],[5,6],[9,8],[14,6],[15,2],[6,12],[2,8],[4,6],[24,2],[10,6],[11,2],[7,4]],'границы':[[22,2]],'Очень':[[22,2]],'вариантов':[[22,2]],'easily':[[14,2],[4,2],[12,2],[20,2],[11,2],[5,2]],'уровня':[[22,2]],'вызываемом':[[22,2]],'дальнейших':[[22,4]],'support':[[12,2],[23,4],[14,2]],'seconds':[[14,2],[6,2],[4,2],[10,2],[11,2],[7,2]],'selections':[[23,4]],'hold':[[17,2],[15,42],[6,8],[2,4],[4,12],[24,2],[12,14],[16,10],[10,2],[11,2],[5,22]],'изменилась':[[22,2]],'сосредоточился':[[22,2]],'запоминать':[[22,4]],'целым':[[22,2]],'select':[[17,46],[15,16],[22,2],[23,6],[25,6],[4,12],[12,8],[16,4],[11,8],[18,4]],'markernum':[[17,2]],'ведётся':[[22,6]],'loops':[[12,2]],'coordinates':[[12,4],[23,4],[14,8]],'ряде':[[22,2]],'портировании':[[22,2]],'displayed':[[15,2],[14,4],[25,8],[4,4],[12,2],[20,2],[11,4],[5,8]],'progressbar':[[15,2],[23,4],[11,2]],'restoring':[[23,8],[14,2]],'orange':[[4,4]],'участок':[[22,10]],'файлами':[[22,2]],'smb':[[6,2],[12,2]],'easy':[[5,4],[14,4],[25,2],[6,6],[4,2],[12,2],[20,2],[7,2],[11,4]],'accurate':[[12,2]],'делает':[[22,2]],'completing':[[20,2]],'ячейкам':[[22,4]],'systematic':[[12,6],[5,2]],'ряда':[[22,2]],'good':[[9,2],[23,2],[2,4],[12,2],[20,2],[10,2]],'distinguish':[[11,2],[23,2]],'отчасти':[[22,2]],'было':[[22,18]],'окрашиваются':[[22,2]],'играми':[[22,2]],'carry':[[6,2]],'outside':[[17,6],[9,4],[15,14],[6,2],[24,2],[4,4],[12,2],[16,2],[18,14],[5,2]],'watches':[[5,2],[7,2],[6,2]],'feeling':[[4,2]],'boundaries':[[6,6],[8,2]],'genius':[[7,2]],'among':[[12,2],[14,4],[15,4],[23,2],[7,2]],'diversify':[[12,2]],'нужен':[[22,4]],'indicate':[[4,2],[12,2]],'conjecture':[[7,2]],'оперативную':[[22,2]],'рабочую':[[22,2]],'quarter':[[17,2]],'spread':[[4,2]],'reviews':[[13,2]],'structurizing':[[12,2]],'thus':[[19,2],[12,2],[20,6],[8,2],[5,10],[9,2],[14,6],[15,2],[23,2],[6,16],[2,8],[4,10],[24,2],[10,4],[11,16],[7,6]],'многолетний':[[22,2]],'look':[[8,2],[11,4],[6,2],[2,2],[4,2],[0,2],[12,2],[10,6],[7,2],[5,4]],'предполагается':[[22,2]],'old':[[18,8],[19,6],[12,2],[20,36],[8,20],[5,12],[17,16],[9,8],[14,4],[6,10],[2,8],[4,4],[24,4],[10,4],[11,16],[7,14]],'потребовать':[[22,2]],'unsaved':[[12,2],[23,4],[3,2],[11,4],[24,2]],'число':[[22,4]],'информацией':[[22,4]],'decisive':[[10,2],[7,6]],'light':[[5,30],[15,2],[14,4],[6,4],[24,4],[4,10],[16,2],[10,2],[8,2],[11,6]],'fm3s':[[25,2]],'что':[[22,34]],'colored':[[16,2],[19,4],[5,6]],'необходимости':[[22,16]],'стола':[[22,2]],'утраченной':[[22,2]],'больших':[[22,2]],'закладочным':[[22,2]],'сложно':[[22,2]],'выбранной':[[22,2]],'comes':[[5,2],[18,2],[8,2],[6,8]],'emulates':[[5,2]],'built':[[12,2],[14,2],[21,2],[5,2]],'readonly':[[18,2]],'checkpoint':[[6,4]],'старыми':[[22,2]],'ends':[[9,2],[14,2],[25,2],[6,6],[4,2],[12,4]],'точки':[[22,2]],'drag_mode_deselection':[[24,2]],'markers':[[19,4],[12,32],[16,14],[5,16],[17,76],[9,2],[14,8],[15,26],[22,4],[6,10],[2,2],[4,30],[23,50],[25,10],[18,10],[11,34]],'месте':[[22,8]],'останавливается':[[22,2]],'пустота':[[22,2]],'pads':[[17,6],[23,8],[5,4]],'keyframe':[[17,2],[23,2]],'counted':[[25,2]],'comparisons':[[7,2]],'выделяются':[[22,2]],'эта':[[22,18]],'реализации':[[22,4]],'тёмным':[[22,2]],'impartiality':[[10,2]],'execute':[[11,2],[18,2]],'simplistic':[[14,2]],'removed':[[4,4],[19,2],[11,4],[24,2]],'highlights':[[4,2],[14,2],[11,2]],'заканчивая':[[22,2]],'technique':[[8,2]],'gate':[[23,4]],'missing':[[5,2]],'meantime':[[5,2]],'method':[[12,8],[16,6],[8,24],[5,4],[9,22],[14,2],[6,4],[2,6],[4,2],[10,36],[11,4],[7,20]],'другие':[[22,4]],'reacts':[[23,6]],'lovingly':[[12,2]],'calculations':[[7,2],[23,2]],'radiobuttons':[[15,2]],'тогда':[[22,2]],'erroneous':[[7,2]],'таки':[[22,2]],'game':[[19,2],[12,30],[16,6],[20,22],[8,26],[5,46],[9,28],[14,80],[15,6],[23,8],[6,72],[2,52],[4,26],[25,2],[3,6],[10,30],[11,26],[7,32]],'agreement':[[24,2]],'presented':[[5,2],[1,2]],'initial':[[12,2],[14,2],[10,4],[7,2],[24,4]],'gradually':[[4,2],[11,2],[9,2],[6,2],[7,2]],'неё':[[22,6]],'теперь':[[22,10]],'Альтернативный':[[22,2]],'элементов':[[22,2]],'голубая':[[22,4]],'копируется':[[22,4]],'содержимого':[[22,2]],'specifically':[[4,2]],'соответственное':[[22,2]],'отличаться':[[22,2]],'разрядную':[[22,2]],'boundary':[[22,2],[6,2],[11,2]],'conduct':[[10,2]],'uncommon':[[6,2]],'grid':[[14,2]],'restart':[[12,2]],'disadvantageous':[[6,2]],'unrestricted':[[21,2],[14,2]],'scrollbars':[[15,2]],'осуществлять':[[22,4]],'getnote':[[18,4]],'plan':[[6,2],[20,2]],'приоритет':[[22,2]],'split':[[11,4]],'changes':[[18,28],[19,2],[12,6],[16,4],[5,12],[17,2],[9,2],[14,2],[15,12],[23,40],[6,2],[24,4],[4,12],[3,2],[10,6],[11,32],[7,4]],'motivate':[[12,2]],'Компактное':[[22,4]],'knowing':[[10,2],[16,2]],'учитывается':[[22,2]],'сделан':[[22,2]],'атрибутов':[[22,4]],'галочки':[[22,2]],'вместо':[[22,12]],'выделится':[[22,2]],'стика':[[22,4]],'inputlogs':[[23,4]],'test':[[11,4],[9,2],[14,2],[6,6],[2,4],[20,2],[10,6],[8,4],[5,4]],'productive':[[11,2]],'desyncs':[[23,2],[14,2]],'Горячие':[[22,12]],'строки':[[22,30]],'изменяя':[[22,2]],'копируются':[[22,2]],'plays':[[7,4]],'относительно':[[22,10]],'him':[[2,6],[6,2]],'возрастанию':[[22,2]],'rightclicks':[[24,2]],'eof':[[25,2]],'completely':[[12,4],[14,2],[6,4],[8,2]],'скриптом':[[22,2]],'помещается':[[22,4]],'animations':[[23,4]],'wide':[[4,2]],'wish':[[1,4],[0,2],[4,2],[16,4],[11,2],[5,2]],'slightly':[[8,1],[6,2],[5,2]],'сэйва':[[22,12]],'multitracking':[[8,2],[15,4],[14,2],[23,4],[2,2],[11,6],[5,4]],'track':[[20,2],[14,2]],'lost':[[8,2]],'emphasizes':[[14,2]],'are':[[18,8],[1,2],[19,16],[12,58],[13,2],[16,4],[20,24],[8,18],[5,40],[17,18],[9,22],[14,32],[15,22],[23,4],[6,38],[2,12],[4,34],[24,16],[25,34],[3,6],[10,6],[11,42],[7,30]],'releasing':[[12,2],[24,2]],'сбоку':[[22,2]],'others':[[12,2],[16,2],[3,2],[20,2]],'music':[[4,2],[14,2],[0,2]],'отличается':[[22,6]],'fatigability':[[8,2]],'откатывать':[[22,2]],'отмечаются':[[22,2]],'notes':[[14,2],[23,14],[6,4],[0,2],[4,6],[12,24],[3,2],[11,12],[5,4]],'реализуются':[[22,2]],'cancelled':[[15,2],[23,2],[5,2]],'reloading':[[7,2]],'состоянии':[[22,2]],'сжимаются':[[22,2]],'naturally':[[12,2],[20,2],[6,4]],'touch':[[6,2]],'getcurrentbranch':[[18,4]],'retry':[[6,2],[7,2]],'хранится':[[22,14]],'простом':[[22,2]],'agrees':[[23,2]],'develops':[[10,2]],'holding':[[11,2],[9,8],[15,4],[19,2],[6,6],[2,2],[10,2],[7,2],[5,4]],'жёлтого':[[22,4]],'дюжине':[[22,2]],'строках':[[22,6]],'вскоре':[[22,2]],'load':[[12,2],[8,4],[5,6],[17,4],[15,26],[23,4],[25,6],[6,2],[24,22],[3,2],[11,20],[7,8]],'setselection':[[18,6]],'продвинутых':[[22,2]],'fer':[[24,2]],'отвязанными':[[22,2]],'skip':[[9,4],[15,2],[6,2],[10,2],[11,4],[5,2]],'thereby':[[11,2]],'которая':[[22,10]],'режим':[[22,6]],'Система':[[22,4]],'revise':[[6,2]],'paused':[[11,2],[12,2],[5,4],[17,2],[15,2],[23,4],[2,2],[24,2],[4,2],[3,2],[18,6],[7,4]],'0000010':[[4,2]],'при':[[22,128]],'выть':[[22,2]],'enough':[[9,2],[2,6],[6,12],[4,4],[24,2],[12,10],[20,6],[7,6],[11,6]],'skips':[[11,2]],'chapters':[[10,2],[2,2],[6,4]],'началом':[[22,6]],'oldest':[[23,2]],'Продвинутые':[[22,6]],'начинаться':[[22,2]],'build':[[23,2],[10,2],[14,2]],'атрибуты':[[22,2]],'accept':[[10,4],[5,2]],'backspace':[[15,4],[11,2],[5,2]],'жёлтый':[[22,6]],'интересующего':[[22,4]],'run':[[17,10],[18,8],[9,2],[15,2],[23,8],[6,2],[12,14],[3,2],[10,2],[8,2],[5,4]],'interface':[[1,2],[14,2],[19,2],[2,6],[0,2],[4,2],[23,12],[3,6],[11,2]],'collects':[[14,2]],'размера':[[22,4]],'indicating':[[25,2]],'прямо':[[22,2]],'обладает':[[22,2]],'three':[[20,2],[7,4],[5,4]],'rarely':[[17,32],[7,4],[15,2],[12,2],[11,2],[5,2]],'indefinite':[[6,2]],'random':[[14,2]],'quiet':[[6,2]],'текущих':[[22,2]],'являющийся':[[22,2]],'relevant':[[16,2],[20,2],[6,2],[11,6]],'forward':[[9,2],[14,4],[15,2],[25,2],[6,4],[16,2],[10,2],[7,2],[5,14]],'aware':[[11,2],[9,2],[6,2],[7,2]],'somehow':[[7,2]],'distributed':[[21,2],[14,2],[8,2]],'sonic':[[14,2]],'клавиш':[[22,8]],'abused':[[14,2]],'прошлый':[[22,2]],'simulating':[[4,2]],'solve':[[14,2]],'mimic':[[14,2]],'расположенному':[[22,2]],'запущенным':[[22,2]],'теоретически':[[22,2]],'impede':[[6,2]],'Правками':[[22,2]],'inflict':[[12,2]],'режиму':[[22,2]],'immediate':[[5,4]],'unsatisfactory':[[7,2]],'отступает':[[22,2]],'масштабе':[[22,2]],'anywhere':[[4,4],[17,4],[15,6],[16,6]],'grow':[[6,4]],'ideally':[[10,2],[16,2]],'compressed':[[23,2],[24,2],[11,4]],'obviously':[[4,2],[12,4],[8,2]],'кеширования':[[22,2]],'stylus':[[14,2]],'каждые':[[22,4]],'habits':[[19,2],[2,2],[8,2]],'tiresome':[[7,2],[8,2]],'environment':[[12,2],[23,2],[0,2]],'duties':[[8,2]],'tail':[[17,2],[11,8]],'tracking':[[16,4]],'reverses':[[18,2]],'somewhere':[[17,2],[15,2],[16,2],[8,2]],'solutions':[[12,2],[14,2]],'Неотмеченные':[[22,2]],'false':[[23,2],[25,2],[18,6]],'things':[[6,6],[14,2],[8,2],[2,4]],'уходит':[[22,6]],'контролировать':[[22,2]],'содержится':[[22,2]],'последнем':[[22,4]],'ТАСа':[[22,4]],'transition':[[12,2]],'origin':[[16,4]],'стратегий':[[22,2]],'эти':[[22,12]],'содержащие':[[22,4]],'ширину':[[22,8]],'сравнивает':[[22,2]],'organization':[[4,2],[2,2],[5,2]],'оценки':[[22,6]],'начального':[[22,4]],'реализовать':[[22,6]],'man':[[2,2],[6,2]],'optional':[[9,4],[10,4],[25,14],[8,4]],'хуже':[[22,2]],'Более':[[22,4]],'благодаря':[[22,4]],'зажата':[[22,2]],'сжатом':[[22,2]],'проблемы':[[22,2]],'оси':[[22,2]],'curent':[[23,2]],'tells':[[24,2]],'hexified':[[25,2]],'cfg':[[11,2],[23,4]],'mode':[[7,18],[8,4],[5,6],[17,6],[9,2],[14,4],[15,18],[23,4],[24,10],[3,2],[10,2],[11,4],[18,4]],'flagpole':[[6,2]],'producing':[[14,2]],'skilled':[[2,2]],'галочка':[[22,8]],'welcome':[[0,2]],'per':[[14,2],[10,2],[23,2],[18,14],[5,2]],'gui':[[15,4],[23,12],[24,6],[12,2],[11,4],[18,6]],'uncompressed':[[23,2]],'следующая':[[22,4]],'желаемого':[[22,2]],'after':[[18,4],[19,4],[12,20],[16,8],[20,4],[8,20],[5,26],[17,46],[9,10],[14,2],[15,4],[23,10],[6,22],[2,4],[4,6],[24,10],[25,12],[10,12],[11,26],[7,22]],'clicking':[[18,2],[9,4],[15,16],[19,2],[24,2],[4,12],[12,2],[11,4],[5,10]],'distinguishes':[[8,2]],'Правки':[[22,12]],'rut':[[2,4]],'recognition':[[9,2]],'expose':[[6,2]],'requirement':[[20,2]],'обновляется':[[22,8]],'всех':[[22,28]],'скрипт':[[22,2]],'Дереве':[[22,10]],'overwritten':[[5,2],[11,2],[7,2]],'элемент':[[22,2]],'использоваться':[[22,2]],'should':[[18,2],[19,6],[12,12],[16,2],[20,4],[8,4],[5,6],[17,4],[9,8],[14,2],[23,48],[25,4],[6,18],[2,4],[4,4],[10,6],[11,10],[7,4]],'white':[[4,2],[15,4],[11,2],[5,2]],'usage':[[8,2],[12,12],[1,2],[2,2],[5,2]],'brings':[[9,2],[24,2],[11,4]],'updating':[[23,2],[14,2]],'компонент':[[22,2]],'редактирования':[[22,14]],'initializes':[[12,2]],'Правок':[[22,8]],'bugs':[[6,2],[14,10]],'vast':[[6,2],[11,2]],'generally':[[14,2],[10,2],[19,2]],'continue':[[9,6],[19,2],[6,2],[12,2],[7,6],[5,2]],'midi':[[14,2]],'famicom':[[25,2],[15,4]],'требуется':[[22,6]],'восстановление':[[22,2]],'запоминается':[[22,2]],'Поиск':[[22,6]],'контекстозависимой':[[22,2]],'define':[[9,2],[10,2],[6,4],[8,2]],'рассчитывается':[[22,2]],'реальный':[[22,2]],'Пересечение':[[22,8]],'repeatable':[[12,2]],'timed':[[6,2]],'координатной':[[22,2]],'платформу':[[22,2]],'adapt':[[10,2],[8,2],[11,2]],'discard':[[10,4],[8,4],[18,2]],'mismatch':[[24,2],[23,2]],'interval':[[7,2],[12,6]],'actions':[[11,4],[15,4],[14,6],[6,6],[2,6],[4,2],[12,6],[10,2],[7,2],[5,4]],'branches':[[11,2],[19,4],[12,2],[16,4],[20,2],[5,24],[17,6],[15,8],[14,6],[23,22],[2,8],[24,8],[7,4],[18,2]],'turn':[[11,4],[9,2],[8,2],[5,4]],'occur':[[9,4],[12,2],[20,2],[11,2],[6,8]],'Выводом':[[22,2]],'зависеть':[[22,2]],'текстового':[[22,2]],'3000':[[24,2]],'аналоговый':[[22,2]],'fonts':[[23,2]],'concentration':[[6,2]],'resync':[[6,4],[7,2]],'odd':[[11,2]],'этого':[[22,32]],'будут':[[22,20]],'стрелке':[[22,4]],'Вместо':[[22,4]],'principles':[[11,2],[19,2],[6,2],[2,2],[10,2],[7,2],[5,2]],'indeterminate':[[18,2]],'bad':[[6,2],[12,2]],'останавливая':[[22,2]],'pick':[[6,2]],'graphics':[[10,2],[12,2]],'perceive':[[6,2],[12,2],[11,2],[2,2]],'журналируемые':[[22,2]],'влево':[[22,2]],'память':[[22,2]],'depends':[[9,4],[14,2],[25,2],[16,2],[10,2],[5,4]],'independently':[[5,2],[24,2],[11,2]],'nonlinear':[[9,6],[14,4],[10,4],[7,2],[8,2]],'undo':[[12,2],[8,4],[5,8],[17,2],[15,6],[22,4],[23,12],[6,2],[2,2],[4,2],[24,6],[3,2],[11,18],[18,2]],'likely':[[2,2],[6,2],[4,2],[12,6],[10,2],[7,2],[11,4]],'конкретно':[[22,4]],'decomposed':[[2,2]],'theme':[[4,2]],'текущего':[[22,54]],'задан':[[22,4]],'mean':[[4,2],[11,4]],'стека':[[22,2]],'whether':[[4,2],[11,2],[2,2],[5,2]],'sub':[[3,2]],'стек':[[22,2]],'site':[[23,2],[25,2],[2,2]],'улучшить':[[22,2]],'соответствующем':[[22,2]],'visualization':[[7,2],[12,2],[14,2],[8,2],[2,4]],'deprecated':[[15,4]],'able':[[11,4],[18,2],[9,2],[23,8],[6,2],[2,6],[12,10],[20,2],[3,2],[7,4],[5,2]],'недавних':[[22,2]],'какие':[[22,4]],'versa':[[15,2],[16,2]],'котором':[[22,12]],'amount':[[7,2],[14,6],[2,2],[12,2],[16,6],[11,6],[5,4]],'all':[[1,2],[16,4],[9,10],[14,20],[15,14],[23,46],[2,10],[24,12],[4,24],[10,12],[18,8],[7,26],[12,34],[13,4],[20,12],[8,2],[5,36],[17,12],[21,2],[22,2],[25,12],[6,28],[3,4],[11,36]],'displays':[[14,4],[23,6],[24,2],[4,4],[3,2],[10,2],[11,4],[5,6]],'удаляется':[[22,2]],'delete':[[17,14],[18,2],[15,12],[14,2],[6,2],[24,2],[11,2],[5,12]],'своё':[[22,6]],'экспериментальных':[[22,2]],'surely':[[2,2]],'способов':[[22,6]],'скриншота':[[22,8]],'полностью':[[22,8]],'researcher':[[2,2]],'near':[[4,2],[17,6],[9,2],[6,2]],'tired':[[20,6],[2,2],[8,2]],'Дополнительный':[[22,2]],'depths':[[9,2]],'предназначены':[[22,2]],'требующей':[[22,2]],'flash':[[4,2],[9,2],[10,4],[7,2],[5,2]],'возможности':[[22,12]],'элемента':[[22,6]],'minimum':[[14,2],[7,2],[11,2]],'друг':[[22,4]],'planned':[[6,2]],'them':[[19,4],[12,10],[16,2],[20,2],[8,6],[5,8],[9,8],[14,6],[15,2],[23,6],[6,18],[2,2],[4,18],[24,2],[25,2],[10,2],[11,20],[18,4]],'hotness':[[11,8]],'светлым':[[22,2]],'данного':[[22,4]],'родительскую':[[22,2]],'alternating':[[17,2],[9,2],[12,2],[10,2],[11,2],[5,2]],'%03d':[[25,4]],'пространстве':[[22,2]],'piano':[[19,10],[12,16],[16,46],[20,4],[8,2],[5,26],[17,36],[9,6],[14,34],[15,66],[22,130],[2,2],[23,24],[4,40],[24,8],[25,8],[3,6],[10,4],[11,40],[7,2]],'variety':[[14,2]],'создают':[[22,2]],'gradual':[[11,2],[23,4]],'адекватной':[[22,2]],'owing':[[2,2]],'выделятся':[[22,2]],'musical':[[8,2]],'least':[[17,6],[15,2],[14,2],[23,4],[6,2],[4,2],[12,6],[5,2]],'purposes':[[12,2],[24,2]],'чтобы':[[22,56]],'запоминаются':[[22,2]],'успешном':[[22,2]],'viewpoint':[[2,2]],'facts':[[2,2]],'change':[[18,8],[19,4],[12,10],[5,30],[17,82],[9,10],[15,12],[23,10],[6,6],[2,2],[4,14],[24,8],[3,2],[10,4],[11,8],[7,4]],'factors':[[7,8],[9,4],[6,46],[12,4],[20,4],[10,6],[8,2],[5,2]],'scripts':[[12,16],[18,8],[2,2]],'upload':[[2,2]],'directly':[[12,2],[14,2],[6,4],[7,4]],'обязательно':[[22,4]],'нулевой':[[22,2]],'bookmark1':[[17,4]],'умолчанию':[[22,6]],'эмуляции':[[22,18]],'проект':[[22,6]],'asksave':[[23,2]],'brighter':[[5,2]],'bit3':[[25,4]],'thoroughly':[[20,2],[10,2],[14,2]],'complete':[[9,2],[10,2],[7,8],[11,2]],'status':[[15,2],[23,4],[18,2]],'attempts':[[6,2]],'array':[[18,2],[23,24]],'fundamentals':[[1,2]],'rolling':[[9,2],[16,4],[19,2],[24,6]],'bumps':[[9,2]],'Джойстик':[[22,12]],'visualize':[[5,2]],'remains':[[12,2],[5,2]],'1440':[[11,2]],'хранения':[[22,6]],'Скорее':[[22,2]],'decompose':[[14,2]],'our':[[2,2],[6,2]],'confugure':[[11,2]],'прошлом':[[22,4]],'resource':[[23,2]],'best':[[9,14],[14,12],[6,18],[2,2],[24,2],[12,2],[20,28],[10,10],[8,12],[7,6]],'опустить':[[22,2]],'mapped':[[15,4],[11,4],[5,2]],'natural':[[12,2],[20,2],[2,2],[6,2]],'plug':[[19,2],[5,2]],'multitude':[[20,2],[6,4],[5,2]],'повышающие':[[22,2]],'preceding':[[5,2]],'critic':[[6,2]],'ассоциируется':[[22,12]],'video':[[12,2],[14,2],[6,2],[5,10]],'повторно':[[22,2]],'integrated':[[12,2],[0,2]],'reasonable':[[8,2],[11,2],[6,4]],'opened':[[4,2],[12,2],[24,4]],'spends':[[2,2]],'justify':[[2,2]],'estimate':[[8,2],[5,4]],'distracting':[[3,2],[7,2]],'tooltips':[[23,2],[3,2],[11,6]],'monstrous':[[5,2]],'presence':[[20,6],[5,2]],'interconnection':[[10,2],[9,2]],'checking':[[23,4],[14,2],[18,2]],'столбцы':[[22,26]],'множества':[[22,2]],'markings':[[8,2]],'одного':[[22,14]],'ограничение':[[22,4]],'equals':[[6,2]],'считается':[[22,6]],'списке':[[22,2]],'absence':[[20,6]],'considered':[[14,6],[25,8],[6,6],[24,4],[4,2],[20,8],[10,2],[7,2]],'bookmark6':[[17,2]],'remaining':[[11,2],[3,2],[25,6],[6,4],[8,2]],'ответвлениям':[[22,2]],'pausing':[[9,2]],'организован':[[22,2]],'активный':[[22,2]],'Ширина':[[22,2]],'message':[[17,4],[25,2],[19,2],[24,6],[12,2],[11,2],[5,4]],'types':[[17,2],[20,4],[23,2],[25,6],[7,2]],'hurry':[[6,2],[9,4]],'bringing':[[12,2],[20,2],[10,2]],'prompts':[[23,2],[19,2],[5,2]],'display':[[15,14],[23,2],[2,4],[24,2],[4,4],[16,2],[10,4],[20,2],[11,10]],'arrays':[[20,4]],'полезна':[[22,2]],'redrawing':[[23,16]]}; \ No newline at end of file diff --git a/help/taseditor/lib/Monitor-example.png b/help/taseditor/lib/Monitor-example.png new file mode 100644 index 00000000..dcbd25a2 Binary files /dev/null and b/help/taseditor/lib/Monitor-example.png differ diff --git a/help/taseditor/lib/NES-controller.png b/help/taseditor/lib/NES-controller.png new file mode 100644 index 00000000..414a15f0 Binary files /dev/null and b/help/taseditor/lib/NES-controller.png differ diff --git a/help/taseditor/lib/branches-example1.png b/help/taseditor/lib/branches-example1.png new file mode 100644 index 00000000..d2fab92e Binary files /dev/null and b/help/taseditor/lib/branches-example1.png differ diff --git a/help/taseditor/lib/branches-example2.png b/help/taseditor/lib/branches-example2.png new file mode 100644 index 00000000..2d1e496b Binary files /dev/null and b/help/taseditor/lib/branches-example2.png differ diff --git a/help/taseditor/lib/branches-example3.png b/help/taseditor/lib/branches-example3.png new file mode 100644 index 00000000..68d7bc35 Binary files /dev/null and b/help/taseditor/lib/branches-example3.png differ diff --git a/help/taseditor/lib/branches-example4.png b/help/taseditor/lib/branches-example4.png new file mode 100644 index 00000000..eba35ea9 Binary files /dev/null and b/help/taseditor/lib/branches-example4.png differ diff --git a/help/taseditor/lib/branches-example5.png b/help/taseditor/lib/branches-example5.png new file mode 100644 index 00000000..573d5df4 Binary files /dev/null and b/help/taseditor/lib/branches-example5.png differ diff --git a/help/taseditor/lib/branches-example6.png b/help/taseditor/lib/branches-example6.png new file mode 100644 index 00000000..f78f492c Binary files /dev/null and b/help/taseditor/lib/branches-example6.png differ diff --git a/help/taseditor/lib/chip-and-dale.png b/help/taseditor/lib/chip-and-dale.png new file mode 100644 index 00000000..13d51d06 Binary files /dev/null and b/help/taseditor/lib/chip-and-dale.png differ diff --git a/help/taseditor/lib/config-menu.png b/help/taseditor/lib/config-menu.png new file mode 100644 index 00000000..65a41170 Binary files /dev/null and b/help/taseditor/lib/config-menu.png differ diff --git a/help/taseditor/lib/dw-luck_manipulation.gif b/help/taseditor/lib/dw-luck_manipulation.gif new file mode 100644 index 00000000..c4142f37 Binary files /dev/null and b/help/taseditor/lib/dw-luck_manipulation.gif differ diff --git a/help/taseditor/lib/export-to-fm2.png b/help/taseditor/lib/export-to-fm2.png new file mode 100644 index 00000000..8757304e Binary files /dev/null and b/help/taseditor/lib/export-to-fm2.png differ diff --git a/help/taseditor/lib/famtasia-smb3j.png b/help/taseditor/lib/famtasia-smb3j.png new file mode 100644 index 00000000..7b373863 Binary files /dev/null and b/help/taseditor/lib/famtasia-smb3j.png differ diff --git a/help/taseditor/lib/find-note.png b/help/taseditor/lib/find-note.png new file mode 100644 index 00000000..1cd00a80 Binary files /dev/null and b/help/taseditor/lib/find-note.png differ diff --git a/help/taseditor/lib/game-player-taser.png b/help/taseditor/lib/game-player-taser.png new file mode 100644 index 00000000..2106da78 Binary files /dev/null and b/help/taseditor/lib/game-player-taser.png differ diff --git a/help/taseditor/lib/greenzone-capacity.png b/help/taseditor/lib/greenzone-capacity.png new file mode 100644 index 00000000..8f75d907 Binary files /dev/null and b/help/taseditor/lib/greenzone-capacity.png differ diff --git a/help/taseditor/lib/help-menu.png b/help/taseditor/lib/help-menu.png new file mode 100644 index 00000000..62e5a100 Binary files /dev/null and b/help/taseditor/lib/help-menu.png differ diff --git a/help/taseditor/lib/hotchanges-colors.png b/help/taseditor/lib/hotchanges-colors.png new file mode 100644 index 00000000..d37f500d Binary files /dev/null and b/help/taseditor/lib/hotchanges-colors.png differ diff --git a/help/taseditor/lib/keyboard-accelerator-keys.png b/help/taseditor/lib/keyboard-accelerator-keys.png new file mode 100644 index 00000000..56f41c7f Binary files /dev/null and b/help/taseditor/lib/keyboard-accelerator-keys.png differ diff --git a/help/taseditor/lib/keyboard-all-keys.png b/help/taseditor/lib/keyboard-all-keys.png new file mode 100644 index 00000000..b508b6b4 Binary files /dev/null and b/help/taseditor/lib/keyboard-all-keys.png differ diff --git a/help/taseditor/lib/keyboard-hotkeys.png b/help/taseditor/lib/keyboard-hotkeys.png new file mode 100644 index 00000000..66315c81 Binary files /dev/null and b/help/taseditor/lib/keyboard-hotkeys.png differ diff --git a/help/taseditor/lib/lua-run-manual.png b/help/taseditor/lib/lua-run-manual.png new file mode 100644 index 00000000..21b9a94c Binary files /dev/null and b/help/taseditor/lib/lua-run-manual.png differ diff --git a/help/taseditor/lib/patterns-menu.png b/help/taseditor/lib/patterns-menu.png new file mode 100644 index 00000000..8a0ff098 Binary files /dev/null and b/help/taseditor/lib/patterns-menu.png differ diff --git a/help/taseditor/lib/piano-roll-header-l.png b/help/taseditor/lib/piano-roll-header-l.png new file mode 100644 index 00000000..261792ac Binary files /dev/null and b/help/taseditor/lib/piano-roll-header-l.png differ diff --git a/help/taseditor/lib/pianoroll.png b/help/taseditor/lib/pianoroll.png new file mode 100644 index 00000000..916f972a Binary files /dev/null and b/help/taseditor/lib/pianoroll.png differ diff --git a/help/taseditor/lib/save-compact.png b/help/taseditor/lib/save-compact.png new file mode 100644 index 00000000..c86c2813 Binary files /dev/null and b/help/taseditor/lib/save-compact.png differ diff --git a/help/taseditor/lib/savestate_slots.png b/help/taseditor/lib/savestate_slots.png new file mode 100644 index 00000000..bc147119 Binary files /dev/null and b/help/taseditor/lib/savestate_slots.png differ diff --git a/help/taseditor/lib/smb-segments.gif b/help/taseditor/lib/smb-segments.gif new file mode 100644 index 00000000..41a4629b Binary files /dev/null and b/help/taseditor/lib/smb-segments.gif differ diff --git a/help/taseditor/lib/smb-zigzag.png b/help/taseditor/lib/smb-zigzag.png new file mode 100644 index 00000000..e898c0db Binary files /dev/null and b/help/taseditor/lib/smb-zigzag.png differ diff --git a/help/taseditor/lib/taseditor-smb.png b/help/taseditor/lib/taseditor-smb.png new file mode 100644 index 00000000..01b0b5bf Binary files /dev/null and b/help/taseditor/lib/taseditor-smb.png differ diff --git a/help/taseditor/lib/toolbox-bookmarks.png b/help/taseditor/lib/toolbox-bookmarks.png new file mode 100644 index 00000000..90506cd7 Binary files /dev/null and b/help/taseditor/lib/toolbox-bookmarks.png differ diff --git a/help/taseditor/lib/toolbox-branches.png b/help/taseditor/lib/toolbox-branches.png new file mode 100644 index 00000000..e039257a Binary files /dev/null and b/help/taseditor/lib/toolbox-branches.png differ diff --git a/help/taseditor/lib/toolbox-history.png b/help/taseditor/lib/toolbox-history.png new file mode 100644 index 00000000..a125ec38 Binary files /dev/null and b/help/taseditor/lib/toolbox-history.png differ diff --git a/help/taseditor/lib/toolbox-lua.png b/help/taseditor/lib/toolbox-lua.png new file mode 100644 index 00000000..53eda7a0 Binary files /dev/null and b/help/taseditor/lib/toolbox-lua.png differ diff --git a/help/taseditor/lib/toolbox-method1.png b/help/taseditor/lib/toolbox-method1.png new file mode 100644 index 00000000..bfa0b172 Binary files /dev/null and b/help/taseditor/lib/toolbox-method1.png differ diff --git a/help/taseditor/lib/toolbox-method2.png b/help/taseditor/lib/toolbox-method2.png new file mode 100644 index 00000000..4bbfe873 Binary files /dev/null and b/help/taseditor/lib/toolbox-method2.png differ diff --git a/help/taseditor/lib/toolbox-method3.png b/help/taseditor/lib/toolbox-method3.png new file mode 100644 index 00000000..b65efccc Binary files /dev/null and b/help/taseditor/lib/toolbox-method3.png differ diff --git a/help/taseditor/lib/toolbox-playback.png b/help/taseditor/lib/toolbox-playback.png new file mode 100644 index 00000000..7f93388f Binary files /dev/null and b/help/taseditor/lib/toolbox-playback.png differ diff --git a/help/taseditor/lib/toolbox-recorder.png b/help/taseditor/lib/toolbox-recorder.png new file mode 100644 index 00000000..99dc30a4 Binary files /dev/null and b/help/taseditor/lib/toolbox-recorder.png differ diff --git a/help/taseditor/lib/toolbox-selection.png b/help/taseditor/lib/toolbox-selection.png new file mode 100644 index 00000000..531f37a3 Binary files /dev/null and b/help/taseditor/lib/toolbox-selection.png differ diff --git a/help/taseditor/lib/toolbox-splicer.png b/help/taseditor/lib/toolbox-splicer.png new file mode 100644 index 00000000..f2c9f5d0 Binary files /dev/null and b/help/taseditor/lib/toolbox-splicer.png differ diff --git a/help/taseditor/lib/toolbox.png b/help/taseditor/lib/toolbox.png new file mode 100644 index 00000000..9edada30 Binary files /dev/null and b/help/taseditor/lib/toolbox.png differ diff --git a/help/taseditor/lib/view-menu.png b/help/taseditor/lib/view-menu.png new file mode 100644 index 00000000..61ffcbe5 Binary files /dev/null and b/help/taseditor/lib/view-menu.png differ diff --git a/help/taseditor/toc.html b/help/taseditor/toc.html new file mode 100644 index 00000000..5782c129 --- /dev/null +++ b/help/taseditor/toc.html @@ -0,0 +1,389 @@ + + + + + TAS Editor Manual- Table of Contents + + + + + + + + + + + + + + + + + + + + + + + + + +