$26 GRAYBYTE WORDPRESS FILE MANAGER $32

SERVER : vnpttt-amd7f72-h1.vietnix.vn #1 SMP Fri May 24 12:42:50 UTC 2024
SERVER IP : 103.200.23.149 | ADMIN IP 216.73.216.22
OPTIONS : CRL = ON | WGT = ON | SDO = OFF | PKEX = OFF
DEACTIVATED : NONE

/usr/share/vim/vim80/indent/

HOME
Current File : /usr/share/vim/vim80/indent//sqlanywhere.vim
" Vim indent file
" Language:    SQL
" Maintainer:  David Fishburn <dfishburn dot vim at gmail dot com>
" Last Change: 2017 Jun 13
" Version:     3.0
" Download:    http://vim.sourceforge.net/script.php?script_id=495

" Notes:
"    Indenting keywords are based on Oracle and Sybase Adaptive Server
"    Anywhere (ASA).  Test indenting was done with ASA stored procedures and
"    fuctions and Oracle packages which contain stored procedures and
"    functions.
"    This has not been tested against Microsoft SQL Server or
"    Sybase Adaptive Server Enterprise (ASE) which use the Transact-SQL
"    syntax.  That syntax does not have end tags for IF's, which makes
"    indenting more difficult.
"
" Known Issues:
"    The Oracle MERGE statement does not have an end tag associated with
"    it, this can leave the indent hanging to the right one too many.
"
" History:
"    3.0 (Dec 2012)
"        Added cpo check
"
"    2.0
"        Added the FOR keyword to SQLBlockStart to handle (Alec Tica):
"            for i in 1..100 loop
"              |<-- I expect to have indentation here
"            end loop;
"

" Only load this indent file when no other was loaded.
if exists("b:did_indent")
    finish
endif
let b:did_indent     = 1
let b:current_indent = "sqlanywhere"

setlocal indentkeys-=0{
setlocal indentkeys-=0}
setlocal indentkeys-=:
setlocal indentkeys-=0#
setlocal indentkeys-=e

" This indicates formatting should take place when one of these
" expressions is used.  These expressions would normally be something
" you would type at the BEGINNING of a line
" SQL is generally case insensitive, so this files assumes that
" These keywords are something that would trigger an indent LEFT, not
" an indent right, since the SQLBlockStart is used for those keywords
setlocal indentkeys+==~end,=~else,=~elseif,=~elsif,0=~when,0=)

" GetSQLIndent is executed whenever one of the expressions
" in the indentkeys is typed
setlocal indentexpr=GetSQLIndent()

" Only define the functions once.
if exists("*GetSQLIndent")
    finish
endif
let s:keepcpo= &cpo
set cpo&vim

" List of all the statements that start a new block.
" These are typically words that start a line.
" IS is excluded, since it is difficult to determine when the
" ending block is (especially for procedures/functions).
let s:SQLBlockStart = '^\s*\%('.
                \ 'if\|else\|elseif\|elsif\|'.
                \ 'while\|loop\|do\|for\|'.
                \ 'begin\|'.
                \ 'case\|when\|merge\|exception'.
                \ '\)\>'
let s:SQLBlockEnd = '^\s*\(end\)\>'

" The indent level is also based on unmatched paranethesis
" If a line has an extra "(" increase the indent
" If a line has an extra ")" decrease the indent
function! s:CountUnbalancedParan( line, paran_to_check )
    let l = a:line
    let lp = substitute(l, '[^(]', '', 'g')
    let l = a:line
    let rp = substitute(l, '[^)]', '', 'g')

    if a:paran_to_check =~ ')'
        " echom 'CountUnbalancedParan ) returning: ' .
        " \ (strlen(rp) - strlen(lp))
        return (strlen(rp) - strlen(lp))
    elseif a:paran_to_check =~ '('
        " echom 'CountUnbalancedParan ( returning: ' .
        " \ (strlen(lp) - strlen(rp))
        return (strlen(lp) - strlen(rp))
    else
        " echom 'CountUnbalancedParan unknown paran to check: ' .
        " \ a:paran_to_check
        return 0
    endif
endfunction

