Write A Program That Outputs Its Mirror Level There are 95 printable ASCII characters:
 !&quot;#$%&amp;'()*+,-./0123456789:;&lt;=&gt;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

In the Consolas font (the Stack Exchange code block default), some of the characters have mirrors around a vertical axis of symmetry:

These pairs of characters are mirrors of each other: () [] {} &lt;&gt; /\
These characters are mirrors of themselves: ! &quot;'*+-.8:=AHIMOTUVWXY^_ovwx| (Note that space is one.)
These do not have mirrors: #$%&amp;,012345679;?@BCDEFGJKLNPQRSZ`abcdefghijklmnpqrstuyz~

(i, l, 0, #, and probably other characters are their own mirrors in some fonts but we'll stick to the Consolas shapes.)
A string is said to be a mirror of itself if it is made with only the 39 mirror characters, arranged such that the string has a central vertical line of symmetry. So ](A--A)[ is a mirror of itself but ](A--A(] is not.
Write a one-line even-length program that is a mirror of itself. When N copies of its left half have been prepended to it and N copies of its right half have been appended to it, it should output N+1. N is a non-negative integer.
For example, if the program was ](A--A)[ (left half: ](A-, right half: -A)[), then:

Running ](A--A)[ should output 1. (N = 0)
Running ](A-](A--A)[-A)[ should output 2. (N = 1)
Running ](A-](A-](A--A)[-A)[-A)[ should output 3. (N = 2)
Running ](A-](A-](A-](A--A)[-A)[-A)[-A)[ should output 4. (N = 3)
. . .
Running ](A-](A-](A-](A-](A-](A-](A-](A-](A-](A--A)[-A)[-A)[-A)[-A)[-A)[-A)[-A)[-A)[-A)[ should output 10. (N = 9)
etc.

Rules

Output to stdout or your language's closest alternative. There may be an optional trailing newline. No input should be taken.
The process should theoretically work for N up to 215-1 or beyond, given enough memory and computing power.
A full program is required, not just a REPL command.

The shortest initial program (N = 0 case) in bytes wins.
GolfScript, 10 bytes

!:{)::(}:!


Try it online with Web Golfscript: N = 0, N = 1, N = 2, N = 3, N = 41

Web GolfScript has a 1024 character limit, but the Ruby interpreter handles N = 32767 perfectly:

$ curl -Ss http://www.golfscript.com/golfscript/golfscript.rb &gt; golfscript.rb
$ echo '"!:{):"32768*":(}:!"32768*' | ruby golfscript.rb &gt; mirror-level-32767.gs
$ ruby golfscript.rb mirror-level-32767.gs
32768


How it works

Without any input, GolfScript initially has an empty string on the stack.

In the first left half, the following happens:


! applies logical NOT to the empty string. This pushes 1.
:{ saves the integer on the stack in the variable {.

Yes, that is a valid identifier, although there's no way to retrieve the stored value.
) increments the integer on the stack.
: is an incomplete instruction.


The the subsequent left halves, the following happens:


:! (where : is a leftover from before) saves the integer on the stack in the variable !.

Yes, that is also a valid identifier. This breaks the ! command, but we don't use it anymore.
:{, ) and : work as before.


In the first right half, the following happens:


:: (where : is a leftover from before) saves the integer on the stack in the variable :.

Yes, even that is valid identifier. As with {, there's no way to retrieve the stored value.
( decrements the integer on the stack, yielding the number of left halves.
}, since it is unmatched and terminates execution immediately.

This is an undocumented feature. I call them supercomments.


The remaining code is simply ignored.