" Unindent commands based on previous indent level
function! s:CheckToIgnoreRightParan( prev_lnum, num_levels )
    let lnum = a:prev_lnum
    let line = getline(lnum)
    let ends = 0
    let num_right_paran = a:num_levels
    let ignore_paran = 0
    let vircol = 1

    while num_right_paran > 0
        silent! exec 'norm! '.lnum."G\<bar>".vircol."\<bar>"
        let right_paran = search( ')', 'W' )
        if right_paran != lnum
            " This should not happen since there should be at least
            " num_right_paran matches for this line
            break
        endif
        let vircol      = virtcol(".")

        " if getline(".") =~ '^)'
        let matching_paran = searchpair('(', '', ')', 'bW',
                    \ 's:IsColComment(line("."), col("."))')

        if matching_paran < 1
            " No match found
            " echom 'CTIRP - no match found, ignoring'
            break
        endif

        if matching_paran == lnum
            " This was not an unmatched parantenses, start the search again
            " again after this column
            " echom 'CTIRP - same line match, ignoring'
            continue
        endif

        " echom 'CTIRP - match: ' . line(".") . '  ' . getline(".")

        if getline(matching_paran) =~? '\(if\|while\)\>'
            " echom 'CTIRP - if/while ignored: ' . line(".") . '  ' . getline(".")
            let ignore_paran = ignore_paran + 1
        endif

        " One match found, decrease and check for further matches
        let num_right_paran = num_right_paran - 1

    endwhile

    " Fallback - just move back one
    " return a:prev_indent - shiftwidth()
    return ignore_paran
endfunction

" Based on the keyword provided, loop through previous non empty
" non comment lines to find the statement that initated the keyword.
" Return its indent level
"    CASE ..
"    WHEN ...
" Should return indent level of CASE
"    EXCEPTION ..
"    WHEN ...
"         something;
"    WHEN ...
" Should return indent level of exception.
function! s:GetStmtStarterIndent( keyword, curr_lnum )
    let lnum  = a:curr_lnum

    " Default - reduce indent by 1
    let ind = indent(a:curr_lnum) - shiftwidth()

    if a:keyword =~? 'end'
        exec 'normal! ^'
        let stmts = '^\s*\%('.
                    \ '\<begin\>\|' .
                    \ '\%(\%(\<end\s\+\)\@<!\<loop\>\)\|' .
                    \ '\%(\%(\<end\s\+\)\@<!\<case\>\)\|' .
                    \ '\%(\%(\<end\s\+\)\@<!\<for\>\)\|' .
                    \ '\%(\%(\<end\s\+\)\@<!\<if\>\)'.
                    \ '\)'
        let matching_lnum = searchpair(stmts, '', '\<end\>\zs', 'bW',
                    \ 's:IsColComment(line("."), col(".")) == 1')
        exec 'normal! $'
        if matching_lnum > 0 && matching_lnum < a:curr_lnum
            let ind = indent(matching_lnum)
        endif
    elseif a:keyword =~? 'when'
        exec 'normal! ^'
        let matching_lnum = searchpair(
                    \ '\%(\<end\s\+\)\@<!\<case\>\|\<exception\>\|\<merge\>',
                    \ '',
                    \ '\%(\%(\<when\s\+others\>\)\|\%(\<end\s\+case\>\)\)',
                    \ 'bW',
                    \ 's:IsColComment(line("."), col(".")) == 1')
        exec 'normal! $'
        if matching_lnum > 0 && matching_lnum < a:curr_lnum
            let ind = indent(matching_lnum)
        else
            let ind = indent(a:curr_lnum)
        endif
    endif

    return ind
endfunction


" Check if the line is a comment
function! s:IsLineComment(lnum)
    let rc = synIDattr(
                \ synID(a:lnum,
                \     match(getline(a:lnum), '\S')+1, 0)
                \ , "name")
                \ =~? "comment"

    return rc
endfunction


" Check if the column is a comment
function! s:IsColComment(lnum, cnum)
    let rc = synIDattr(synID(a:lnum, a:cnum, 0), "name")
                \           =~? "comment"

    return rc
endfunction


" Instead of returning a column position, return
" an appropriate value as a factor of shiftwidth.
function! s:ModuloIndent(ind)
    let ind = a:ind

    if ind > 0
        let modulo = ind % shiftwidth()

        if modulo > 0
            let ind = ind - modulo
        endif
    endif

    return ind
endfunction


" Find correct indent of a new line based upon the previous line
function! GetSQLIndent()
    let lnum = v:lnum
    let ind = indent(lnum)

    " If the current line is a comment, leave the indent as is
    " Comment out this additional check since it affects the
    " indenting of =, and will not reindent comments as it should
    " if s:IsLineComment(lnum) == 1
    "     return ind
    " endif

    " Get previous non-blank line
    let prevlnum = prevnonblank(lnum - 1)
    if prevlnum <= 0
        return ind
    endif

    if s:IsLineComment(prevlnum) == 1
        if getline(v:lnum) =~ '^\s*\*'
            let ind = s:ModuloIndent(indent(prevlnum))
            return ind + 1
        endif
        " If the previous line is a comment, then return -1
        " to tell Vim to use the formatoptions setting to determine
        " the indent to use
        " But only if the next line is blank.  This would be true if
        " the user is typing, but it would not be true if the user
        " is reindenting the file
        if getline(v:lnum) =~ '^\s*$'
            return -1
        endif
    endif

    " echom 'PREVIOUS INDENT: ' . indent(prevlnum) . '  LINE: ' . getline(prevlnum)

    " This is the line you just hit return on, it is not the current line
    " which is new and empty
    " Based on this line, we can determine how much to indent the new
    " line

    " Get default indent (from prev. line)
    let ind      = indent(prevlnum)
    let prevline = getline(prevlnum)

    " Now check what's on the previous line to determine if the indent
    " should be changed, for example IF, BEGIN, should increase the indent
    " where END IF, END, should decrease the indent.
    if prevline =~? s:SQLBlockStart
        " Move indent in
        let ind = ind + shiftwidth()
        " echom 'prevl - SQLBlockStart - indent ' . ind . '  line: ' . prevline
    elseif prevline =~ '[()]'
        if prevline =~ '('
            let num_unmatched_left = s:CountUnbalancedParan( prevline, '(' )
        else
            let num_unmatched_left = 0
        endif
        if prevline =~ ')'
            let num_unmatched_right  = s:CountUnbalancedParan( prevline, ')' )
        else
            let num_unmatched_right  = 0
            " let num_unmatched_right  = s:CountUnbalancedParan( prevline, ')' )
        endif
        if num_unmatched_left > 0
            " There is a open left paranethesis
            " increase indent
            let ind = ind + ( shiftwidth() * num_unmatched_left )
        elseif num_unmatched_right > 0
            " if it is an unbalanced paranethesis only unindent if
            " it was part of a command (ie create table(..)  )
            " instead of part of an if (ie if (....) then) which should
            " maintain the indent level
            let ignore = s:CheckToIgnoreRightParan( prevlnum, num_unmatched_right )
            " echom 'prevl - ) unbalanced - CTIRP - ignore: ' . ignore

            if prevline =~ '^\s*)'
                let ignore = ignore + 1
                " echom 'prevl - begins ) unbalanced ignore: ' . ignore
            endif

            if (num_unmatched_right - ignore) > 0
                let ind = ind - ( shiftwidth() * (num_unmatched_right - ignore) )
            endif

        endif
    endif


    " echom 'CURRENT INDENT: ' . ind . '  LINE: '  . getline(v:lnum)

    " This is a new blank line since we just typed a carriage return
    " Check current line; search for simplistic matching start-of-block
    let line = getline(v:lnum)

    if line =~? '^\s*els'
        " Any line when you type else will automatically back up one
        " ident level  (ie else, elseif, elsif)
        let ind = ind - shiftwidth()
        " echom 'curr - else - indent ' . ind
    elseif line =~? '^\s*end\>'
        let ind = s:GetStmtStarterIndent('end', v:lnum)
        " General case for end
        " let ind = ind - shiftwidth()
        " echom 'curr - end - indent ' . ind
    elseif line =~? '^\s*when\>'
        let ind = s:GetStmtStarterIndent('when', v:lnum)
        " If the WHEN clause is used with a MERGE or EXCEPTION
        " clause, do not change the indent level, since these
        " statements do not have a corresponding END statement.
        " if stmt_starter =~? 'case'
        "    let ind = ind - shiftwidth()
        " endif
        " elseif line =~ '^\s*)\s*;\?\s*$'
        " elseif line =~ '^\s*)'
    elseif line =~ '^\s*)'
        let num_unmatched_right  = s:CountUnbalancedParan( line, ')' )
        let ignore = s:CheckToIgnoreRightParan( v:lnum, num_unmatched_right )
        " If the line ends in a ), then reduce the indent
        " This catches items like:
        " CREATE TABLE T1(
        "    c1 int,
        "    c2 int
        "    );
        " But we do not want to unindent a line like:
        " IF ( c1 = 1
        " AND  c2 = 3 ) THEN
        " let num_unmatched_right  = s:CountUnbalancedParan( line, ')' )
        " if num_unmatched_right > 0
        " elseif strpart( line, strlen(line)-1, 1 ) =~ ')'
        " let ind = ind - shiftwidth()
        if line =~ '^\s*)'
            " let ignore = ignore + 1
            " echom 'curr - begins ) unbalanced ignore: ' . ignore
        endif

        if (num_unmatched_right - ignore) > 0
            let ind = ind - ( shiftwidth() * (num_unmatched_right - ignore) )
        endif
        " endif
    endif

    " echom 'final - indent ' . ind
    return s:ModuloIndent(ind)
endfunction

"  Restore:
let &cpo= s:keepcpo
unlet s:keepcpo
" vim: ts=4 fdm=marker sw=4

Current_dir [ NOT WRITEABLE ] Document_root [ WRITEABLE ]


[ Back ]
NAME
SIZE
LAST TOUCH
USER
CAN-I?
FUNCTIONS
..
--
16 Dec 2025 9.30 PM
root / root
0755
README.txt
1.601 KB
12 Oct 2025 7.23 AM
root / root
0644
aap.vim
0.259 KB
12 Oct 2025 7.23 AM
root / root
0644
ada.vim
10.972 KB
12 Oct 2025 7.23 AM
root / root
0644
ant.vim
0.283 KB
12 Oct 2025 7.23 AM
root / root
0644
automake.vim
0.237 KB
12 Oct 2025 7.23 AM
root / root
0644
awk.vim
7.593 KB
12 Oct 2025 7.23 AM
root / root
0644
bib.vim
0.338 KB
12 Oct 2025 7.23 AM
root / root
0644
bst.vim
1.892 KB
12 Oct 2025 7.23 AM
root / root
0644
bzl.vim
2.426 KB
12 Oct 2025 7.23 AM
root / root
0644
c.vim
0.317 KB
12 Oct 2025 7.23 AM
root / root
0644
cdl.vim
4.153 KB
12 Oct 2025 7.23 AM
root / root
0644
ch.vim
0.459 KB
12 Oct 2025 7.23 AM
root / root
0644
chaiscript.vim
1.111 KB
12 Oct 2025 7.23 AM
root / root
0644
changelog.vim
0.258 KB
12 Oct 2025 7.23 AM
root / root
0644
clojure.vim
10.195 KB
12 Oct 2025 7.23 AM
root / root
0644
cmake.vim
2.62 KB
12 Oct 2025 7.23 AM
root / root
0644
cobol.vim
8.11 KB
12 Oct 2025 7.23 AM
root / root
0644
config.vim
2.131 KB
12 Oct 2025 7.23 AM
root / root
0644
context.vim
0.734 KB
12 Oct 2025 7.23 AM
root / root
0644
cpp.vim
0.321 KB
12 Oct 2025 7.23 AM
root / root
0644
cs.vim
0.319 KB
12 Oct 2025 7.23 AM
root / root
0644
css.vim
1.748 KB
12 Oct 2025 7.23 AM
root / root
0644
cucumber.vim
2.615 KB
12 Oct 2025 7.23 AM
root / root
0644
cuda.vim
0.298 KB
12 Oct 2025 7.23 AM
root / root
0644
d.vim
0.498 KB
12 Oct 2025 7.23 AM
root / root
0644
dictconf.vim
0.329 KB
12 Oct 2025 7.23 AM
root / root
0644
dictdconf.vim
0.33 KB
12 Oct 2025 7.23 AM
root / root
0644
docbk.vim
0.328 KB
12 Oct 2025 7.23 AM
root / root
0644
dtd.vim
11.591 KB
12 Oct 2025 7.23 AM
root / root
0644
dtrace.vim
0.44 KB
12 Oct 2025 7.23 AM
root / root
0644
dylan.vim
2.644 KB
12 Oct 2025 7.23 AM
root / root
0644
eiffel.vim
3.239 KB
12 Oct 2025 7.23 AM
root / root
0644
erlang.vim
45.292 KB
12 Oct 2025 7.23 AM
root / root
0644
eruby.vim
2.736 KB
12 Oct 2025 7.23 AM
root / root
0644
eterm.vim
0.652 KB
12 Oct 2025 7.23 AM
root / root
0644
falcon.vim
13.725 KB
12 Oct 2025 7.23 AM
root / root
0644
fortran.vim
7.271 KB
12 Oct 2025 7.23 AM
root / root
0644
framescript.vim
0.797 KB
12 Oct 2025 7.23 AM
root / root
0644
gitconfig.vim
0.821 KB
12 Oct 2025 7.23 AM
root / root
0644
gitolite.vim
1.247 KB
12 Oct 2025 7.23 AM
root / root
0644
go.vim
1.634 KB
12 Oct 2025 7.23 AM
root / root
0644
haml.vim
2.159 KB
12 Oct 2025 7.23 AM
root / root
0644
hamster.vim
1.392 KB
12 Oct 2025 7.23 AM
root / root
0644
hog.vim
1.848 KB
12 Oct 2025 7.23 AM
root / root
0644
html.vim
32.469 KB
12 Oct 2025 7.23 AM
root / root
0644
htmldjango.vim
0.267 KB
12 Oct 2025 7.23 AM
root / root
0644
idlang.vim
1.582 KB
12 Oct 2025 7.23 AM
root / root
0644
ishd.vim
1.833 KB
12 Oct 2025 7.23 AM
root / root
0644
j.vim
1.771 KB
12 Oct 2025 7.23 AM
root / root
0644
java.vim
4.187 KB
12 Oct 2025 7.23 AM
root / root
0644
javascript.vim
15.002 KB
12 Oct 2025 7.23 AM
root / root
0644
json.vim
4.317 KB
12 Oct 2025 7.23 AM
root / root
0644
jsp.vim
0.451 KB
12 Oct 2025 7.23 AM
root / root
0644
ld.vim
1.75 KB
12 Oct 2025 7.23 AM
root / root
0644
less.vim
0.237 KB
12 Oct 2025 7.23 AM
root / root
0644
lifelines.vim
0.622 KB
12 Oct 2025 7.23 AM
root / root
0644
liquid.vim
1.854 KB
12 Oct 2025 7.23 AM
root / root
0644
lisp.vim
0.345 KB
12 Oct 2025 7.23 AM
root / root
0644
logtalk.vim
1.703 KB
12 Oct 2025 7.23 AM
root / root
0644
lua.vim
1.882 KB
12 Oct 2025 7.23 AM
root / root
0644
mail.vim
0.301 KB
12 Oct 2025 7.23 AM
root / root
0644
make.vim
3.406 KB
12 Oct 2025 7.23 AM
root / root
0644
matlab.vim
1.918 KB
12 Oct 2025 7.23 AM
root / root
0644
mf.vim
0.152 KB
12 Oct 2025 7.23 AM
root / root
0644
mma.vim
2.184 KB
12 Oct 2025 7.23 AM
root / root
0644
mp.vim
11.056 KB
12 Oct 2025 7.23 AM
root / root
0644
nsis.vim
3.181 KB
12 Oct 2025 7.23 AM
root / root
0644
objc.vim
1.606 KB
12 Oct 2025 7.23 AM
root / root
0644
ocaml.vim
8.938 KB
12 Oct 2025 7.23 AM
root / root
0644
occam.vim
4.528 KB
12 Oct 2025 7.23 AM
root / root
0644
pascal.vim
5.523 KB
12 Oct 2025 7.23 AM
root / root
0644
perl.vim
5.764 KB
12 Oct 2025 7.23 AM
root / root
0644
perl6.vim
3.457 KB
12 Oct 2025 7.23 AM
root / root
0644
php.vim
21.905 KB
12 Oct 2025 7.23 AM
root / root
0644
postscr.vim
1.61 KB
12 Oct 2025 7.23 AM
root / root
0644
pov.vim
2.6 KB
12 Oct 2025 7.23 AM
root / root
0644
prolog.vim
1.455 KB
12 Oct 2025 7.23 AM
root / root
0644
pyrex.vim
0.318 KB
12 Oct 2025 7.23 AM
root / root
0644
python.vim
5.609 KB
12 Oct 2025 7.23 AM
root / root
0644
r.vim
13.579 KB
12 Oct 2025 7.23 AM
root / root
0644
readline.vim
0.694 KB
12 Oct 2025 7.23 AM
root / root
0644
rhelp.vim
2.773 KB
12 Oct 2025 7.23 AM
root / root
0644
rmd.vim
1.169 KB
12 Oct 2025 7.23 AM
root / root
0644
rnoweb.vim
1.061 KB
12 Oct 2025 7.23 AM
root / root
0644
rpl.vim
1.818 KB
12 Oct 2025 7.23 AM
root / root
0644
rrst.vim
1.167 KB
12 Oct 2025 7.23 AM
root / root
0644
rst.vim
1.366 KB
12 Oct 2025 7.23 AM
root / root
0644
ruby.vim
22.432 KB
12 Oct 2025 7.23 AM
root / root
0644
rust.vim
6.346 KB
12 Oct 2025 7.23 AM
root / root
0644
sas.vim
5.007 KB
12 Oct 2025 7.23 AM
root / root
0644
sass.vim
0.928 KB
12 Oct 2025 7.23 AM
root / root
0644
scala.vim
18.975 KB
12 Oct 2025 7.23 AM
root / root
0644
scheme.vim
0.363 KB
12 Oct 2025 7.23 AM
root / root
0644
scss.vim
0.187 KB
12 Oct 2025 7.23 AM
root / root
0644
sdl.vim
2.729 KB
12 Oct 2025 7.23 AM
root / root
0644
sh.vim
5.582 KB
12 Oct 2025 7.23 AM
root / root
0644
sml.vim
6.326 KB
12 Oct 2025 7.23 AM
root / root
0644
sql.vim
1.176 KB
12 Oct 2025 7.23 AM
root / root
0644
sqlanywhere.vim
12.857 KB
12 Oct 2025 7.23 AM
root / root
0644
systemd.vim
0.2 KB
12 Oct 2025 7.23 AM
root / root
0644
systemverilog.vim
8.376 KB
12 Oct 2025 7.23 AM
root / root
0644
tcl.vim
1.591 KB
12 Oct 2025 7.23 AM
root / root
0644
tcsh.vim
1.24 KB
12 Oct 2025 7.23 AM
root / root
0644
teraterm.vim
1.333 KB
12 Oct 2025 7.23 AM
root / root
0644
tex.vim
13.182 KB
12 Oct 2025 7.23 AM
root / root
0644
tf.vim
1.513 KB
12 Oct 2025 7.23 AM
root / root
0644
tilde.vim
0.988 KB
12 Oct 2025 7.23 AM
root / root
0644
treetop.vim
0.69 KB
12 Oct 2025 7.23 AM
root / root
0644
vb.vim
2.04 KB
12 Oct 2025 7.23 AM
root / root
0644
verilog.vim
7.974 KB
12 Oct 2025 7.23 AM
root / root
0644
vhdl.vim
14.322 KB
12 Oct 2025 7.23 AM
root / root
0644
vim.vim
2.919 KB
12 Oct 2025 7.23 AM
root / root
0644
vroom.vim
0.37 KB
12 Oct 2025 7.23 AM
root / root
0644
xf86conf.vim
0.692 KB
12 Oct 2025 7.23 AM
root / root
0644
xhtml.vim
0.263 KB
12 Oct 2025 7.23 AM
root / root
0644
xinetd.vim
1.202 KB
12 Oct 2025 7.23 AM
root / root
0644
xml.vim
2.782 KB
12 Oct 2025 7.23 AM
root / root
0644
xsd.vim
0.247 KB
12 Oct 2025 7.23 AM
root / root
0644
xslt.vim
0.29 KB
12 Oct 2025 7.23 AM
root / root
0644
yacc.vim
0.763 KB
12 Oct 2025 7.23 AM
root / root
0644
yaml.vim
5.344 KB
12 Oct 2025 7.23 AM
root / root
0644
zimbu.vim
3.844 KB
12 Oct 2025 7.23 AM
root / root
0644
zsh.vim
0.401 KB
12 Oct 2025 7.23 AM
root / root
0644

GRAYBYTE WORDPRESS FILE MANAGER @ 2026 CONTACT ME
Static GIF