[Groonga-commit] groonga/groonga at b25dc9c [master] nginx: update to 1.9.5

Back to archive index

Kouhei Sutou null+****@clear*****
Sun Sep 27 22:10:53 JST 2015


Kouhei Sutou	2015-09-27 22:10:53 +0900 (Sun, 27 Sep 2015)

  New Revision: b25dc9cca6789024ac131097f85d52a52ecc6b39
  https://github.com/groonga/groonga/commit/b25dc9cca6789024ac131097f85d52a52ecc6b39

  Message:
    nginx: update to 1.9.5
    
    1.9.5 has experimental HTTP/2 support.

  Added files:
    vendor/nginx-1.9.5/src/core/ngx_parse_time.h
    vendor/nginx-1.9.5/src/core/ngx_rwlock.c
    vendor/nginx-1.9.5/src/core/ngx_rwlock.h
    vendor/nginx-1.9.5/src/http/modules/ngx_http_upstream_zone_module.c
    vendor/nginx-1.9.5/src/http/ngx_http_upstream_round_robin.h
    vendor/nginx-1.9.5/src/http/v2/ngx_http_v2.c
    vendor/nginx-1.9.5/src/http/v2/ngx_http_v2.h
    vendor/nginx-1.9.5/src/http/v2/ngx_http_v2_filter_module.c
    vendor/nginx-1.9.5/src/http/v2/ngx_http_v2_huff_decode.c
    vendor/nginx-1.9.5/src/http/v2/ngx_http_v2_huff_encode.c
    vendor/nginx-1.9.5/src/http/v2/ngx_http_v2_module.c
    vendor/nginx-1.9.5/src/http/v2/ngx_http_v2_table.c
    vendor/nginx-1.9.5/src/os/win32/ngx_shmem.c
    vendor/nginx-1.9.5/src/os/win32/ngx_thread.c
    vendor/nginx-1.9.5/src/stream/ngx_stream.c
    vendor/nginx-1.9.5/src/stream/ngx_stream.h
    vendor/nginx-1.9.5/src/stream/ngx_stream_access_module.c
    vendor/nginx-1.9.5/src/stream/ngx_stream_handler.c
    vendor/nginx-1.9.5/src/stream/ngx_stream_proxy_module.c
    vendor/nginx-1.9.5/src/stream/ngx_stream_ssl_module.c
    vendor/nginx-1.9.5/src/stream/ngx_stream_upstream.c
    vendor/nginx-1.9.5/src/stream/ngx_stream_upstream.h
    vendor/nginx-1.9.5/src/stream/ngx_stream_upstream_hash_module.c
    vendor/nginx-1.9.5/src/stream/ngx_stream_upstream_least_conn_module.c
    vendor/nginx-1.9.5/src/stream/ngx_stream_upstream_round_robin.c
    vendor/nginx-1.9.5/src/stream/ngx_stream_upstream_round_robin.h
    vendor/nginx-1.9.5/src/stream/ngx_stream_upstream_zone_module.c
  Copied files:
    vendor/nginx-1.9.5/src/http/modules/ngx_http_limit_conn_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_limit_conn_module.c)
    vendor/nginx-1.9.5/src/mail/ngx_mail_core_module.c
      (from vendor/nginx-1.8.0/src/mail/ngx_mail_core_module.c)
    vendor/nginx-1.9.5/src/mail/ngx_mail_ssl_module.h
      (from vendor/nginx-1.8.0/src/mail/ngx_mail_ssl_module.h)
  Removed files:
    vendor/nginx-1.8.0/src/event/modules/ngx_aio_module.c
    vendor/nginx-1.8.0/src/event/modules/ngx_rtsig_module.c
    vendor/nginx-1.8.0/src/http/ngx_http_spdy.c
    vendor/nginx-1.8.0/src/http/ngx_http_spdy.h
    vendor/nginx-1.8.0/src/http/ngx_http_spdy_filter_module.c
    vendor/nginx-1.8.0/src/http/ngx_http_spdy_module.c
    vendor/nginx-1.8.0/src/http/ngx_http_upstream_round_robin.h
    vendor/nginx-1.8.0/src/os/unix/ngx_aio_read.c
    vendor/nginx-1.8.0/src/os/unix/ngx_aio_read_chain.c
    vendor/nginx-1.8.0/src/os/unix/ngx_aio_write.c
    vendor/nginx-1.8.0/src/os/unix/ngx_aio_write_chain.c
    vendor/nginx-1.8.0/src/os/win32/ngx_shmem.c
    vendor/nginx-1.8.0/src/os/win32/ngx_thread.c
  Modified files:
    nginx_version
  Renamed files:
    vendor/nginx-1.9.5/auto/cc/acc
      (from vendor/nginx-1.8.0/auto/cc/acc)
    vendor/nginx-1.9.5/auto/cc/bcc
      (from vendor/nginx-1.8.0/auto/cc/bcc)
    vendor/nginx-1.9.5/auto/cc/ccc
      (from vendor/nginx-1.8.0/auto/cc/ccc)
    vendor/nginx-1.9.5/auto/cc/clang
      (from vendor/nginx-1.8.0/auto/cc/clang)
    vendor/nginx-1.9.5/auto/cc/conf
      (from vendor/nginx-1.8.0/auto/cc/conf)
    vendor/nginx-1.9.5/auto/cc/gcc
      (from vendor/nginx-1.8.0/auto/cc/gcc)
    vendor/nginx-1.9.5/auto/cc/icc
      (from vendor/nginx-1.8.0/auto/cc/icc)
    vendor/nginx-1.9.5/auto/cc/msvc
      (from vendor/nginx-1.8.0/auto/cc/msvc)
    vendor/nginx-1.9.5/auto/cc/name
      (from vendor/nginx-1.8.0/auto/cc/name)
    vendor/nginx-1.9.5/auto/cc/owc
      (from vendor/nginx-1.8.0/auto/cc/owc)
    vendor/nginx-1.9.5/auto/cc/sunc
      (from vendor/nginx-1.8.0/auto/cc/sunc)
    vendor/nginx-1.9.5/auto/configure
      (from vendor/nginx-1.8.0/auto/configure)
    vendor/nginx-1.9.5/auto/define
      (from vendor/nginx-1.8.0/auto/define)
    vendor/nginx-1.9.5/auto/endianness
      (from vendor/nginx-1.8.0/auto/endianness)
    vendor/nginx-1.9.5/auto/feature
      (from vendor/nginx-1.8.0/auto/feature)
    vendor/nginx-1.9.5/auto/have
      (from vendor/nginx-1.8.0/auto/have)
    vendor/nginx-1.9.5/auto/have_headers
      (from vendor/nginx-1.8.0/auto/have_headers)
    vendor/nginx-1.9.5/auto/headers
      (from vendor/nginx-1.8.0/auto/headers)
    vendor/nginx-1.9.5/auto/include
      (from vendor/nginx-1.8.0/auto/include)
    vendor/nginx-1.9.5/auto/init
      (from vendor/nginx-1.8.0/auto/init)
    vendor/nginx-1.9.5/auto/install
      (from vendor/nginx-1.8.0/auto/install)
    vendor/nginx-1.9.5/auto/lib/conf
      (from vendor/nginx-1.8.0/auto/lib/conf)
    vendor/nginx-1.9.5/auto/lib/geoip/conf
      (from vendor/nginx-1.8.0/auto/lib/geoip/conf)
    vendor/nginx-1.9.5/auto/lib/google-perftools/conf
      (from vendor/nginx-1.8.0/auto/lib/google-perftools/conf)
    vendor/nginx-1.9.5/auto/lib/libatomic/conf
      (from vendor/nginx-1.8.0/auto/lib/libatomic/conf)
    vendor/nginx-1.9.5/auto/lib/libatomic/make
      (from vendor/nginx-1.8.0/auto/lib/libatomic/make)
    vendor/nginx-1.9.5/auto/lib/libgd/conf
      (from vendor/nginx-1.8.0/auto/lib/libgd/conf)
    vendor/nginx-1.9.5/auto/lib/libxslt/conf
      (from vendor/nginx-1.8.0/auto/lib/libxslt/conf)
    vendor/nginx-1.9.5/auto/lib/make
      (from vendor/nginx-1.8.0/auto/lib/make)
    vendor/nginx-1.9.5/auto/lib/md5/conf
      (from vendor/nginx-1.8.0/auto/lib/md5/conf)
    vendor/nginx-1.9.5/auto/lib/md5/make
      (from vendor/nginx-1.8.0/auto/lib/md5/make)
    vendor/nginx-1.9.5/auto/lib/md5/makefile.bcc
      (from vendor/nginx-1.8.0/auto/lib/md5/makefile.bcc)
    vendor/nginx-1.9.5/auto/lib/md5/makefile.msvc
      (from vendor/nginx-1.8.0/auto/lib/md5/makefile.msvc)
    vendor/nginx-1.9.5/auto/lib/md5/makefile.owc
      (from vendor/nginx-1.8.0/auto/lib/md5/makefile.owc)
    vendor/nginx-1.9.5/auto/lib/openssl/conf
      (from vendor/nginx-1.8.0/auto/lib/openssl/conf)
    vendor/nginx-1.9.5/auto/lib/openssl/make
      (from vendor/nginx-1.8.0/auto/lib/openssl/make)
    vendor/nginx-1.9.5/auto/lib/openssl/makefile.bcc
      (from vendor/nginx-1.8.0/auto/lib/openssl/makefile.bcc)
    vendor/nginx-1.9.5/auto/lib/openssl/makefile.msvc
      (from vendor/nginx-1.8.0/auto/lib/openssl/makefile.msvc)
    vendor/nginx-1.9.5/auto/lib/pcre/conf
      (from vendor/nginx-1.8.0/auto/lib/pcre/conf)
    vendor/nginx-1.9.5/auto/lib/pcre/make
      (from vendor/nginx-1.8.0/auto/lib/pcre/make)
    vendor/nginx-1.9.5/auto/lib/pcre/makefile.bcc
      (from vendor/nginx-1.8.0/auto/lib/pcre/makefile.bcc)
    vendor/nginx-1.9.5/auto/lib/pcre/makefile.msvc
      (from vendor/nginx-1.8.0/auto/lib/pcre/makefile.msvc)
    vendor/nginx-1.9.5/auto/lib/pcre/makefile.owc
      (from vendor/nginx-1.8.0/auto/lib/pcre/makefile.owc)
    vendor/nginx-1.9.5/auto/lib/perl/conf
      (from vendor/nginx-1.8.0/auto/lib/perl/conf)
    vendor/nginx-1.9.5/auto/lib/perl/make
      (from vendor/nginx-1.8.0/auto/lib/perl/make)
    vendor/nginx-1.9.5/auto/lib/sha1/conf
      (from vendor/nginx-1.8.0/auto/lib/sha1/conf)
    vendor/nginx-1.9.5/auto/lib/sha1/make
      (from vendor/nginx-1.8.0/auto/lib/sha1/make)
    vendor/nginx-1.9.5/auto/lib/sha1/makefile.bcc
      (from vendor/nginx-1.8.0/auto/lib/sha1/makefile.bcc)
    vendor/nginx-1.9.5/auto/lib/sha1/makefile.msvc
      (from vendor/nginx-1.8.0/auto/lib/sha1/makefile.msvc)
    vendor/nginx-1.9.5/auto/lib/sha1/makefile.owc
      (from vendor/nginx-1.8.0/auto/lib/sha1/makefile.owc)
    vendor/nginx-1.9.5/auto/lib/test
      (from vendor/nginx-1.8.0/auto/lib/test)
    vendor/nginx-1.9.5/auto/lib/zlib/conf
      (from vendor/nginx-1.8.0/auto/lib/zlib/conf)
    vendor/nginx-1.9.5/auto/lib/zlib/make
      (from vendor/nginx-1.8.0/auto/lib/zlib/make)
    vendor/nginx-1.9.5/auto/lib/zlib/makefile.bcc
      (from vendor/nginx-1.8.0/auto/lib/zlib/makefile.bcc)
    vendor/nginx-1.9.5/auto/lib/zlib/makefile.msvc
      (from vendor/nginx-1.8.0/auto/lib/zlib/makefile.msvc)
    vendor/nginx-1.9.5/auto/lib/zlib/makefile.owc
      (from vendor/nginx-1.8.0/auto/lib/zlib/makefile.owc)
    vendor/nginx-1.9.5/auto/make
      (from vendor/nginx-1.8.0/auto/make)
    vendor/nginx-1.9.5/auto/modules
      (from vendor/nginx-1.8.0/auto/modules)
    vendor/nginx-1.9.5/auto/nohave
      (from vendor/nginx-1.8.0/auto/nohave)
    vendor/nginx-1.9.5/auto/options
      (from vendor/nginx-1.8.0/auto/options)
    vendor/nginx-1.9.5/auto/os/conf
      (from vendor/nginx-1.8.0/auto/os/conf)
    vendor/nginx-1.9.5/auto/os/darwin
      (from vendor/nginx-1.8.0/auto/os/darwin)
    vendor/nginx-1.9.5/auto/os/freebsd
      (from vendor/nginx-1.8.0/auto/os/freebsd)
    vendor/nginx-1.9.5/auto/os/linux
      (from vendor/nginx-1.8.0/auto/os/linux)
    vendor/nginx-1.9.5/auto/os/solaris
      (from vendor/nginx-1.8.0/auto/os/solaris)
    vendor/nginx-1.9.5/auto/os/win32
      (from vendor/nginx-1.8.0/auto/os/win32)
    vendor/nginx-1.9.5/auto/sources
      (from vendor/nginx-1.8.0/auto/sources)
    vendor/nginx-1.9.5/auto/stubs
      (from vendor/nginx-1.8.0/auto/stubs)
    vendor/nginx-1.9.5/auto/summary
      (from vendor/nginx-1.8.0/auto/summary)
    vendor/nginx-1.9.5/auto/threads
      (from vendor/nginx-1.8.0/auto/threads)
    vendor/nginx-1.9.5/auto/types/sizeof
      (from vendor/nginx-1.8.0/auto/types/sizeof)
    vendor/nginx-1.9.5/auto/types/typedef
      (from vendor/nginx-1.8.0/auto/types/typedef)
    vendor/nginx-1.9.5/auto/types/uintptr_t
      (from vendor/nginx-1.8.0/auto/types/uintptr_t)
    vendor/nginx-1.9.5/auto/types/value
      (from vendor/nginx-1.8.0/auto/types/value)
    vendor/nginx-1.9.5/auto/unix
      (from vendor/nginx-1.8.0/auto/unix)
    vendor/nginx-1.9.5/conf/fastcgi.conf
      (from vendor/nginx-1.8.0/conf/fastcgi.conf)
    vendor/nginx-1.9.5/conf/fastcgi_params
      (from vendor/nginx-1.8.0/conf/fastcgi_params)
    vendor/nginx-1.9.5/conf/koi-utf
      (from vendor/nginx-1.8.0/conf/koi-utf)
    vendor/nginx-1.9.5/conf/koi-win
      (from vendor/nginx-1.8.0/conf/koi-win)
    vendor/nginx-1.9.5/conf/mime.types
      (from vendor/nginx-1.8.0/conf/mime.types)
    vendor/nginx-1.9.5/conf/nginx.conf
      (from vendor/nginx-1.8.0/conf/nginx.conf)
    vendor/nginx-1.9.5/conf/scgi_params
      (from vendor/nginx-1.8.0/conf/scgi_params)
    vendor/nginx-1.9.5/conf/uwsgi_params
      (from vendor/nginx-1.8.0/conf/uwsgi_params)
    vendor/nginx-1.9.5/conf/win-utf
      (from vendor/nginx-1.8.0/conf/win-utf)
    vendor/nginx-1.9.5/contrib/README
      (from vendor/nginx-1.8.0/contrib/README)
    vendor/nginx-1.9.5/contrib/geo2nginx.pl
      (from vendor/nginx-1.8.0/contrib/geo2nginx.pl)
    vendor/nginx-1.9.5/contrib/unicode2nginx/koi-utf
      (from vendor/nginx-1.8.0/contrib/unicode2nginx/koi-utf)
    vendor/nginx-1.9.5/contrib/unicode2nginx/unicode-to-nginx.pl
      (from vendor/nginx-1.8.0/contrib/unicode2nginx/unicode-to-nginx.pl)
    vendor/nginx-1.9.5/contrib/unicode2nginx/win-utf
      (from vendor/nginx-1.8.0/contrib/unicode2nginx/win-utf)
    vendor/nginx-1.9.5/contrib/vim/ftdetect/nginx.vim
      (from vendor/nginx-1.8.0/contrib/vim/ftdetect/nginx.vim)
    vendor/nginx-1.9.5/contrib/vim/indent/nginx.vim
      (from vendor/nginx-1.8.0/contrib/vim/indent/nginx.vim)
    vendor/nginx-1.9.5/contrib/vim/syntax/nginx.vim
      (from vendor/nginx-1.8.0/contrib/vim/syntax/nginx.vim)
    vendor/nginx-1.9.5/docs/GNUmakefile
      (from vendor/nginx-1.8.0/docs/GNUmakefile)
    vendor/nginx-1.9.5/docs/dtd/change_log_conf.dtd
      (from vendor/nginx-1.8.0/docs/dtd/change_log_conf.dtd)
    vendor/nginx-1.9.5/docs/dtd/changes.dtd
      (from vendor/nginx-1.8.0/docs/dtd/changes.dtd)
    vendor/nginx-1.9.5/docs/html/50x.html
      (from vendor/nginx-1.8.0/docs/html/50x.html)
    vendor/nginx-1.9.5/docs/html/index.html
      (from vendor/nginx-1.8.0/docs/html/index.html)
    vendor/nginx-1.9.5/docs/man/nginx.8
      (from vendor/nginx-1.8.0/docs/man/nginx.8)
    vendor/nginx-1.9.5/docs/text/LICENSE
      (from vendor/nginx-1.8.0/docs/text/LICENSE)
    vendor/nginx-1.9.5/docs/text/README
      (from vendor/nginx-1.8.0/docs/text/README)
    vendor/nginx-1.9.5/docs/xml/change_log_conf.xml
      (from vendor/nginx-1.8.0/docs/xml/change_log_conf.xml)
    vendor/nginx-1.9.5/docs/xml/nginx/changes.xml
      (from vendor/nginx-1.8.0/docs/xml/nginx/changes.xml)
    vendor/nginx-1.9.5/docs/xsls/changes.xsls
      (from vendor/nginx-1.8.0/docs/xsls/changes.xsls)
    vendor/nginx-1.9.5/docs/xslt/changes.xslt
      (from vendor/nginx-1.8.0/docs/xslt/changes.xslt)
    vendor/nginx-1.9.5/misc/GNUmakefile
      (from vendor/nginx-1.8.0/misc/GNUmakefile)
    vendor/nginx-1.9.5/misc/README
      (from vendor/nginx-1.8.0/misc/README)
    vendor/nginx-1.9.5/src/core/nginx.c
      (from vendor/nginx-1.8.0/src/core/nginx.c)
    vendor/nginx-1.9.5/src/core/nginx.h
      (from vendor/nginx-1.8.0/src/core/nginx.h)
    vendor/nginx-1.9.5/src/core/ngx_array.c
      (from vendor/nginx-1.8.0/src/core/ngx_array.c)
    vendor/nginx-1.9.5/src/core/ngx_array.h
      (from vendor/nginx-1.8.0/src/core/ngx_array.h)
    vendor/nginx-1.9.5/src/core/ngx_buf.c
      (from vendor/nginx-1.8.0/src/core/ngx_buf.c)
    vendor/nginx-1.9.5/src/core/ngx_buf.h
      (from vendor/nginx-1.8.0/src/core/ngx_buf.h)
    vendor/nginx-1.9.5/src/core/ngx_conf_file.c
      (from vendor/nginx-1.8.0/src/core/ngx_conf_file.c)
    vendor/nginx-1.9.5/src/core/ngx_conf_file.h
      (from vendor/nginx-1.8.0/src/core/ngx_conf_file.h)
    vendor/nginx-1.9.5/src/core/ngx_config.h
      (from vendor/nginx-1.8.0/src/core/ngx_config.h)
    vendor/nginx-1.9.5/src/core/ngx_connection.c
      (from vendor/nginx-1.8.0/src/core/ngx_connection.c)
    vendor/nginx-1.9.5/src/core/ngx_connection.h
      (from vendor/nginx-1.8.0/src/core/ngx_connection.h)
    vendor/nginx-1.9.5/src/core/ngx_core.h
      (from vendor/nginx-1.8.0/src/core/ngx_core.h)
    vendor/nginx-1.9.5/src/core/ngx_cpuinfo.c
      (from vendor/nginx-1.8.0/src/core/ngx_cpuinfo.c)
    vendor/nginx-1.9.5/src/core/ngx_crc.h
      (from vendor/nginx-1.8.0/src/core/ngx_crc.h)
    vendor/nginx-1.9.5/src/core/ngx_crc32.c
      (from vendor/nginx-1.8.0/src/core/ngx_crc32.c)
    vendor/nginx-1.9.5/src/core/ngx_crc32.h
      (from vendor/nginx-1.8.0/src/core/ngx_crc32.h)
    vendor/nginx-1.9.5/src/core/ngx_crypt.c
      (from vendor/nginx-1.8.0/src/core/ngx_crypt.c)
    vendor/nginx-1.9.5/src/core/ngx_crypt.h
      (from vendor/nginx-1.8.0/src/core/ngx_crypt.h)
    vendor/nginx-1.9.5/src/core/ngx_cycle.c
      (from vendor/nginx-1.8.0/src/core/ngx_cycle.c)
    vendor/nginx-1.9.5/src/core/ngx_cycle.h
      (from vendor/nginx-1.8.0/src/core/ngx_cycle.h)
    vendor/nginx-1.9.5/src/core/ngx_file.c
      (from vendor/nginx-1.8.0/src/core/ngx_file.c)
    vendor/nginx-1.9.5/src/core/ngx_file.h
      (from vendor/nginx-1.8.0/src/core/ngx_file.h)
    vendor/nginx-1.9.5/src/core/ngx_hash.c
      (from vendor/nginx-1.8.0/src/core/ngx_hash.c)
    vendor/nginx-1.9.5/src/core/ngx_hash.h
      (from vendor/nginx-1.8.0/src/core/ngx_hash.h)
    vendor/nginx-1.9.5/src/core/ngx_inet.c
      (from vendor/nginx-1.8.0/src/core/ngx_inet.c)
    vendor/nginx-1.9.5/src/core/ngx_inet.h
      (from vendor/nginx-1.8.0/src/core/ngx_inet.h)
    vendor/nginx-1.9.5/src/core/ngx_list.c
      (from vendor/nginx-1.8.0/src/core/ngx_list.c)
    vendor/nginx-1.9.5/src/core/ngx_list.h
      (from vendor/nginx-1.8.0/src/core/ngx_list.h)
    vendor/nginx-1.9.5/src/core/ngx_log.c
      (from vendor/nginx-1.8.0/src/core/ngx_log.c)
    vendor/nginx-1.9.5/src/core/ngx_log.h
      (from vendor/nginx-1.8.0/src/core/ngx_log.h)
    vendor/nginx-1.9.5/src/core/ngx_md5.c
      (from vendor/nginx-1.8.0/src/core/ngx_md5.c)
    vendor/nginx-1.9.5/src/core/ngx_md5.h
      (from vendor/nginx-1.8.0/src/core/ngx_md5.h)
    vendor/nginx-1.9.5/src/core/ngx_murmurhash.c
      (from vendor/nginx-1.8.0/src/core/ngx_murmurhash.c)
    vendor/nginx-1.9.5/src/core/ngx_murmurhash.h
      (from vendor/nginx-1.8.0/src/core/ngx_murmurhash.h)
    vendor/nginx-1.9.5/src/core/ngx_open_file_cache.c
      (from vendor/nginx-1.8.0/src/core/ngx_open_file_cache.c)
    vendor/nginx-1.9.5/src/core/ngx_open_file_cache.h
      (from vendor/nginx-1.8.0/src/core/ngx_open_file_cache.h)
    vendor/nginx-1.9.5/src/core/ngx_output_chain.c
      (from vendor/nginx-1.8.0/src/core/ngx_output_chain.c)
    vendor/nginx-1.9.5/src/core/ngx_palloc.c
      (from vendor/nginx-1.8.0/src/core/ngx_palloc.c)
    vendor/nginx-1.9.5/src/core/ngx_palloc.h
      (from vendor/nginx-1.8.0/src/core/ngx_palloc.h)
    vendor/nginx-1.9.5/src/core/ngx_parse.c
      (from vendor/nginx-1.8.0/src/core/ngx_parse.c)
    vendor/nginx-1.9.5/src/core/ngx_parse.h
      (from vendor/nginx-1.8.0/src/core/ngx_parse.h)
    vendor/nginx-1.9.5/src/core/ngx_parse_time.c
      (from vendor/nginx-1.8.0/src/http/ngx_http_parse_time.c)
    vendor/nginx-1.9.5/src/core/ngx_proxy_protocol.c
      (from vendor/nginx-1.8.0/src/core/ngx_proxy_protocol.c)
    vendor/nginx-1.9.5/src/core/ngx_proxy_protocol.h
      (from vendor/nginx-1.8.0/src/core/ngx_proxy_protocol.h)
    vendor/nginx-1.9.5/src/core/ngx_queue.c
      (from vendor/nginx-1.8.0/src/core/ngx_queue.c)
    vendor/nginx-1.9.5/src/core/ngx_queue.h
      (from vendor/nginx-1.8.0/src/core/ngx_queue.h)
    vendor/nginx-1.9.5/src/core/ngx_radix_tree.c
      (from vendor/nginx-1.8.0/src/core/ngx_radix_tree.c)
    vendor/nginx-1.9.5/src/core/ngx_radix_tree.h
      (from vendor/nginx-1.8.0/src/core/ngx_radix_tree.h)
    vendor/nginx-1.9.5/src/core/ngx_rbtree.c
      (from vendor/nginx-1.8.0/src/core/ngx_rbtree.c)
    vendor/nginx-1.9.5/src/core/ngx_rbtree.h
      (from vendor/nginx-1.8.0/src/core/ngx_rbtree.h)
    vendor/nginx-1.9.5/src/core/ngx_regex.c
      (from vendor/nginx-1.8.0/src/core/ngx_regex.c)
    vendor/nginx-1.9.5/src/core/ngx_regex.h
      (from vendor/nginx-1.8.0/src/core/ngx_regex.h)
    vendor/nginx-1.9.5/src/core/ngx_resolver.c
      (from vendor/nginx-1.8.0/src/core/ngx_resolver.c)
    vendor/nginx-1.9.5/src/core/ngx_resolver.h
      (from vendor/nginx-1.8.0/src/core/ngx_resolver.h)
    vendor/nginx-1.9.5/src/core/ngx_sha1.h
      (from vendor/nginx-1.8.0/src/core/ngx_sha1.h)
    vendor/nginx-1.9.5/src/core/ngx_shmtx.c
      (from vendor/nginx-1.8.0/src/core/ngx_shmtx.c)
    vendor/nginx-1.9.5/src/core/ngx_shmtx.h
      (from vendor/nginx-1.8.0/src/core/ngx_shmtx.h)
    vendor/nginx-1.9.5/src/core/ngx_slab.c
      (from vendor/nginx-1.8.0/src/core/ngx_slab.c)
    vendor/nginx-1.9.5/src/core/ngx_slab.h
      (from vendor/nginx-1.8.0/src/core/ngx_slab.h)
    vendor/nginx-1.9.5/src/core/ngx_spinlock.c
      (from vendor/nginx-1.8.0/src/core/ngx_spinlock.c)
    vendor/nginx-1.9.5/src/core/ngx_string.c
      (from vendor/nginx-1.8.0/src/core/ngx_string.c)
    vendor/nginx-1.9.5/src/core/ngx_string.h
      (from vendor/nginx-1.8.0/src/core/ngx_string.h)
    vendor/nginx-1.9.5/src/core/ngx_syslog.c
      (from vendor/nginx-1.8.0/src/core/ngx_syslog.c)
    vendor/nginx-1.9.5/src/core/ngx_syslog.h
      (from vendor/nginx-1.8.0/src/core/ngx_syslog.h)
    vendor/nginx-1.9.5/src/core/ngx_thread_pool.c
      (from vendor/nginx-1.8.0/src/core/ngx_thread_pool.c)
    vendor/nginx-1.9.5/src/core/ngx_thread_pool.h
      (from vendor/nginx-1.8.0/src/core/ngx_thread_pool.h)
    vendor/nginx-1.9.5/src/core/ngx_times.c
      (from vendor/nginx-1.8.0/src/core/ngx_times.c)
    vendor/nginx-1.9.5/src/core/ngx_times.h
      (from vendor/nginx-1.8.0/src/core/ngx_times.h)
    vendor/nginx-1.9.5/src/event/modules/ngx_devpoll_module.c
      (from vendor/nginx-1.8.0/src/event/modules/ngx_devpoll_module.c)
    vendor/nginx-1.9.5/src/event/modules/ngx_epoll_module.c
      (from vendor/nginx-1.8.0/src/event/modules/ngx_epoll_module.c)
    vendor/nginx-1.9.5/src/event/modules/ngx_eventport_module.c
      (from vendor/nginx-1.8.0/src/event/modules/ngx_eventport_module.c)
    vendor/nginx-1.9.5/src/event/modules/ngx_iocp_module.c
      (from vendor/nginx-1.8.0/src/event/modules/ngx_iocp_module.c)
    vendor/nginx-1.9.5/src/event/modules/ngx_iocp_module.h
      (from vendor/nginx-1.8.0/src/event/modules/ngx_iocp_module.h)
    vendor/nginx-1.9.5/src/event/modules/ngx_kqueue_module.c
      (from vendor/nginx-1.8.0/src/event/modules/ngx_kqueue_module.c)
    vendor/nginx-1.9.5/src/event/modules/ngx_poll_module.c
      (from vendor/nginx-1.8.0/src/event/modules/ngx_poll_module.c)
    vendor/nginx-1.9.5/src/event/modules/ngx_select_module.c
      (from vendor/nginx-1.8.0/src/event/modules/ngx_select_module.c)
    vendor/nginx-1.9.5/src/event/modules/ngx_win32_select_module.c
      (from vendor/nginx-1.8.0/src/event/modules/ngx_win32_select_module.c)
    vendor/nginx-1.9.5/src/event/ngx_event.c
      (from vendor/nginx-1.8.0/src/event/ngx_event.c)
    vendor/nginx-1.9.5/src/event/ngx_event.h
      (from vendor/nginx-1.8.0/src/event/ngx_event.h)
    vendor/nginx-1.9.5/src/event/ngx_event_accept.c
      (from vendor/nginx-1.8.0/src/event/ngx_event_accept.c)
    vendor/nginx-1.9.5/src/event/ngx_event_acceptex.c
      (from vendor/nginx-1.8.0/src/event/ngx_event_acceptex.c)
    vendor/nginx-1.9.5/src/event/ngx_event_connect.c
      (from vendor/nginx-1.8.0/src/event/ngx_event_connect.c)
    vendor/nginx-1.9.5/src/event/ngx_event_connect.h
      (from vendor/nginx-1.8.0/src/event/ngx_event_connect.h)
    vendor/nginx-1.9.5/src/event/ngx_event_connectex.c
      (from vendor/nginx-1.8.0/src/event/ngx_event_connectex.c)
    vendor/nginx-1.9.5/src/event/ngx_event_openssl.c
      (from vendor/nginx-1.8.0/src/event/ngx_event_openssl.c)
    vendor/nginx-1.9.5/src/event/ngx_event_openssl.h
      (from vendor/nginx-1.8.0/src/event/ngx_event_openssl.h)
    vendor/nginx-1.9.5/src/event/ngx_event_openssl_stapling.c
      (from vendor/nginx-1.8.0/src/event/ngx_event_openssl_stapling.c)
    vendor/nginx-1.9.5/src/event/ngx_event_pipe.c
      (from vendor/nginx-1.8.0/src/event/ngx_event_pipe.c)
    vendor/nginx-1.9.5/src/event/ngx_event_pipe.h
      (from vendor/nginx-1.8.0/src/event/ngx_event_pipe.h)
    vendor/nginx-1.9.5/src/event/ngx_event_posted.c
      (from vendor/nginx-1.8.0/src/event/ngx_event_posted.c)
    vendor/nginx-1.9.5/src/event/ngx_event_posted.h
      (from vendor/nginx-1.8.0/src/event/ngx_event_posted.h)
    vendor/nginx-1.9.5/src/event/ngx_event_timer.c
      (from vendor/nginx-1.8.0/src/event/ngx_event_timer.c)
    vendor/nginx-1.9.5/src/event/ngx_event_timer.h
      (from vendor/nginx-1.8.0/src/event/ngx_event_timer.h)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_access_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_access_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_addition_filter_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_addition_filter_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_auth_basic_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_auth_basic_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_auth_request_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_auth_request_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_autoindex_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_autoindex_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_browser_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_browser_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_charset_filter_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_charset_filter_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_chunked_filter_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_chunked_filter_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_dav_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_dav_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_degradation_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_degradation_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_empty_gif_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_empty_gif_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_fastcgi_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_fastcgi_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_flv_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_flv_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_geo_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_geo_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_geoip_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_geoip_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_gunzip_filter_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_gunzip_filter_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_gzip_filter_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_gzip_filter_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_gzip_static_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_gzip_static_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_headers_filter_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_headers_filter_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_image_filter_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_image_filter_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_index_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_index_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_limit_req_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_limit_req_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_log_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_log_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_map_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_map_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_memcached_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_memcached_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_mp4_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_mp4_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_not_modified_filter_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_not_modified_filter_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_proxy_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_proxy_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_random_index_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_random_index_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_range_filter_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_range_filter_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_realip_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_realip_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_referer_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_referer_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_rewrite_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_rewrite_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_scgi_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_scgi_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_secure_link_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_secure_link_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_split_clients_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_split_clients_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_ssi_filter_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_ssi_filter_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_ssi_filter_module.h
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_ssi_filter_module.h)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_ssl_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_ssl_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_ssl_module.h
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_ssl_module.h)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_static_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_static_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_stub_status_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_stub_status_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_sub_filter_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_sub_filter_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_upstream_hash_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_upstream_hash_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_upstream_ip_hash_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_upstream_ip_hash_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_upstream_keepalive_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_upstream_keepalive_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_upstream_least_conn_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_upstream_least_conn_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_userid_filter_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_userid_filter_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_uwsgi_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_uwsgi_module.c)
    vendor/nginx-1.9.5/src/http/modules/ngx_http_xslt_filter_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_xslt_filter_module.c)
    vendor/nginx-1.9.5/src/http/modules/perl/Makefile.PL
      (from vendor/nginx-1.8.0/src/http/modules/perl/Makefile.PL)
    vendor/nginx-1.9.5/src/http/modules/perl/nginx.pm
      (from vendor/nginx-1.8.0/src/http/modules/perl/nginx.pm)
    vendor/nginx-1.9.5/src/http/modules/perl/nginx.xs
      (from vendor/nginx-1.8.0/src/http/modules/perl/nginx.xs)
    vendor/nginx-1.9.5/src/http/modules/perl/ngx_http_perl_module.c
      (from vendor/nginx-1.8.0/src/http/modules/perl/ngx_http_perl_module.c)
    vendor/nginx-1.9.5/src/http/modules/perl/ngx_http_perl_module.h
      (from vendor/nginx-1.8.0/src/http/modules/perl/ngx_http_perl_module.h)
    vendor/nginx-1.9.5/src/http/modules/perl/typemap
      (from vendor/nginx-1.8.0/src/http/modules/perl/typemap)
    vendor/nginx-1.9.5/src/http/ngx_http.c
      (from vendor/nginx-1.8.0/src/http/ngx_http.c)
    vendor/nginx-1.9.5/src/http/ngx_http.h
      (from vendor/nginx-1.8.0/src/http/ngx_http.h)
    vendor/nginx-1.9.5/src/http/ngx_http_cache.h
      (from vendor/nginx-1.8.0/src/http/ngx_http_cache.h)
    vendor/nginx-1.9.5/src/http/ngx_http_config.h
      (from vendor/nginx-1.8.0/src/http/ngx_http_config.h)
    vendor/nginx-1.9.5/src/http/ngx_http_copy_filter_module.c
      (from vendor/nginx-1.8.0/src/http/ngx_http_copy_filter_module.c)
    vendor/nginx-1.9.5/src/http/ngx_http_core_module.c
      (from vendor/nginx-1.8.0/src/http/ngx_http_core_module.c)
    vendor/nginx-1.9.5/src/http/ngx_http_core_module.h
      (from vendor/nginx-1.8.0/src/http/ngx_http_core_module.h)
    vendor/nginx-1.9.5/src/http/ngx_http_file_cache.c
      (from vendor/nginx-1.8.0/src/http/ngx_http_file_cache.c)
    vendor/nginx-1.9.5/src/http/ngx_http_header_filter_module.c
      (from vendor/nginx-1.8.0/src/http/ngx_http_header_filter_module.c)
    vendor/nginx-1.9.5/src/http/ngx_http_parse.c
      (from vendor/nginx-1.8.0/src/http/ngx_http_parse.c)
    vendor/nginx-1.9.5/src/http/ngx_http_postpone_filter_module.c
      (from vendor/nginx-1.8.0/src/http/ngx_http_postpone_filter_module.c)
    vendor/nginx-1.9.5/src/http/ngx_http_request.c
      (from vendor/nginx-1.8.0/src/http/ngx_http_request.c)
    vendor/nginx-1.9.5/src/http/ngx_http_request.h
      (from vendor/nginx-1.8.0/src/http/ngx_http_request.h)
    vendor/nginx-1.9.5/src/http/ngx_http_request_body.c
      (from vendor/nginx-1.8.0/src/http/ngx_http_request_body.c)
    vendor/nginx-1.9.5/src/http/ngx_http_script.c
      (from vendor/nginx-1.8.0/src/http/ngx_http_script.c)
    vendor/nginx-1.9.5/src/http/ngx_http_script.h
      (from vendor/nginx-1.8.0/src/http/ngx_http_script.h)
    vendor/nginx-1.9.5/src/http/ngx_http_special_response.c
      (from vendor/nginx-1.8.0/src/http/ngx_http_special_response.c)
    vendor/nginx-1.9.5/src/http/ngx_http_upstream.c
      (from vendor/nginx-1.8.0/src/http/ngx_http_upstream.c)
    vendor/nginx-1.9.5/src/http/ngx_http_upstream.h
      (from vendor/nginx-1.8.0/src/http/ngx_http_upstream.h)
    vendor/nginx-1.9.5/src/http/ngx_http_upstream_round_robin.c
      (from vendor/nginx-1.8.0/src/http/ngx_http_upstream_round_robin.c)
    vendor/nginx-1.9.5/src/http/ngx_http_variables.c
      (from vendor/nginx-1.8.0/src/http/ngx_http_variables.c)
    vendor/nginx-1.9.5/src/http/ngx_http_variables.h
      (from vendor/nginx-1.8.0/src/http/ngx_http_variables.h)
    vendor/nginx-1.9.5/src/http/ngx_http_write_filter_module.c
      (from vendor/nginx-1.8.0/src/http/ngx_http_write_filter_module.c)
    vendor/nginx-1.9.5/src/http/v2/ngx_http_v2_module.h
      (from vendor/nginx-1.8.0/src/http/ngx_http_spdy_module.h)
    vendor/nginx-1.9.5/src/mail/ngx_mail.c
      (from vendor/nginx-1.8.0/src/mail/ngx_mail.c)
    vendor/nginx-1.9.5/src/mail/ngx_mail.h
      (from vendor/nginx-1.8.0/src/mail/ngx_mail.h)
    vendor/nginx-1.9.5/src/mail/ngx_mail_auth_http_module.c
      (from vendor/nginx-1.8.0/src/mail/ngx_mail_auth_http_module.c)
    vendor/nginx-1.9.5/src/mail/ngx_mail_handler.c
      (from vendor/nginx-1.8.0/src/mail/ngx_mail_handler.c)
    vendor/nginx-1.9.5/src/mail/ngx_mail_imap_handler.c
      (from vendor/nginx-1.8.0/src/mail/ngx_mail_imap_handler.c)
    vendor/nginx-1.9.5/src/mail/ngx_mail_imap_module.c
      (from vendor/nginx-1.8.0/src/mail/ngx_mail_imap_module.c)
    vendor/nginx-1.9.5/src/mail/ngx_mail_imap_module.h
      (from vendor/nginx-1.8.0/src/mail/ngx_mail_imap_module.h)
    vendor/nginx-1.9.5/src/mail/ngx_mail_parse.c
      (from vendor/nginx-1.8.0/src/mail/ngx_mail_parse.c)
    vendor/nginx-1.9.5/src/mail/ngx_mail_pop3_handler.c
      (from vendor/nginx-1.8.0/src/mail/ngx_mail_pop3_handler.c)
    vendor/nginx-1.9.5/src/mail/ngx_mail_pop3_module.c
      (from vendor/nginx-1.8.0/src/mail/ngx_mail_pop3_module.c)
    vendor/nginx-1.9.5/src/mail/ngx_mail_pop3_module.h
      (from vendor/nginx-1.8.0/src/mail/ngx_mail_pop3_module.h)
    vendor/nginx-1.9.5/src/mail/ngx_mail_proxy_module.c
      (from vendor/nginx-1.8.0/src/mail/ngx_mail_proxy_module.c)
    vendor/nginx-1.9.5/src/mail/ngx_mail_smtp_handler.c
      (from vendor/nginx-1.8.0/src/mail/ngx_mail_smtp_handler.c)
    vendor/nginx-1.9.5/src/mail/ngx_mail_smtp_module.c
      (from vendor/nginx-1.8.0/src/mail/ngx_mail_smtp_module.c)
    vendor/nginx-1.9.5/src/mail/ngx_mail_smtp_module.h
      (from vendor/nginx-1.8.0/src/mail/ngx_mail_smtp_module.h)
    vendor/nginx-1.9.5/src/mail/ngx_mail_ssl_module.c
      (from vendor/nginx-1.8.0/src/mail/ngx_mail_ssl_module.c)
    vendor/nginx-1.9.5/src/misc/ngx_cpp_test_module.cpp
      (from vendor/nginx-1.8.0/src/misc/ngx_cpp_test_module.cpp)
    vendor/nginx-1.9.5/src/misc/ngx_google_perftools_module.c
      (from vendor/nginx-1.8.0/src/misc/ngx_google_perftools_module.c)
    vendor/nginx-1.9.5/src/mysql/config
      (from vendor/nginx-1.8.0/src/mysql/config)
    vendor/nginx-1.9.5/src/mysql/ngx_http_mysql_test.c
      (from vendor/nginx-1.8.0/src/mysql/ngx_http_mysql_test.c)
    vendor/nginx-1.9.5/src/mysql/ngx_mysql.c
      (from vendor/nginx-1.8.0/src/mysql/ngx_mysql.c)
    vendor/nginx-1.9.5/src/mysql/ngx_mysql.h
      (from vendor/nginx-1.8.0/src/mysql/ngx_mysql.h)
    vendor/nginx-1.9.5/src/os/unix/ngx_alloc.c
      (from vendor/nginx-1.8.0/src/os/unix/ngx_alloc.c)
    vendor/nginx-1.9.5/src/os/unix/ngx_alloc.h
      (from vendor/nginx-1.8.0/src/os/unix/ngx_alloc.h)
    vendor/nginx-1.9.5/src/os/unix/ngx_atomic.h
      (from vendor/nginx-1.8.0/src/os/unix/ngx_atomic.h)
    vendor/nginx-1.9.5/src/os/unix/ngx_channel.c
      (from vendor/nginx-1.8.0/src/os/unix/ngx_channel.c)
    vendor/nginx-1.9.5/src/os/unix/ngx_channel.h
      (from vendor/nginx-1.8.0/src/os/unix/ngx_channel.h)
    vendor/nginx-1.9.5/src/os/unix/ngx_daemon.c
      (from vendor/nginx-1.8.0/src/os/unix/ngx_daemon.c)
    vendor/nginx-1.9.5/src/os/unix/ngx_darwin.h
      (from vendor/nginx-1.8.0/src/os/unix/ngx_darwin.h)
    vendor/nginx-1.9.5/src/os/unix/ngx_darwin_config.h
      (from vendor/nginx-1.8.0/src/os/unix/ngx_darwin_config.h)
    vendor/nginx-1.9.5/src/os/unix/ngx_darwin_init.c
      (from vendor/nginx-1.8.0/src/os/unix/ngx_darwin_init.c)
    vendor/nginx-1.9.5/src/os/unix/ngx_darwin_sendfile_chain.c
      (from vendor/nginx-1.8.0/src/os/unix/ngx_darwin_sendfile_chain.c)
    vendor/nginx-1.9.5/src/os/unix/ngx_errno.c
      (from vendor/nginx-1.8.0/src/os/unix/ngx_errno.c)
    vendor/nginx-1.9.5/src/os/unix/ngx_errno.h
      (from vendor/nginx-1.8.0/src/os/unix/ngx_errno.h)
    vendor/nginx-1.9.5/src/os/unix/ngx_file_aio_read.c
      (from vendor/nginx-1.8.0/src/os/unix/ngx_file_aio_read.c)
    vendor/nginx-1.9.5/src/os/unix/ngx_files.c
      (from vendor/nginx-1.8.0/src/os/unix/ngx_files.c)
    vendor/nginx-1.9.5/src/os/unix/ngx_files.h
      (from vendor/nginx-1.8.0/src/os/unix/ngx_files.h)
    vendor/nginx-1.9.5/src/os/unix/ngx_freebsd.h
      (from vendor/nginx-1.8.0/src/os/unix/ngx_freebsd.h)
    vendor/nginx-1.9.5/src/os/unix/ngx_freebsd_config.h
      (from vendor/nginx-1.8.0/src/os/unix/ngx_freebsd_config.h)
    vendor/nginx-1.9.5/src/os/unix/ngx_freebsd_init.c
      (from vendor/nginx-1.8.0/src/os/unix/ngx_freebsd_init.c)
    vendor/nginx-1.9.5/src/os/unix/ngx_freebsd_sendfile_chain.c
      (from vendor/nginx-1.8.0/src/os/unix/ngx_freebsd_sendfile_chain.c)
    vendor/nginx-1.9.5/src/os/unix/ngx_gcc_atomic_amd64.h
      (from vendor/nginx-1.8.0/src/os/unix/ngx_gcc_atomic_amd64.h)
    vendor/nginx-1.9.5/src/os/unix/ngx_gcc_atomic_ppc.h
      (from vendor/nginx-1.8.0/src/os/unix/ngx_gcc_atomic_ppc.h)
    vendor/nginx-1.9.5/src/os/unix/ngx_gcc_atomic_sparc64.h
      (from vendor/nginx-1.8.0/src/os/unix/ngx_gcc_atomic_sparc64.h)
    vendor/nginx-1.9.5/src/os/unix/ngx_gcc_atomic_x86.h
      (from vendor/nginx-1.8.0/src/os/unix/ngx_gcc_atomic_x86.h)
    vendor/nginx-1.9.5/src/os/unix/ngx_linux.h
      (from vendor/nginx-1.8.0/src/os/unix/ngx_linux.h)
    vendor/nginx-1.9.5/src/os/unix/ngx_linux_aio_read.c
      (from vendor/nginx-1.8.0/src/os/unix/ngx_linux_aio_read.c)
    vendor/nginx-1.9.5/src/os/unix/ngx_linux_config.h
      (from vendor/nginx-1.8.0/src/os/unix/ngx_linux_config.h)
    vendor/nginx-1.9.5/src/os/unix/ngx_linux_init.c
      (from vendor/nginx-1.8.0/src/os/unix/ngx_linux_init.c)
    vendor/nginx-1.9.5/src/os/unix/ngx_linux_sendfile_chain.c
      (from vendor/nginx-1.8.0/src/os/unix/ngx_linux_sendfile_chain.c)
    vendor/nginx-1.9.5/src/os/unix/ngx_os.h
      (from vendor/nginx-1.8.0/src/os/unix/ngx_os.h)
    vendor/nginx-1.9.5/src/os/unix/ngx_posix_config.h
      (from vendor/nginx-1.8.0/src/os/unix/ngx_posix_config.h)
    vendor/nginx-1.9.5/src/os/unix/ngx_posix_init.c
      (from vendor/nginx-1.8.0/src/os/unix/ngx_posix_init.c)
    vendor/nginx-1.9.5/src/os/unix/ngx_process.c
      (from vendor/nginx-1.8.0/src/os/unix/ngx_process.c)
    vendor/nginx-1.9.5/src/os/unix/ngx_process.h
      (from vendor/nginx-1.8.0/src/os/unix/ngx_process.h)
    vendor/nginx-1.9.5/src/os/unix/ngx_process_cycle.c
      (from vendor/nginx-1.8.0/src/os/unix/ngx_process_cycle.c)
    vendor/nginx-1.9.5/src/os/unix/ngx_process_cycle.h
      (from vendor/nginx-1.8.0/src/os/unix/ngx_process_cycle.h)
    vendor/nginx-1.9.5/src/os/unix/ngx_readv_chain.c
      (from vendor/nginx-1.8.0/src/os/unix/ngx_readv_chain.c)
    vendor/nginx-1.9.5/src/os/unix/ngx_recv.c
      (from vendor/nginx-1.8.0/src/os/unix/ngx_recv.c)
    vendor/nginx-1.9.5/src/os/unix/ngx_send.c
      (from vendor/nginx-1.8.0/src/os/unix/ngx_send.c)
    vendor/nginx-1.9.5/src/os/unix/ngx_setaffinity.c
      (from vendor/nginx-1.8.0/src/os/unix/ngx_setaffinity.c)
    vendor/nginx-1.9.5/src/os/unix/ngx_setaffinity.h
      (from vendor/nginx-1.8.0/src/os/unix/ngx_setaffinity.h)
    vendor/nginx-1.9.5/src/os/unix/ngx_setproctitle.c
      (from vendor/nginx-1.8.0/src/os/unix/ngx_setproctitle.c)
    vendor/nginx-1.9.5/src/os/unix/ngx_setproctitle.h
      (from vendor/nginx-1.8.0/src/os/unix/ngx_setproctitle.h)
    vendor/nginx-1.9.5/src/os/unix/ngx_shmem.c
      (from vendor/nginx-1.8.0/src/os/unix/ngx_shmem.c)
    vendor/nginx-1.9.5/src/os/unix/ngx_shmem.h
      (from vendor/nginx-1.8.0/src/os/unix/ngx_shmem.h)
    vendor/nginx-1.9.5/src/os/unix/ngx_socket.c
      (from vendor/nginx-1.8.0/src/os/unix/ngx_socket.c)
    vendor/nginx-1.9.5/src/os/unix/ngx_socket.h
      (from vendor/nginx-1.8.0/src/os/unix/ngx_socket.h)
    vendor/nginx-1.9.5/src/os/unix/ngx_solaris.h
      (from vendor/nginx-1.8.0/src/os/unix/ngx_solaris.h)
    vendor/nginx-1.9.5/src/os/unix/ngx_solaris_config.h
      (from vendor/nginx-1.8.0/src/os/unix/ngx_solaris_config.h)
    vendor/nginx-1.9.5/src/os/unix/ngx_solaris_init.c
      (from vendor/nginx-1.8.0/src/os/unix/ngx_solaris_init.c)
    vendor/nginx-1.9.5/src/os/unix/ngx_solaris_sendfilev_chain.c
      (from vendor/nginx-1.8.0/src/os/unix/ngx_solaris_sendfilev_chain.c)
    vendor/nginx-1.9.5/src/os/unix/ngx_sunpro_amd64.il
      (from vendor/nginx-1.8.0/src/os/unix/ngx_sunpro_amd64.il)
    vendor/nginx-1.9.5/src/os/unix/ngx_sunpro_atomic_sparc64.h
      (from vendor/nginx-1.8.0/src/os/unix/ngx_sunpro_atomic_sparc64.h)
    vendor/nginx-1.9.5/src/os/unix/ngx_sunpro_sparc64.il
      (from vendor/nginx-1.8.0/src/os/unix/ngx_sunpro_sparc64.il)
    vendor/nginx-1.9.5/src/os/unix/ngx_sunpro_x86.il
      (from vendor/nginx-1.8.0/src/os/unix/ngx_sunpro_x86.il)
    vendor/nginx-1.9.5/src/os/unix/ngx_thread.h
      (from vendor/nginx-1.8.0/src/os/unix/ngx_thread.h)
    vendor/nginx-1.9.5/src/os/unix/ngx_thread_cond.c
      (from vendor/nginx-1.8.0/src/os/unix/ngx_thread_cond.c)
    vendor/nginx-1.9.5/src/os/unix/ngx_thread_id.c
      (from vendor/nginx-1.8.0/src/os/unix/ngx_thread_id.c)
    vendor/nginx-1.9.5/src/os/unix/ngx_thread_mutex.c
      (from vendor/nginx-1.8.0/src/os/unix/ngx_thread_mutex.c)
    vendor/nginx-1.9.5/src/os/unix/ngx_time.c
      (from vendor/nginx-1.8.0/src/os/unix/ngx_time.c)
    vendor/nginx-1.9.5/src/os/unix/ngx_time.h
      (from vendor/nginx-1.8.0/src/os/unix/ngx_time.h)
    vendor/nginx-1.9.5/src/os/unix/ngx_udp_recv.c
      (from vendor/nginx-1.8.0/src/os/unix/ngx_udp_recv.c)
    vendor/nginx-1.9.5/src/os/unix/ngx_user.c
      (from vendor/nginx-1.8.0/src/os/unix/ngx_user.c)
    vendor/nginx-1.9.5/src/os/unix/ngx_user.h
      (from vendor/nginx-1.8.0/src/os/unix/ngx_user.h)
    vendor/nginx-1.9.5/src/os/unix/ngx_writev_chain.c
      (from vendor/nginx-1.8.0/src/os/unix/ngx_writev_chain.c)
    vendor/nginx-1.9.5/src/os/win32/nginx.ico
      (from vendor/nginx-1.8.0/src/os/win32/nginx.ico)
    vendor/nginx-1.9.5/src/os/win32/nginx.rc
      (from vendor/nginx-1.8.0/src/os/win32/nginx.rc)
    vendor/nginx-1.9.5/src/os/win32/nginx_icon16.xpm
      (from vendor/nginx-1.8.0/src/os/win32/nginx_icon16.xpm)
    vendor/nginx-1.9.5/src/os/win32/nginx_icon32.xpm
      (from vendor/nginx-1.8.0/src/os/win32/nginx_icon32.xpm)
    vendor/nginx-1.9.5/src/os/win32/nginx_icon48.xpm
      (from vendor/nginx-1.8.0/src/os/win32/nginx_icon48.xpm)
    vendor/nginx-1.9.5/src/os/win32/ngx_alloc.c
      (from vendor/nginx-1.8.0/src/os/win32/ngx_alloc.c)
    vendor/nginx-1.9.5/src/os/win32/ngx_alloc.h
      (from vendor/nginx-1.8.0/src/os/win32/ngx_alloc.h)
    vendor/nginx-1.9.5/src/os/win32/ngx_atomic.h
      (from vendor/nginx-1.8.0/src/os/win32/ngx_atomic.h)
    vendor/nginx-1.9.5/src/os/win32/ngx_errno.c
      (from vendor/nginx-1.8.0/src/os/win32/ngx_errno.c)
    vendor/nginx-1.9.5/src/os/win32/ngx_errno.h
      (from vendor/nginx-1.8.0/src/os/win32/ngx_errno.h)
    vendor/nginx-1.9.5/src/os/win32/ngx_event_log.c
      (from vendor/nginx-1.8.0/src/os/win32/ngx_event_log.c)
    vendor/nginx-1.9.5/src/os/win32/ngx_files.c
      (from vendor/nginx-1.8.0/src/os/win32/ngx_files.c)
    vendor/nginx-1.9.5/src/os/win32/ngx_files.h
      (from vendor/nginx-1.8.0/src/os/win32/ngx_files.h)
    vendor/nginx-1.9.5/src/os/win32/ngx_os.h
      (from vendor/nginx-1.8.0/src/os/win32/ngx_os.h)
    vendor/nginx-1.9.5/src/os/win32/ngx_process.c
      (from vendor/nginx-1.8.0/src/os/win32/ngx_process.c)
    vendor/nginx-1.9.5/src/os/win32/ngx_process.h
      (from vendor/nginx-1.8.0/src/os/win32/ngx_process.h)
    vendor/nginx-1.9.5/src/os/win32/ngx_process_cycle.c
      (from vendor/nginx-1.8.0/src/os/win32/ngx_process_cycle.c)
    vendor/nginx-1.9.5/src/os/win32/ngx_process_cycle.h
      (from vendor/nginx-1.8.0/src/os/win32/ngx_process_cycle.h)
    vendor/nginx-1.9.5/src/os/win32/ngx_service.c
      (from vendor/nginx-1.8.0/src/os/win32/ngx_service.c)
    vendor/nginx-1.9.5/src/os/win32/ngx_shmem.h
      (from vendor/nginx-1.8.0/src/os/win32/ngx_shmem.h)
    vendor/nginx-1.9.5/src/os/win32/ngx_socket.c
      (from vendor/nginx-1.8.0/src/os/win32/ngx_socket.c)
    vendor/nginx-1.9.5/src/os/win32/ngx_socket.h
      (from vendor/nginx-1.8.0/src/os/win32/ngx_socket.h)
    vendor/nginx-1.9.5/src/os/win32/ngx_stat.c
      (from vendor/nginx-1.8.0/src/os/win32/ngx_stat.c)
    vendor/nginx-1.9.5/src/os/win32/ngx_thread.h
      (from vendor/nginx-1.8.0/src/os/win32/ngx_thread.h)
    vendor/nginx-1.9.5/src/os/win32/ngx_time.c
      (from vendor/nginx-1.8.0/src/os/win32/ngx_time.c)
    vendor/nginx-1.9.5/src/os/win32/ngx_time.h
      (from vendor/nginx-1.8.0/src/os/win32/ngx_time.h)
    vendor/nginx-1.9.5/src/os/win32/ngx_udp_wsarecv.c
      (from vendor/nginx-1.8.0/src/os/win32/ngx_udp_wsarecv.c)
    vendor/nginx-1.9.5/src/os/win32/ngx_user.c
      (from vendor/nginx-1.8.0/src/os/win32/ngx_user.c)
    vendor/nginx-1.9.5/src/os/win32/ngx_user.h
      (from vendor/nginx-1.8.0/src/os/win32/ngx_user.h)
    vendor/nginx-1.9.5/src/os/win32/ngx_win32_config.h
      (from vendor/nginx-1.8.0/src/os/win32/ngx_win32_config.h)
    vendor/nginx-1.9.5/src/os/win32/ngx_win32_init.c
      (from vendor/nginx-1.8.0/src/os/win32/ngx_win32_init.c)
    vendor/nginx-1.9.5/src/os/win32/ngx_wsarecv.c
      (from vendor/nginx-1.8.0/src/os/win32/ngx_wsarecv.c)
    vendor/nginx-1.9.5/src/os/win32/ngx_wsarecv_chain.c
      (from vendor/nginx-1.8.0/src/os/win32/ngx_wsarecv_chain.c)
    vendor/nginx-1.9.5/src/os/win32/ngx_wsasend.c
      (from vendor/nginx-1.8.0/src/os/win32/ngx_wsasend.c)
    vendor/nginx-1.9.5/src/os/win32/ngx_wsasend_chain.c
      (from vendor/nginx-1.8.0/src/os/win32/ngx_wsasend_chain.c)
    vendor/nginx-1.9.5/src/stream/ngx_stream_core_module.c
      (from vendor/nginx-1.8.0/src/mail/ngx_mail_core_module.c)
    vendor/nginx-1.9.5/src/stream/ngx_stream_limit_conn_module.c
      (from vendor/nginx-1.8.0/src/http/modules/ngx_http_limit_conn_module.c)
    vendor/nginx-1.9.5/src/stream/ngx_stream_ssl_module.h
      (from vendor/nginx-1.8.0/src/mail/ngx_mail_ssl_module.h)

  Modified: nginx_version (+1 -1)
===================================================================
--- nginx_version    2015-09-27 18:09:01 +0900 (27f9cd3)
+++ nginx_version    2015-09-27 22:10:53 +0900 (158c747)
@@ -1 +1 @@
-1.8.0
+1.9.5

  Deleted: vendor/nginx-1.8.0/src/event/modules/ngx_aio_module.c (+0 -171) 100644
===================================================================
--- vendor/nginx-1.8.0/src/event/modules/ngx_aio_module.c    2015-09-27 18:09:01 +0900 (fd03fec)
+++ /dev/null
@@ -1,171 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) Nginx, Inc.
- */
-
-
-#include <ngx_config.h>
-#include <ngx_core.h>
-#include <ngx_event.h>
-
-
-extern ngx_event_module_t  ngx_kqueue_module_ctx;
-
-
-static ngx_int_t ngx_aio_init(ngx_cycle_t *cycle, ngx_msec_t timer);
-static void ngx_aio_done(ngx_cycle_t *cycle);
-static ngx_int_t ngx_aio_add_event(ngx_event_t *ev, ngx_int_t event,
-    ngx_uint_t flags);
-static ngx_int_t ngx_aio_del_event(ngx_event_t *ev, ngx_int_t event,
-    ngx_uint_t flags);
-static ngx_int_t ngx_aio_del_connection(ngx_connection_t *c, ngx_uint_t flags);
-static ngx_int_t ngx_aio_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
-    ngx_uint_t flags);
-
-
-ngx_os_io_t ngx_os_aio = {
-    ngx_aio_read,
-    ngx_aio_read_chain,
-    NULL,
-    ngx_aio_write,
-    ngx_aio_write_chain,
-    0
-};
-
-
-static ngx_str_t      aio_name = ngx_string("aio");
-
-ngx_event_module_t  ngx_aio_module_ctx = {
-    &aio_name,
-    NULL,                                  /* create configuration */
-    NULL,                                  /* init configuration */
-
-    {
-        ngx_aio_add_event,                 /* add an event */
-        ngx_aio_del_event,                 /* delete an event */
-        NULL,                              /* enable an event */
-        NULL,                              /* disable an event */
-        NULL,                              /* add an connection */
-        ngx_aio_del_connection,            /* delete an connection */
-        NULL,                              /* trigger a notify */
-        ngx_aio_process_events,            /* process the events */
-        ngx_aio_init,                      /* init the events */
-        ngx_aio_done                       /* done the events */
-    }
-
-};
-
-ngx_module_t  ngx_aio_module = {
-    NGX_MODULE_V1,
-    &ngx_aio_module_ctx,                   /* module context */
-    NULL,                                  /* module directives */
-    NGX_EVENT_MODULE,                      /* module type */
-    NULL,                                  /* init master */
-    NULL,                                  /* init module */
-    NULL,                                  /* init process */
-    NULL,                                  /* init thread */
-    NULL,                                  /* exit thread */
-    NULL,                                  /* exit process */
-    NULL,                                  /* exit master */
-    NGX_MODULE_V1_PADDING
-};
-
-
-#if (NGX_HAVE_KQUEUE)
-
-static ngx_int_t
-ngx_aio_init(ngx_cycle_t *cycle, ngx_msec_t timer)
-{
-    if (ngx_kqueue_module_ctx.actions.init(cycle, timer) == NGX_ERROR) {
-        return NGX_ERROR;
-    }
-
-    ngx_io = ngx_os_aio;
-
-    ngx_event_flags = NGX_USE_AIO_EVENT;
-    ngx_event_actions = ngx_aio_module_ctx.actions;
-
-
-    return NGX_OK;
-}
-
-
-static void
-ngx_aio_done(ngx_cycle_t *cycle)
-{
-    ngx_kqueue_module_ctx.actions.done(cycle);
-}
-
-
-/* the event adding and deleting are needed for the listening sockets */
-
-static ngx_int_t
-ngx_aio_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)
-{
-    return ngx_kqueue_module_ctx.actions.add(ev, event, flags);
-}
-
-
-static ngx_int_t
-ngx_aio_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)
-{
-    return ngx_kqueue_module_ctx.actions.del(ev, event, flags);
-}
-
-
-static ngx_int_t
-ngx_aio_del_connection(ngx_connection_t *c, ngx_uint_t flags)
-{
-    int  rc;
-
-    if (c->read->active == 0 && c->write->active == 0) {
-        return NGX_OK;
-    }
-
-    if (flags & NGX_CLOSE_EVENT) {
-        return NGX_OK;
-    }
-
-    rc = aio_cancel(c->fd, NULL);
-
-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "aio_cancel: %d", rc);
-
-    if (rc == AIO_CANCELED) {
-        c->read->active = 0;
-        c->write->active = 0;
-        return NGX_OK;
-    }
-
-    if (rc == AIO_ALLDONE) {
-        c->read->active = 0;
-        c->write->active = 0;
-        ngx_log_error(NGX_LOG_ALERT, c->log, 0,
-                      "aio_cancel() returned AIO_ALLDONE");
-        return NGX_OK;
-    }
-
-    if (rc == -1) {
-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,
-                      "aio_cancel() failed");
-        return NGX_ERROR;
-    }
-
-    if (rc == AIO_NOTCANCELED) {
-        ngx_log_error(NGX_LOG_ALERT, c->log, 0,
-                      "aio_cancel() returned AIO_NOTCANCELED");
-
-        return NGX_ERROR;
-    }
-
-    return NGX_OK;
-}
-
-
-static ngx_int_t
-ngx_aio_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags)
-{
-    return ngx_kqueue_module_ctx.actions.process_events(cycle, timer, flags);
-}
-
-#endif /* NGX_HAVE_KQUEUE */

  Deleted: vendor/nginx-1.8.0/src/event/modules/ngx_rtsig_module.c (+0 -735) 100644
===================================================================
--- vendor/nginx-1.8.0/src/event/modules/ngx_rtsig_module.c    2015-09-27 18:09:01 +0900 (b120fec)
+++ /dev/null
@@ -1,735 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) Nginx, Inc.
- */
-
-
-#include <ngx_config.h>
-#include <ngx_core.h>
-#include <ngx_event.h>
-
-
-#if (NGX_TEST_BUILD_RTSIG)
-
-#if (NGX_DARWIN)
-
-#define SIGRTMIN       33
-#define si_fd          __pad[0]
-
-#else
-
-#ifdef  SIGRTMIN
-#define si_fd          _reason.__spare__.__spare2__[0]
-#else
-#define SIGRTMIN       33
-#define si_fd          __spare__[0]
-#endif
-
-#endif
-
-#define F_SETSIG       10
-#define KERN_RTSIGNR   30
-#define KERN_RTSIGMAX  31
-
-int sigtimedwait(const sigset_t *set, siginfo_t *info,
-                 const struct timespec *timeout);
-
-int sigtimedwait(const sigset_t *set, siginfo_t *info,
-                 const struct timespec *timeout)
-{
-    return -1;
-}
-
-int ngx_linux_rtsig_max;
-
-#endif
-
-
-typedef struct {
-    ngx_uint_t  signo;
-    ngx_uint_t  overflow_events;
-    ngx_uint_t  overflow_test;
-    ngx_uint_t  overflow_threshold;
-} ngx_rtsig_conf_t;
-
-
-extern ngx_event_module_t  ngx_poll_module_ctx;
-
-static ngx_int_t ngx_rtsig_init(ngx_cycle_t *cycle, ngx_msec_t timer);
-static void ngx_rtsig_done(ngx_cycle_t *cycle);
-static ngx_int_t ngx_rtsig_add_connection(ngx_connection_t *c);
-static ngx_int_t ngx_rtsig_del_connection(ngx_connection_t *c,
-    ngx_uint_t flags);
-static ngx_int_t ngx_rtsig_process_events(ngx_cycle_t *cycle,
-    ngx_msec_t timer, ngx_uint_t flags);
-static ngx_int_t ngx_rtsig_process_overflow(ngx_cycle_t *cycle,
-    ngx_msec_t timer, ngx_uint_t flags);
-
-static void *ngx_rtsig_create_conf(ngx_cycle_t *cycle);
-static char *ngx_rtsig_init_conf(ngx_cycle_t *cycle, void *conf);
-static char *ngx_check_ngx_overflow_threshold_bounds(ngx_conf_t *cf,
-    void *post, void *data);
-
-
-static sigset_t        set;
-static ngx_uint_t      overflow, overflow_current;
-static struct pollfd  *overflow_list;
-
-
-static ngx_str_t      rtsig_name = ngx_string("rtsig");
-
-static ngx_conf_num_bounds_t  ngx_overflow_threshold_bounds = {
-    ngx_check_ngx_overflow_threshold_bounds, 2, 10
-};
-
-
-static ngx_command_t  ngx_rtsig_commands[] = {
-
-    { ngx_string("rtsig_signo"),
-      NGX_EVENT_CONF|NGX_CONF_TAKE1,
-      ngx_conf_set_num_slot,
-      0,
-      offsetof(ngx_rtsig_conf_t, signo),
-      NULL },
-
-    { ngx_string("rtsig_overflow_events"),
-      NGX_EVENT_CONF|NGX_CONF_TAKE1,
-      ngx_conf_set_num_slot,
-      0,
-      offsetof(ngx_rtsig_conf_t, overflow_events),
-      NULL },
-
-    { ngx_string("rtsig_overflow_test"),
-      NGX_EVENT_CONF|NGX_CONF_TAKE1,
-      ngx_conf_set_num_slot,
-      0,
-      offsetof(ngx_rtsig_conf_t, overflow_test),
-      NULL },
-
-    { ngx_string("rtsig_overflow_threshold"),
-      NGX_EVENT_CONF|NGX_CONF_TAKE1,
-      ngx_conf_set_num_slot,
-      0,
-      offsetof(ngx_rtsig_conf_t, overflow_threshold),
-      &ngx_overflow_threshold_bounds },
-
-      ngx_null_command
-};
-
-
-ngx_event_module_t  ngx_rtsig_module_ctx = {
-    &rtsig_name,
-    ngx_rtsig_create_conf,               /* create configuration */
-    ngx_rtsig_init_conf,                 /* init configuration */
-
-    {
-        NULL,                            /* add an event */
-        NULL,                            /* delete an event */
-        NULL,                            /* enable an event */
-        NULL,                            /* disable an event */
-        ngx_rtsig_add_connection,        /* add an connection */
-        ngx_rtsig_del_connection,        /* delete an connection */
-        NULL,                            /* trigger a notify */
-        ngx_rtsig_process_events,        /* process the events */
-        ngx_rtsig_init,                  /* init the events */
-        ngx_rtsig_done,                  /* done the events */
-    }
-
-};
-
-ngx_module_t  ngx_rtsig_module = {
-    NGX_MODULE_V1,
-    &ngx_rtsig_module_ctx,               /* module context */
-    ngx_rtsig_commands,                  /* module directives */
-    NGX_EVENT_MODULE,                    /* module type */
-    NULL,                                /* init master */
-    NULL,                                /* init module */
-    NULL,                                /* init process */
-    NULL,                                /* init thread */
-    NULL,                                /* exit thread */
-    NULL,                                /* exit process */
-    NULL,                                /* exit master */
-    NGX_MODULE_V1_PADDING
-};
-
-
-static ngx_int_t
-ngx_rtsig_init(ngx_cycle_t *cycle, ngx_msec_t timer)
-{
-    ngx_rtsig_conf_t  *rtscf;
-
-    rtscf = ngx_event_get_conf(cycle->conf_ctx, ngx_rtsig_module);
-
-    sigemptyset(&set);
-    sigaddset(&set, (int) rtscf->signo);
-    sigaddset(&set, (int) rtscf->signo + 1);
-    sigaddset(&set, SIGIO);
-    sigaddset(&set, SIGALRM);
-
-    if (sigprocmask(SIG_BLOCK, &set, NULL) == -1) {
-        ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
-                      "sigprocmask() failed");
-        return NGX_ERROR;
-    }
-
-    if (overflow_list) {
-        ngx_free(overflow_list);
-    }
-
-    overflow_list = ngx_alloc(sizeof(struct pollfd) * rtscf->overflow_events,
-                              cycle->log);
-    if (overflow_list == NULL) {
-        return NGX_ERROR;
-    }
-
-    ngx_io = ngx_os_io;
-
-    ngx_event_actions = ngx_rtsig_module_ctx.actions;
-
-    ngx_event_flags = NGX_USE_RTSIG_EVENT
-                      |NGX_USE_GREEDY_EVENT
-                      |NGX_USE_FD_EVENT;
-
-    return NGX_OK;
-}
-
-
-static void
-ngx_rtsig_done(ngx_cycle_t *cycle)
-{
-    ngx_free(overflow_list);
-
-    overflow_list = NULL;
-}
-
-
-static ngx_int_t
-ngx_rtsig_add_connection(ngx_connection_t *c)
-{
-    ngx_uint_t         signo;
-    ngx_rtsig_conf_t  *rtscf;
-
-    if (c->read->accept && c->read->disabled) {
-
-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
-                       "rtsig enable connection: fd:%d", c->fd);
-
-        if (fcntl(c->fd, F_SETOWN, ngx_pid) == -1) {
-            ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,
-                          "fcntl(F_SETOWN) failed");
-            return NGX_ERROR;
-        }
-
-        c->read->active = 1;
-        c->read->disabled = 0;
-    }
-
-    rtscf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_rtsig_module);
-
-    signo = rtscf->signo + c->read->instance;
-
-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
-                   "rtsig add connection: fd:%d signo:%ui", c->fd, signo);
-
-    if (fcntl(c->fd, F_SETFL, O_RDWR|O_NONBLOCK|O_ASYNC) == -1) {
-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,
-                      "fcntl(O_RDWR|O_NONBLOCK|O_ASYNC) failed");
-        return NGX_ERROR;
-    }
-
-    if (fcntl(c->fd, F_SETSIG, (int) signo) == -1) {
-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,
-                      "fcntl(F_SETSIG) failed");
-        return NGX_ERROR;
-    }
-
-    if (fcntl(c->fd, F_SETOWN, ngx_pid) == -1) {
-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,
-                      "fcntl(F_SETOWN) failed");
-        return NGX_ERROR;
-    }
-
-#if (NGX_HAVE_ONESIGFD)
-    if (fcntl(c->fd, F_SETAUXFL, O_ONESIGFD) == -1) {
-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,
-                      "fcntl(F_SETAUXFL) failed");
-        return NGX_ERROR;
-    }
-#endif
-
-    c->read->active = 1;
-    c->write->active = 1;
-
-    return NGX_OK;
-}
-
-
-static ngx_int_t
-ngx_rtsig_del_connection(ngx_connection_t *c, ngx_uint_t flags)
-{
-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
-                   "rtsig del connection: fd:%d", c->fd);
-
-    if ((flags & NGX_DISABLE_EVENT) && c->read->accept) {
-
-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
-                       "rtsig disable connection: fd:%d", c->fd);
-
-        c->read->active = 0;
-        c->read->disabled = 1;
-        return NGX_OK;
-    }
-
-    if (flags & NGX_CLOSE_EVENT) {
-        c->read->active = 0;
-        c->write->active = 0;
-        return NGX_OK;
-    }
-
-    if (fcntl(c->fd, F_SETFL, O_RDWR|O_NONBLOCK) == -1) {
-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,
-                      "fcntl(O_RDWR|O_NONBLOCK) failed");
-        return NGX_ERROR;
-    }
-
-    c->read->active = 0;
-    c->write->active = 0;
-
-    return NGX_OK;
-}
-
-
-static ngx_int_t
-ngx_rtsig_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags)
-{
-    int                 signo;
-    ngx_int_t           instance;
-    ngx_err_t           err;
-    siginfo_t           si;
-    ngx_event_t        *rev, *wev;
-    ngx_queue_t        *queue;
-    struct timespec     ts, *tp;
-    struct sigaction    sa;
-    ngx_connection_t   *c;
-    ngx_rtsig_conf_t   *rtscf;
-
-    if (timer == NGX_TIMER_INFINITE) {
-        tp = NULL;
-
-    } else {
-        ts.tv_sec = timer / 1000;
-        ts.tv_nsec = (timer % 1000) * 1000000;
-        tp = &ts;
-    }
-
-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                   "rtsig timer: %M", timer);
-
-    /* Linux's sigwaitinfo() is sigtimedwait() with the NULL timeout pointer */
-
-    signo = sigtimedwait(&set, &si, tp);
-
-    if (signo == -1) {
-        err = ngx_errno;
-
-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, err,
-                       "rtsig signo:%d", signo);
-
-        if (flags & NGX_UPDATE_TIME) {
-            ngx_time_update();
-        }
-
-        if (err == NGX_EAGAIN) {
-
-            /* timeout */
-
-            if (timer != NGX_TIMER_INFINITE) {
-                return NGX_AGAIN;
-            }
-
-            ngx_log_error(NGX_LOG_ALERT, cycle->log, err,
-                          "sigtimedwait() returned EAGAIN without timeout");
-            return NGX_ERROR;
-        }
-
-        ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT,
-                      cycle->log, err, "sigtimedwait() failed");
-        return NGX_ERROR;
-    }
-
-    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                   "rtsig signo:%d fd:%d band:%04Xd",
-                   signo, si.si_fd, si.si_band);
-
-    if (flags & NGX_UPDATE_TIME) {
-        ngx_time_update();
-    }
-
-    rtscf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_rtsig_module);
-
-    if (signo == (int) rtscf->signo || signo == (int) rtscf->signo + 1) {
-
-        if (overflow && (ngx_uint_t) si.si_fd > overflow_current) {
-            return NGX_OK;
-        }
-
-        c = ngx_cycle->files[si.si_fd];
-
-        if (c == NULL) {
-
-            /* the stale event */
-
-            return NGX_OK;
-        }
-
-        instance = signo - (int) rtscf->signo;
-
-        rev = c->read;
-
-        if (rev->instance != instance) {
-
-            /*
-             * the stale event from a file descriptor
-             * that was just closed in this iteration
-             */
-
-            ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                           "rtsig: stale event %p", c);
-
-            return NGX_OK;
-        }
-
-        if ((si.si_band & (POLLIN|POLLHUP|POLLERR)) && rev->active) {
-
-            rev->ready = 1;
-
-            if (flags & NGX_POST_EVENTS) {
-                queue = rev->accept ? &ngx_posted_accept_events
-                                    : &ngx_posted_events;
-
-                ngx_post_event(rev, queue);
-
-            } else {
-                rev->handler(rev);
-            }
-        }
-
-        wev = c->write;
-
-        if ((si.si_band & (POLLOUT|POLLHUP|POLLERR)) && wev->active) {
-
-            wev->ready = 1;
-
-            if (flags & NGX_POST_EVENTS) {
-                ngx_post_event(wev, &ngx_posted_events);
-
-            } else {
-                wev->handler(wev);
-            }
-        }
-
-        return NGX_OK;
-
-    } else if (signo == SIGALRM) {
-
-        ngx_time_update();
-
-        return NGX_OK;
-
-    } else if (signo == SIGIO) {
-
-        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
-                      "rt signal queue overflowed");
-
-        /* flush the RT signal queue */
-
-        ngx_memzero(&sa, sizeof(struct sigaction));
-        sa.sa_handler = SIG_DFL;
-        sigemptyset(&sa.sa_mask);
-
-        if (sigaction(rtscf->signo, &sa, NULL) == -1) {
-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
-                          "sigaction(%d, SIG_DFL) failed", rtscf->signo);
-        }
-
-        if (sigaction(rtscf->signo + 1, &sa, NULL) == -1) {
-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
-                          "sigaction(%d, SIG_DFL) failed", rtscf->signo + 1);
-        }
-
-        overflow = 1;
-        overflow_current = 0;
-        ngx_event_actions.process_events = ngx_rtsig_process_overflow;
-
-        return NGX_ERROR;
-
-    }
-
-    ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
-                  "sigtimedwait() returned unexpected signal: %d", signo);
-
-    return NGX_ERROR;
-}
-
-
-static ngx_int_t
-ngx_rtsig_process_overflow(ngx_cycle_t *cycle, ngx_msec_t timer,
-    ngx_uint_t flags)
-{
-    int                name[2], rtsig_max, rtsig_nr, events, ready;
-    size_t             len;
-    ngx_err_t          err;
-    ngx_uint_t         tested, n, i;
-    ngx_event_t       *rev, *wev;
-    ngx_queue_t       *queue;
-    ngx_connection_t  *c;
-    ngx_rtsig_conf_t  *rtscf;
-
-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                   "rtsig process overflow");
-
-    rtscf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_rtsig_module);
-
-    tested = 0;
-
-    for ( ;; ) {
-
-        n = 0;
-        while (n < rtscf->overflow_events) {
-
-            if (overflow_current == cycle->connection_n) {
-                break;
-            }
-
-            c = cycle->files[overflow_current++];
-
-            if (c == NULL || c->fd == -1) {
-                continue;
-            }
-
-            events = 0;
-
-            if (c->read->active && c->read->handler) {
-                events |= POLLIN;
-            }
-
-            if (c->write->active && c->write->handler) {
-                events |= POLLOUT;
-            }
-
-            if (events == 0) {
-                continue;
-            }
-
-            overflow_list[n].fd = c->fd;
-            overflow_list[n].events = events;
-            overflow_list[n].revents = 0;
-            n++;
-        }
-
-        if (n == 0) {
-            break;
-        }
-
-        for ( ;; ) {
-            ready = poll(overflow_list, n, 0);
-
-            ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                           "rtsig overflow poll:%d", ready);
-
-            if (ready == -1) {
-                err = ngx_errno;
-                ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT,
-                              cycle->log, 0,
-                              "poll() failed while the overflow recover");
-
-                if (err == NGX_EINTR) {
-                    continue;
-                }
-            }
-
-            break;
-        }
-
-        if (ready <= 0) {
-            continue;
-        }
-
-        for (i = 0; i < n; i++) {
-            c = cycle->files[overflow_list[i].fd];
-
-            if (c == NULL) {
-                continue;
-            }
-
-            rev = c->read;
-
-            if (rev->active
-                && !rev->closed
-                && rev->handler
-                && (overflow_list[i].revents
-                                          & (POLLIN|POLLERR|POLLHUP|POLLNVAL)))
-            {
-                tested++;
-
-                rev->ready = 1;
-
-                if (flags & NGX_POST_EVENTS) {
-                    queue = rev->accept ? &ngx_posted_accept_events
-                                        : &ngx_posted_events;
-
-                    ngx_post_event(rev, queue);
-
-                } else {
-                    rev->handler(rev);
-                }
-            }
-
-            wev = c->write;
-
-            if (wev->active
-                && !wev->closed
-                && wev->handler
-                && (overflow_list[i].revents
-                                         & (POLLOUT|POLLERR|POLLHUP|POLLNVAL)))
-            {
-                tested++;
-
-                wev->ready = 1;
-
-                if (flags & NGX_POST_EVENTS) {
-                    ngx_post_event(wev, &ngx_posted_events);
-
-                } else {
-                    wev->handler(wev);
-                }
-            }
-        }
-
-        if (tested >= rtscf->overflow_test) {
-
-            if (ngx_linux_rtsig_max) {
-
-                /*
-                 * Check the current rt queue length to prevent
-                 * the new overflow.
-                 *
-                 * learn the "/proc/sys/kernel/rtsig-max" value because
-                 * it can be changed since the last checking
-                 */
-
-                name[0] = CTL_KERN;
-                name[1] = KERN_RTSIGMAX;
-                len = sizeof(rtsig_max);
-
-                if (sysctl(name, 2, &rtsig_max, &len, NULL, 0) == -1) {
-                    ngx_log_error(NGX_LOG_ALERT, cycle->log, errno,
-                                  "sysctl(KERN_RTSIGMAX) failed");
-                    return NGX_ERROR;
-                }
-
-                /* name[0] = CTL_KERN; */
-                name[1] = KERN_RTSIGNR;
-                len = sizeof(rtsig_nr);
-
-                if (sysctl(name, 2, &rtsig_nr, &len, NULL, 0) == -1) {
-                    ngx_log_error(NGX_LOG_ALERT, cycle->log, errno,
-                                  "sysctl(KERN_RTSIGNR) failed");
-                    return NGX_ERROR;
-                }
-
-                /*
-                 * drain the rt signal queue if the /"proc/sys/kernel/rtsig-nr"
-                 * is bigger than
-                 *    "/proc/sys/kernel/rtsig-max" / "rtsig_overflow_threshold"
-                 */
-
-                if (rtsig_max / (int) rtscf->overflow_threshold < rtsig_nr) {
-                    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                                   "rtsig queue state: %d/%d",
-                                   rtsig_nr, rtsig_max);
-                    while (ngx_rtsig_process_events(cycle, 0, flags) == NGX_OK)
-                    {
-                        /* void */
-                    }
-                }
-
-            } else {
-
-                /*
-                 * Linux has not KERN_RTSIGMAX since 2.6.6-mm2
-                 * so drain the rt signal queue unconditionally
-                 */
-
-                while (ngx_rtsig_process_events(cycle, 0, flags) == NGX_OK) {
-                    /* void */
-                }
-            }
-
-            tested = 0;
-        }
-    }
-
-    if (flags & NGX_UPDATE_TIME) {
-        ngx_time_update();
-    }
-
-    ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
-                  "rt signal queue overflow recovered");
-
-    overflow = 0;
-    ngx_event_actions.process_events = ngx_rtsig_process_events;
-
-    return NGX_OK;
-}
-
-
-static void *
-ngx_rtsig_create_conf(ngx_cycle_t *cycle)
-{
-    ngx_rtsig_conf_t  *rtscf;
-
-    rtscf = ngx_palloc(cycle->pool, sizeof(ngx_rtsig_conf_t));
-    if (rtscf == NULL) {
-        return NULL;
-    }
-
-    rtscf->signo = NGX_CONF_UNSET;
-    rtscf->overflow_events = NGX_CONF_UNSET;
-    rtscf->overflow_test = NGX_CONF_UNSET;
-    rtscf->overflow_threshold = NGX_CONF_UNSET;
-
-    return rtscf;
-}
-
-
-static char *
-ngx_rtsig_init_conf(ngx_cycle_t *cycle, void *conf)
-{
-    ngx_rtsig_conf_t  *rtscf = conf;
-
-    /* LinuxThreads use the first 3 RT signals */
-    ngx_conf_init_uint_value(rtscf->signo, SIGRTMIN + 10);
-
-    ngx_conf_init_uint_value(rtscf->overflow_events, 16);
-    ngx_conf_init_uint_value(rtscf->overflow_test, 32);
-    ngx_conf_init_uint_value(rtscf->overflow_threshold, 10);
-
-    return NGX_CONF_OK;
-}
-
-
-static char *
-ngx_check_ngx_overflow_threshold_bounds(ngx_conf_t *cf, void *post, void *data)
-{
-    if (ngx_linux_rtsig_max) {
-        return ngx_conf_check_num_bounds(cf, post, data);
-    }
-
-    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
-                       "\"rtsig_overflow_threshold\" is not supported "
-                       "since Linux 2.6.6-mm2, ignored");
-
-    return NGX_CONF_OK;
-}

  Deleted: vendor/nginx-1.8.0/src/http/ngx_http_spdy.c (+0 -3701) 100644
===================================================================
--- vendor/nginx-1.8.0/src/http/ngx_http_spdy.c    2015-09-27 18:09:01 +0900 (6bb79b8)
+++ /dev/null
@@ -1,3701 +0,0 @@
-
-/*
- * Copyright (C) Nginx, Inc.
- * Copyright (C) Valentin V. Bartenev
- */
-
-
-#include <ngx_config.h>
-#include <ngx_core.h>
-#include <ngx_http.h>
-#include <ngx_http_spdy_module.h>
-
-#include <zlib.h>
-
-
-#if (NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED)
-
-#define ngx_str5cmp(m, c0, c1, c2, c3, c4)                                    \
-    *(uint32_t *) m == (c3 << 24 | c2 << 16 | c1 << 8 | c0)                   \
-        && m[4] == c4
-
-#else
-
-#define ngx_str5cmp(m, c0, c1, c2, c3, c4)                                    \
-    m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3 && m[4] == c4
-
-#endif
-
-
-#if (NGX_HAVE_NONALIGNED)
-
-#define ngx_spdy_frame_parse_uint16(p)  ntohs(*(uint16_t *) (p))
-#define ngx_spdy_frame_parse_uint32(p)  ntohl(*(uint32_t *) (p))
-
-#else
-
-#define ngx_spdy_frame_parse_uint16(p) ((p)[0] << 8 | (p)[1])
-#define ngx_spdy_frame_parse_uint32(p)                                        \
-    ((p)[0] << 24 | (p)[1] << 16 | (p)[2] << 8 | (p)[3])
-
-#endif
-
-#define ngx_spdy_frame_parse_sid(p)                                           \
-    (ngx_spdy_frame_parse_uint32(p) & 0x7fffffff)
-#define ngx_spdy_frame_parse_delta(p)                                         \
-    (ngx_spdy_frame_parse_uint32(p) & 0x7fffffff)
-
-
-#define ngx_spdy_ctl_frame_check(h)                                           \
-    (((h) & 0xffff0000) == ngx_spdy_ctl_frame_head(0))
-#define ngx_spdy_data_frame_check(h)                                          \
-    (!((h) & (uint32_t) NGX_SPDY_CTL_BIT << 31))
-
-#define ngx_spdy_ctl_frame_type(h)   ((h) & 0x0000ffff)
-#define ngx_spdy_frame_flags(p)      ((p) >> 24)
-#define ngx_spdy_frame_length(p)     ((p) & 0x00ffffff)
-#define ngx_spdy_frame_id(p)         ((p) & 0x00ffffff)
-
-
-#define NGX_SPDY_SKIP_HEADERS_BUFFER_SIZE  4096
-#define NGX_SPDY_CTL_FRAME_BUFFER_SIZE     16
-
-#define NGX_SPDY_PROTOCOL_ERROR            1
-#define NGX_SPDY_INVALID_STREAM            2
-#define NGX_SPDY_REFUSED_STREAM            3
-#define NGX_SPDY_UNSUPPORTED_VERSION       4
-#define NGX_SPDY_CANCEL                    5
-#define NGX_SPDY_INTERNAL_ERROR            6
-#define NGX_SPDY_FLOW_CONTROL_ERROR        7
-#define NGX_SPDY_STREAM_IN_USE             8
-#define NGX_SPDY_STREAM_ALREADY_CLOSED     9
-/* deprecated                              10 */
-#define NGX_SPDY_FRAME_TOO_LARGE           11
-
-#define NGX_SPDY_SETTINGS_MAX_STREAMS      4
-#define NGX_SPDY_SETTINGS_INIT_WINDOW      7
-
-#define NGX_SPDY_SETTINGS_FLAG_PERSIST     0x01
-#define NGX_SPDY_SETTINGS_FLAG_PERSISTED   0x02
-
-#define NGX_SPDY_MAX_WINDOW                NGX_MAX_INT32_VALUE
-#define NGX_SPDY_CONNECTION_WINDOW         65536
-#define NGX_SPDY_INIT_STREAM_WINDOW        65536
-#define NGX_SPDY_STREAM_WINDOW             NGX_SPDY_MAX_WINDOW
-
-typedef struct {
-    ngx_uint_t    hash;
-    u_char        len;
-    u_char        header[7];
-    ngx_int_t   (*handler)(ngx_http_request_t *r);
-} ngx_http_spdy_request_header_t;
-
-
-static void ngx_http_spdy_read_handler(ngx_event_t *rev);
-static void ngx_http_spdy_write_handler(ngx_event_t *wev);
-static void ngx_http_spdy_handle_connection(ngx_http_spdy_connection_t *sc);
-
-static u_char *ngx_http_spdy_proxy_protocol(ngx_http_spdy_connection_t *sc,
-    u_char *pos, u_char *end);
-static u_char *ngx_http_spdy_state_head(ngx_http_spdy_connection_t *sc,
-    u_char *pos, u_char *end);
-static u_char *ngx_http_spdy_state_syn_stream(ngx_http_spdy_connection_t *sc,
-    u_char *pos, u_char *end);
-static u_char *ngx_http_spdy_state_headers(ngx_http_spdy_connection_t *sc,
-    u_char *pos, u_char *end);
-static u_char *ngx_http_spdy_state_headers_skip(ngx_http_spdy_connection_t *sc,
-    u_char *pos, u_char *end);
-static u_char *ngx_http_spdy_state_headers_error(ngx_http_spdy_connection_t *sc,
-    u_char *pos, u_char *end);
-static u_char *ngx_http_spdy_state_window_update(ngx_http_spdy_connection_t *sc,
-    u_char *pos, u_char *end);
-static u_char *ngx_http_spdy_state_data(ngx_http_spdy_connection_t *sc,
-    u_char *pos, u_char *end);
-static u_char *ngx_http_spdy_state_read_data(ngx_http_spdy_connection_t *sc,
-    u_char *pos, u_char *end);
-static u_char *ngx_http_spdy_state_rst_stream(ngx_http_spdy_connection_t *sc,
-    u_char *pos, u_char *end);
-static u_char *ngx_http_spdy_state_ping(ngx_http_spdy_connection_t *sc,
-    u_char *pos, u_char *end);
-static u_char *ngx_http_spdy_state_skip(ngx_http_spdy_connection_t *sc,
-    u_char *pos, u_char *end);
-static u_char *ngx_http_spdy_state_settings(ngx_http_spdy_connection_t *sc,
-    u_char *pos, u_char *end);
-static u_char *ngx_http_spdy_state_complete(ngx_http_spdy_connection_t *sc,
-    u_char *pos, u_char *end);
-static u_char *ngx_http_spdy_state_save(ngx_http_spdy_connection_t *sc,
-    u_char *pos, u_char *end, ngx_http_spdy_handler_pt handler);
-
-static u_char *ngx_http_spdy_state_inflate_error(
-    ngx_http_spdy_connection_t *sc, int rc);
-static u_char *ngx_http_spdy_state_protocol_error(
-    ngx_http_spdy_connection_t *sc);
-static u_char *ngx_http_spdy_state_internal_error(
-    ngx_http_spdy_connection_t *sc);
-
-static ngx_int_t ngx_http_spdy_send_window_update(
-    ngx_http_spdy_connection_t *sc, ngx_uint_t sid, ngx_uint_t delta);
-static ngx_int_t ngx_http_spdy_send_rst_stream(ngx_http_spdy_connection_t *sc,
-    ngx_uint_t sid, ngx_uint_t status, ngx_uint_t priority);
-static ngx_int_t ngx_http_spdy_send_settings(ngx_http_spdy_connection_t *sc);
-static ngx_int_t ngx_http_spdy_settings_frame_handler(
-    ngx_http_spdy_connection_t *sc, ngx_http_spdy_out_frame_t *frame);
-static ngx_http_spdy_out_frame_t *ngx_http_spdy_get_ctl_frame(
-    ngx_http_spdy_connection_t *sc, size_t size, ngx_uint_t priority);
-static ngx_int_t ngx_http_spdy_ctl_frame_handler(
-    ngx_http_spdy_connection_t *sc, ngx_http_spdy_out_frame_t *frame);
-
-static ngx_http_spdy_stream_t *ngx_http_spdy_create_stream(
-    ngx_http_spdy_connection_t *sc, ngx_uint_t id, ngx_uint_t priority);
-static ngx_http_spdy_stream_t *ngx_http_spdy_get_stream_by_id(
-    ngx_http_spdy_connection_t *sc, ngx_uint_t sid);
-#define ngx_http_spdy_streams_index_size(sscf)  (sscf->streams_index_mask + 1)
-#define ngx_http_spdy_stream_index(sscf, sid)                                 \
-    ((sid >> 1) & sscf->streams_index_mask)
-
-static ngx_int_t ngx_http_spdy_parse_header(ngx_http_request_t *r);
-static ngx_int_t ngx_http_spdy_alloc_large_header_buffer(ngx_http_request_t *r);
-
-static ngx_int_t ngx_http_spdy_handle_request_header(ngx_http_request_t *r);
-static ngx_int_t ngx_http_spdy_parse_method(ngx_http_request_t *r);
-static ngx_int_t ngx_http_spdy_parse_scheme(ngx_http_request_t *r);
-static ngx_int_t ngx_http_spdy_parse_host(ngx_http_request_t *r);
-static ngx_int_t ngx_http_spdy_parse_path(ngx_http_request_t *r);
-static ngx_int_t ngx_http_spdy_parse_version(ngx_http_request_t *r);
-
-static ngx_int_t ngx_http_spdy_construct_request_line(ngx_http_request_t *r);
-static void ngx_http_spdy_run_request(ngx_http_request_t *r);
-static ngx_int_t ngx_http_spdy_init_request_body(ngx_http_request_t *r);
-
-static ngx_int_t ngx_http_spdy_terminate_stream(ngx_http_spdy_connection_t *sc,
-    ngx_http_spdy_stream_t *stream, ngx_uint_t status);
-
-static void ngx_http_spdy_close_stream_handler(ngx_event_t *ev);
-
-static void ngx_http_spdy_handle_connection_handler(ngx_event_t *rev);
-static void ngx_http_spdy_keepalive_handler(ngx_event_t *rev);
-static void ngx_http_spdy_finalize_connection(ngx_http_spdy_connection_t *sc,
-    ngx_int_t rc);
-
-static ngx_int_t ngx_http_spdy_adjust_windows(ngx_http_spdy_connection_t *sc,
-    ssize_t delta);
-
-static void ngx_http_spdy_pool_cleanup(void *data);
-
-static void *ngx_http_spdy_zalloc(void *opaque, u_int items, u_int size);
-static void ngx_http_spdy_zfree(void *opaque, void *address);
-
-
-static const u_char ngx_http_spdy_dict[] = {
-    0x00, 0x00, 0x00, 0x07, 0x6f, 0x70, 0x74, 0x69,   /* - - - - o p t i */
-    0x6f, 0x6e, 0x73, 0x00, 0x00, 0x00, 0x04, 0x68,   /* o n s - - - - h */
-    0x65, 0x61, 0x64, 0x00, 0x00, 0x00, 0x04, 0x70,   /* e a d - - - - p */
-    0x6f, 0x73, 0x74, 0x00, 0x00, 0x00, 0x03, 0x70,   /* o s t - - - - p */
-    0x75, 0x74, 0x00, 0x00, 0x00, 0x06, 0x64, 0x65,   /* u t - - - - d e */
-    0x6c, 0x65, 0x74, 0x65, 0x00, 0x00, 0x00, 0x05,   /* l e t e - - - - */
-    0x74, 0x72, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,   /* t r a c e - - - */
-    0x06, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x00,   /* - a c c e p t - */
-    0x00, 0x00, 0x0e, 0x61, 0x63, 0x63, 0x65, 0x70,   /* - - - a c c e p */
-    0x74, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65,   /* t - c h a r s e */
-    0x74, 0x00, 0x00, 0x00, 0x0f, 0x61, 0x63, 0x63,   /* t - - - - a c c */
-    0x65, 0x70, 0x74, 0x2d, 0x65, 0x6e, 0x63, 0x6f,   /* e p t - e n c o */
-    0x64, 0x69, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x0f,   /* d i n g - - - - */
-    0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x6c,   /* a c c e p t - l */
-    0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x00,   /* a n g u a g e - */
-    0x00, 0x00, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x70,   /* - - - a c c e p */
-    0x74, 0x2d, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73,   /* t - r a n g e s */
-    0x00, 0x00, 0x00, 0x03, 0x61, 0x67, 0x65, 0x00,   /* - - - - a g e - */
-    0x00, 0x00, 0x05, 0x61, 0x6c, 0x6c, 0x6f, 0x77,   /* - - - a l l o w */
-    0x00, 0x00, 0x00, 0x0d, 0x61, 0x75, 0x74, 0x68,   /* - - - - a u t h */
-    0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f,   /* o r i z a t i o */
-    0x6e, 0x00, 0x00, 0x00, 0x0d, 0x63, 0x61, 0x63,   /* n - - - - c a c */
-    0x68, 0x65, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72,   /* h e - c o n t r */
-    0x6f, 0x6c, 0x00, 0x00, 0x00, 0x0a, 0x63, 0x6f,   /* o l - - - - c o */
-    0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,   /* n n e c t i o n */
-    0x00, 0x00, 0x00, 0x0c, 0x63, 0x6f, 0x6e, 0x74,   /* - - - - c o n t */
-    0x65, 0x6e, 0x74, 0x2d, 0x62, 0x61, 0x73, 0x65,   /* e n t - b a s e */
-    0x00, 0x00, 0x00, 0x10, 0x63, 0x6f, 0x6e, 0x74,   /* - - - - c o n t */
-    0x65, 0x6e, 0x74, 0x2d, 0x65, 0x6e, 0x63, 0x6f,   /* e n t - e n c o */
-    0x64, 0x69, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x10,   /* d i n g - - - - */
-    0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d,   /* c o n t e n t - */
-    0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65,   /* l a n g u a g e */
-    0x00, 0x00, 0x00, 0x0e, 0x63, 0x6f, 0x6e, 0x74,   /* - - - - c o n t */
-    0x65, 0x6e, 0x74, 0x2d, 0x6c, 0x65, 0x6e, 0x67,   /* e n t - l e n g */
-    0x74, 0x68, 0x00, 0x00, 0x00, 0x10, 0x63, 0x6f,   /* t h - - - - c o */
-    0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x6c, 0x6f,   /* n t e n t - l o */
-    0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00,   /* c a t i o n - - */
-    0x00, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,   /* - - c o n t e n */
-    0x74, 0x2d, 0x6d, 0x64, 0x35, 0x00, 0x00, 0x00,   /* t - m d 5 - - - */
-    0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,   /* - c o n t e n t */
-    0x2d, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x00, 0x00,   /* - r a n g e - - */
-    0x00, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,   /* - - c o n t e n */
-    0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x00, 0x00,   /* t - t y p e - - */
-    0x00, 0x04, 0x64, 0x61, 0x74, 0x65, 0x00, 0x00,   /* - - d a t e - - */
-    0x00, 0x04, 0x65, 0x74, 0x61, 0x67, 0x00, 0x00,   /* - - e t a g - - */
-    0x00, 0x06, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74,   /* - - e x p e c t */
-    0x00, 0x00, 0x00, 0x07, 0x65, 0x78, 0x70, 0x69,   /* - - - - e x p i */
-    0x72, 0x65, 0x73, 0x00, 0x00, 0x00, 0x04, 0x66,   /* r e s - - - - f */
-    0x72, 0x6f, 0x6d, 0x00, 0x00, 0x00, 0x04, 0x68,   /* r o m - - - - h */
-    0x6f, 0x73, 0x74, 0x00, 0x00, 0x00, 0x08, 0x69,   /* o s t - - - - i */
-    0x66, 0x2d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x00,   /* f - m a t c h - */
-    0x00, 0x00, 0x11, 0x69, 0x66, 0x2d, 0x6d, 0x6f,   /* - - - i f - m o */
-    0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2d, 0x73,   /* d i f i e d - s */
-    0x69, 0x6e, 0x63, 0x65, 0x00, 0x00, 0x00, 0x0d,   /* i n c e - - - - */
-    0x69, 0x66, 0x2d, 0x6e, 0x6f, 0x6e, 0x65, 0x2d,   /* i f - n o n e - */
-    0x6d, 0x61, 0x74, 0x63, 0x68, 0x00, 0x00, 0x00,   /* m a t c h - - - */
-    0x08, 0x69, 0x66, 0x2d, 0x72, 0x61, 0x6e, 0x67,   /* - i f - r a n g */
-    0x65, 0x00, 0x00, 0x00, 0x13, 0x69, 0x66, 0x2d,   /* e - - - - i f - */
-    0x75, 0x6e, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69,   /* u n m o d i f i */
-    0x65, 0x64, 0x2d, 0x73, 0x69, 0x6e, 0x63, 0x65,   /* e d - s i n c e */
-    0x00, 0x00, 0x00, 0x0d, 0x6c, 0x61, 0x73, 0x74,   /* - - - - l a s t */
-    0x2d, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65,   /* - m o d i f i e */
-    0x64, 0x00, 0x00, 0x00, 0x08, 0x6c, 0x6f, 0x63,   /* d - - - - l o c */
-    0x61, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00,   /* a t i o n - - - */
-    0x0c, 0x6d, 0x61, 0x78, 0x2d, 0x66, 0x6f, 0x72,   /* - m a x - f o r */
-    0x77, 0x61, 0x72, 0x64, 0x73, 0x00, 0x00, 0x00,   /* w a r d s - - - */
-    0x06, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x00,   /* - p r a g m a - */
-    0x00, 0x00, 0x12, 0x70, 0x72, 0x6f, 0x78, 0x79,   /* - - - p r o x y */
-    0x2d, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74,   /* - a u t h e n t */
-    0x69, 0x63, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00,   /* i c a t e - - - */
-    0x13, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2d, 0x61,   /* - p r o x y - a */
-    0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61,   /* u t h o r i z a */
-    0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x05,   /* t i o n - - - - */
-    0x72, 0x61, 0x6e, 0x67, 0x65, 0x00, 0x00, 0x00,   /* r a n g e - - - */
-    0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x72,   /* - r e f e r e r */
-    0x00, 0x00, 0x00, 0x0b, 0x72, 0x65, 0x74, 0x72,   /* - - - - r e t r */
-    0x79, 0x2d, 0x61, 0x66, 0x74, 0x65, 0x72, 0x00,   /* y - a f t e r - */
-    0x00, 0x00, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65,   /* - - - s e r v e */
-    0x72, 0x00, 0x00, 0x00, 0x02, 0x74, 0x65, 0x00,   /* r - - - - t e - */
-    0x00, 0x00, 0x07, 0x74, 0x72, 0x61, 0x69, 0x6c,   /* - - - t r a i l */
-    0x65, 0x72, 0x00, 0x00, 0x00, 0x11, 0x74, 0x72,   /* e r - - - - t r */
-    0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2d, 0x65,   /* a n s f e r - e */
-    0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x00,   /* n c o d i n g - */
-    0x00, 0x00, 0x07, 0x75, 0x70, 0x67, 0x72, 0x61,   /* - - - u p g r a */
-    0x64, 0x65, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x73,   /* d e - - - - u s */
-    0x65, 0x72, 0x2d, 0x61, 0x67, 0x65, 0x6e, 0x74,   /* e r - a g e n t */
-    0x00, 0x00, 0x00, 0x04, 0x76, 0x61, 0x72, 0x79,   /* - - - - v a r y */
-    0x00, 0x00, 0x00, 0x03, 0x76, 0x69, 0x61, 0x00,   /* - - - - v i a - */
-    0x00, 0x00, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69,   /* - - - w a r n i */
-    0x6e, 0x67, 0x00, 0x00, 0x00, 0x10, 0x77, 0x77,   /* n g - - - - w w */
-    0x77, 0x2d, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e,   /* w - a u t h e n */
-    0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x00, 0x00,   /* t i c a t e - - */
-    0x00, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64,   /* - - m e t h o d */
-    0x00, 0x00, 0x00, 0x03, 0x67, 0x65, 0x74, 0x00,   /* - - - - g e t - */
-    0x00, 0x00, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75,   /* - - - s t a t u */
-    0x73, 0x00, 0x00, 0x00, 0x06, 0x32, 0x30, 0x30,   /* s - - - - 2 0 0 */
-    0x20, 0x4f, 0x4b, 0x00, 0x00, 0x00, 0x07, 0x76,   /* - O K - - - - v */
-    0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x00, 0x00,   /* e r s i o n - - */
-    0x00, 0x08, 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31,   /* - - H T T P - 1 */
-    0x2e, 0x31, 0x00, 0x00, 0x00, 0x03, 0x75, 0x72,   /* - 1 - - - - u r */
-    0x6c, 0x00, 0x00, 0x00, 0x06, 0x70, 0x75, 0x62,   /* l - - - - p u b */
-    0x6c, 0x69, 0x63, 0x00, 0x00, 0x00, 0x0a, 0x73,   /* l i c - - - - s */
-    0x65, 0x74, 0x2d, 0x63, 0x6f, 0x6f, 0x6b, 0x69,   /* e t - c o o k i */
-    0x65, 0x00, 0x00, 0x00, 0x0a, 0x6b, 0x65, 0x65,   /* e - - - - k e e */
-    0x70, 0x2d, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x00,   /* p - a l i v e - */
-    0x00, 0x00, 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69,   /* - - - o r i g i */
-    0x6e, 0x31, 0x30, 0x30, 0x31, 0x30, 0x31, 0x32,   /* n 1 0 0 1 0 1 2 */
-    0x30, 0x31, 0x32, 0x30, 0x32, 0x32, 0x30, 0x35,   /* 0 1 2 0 2 2 0 5 */
-    0x32, 0x30, 0x36, 0x33, 0x30, 0x30, 0x33, 0x30,   /* 2 0 6 3 0 0 3 0 */
-    0x32, 0x33, 0x30, 0x33, 0x33, 0x30, 0x34, 0x33,   /* 2 3 0 3 3 0 4 3 */
-    0x30, 0x35, 0x33, 0x30, 0x36, 0x33, 0x30, 0x37,   /* 0 5 3 0 6 3 0 7 */
-    0x34, 0x30, 0x32, 0x34, 0x30, 0x35, 0x34, 0x30,   /* 4 0 2 4 0 5 4 0 */
-    0x36, 0x34, 0x30, 0x37, 0x34, 0x30, 0x38, 0x34,   /* 6 4 0 7 4 0 8 4 */
-    0x30, 0x39, 0x34, 0x31, 0x30, 0x34, 0x31, 0x31,   /* 0 9 4 1 0 4 1 1 */
-    0x34, 0x31, 0x32, 0x34, 0x31, 0x33, 0x34, 0x31,   /* 4 1 2 4 1 3 4 1 */
-    0x34, 0x34, 0x31, 0x35, 0x34, 0x31, 0x36, 0x34,   /* 4 4 1 5 4 1 6 4 */
-    0x31, 0x37, 0x35, 0x30, 0x32, 0x35, 0x30, 0x34,   /* 1 7 5 0 2 5 0 4 */
-    0x35, 0x30, 0x35, 0x32, 0x30, 0x33, 0x20, 0x4e,   /* 5 0 5 2 0 3 - N */
-    0x6f, 0x6e, 0x2d, 0x41, 0x75, 0x74, 0x68, 0x6f,   /* o n - A u t h o */
-    0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65,   /* r i t a t i v e */
-    0x20, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61,   /* - I n f o r m a */
-    0x74, 0x69, 0x6f, 0x6e, 0x32, 0x30, 0x34, 0x20,   /* t i o n 2 0 4 - */
-    0x4e, 0x6f, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x65,   /* N o - C o n t e */
-    0x6e, 0x74, 0x33, 0x30, 0x31, 0x20, 0x4d, 0x6f,   /* n t 3 0 1 - M o */
-    0x76, 0x65, 0x64, 0x20, 0x50, 0x65, 0x72, 0x6d,   /* v e d - P e r m */
-    0x61, 0x6e, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x34,   /* a n e n t l y 4 */
-    0x30, 0x30, 0x20, 0x42, 0x61, 0x64, 0x20, 0x52,   /* 0 0 - B a d - R */
-    0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x34, 0x30,   /* e q u e s t 4 0 */
-    0x31, 0x20, 0x55, 0x6e, 0x61, 0x75, 0x74, 0x68,   /* 1 - U n a u t h */
-    0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x34, 0x30,   /* o r i z e d 4 0 */
-    0x33, 0x20, 0x46, 0x6f, 0x72, 0x62, 0x69, 0x64,   /* 3 - F o r b i d */
-    0x64, 0x65, 0x6e, 0x34, 0x30, 0x34, 0x20, 0x4e,   /* d e n 4 0 4 - N */
-    0x6f, 0x74, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64,   /* o t - F o u n d */
-    0x35, 0x30, 0x30, 0x20, 0x49, 0x6e, 0x74, 0x65,   /* 5 0 0 - I n t e */
-    0x72, 0x6e, 0x61, 0x6c, 0x20, 0x53, 0x65, 0x72,   /* r n a l - S e r */
-    0x76, 0x65, 0x72, 0x20, 0x45, 0x72, 0x72, 0x6f,   /* v e r - E r r o */
-    0x72, 0x35, 0x30, 0x31, 0x20, 0x4e, 0x6f, 0x74,   /* r 5 0 1 - N o t */
-    0x20, 0x49, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65,   /* - I m p l e m e */
-    0x6e, 0x74, 0x65, 0x64, 0x35, 0x30, 0x33, 0x20,   /* n t e d 5 0 3 - */
-    0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20,   /* S e r v i c e - */
-    0x55, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61,   /* U n a v a i l a */
-    0x62, 0x6c, 0x65, 0x4a, 0x61, 0x6e, 0x20, 0x46,   /* b l e J a n - F */
-    0x65, 0x62, 0x20, 0x4d, 0x61, 0x72, 0x20, 0x41,   /* e b - M a r - A */
-    0x70, 0x72, 0x20, 0x4d, 0x61, 0x79, 0x20, 0x4a,   /* p r - M a y - J */
-    0x75, 0x6e, 0x20, 0x4a, 0x75, 0x6c, 0x20, 0x41,   /* u n - J u l - A */
-    0x75, 0x67, 0x20, 0x53, 0x65, 0x70, 0x74, 0x20,   /* u g - S e p t - */
-    0x4f, 0x63, 0x74, 0x20, 0x4e, 0x6f, 0x76, 0x20,   /* O c t - N o v - */
-    0x44, 0x65, 0x63, 0x20, 0x30, 0x30, 0x3a, 0x30,   /* D e c - 0 0 - 0 */
-    0x30, 0x3a, 0x30, 0x30, 0x20, 0x4d, 0x6f, 0x6e,   /* 0 - 0 0 - M o n */
-    0x2c, 0x20, 0x54, 0x75, 0x65, 0x2c, 0x20, 0x57,   /* - - T u e - - W */
-    0x65, 0x64, 0x2c, 0x20, 0x54, 0x68, 0x75, 0x2c,   /* e d - - T h u - */
-    0x20, 0x46, 0x72, 0x69, 0x2c, 0x20, 0x53, 0x61,   /* - F r i - - S a */
-    0x74, 0x2c, 0x20, 0x53, 0x75, 0x6e, 0x2c, 0x20,   /* t - - S u n - - */
-    0x47, 0x4d, 0x54, 0x63, 0x68, 0x75, 0x6e, 0x6b,   /* G M T c h u n k */
-    0x65, 0x64, 0x2c, 0x74, 0x65, 0x78, 0x74, 0x2f,   /* e d - t e x t - */
-    0x68, 0x74, 0x6d, 0x6c, 0x2c, 0x69, 0x6d, 0x61,   /* h t m l - i m a */
-    0x67, 0x65, 0x2f, 0x70, 0x6e, 0x67, 0x2c, 0x69,   /* g e - p n g - i */
-    0x6d, 0x61, 0x67, 0x65, 0x2f, 0x6a, 0x70, 0x67,   /* m a g e - j p g */
-    0x2c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x67,   /* - i m a g e - g */
-    0x69, 0x66, 0x2c, 0x61, 0x70, 0x70, 0x6c, 0x69,   /* i f - a p p l i */
-    0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x78,   /* c a t i o n - x */
-    0x6d, 0x6c, 0x2c, 0x61, 0x70, 0x70, 0x6c, 0x69,   /* m l - a p p l i */
-    0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x78,   /* c a t i o n - x */
-    0x68, 0x74, 0x6d, 0x6c, 0x2b, 0x78, 0x6d, 0x6c,   /* h t m l - x m l */
-    0x2c, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x70, 0x6c,   /* - t e x t - p l */
-    0x61, 0x69, 0x6e, 0x2c, 0x74, 0x65, 0x78, 0x74,   /* a i n - t e x t */
-    0x2f, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72,   /* - j a v a s c r */
-    0x69, 0x70, 0x74, 0x2c, 0x70, 0x75, 0x62, 0x6c,   /* i p t - p u b l */
-    0x69, 0x63, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74,   /* i c p r i v a t */
-    0x65, 0x6d, 0x61, 0x78, 0x2d, 0x61, 0x67, 0x65,   /* e m a x - a g e */
-    0x3d, 0x67, 0x7a, 0x69, 0x70, 0x2c, 0x64, 0x65,   /* - g z i p - d e */
-    0x66, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x73, 0x64,   /* f l a t e - s d */
-    0x63, 0x68, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65,   /* c h c h a r s e */
-    0x74, 0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x63,   /* t - u t f - 8 c */
-    0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x69,   /* h a r s e t - i */
-    0x73, 0x6f, 0x2d, 0x38, 0x38, 0x35, 0x39, 0x2d,   /* s o - 8 8 5 9 - */
-    0x31, 0x2c, 0x75, 0x74, 0x66, 0x2d, 0x2c, 0x2a,   /* 1 - u t f - - - */
-    0x2c, 0x65, 0x6e, 0x71, 0x3d, 0x30, 0x2e          /* - e n q - 0 -   */
-};
-
-
-static ngx_http_spdy_request_header_t ngx_http_spdy_request_headers[] = {
-    { 0, 6, "method", ngx_http_spdy_parse_method },
-    { 0, 6, "scheme", ngx_http_spdy_parse_scheme },
-    { 0, 4, "host", ngx_http_spdy_parse_host },
-    { 0, 4, "path", ngx_http_spdy_parse_path },
-    { 0, 7, "version", ngx_http_spdy_parse_version },
-};
-
-#define NGX_SPDY_REQUEST_HEADERS                                              \
-    (sizeof(ngx_http_spdy_request_headers)                                    \
-     / sizeof(ngx_http_spdy_request_header_t))
-
-
-void
-ngx_http_spdy_init(ngx_event_t *rev)
-{
-    int                          rc;
-    ngx_connection_t            *c;
-    ngx_pool_cleanup_t          *cln;
-    ngx_http_connection_t       *hc;
-    ngx_http_spdy_srv_conf_t    *sscf;
-    ngx_http_spdy_main_conf_t   *smcf;
-    ngx_http_spdy_connection_t  *sc;
-
-    c = rev->data;
-    hc = c->data;
-
-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "init spdy request");
-
-    c->log->action = "processing SPDY";
-
-    smcf = ngx_http_get_module_main_conf(hc->conf_ctx, ngx_http_spdy_module);
-
-    if (smcf->recv_buffer == NULL) {
-        smcf->recv_buffer = ngx_palloc(ngx_cycle->pool, smcf->recv_buffer_size);
-        if (smcf->recv_buffer == NULL) {
-            ngx_http_close_connection(c);
-            return;
-        }
-    }
-
-    sc = ngx_pcalloc(c->pool, sizeof(ngx_http_spdy_connection_t));
-    if (sc == NULL) {
-        ngx_http_close_connection(c);
-        return;
-    }
-
-    sc->connection = c;
-    sc->http_connection = hc;
-
-    sc->send_window = NGX_SPDY_CONNECTION_WINDOW;
-    sc->recv_window = NGX_SPDY_CONNECTION_WINDOW;
-
-    sc->init_window = NGX_SPDY_INIT_STREAM_WINDOW;
-
-    sc->handler = hc->proxy_protocol ? ngx_http_spdy_proxy_protocol
-                                     : ngx_http_spdy_state_head;
-
-    sc->zstream_in.zalloc = ngx_http_spdy_zalloc;
-    sc->zstream_in.zfree = ngx_http_spdy_zfree;
-    sc->zstream_in.opaque = sc;
-
-    rc = inflateInit(&sc->zstream_in);
-    if (rc != Z_OK) {
-        ngx_log_error(NGX_LOG_ALERT, c->log, 0,
-                      "inflateInit() failed: %d", rc);
-        ngx_http_close_connection(c);
-        return;
-    }
-
-    sc->zstream_out.zalloc = ngx_http_spdy_zalloc;
-    sc->zstream_out.zfree = ngx_http_spdy_zfree;
-    sc->zstream_out.opaque = sc;
-
-    sscf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_spdy_module);
-
-    rc = deflateInit2(&sc->zstream_out, (int) sscf->headers_comp,
-                      Z_DEFLATED, 11, 4, Z_DEFAULT_STRATEGY);
-
-    if (rc != Z_OK) {
-        ngx_log_error(NGX_LOG_ALERT, c->log, 0,
-                      "deflateInit2() failed: %d", rc);
-        ngx_http_close_connection(c);
-        return;
-    }
-
-    rc = deflateSetDictionary(&sc->zstream_out, ngx_http_spdy_dict,
-                              sizeof(ngx_http_spdy_dict));
-    if (rc != Z_OK) {
-        ngx_log_error(NGX_LOG_ALERT, c->log, 0,
-                      "deflateSetDictionary() failed: %d", rc);
-        ngx_http_close_connection(c);
-        return;
-    }
-
-    sc->pool = ngx_create_pool(sscf->pool_size, sc->connection->log);
-    if (sc->pool == NULL) {
-        ngx_http_close_connection(c);
-        return;
-    }
-
-    cln = ngx_pool_cleanup_add(c->pool, sizeof(ngx_pool_cleanup_file_t));
-    if (cln == NULL) {
-        ngx_http_close_connection(c);
-        return;
-    }
-
-    cln->handler = ngx_http_spdy_pool_cleanup;
-    cln->data = sc;
-
-    sc->streams_index = ngx_pcalloc(sc->pool,
-                                    ngx_http_spdy_streams_index_size(sscf)
-                                    * sizeof(ngx_http_spdy_stream_t *));
-    if (sc->streams_index == NULL) {
-        ngx_http_close_connection(c);
-        return;
-    }
-
-    if (ngx_http_spdy_send_settings(sc) == NGX_ERROR) {
-        ngx_http_close_connection(c);
-        return;
-    }
-
-    if (ngx_http_spdy_send_window_update(sc, 0, NGX_SPDY_MAX_WINDOW
-                                                - sc->recv_window)
-        == NGX_ERROR)
-    {
-        ngx_http_close_connection(c);
-        return;
-    }
-
-    sc->recv_window = NGX_SPDY_MAX_WINDOW;
-
-    ngx_queue_init(&sc->waiting);
-    ngx_queue_init(&sc->posted);
-
-    c->data = sc;
-
-    rev->handler = ngx_http_spdy_read_handler;
-    c->write->handler = ngx_http_spdy_write_handler;
-
-    ngx_http_spdy_read_handler(rev);
-}
-
-
-static void
-ngx_http_spdy_read_handler(ngx_event_t *rev)
-{
-    u_char                      *p, *end;
-    size_t                       available;
-    ssize_t                      n;
-    ngx_connection_t            *c;
-    ngx_http_spdy_main_conf_t   *smcf;
-    ngx_http_spdy_connection_t  *sc;
-
-    c = rev->data;
-    sc = c->data;
-
-    if (rev->timedout) {
-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");
-        ngx_http_spdy_finalize_connection(sc, NGX_HTTP_REQUEST_TIME_OUT);
-        return;
-    }
-
-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "spdy read handler");
-
-    sc->blocked = 1;
-
-    smcf = ngx_http_get_module_main_conf(sc->http_connection->conf_ctx,
-                                         ngx_http_spdy_module);
-
-    available = smcf->recv_buffer_size - 2 * NGX_SPDY_STATE_BUFFER_SIZE;
-
-    do {
-        p = smcf->recv_buffer;
-
-        ngx_memcpy(p, sc->buffer, NGX_SPDY_STATE_BUFFER_SIZE);
-        end = p + sc->buffer_used;
-
-        n = c->recv(c, end, available);
-
-        if (n == NGX_AGAIN) {
-            break;
-        }
-
-        if (n == 0 && (sc->incomplete || sc->processing)) {
-            ngx_log_error(NGX_LOG_INFO, c->log, 0,
-                          "client prematurely closed connection");
-        }
-
-        if (n == 0 || n == NGX_ERROR) {
-            ngx_http_spdy_finalize_connection(sc,
-                                              NGX_HTTP_CLIENT_CLOSED_REQUEST);
-            return;
-        }
-
-        end += n;
-
-        sc->buffer_used = 0;
-        sc->incomplete = 0;
-
-        do {
-            p = sc->handler(sc, p, end);
-
-            if (p == NULL) {
-                return;
-            }
-
-        } while (p != end);
-
-    } while (rev->ready);
-
-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {
-        ngx_http_spdy_finalize_connection(sc, NGX_HTTP_INTERNAL_SERVER_ERROR);
-        return;
-    }
-
-    if (sc->last_out && ngx_http_spdy_send_output_queue(sc) == NGX_ERROR) {
-        ngx_http_spdy_finalize_connection(sc, NGX_HTTP_CLIENT_CLOSED_REQUEST);
-        return;
-    }
-
-    sc->blocked = 0;
-
-    if (sc->processing) {
-        if (rev->timer_set) {
-            ngx_del_timer(rev);
-        }
-        return;
-    }
-
-    ngx_http_spdy_handle_connection(sc);
-}
-
-
-static void
-ngx_http_spdy_write_handler(ngx_event_t *wev)
-{
-    ngx_int_t                    rc;
-    ngx_queue_t                 *q;
-    ngx_connection_t            *c;
-    ngx_http_spdy_stream_t      *stream;
-    ngx_http_spdy_connection_t  *sc;
-
-    c = wev->data;
-    sc = c->data;
-
-    if (wev->timedout) {
-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
-                       "spdy write event timed out");
-        ngx_http_spdy_finalize_connection(sc, NGX_HTTP_CLIENT_CLOSED_REQUEST);
-        return;
-    }
-
-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "spdy write handler");
-
-    sc->blocked = 1;
-
-    rc = ngx_http_spdy_send_output_queue(sc);
-
-    if (rc == NGX_ERROR) {
-        ngx_http_spdy_finalize_connection(sc, NGX_HTTP_CLIENT_CLOSED_REQUEST);
-        return;
-    }
-
-    while (!ngx_queue_empty(&sc->posted)) {
-        q = ngx_queue_head(&sc->posted);
-
-        ngx_queue_remove(q);
-
-        stream = ngx_queue_data(q, ngx_http_spdy_stream_t, queue);
-
-        stream->handled = 0;
-
-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
-                       "run spdy stream %ui", stream->id);
-
-        wev = stream->request->connection->write;
-        wev->handler(wev);
-    }
-
-    sc->blocked = 0;
-
-    if (rc == NGX_AGAIN) {
-        return;
-    }
-
-    ngx_http_spdy_handle_connection(sc);
-}
-
-
-ngx_int_t
-ngx_http_spdy_send_output_queue(ngx_http_spdy_connection_t *sc)
-{
-    int                         tcp_nodelay;
-    ngx_chain_t                *cl;
-    ngx_event_t                *wev;
-    ngx_connection_t           *c;
-    ngx_http_core_loc_conf_t   *clcf;
-    ngx_http_spdy_out_frame_t  *out, *frame, *fn;
-
-    c = sc->connection;
-
-    if (c->error) {
-        return NGX_ERROR;
-    }
-
-    wev = c->write;
-
-    if (!wev->ready) {
-        return NGX_OK;
-    }
-
-    cl = NULL;
-    out = NULL;
-
-    for (frame = sc->last_out; frame; frame = fn) {
-        frame->last->next = cl;
-        cl = frame->first;
-
-        fn = frame->next;
-        frame->next = out;
-        out = frame;
-
-        ngx_log_debug5(NGX_LOG_DEBUG_HTTP, c->log, 0,
-                       "spdy frame out: %p sid:%ui prio:%ui bl:%d len:%uz",
-                       out, out->stream ? out->stream->id : 0, out->priority,
-                       out->blocked, out->length);
-    }
-
-    cl = c->send_chain(c, cl, 0);
-
-    if (cl == NGX_CHAIN_ERROR) {
-        goto error;
-    }
-
-    clcf = ngx_http_get_module_loc_conf(sc->http_connection->conf_ctx,
-                                        ngx_http_core_module);
-
-    if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) {
-        goto error;
-    }
-
-    if (c->tcp_nopush == NGX_TCP_NOPUSH_SET) {
-        if (ngx_tcp_push(c->fd) == -1) {
-            ngx_connection_error(c, ngx_socket_errno, ngx_tcp_push_n " failed");
-            goto error;
-        }
-
-        c->tcp_nopush = NGX_TCP_NOPUSH_UNSET;
-        tcp_nodelay = ngx_tcp_nodelay_and_tcp_nopush ? 1 : 0;
-
-    } else {
-        tcp_nodelay = 1;
-    }
-
-    if (tcp_nodelay
-        && clcf->tcp_nodelay
-        && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET)
-    {
-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay");
-
-        if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,
-                       (const void *) &tcp_nodelay, sizeof(int))
-            == -1)
-        {
-#if (NGX_SOLARIS)
-            /* Solaris returns EINVAL if a socket has been shut down */
-            c->log_error = NGX_ERROR_IGNORE_EINVAL;
-#endif
-
-            ngx_connection_error(c, ngx_socket_errno,
-                                 "setsockopt(TCP_NODELAY) failed");
-
-            c->log_error = NGX_ERROR_INFO;
-            goto error;
-        }
-
-        c->tcp_nodelay = NGX_TCP_NODELAY_SET;
-    }
-
-    if (cl) {
-        ngx_add_timer(wev, clcf->send_timeout);
-
-    } else {
-        if (wev->timer_set) {
-            ngx_del_timer(wev);
-        }
-    }
-
-    for ( /* void */ ; out; out = fn) {
-        fn = out->next;
-
-        if (out->handler(sc, out) != NGX_OK) {
-            out->blocked = 1;
-            out->priority = NGX_SPDY_HIGHEST_PRIORITY;
-            break;
-        }
-
-        ngx_log_debug4(NGX_LOG_DEBUG_HTTP, c->log, 0,
-                       "spdy frame sent: %p sid:%ui bl:%d len:%uz",
-                       out, out->stream ? out->stream->id : 0,
-                       out->blocked, out->length);
-    }
-
-    frame = NULL;
-
-    for ( /* void */ ; out; out = fn) {
-        fn = out->next;
-        out->next = frame;
-        frame = out;
-    }
-
-    sc->last_out = frame;
-
-    return NGX_OK;
-
-error:
-
-    c->error = 1;
-
-    if (!sc->blocked) {
-        ngx_post_event(wev, &ngx_posted_events);
-    }
-
-    return NGX_ERROR;
-}
-
-
-static void
-ngx_http_spdy_handle_connection(ngx_http_spdy_connection_t *sc)
-{
-    ngx_connection_t          *c;
-    ngx_http_spdy_srv_conf_t  *sscf;
-
-    if (sc->last_out || sc->processing) {
-        return;
-    }
-
-    c = sc->connection;
-
-    if (c->error) {
-        ngx_http_close_connection(c);
-        return;
-    }
-
-    if (c->buffered) {
-        return;
-    }
-
-    sscf = ngx_http_get_module_srv_conf(sc->http_connection->conf_ctx,
-                                        ngx_http_spdy_module);
-    if (sc->incomplete) {
-        ngx_add_timer(c->read, sscf->recv_timeout);
-        return;
-    }
-
-    if (ngx_terminate || ngx_exiting) {
-        ngx_http_close_connection(c);
-        return;
-    }
-
-    ngx_destroy_pool(sc->pool);
-
-    sc->pool = NULL;
-    sc->free_ctl_frames = NULL;
-    sc->free_fake_connections = NULL;
-
-#if (NGX_HTTP_SSL)
-    if (c->ssl) {
-        ngx_ssl_free_buffer(c);
-    }
-#endif
-
-    c->destroyed = 1;
-    c->idle = 1;
-    ngx_reusable_connection(c, 1);
-
-    c->write->handler = ngx_http_empty_handler;
-    c->read->handler = ngx_http_spdy_keepalive_handler;
-
-    if (c->write->timer_set) {
-        ngx_del_timer(c->write);
-    }
-
-    ngx_add_timer(c->read, sscf->keepalive_timeout);
-}
-
-
-static u_char *
-ngx_http_spdy_proxy_protocol(ngx_http_spdy_connection_t *sc, u_char *pos,
-    u_char *end)
-{
-    ngx_log_t  *log;
-
-    log = sc->connection->log;
-    log->action = "reading PROXY protocol";
-
-    pos = ngx_proxy_protocol_parse(sc->connection, pos, end);
-
-    log->action = "processing SPDY";
-
-    if (pos == NULL) {
-        return ngx_http_spdy_state_protocol_error(sc);
-    }
-
-    return ngx_http_spdy_state_complete(sc, pos, end);
-}
-
-
-static u_char *
-ngx_http_spdy_state_head(ngx_http_spdy_connection_t *sc, u_char *pos,
-    u_char *end)
-{
-    uint32_t    head, flen;
-    ngx_uint_t  type;
-
-    if (end - pos < NGX_SPDY_FRAME_HEADER_SIZE) {
-        return ngx_http_spdy_state_save(sc, pos, end,
-                                        ngx_http_spdy_state_head);
-    }
-
-    head = ngx_spdy_frame_parse_uint32(pos);
-
-    pos += sizeof(uint32_t);
-
-    flen = ngx_spdy_frame_parse_uint32(pos);
-
-    sc->flags = ngx_spdy_frame_flags(flen);
-    sc->length = ngx_spdy_frame_length(flen);
-
-    pos += sizeof(uint32_t);
-
-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
-                   "process spdy frame head:%08XD f:%Xd l:%uz",
-                   head, sc->flags, sc->length);
-
-    if (ngx_spdy_ctl_frame_check(head)) {
-        type = ngx_spdy_ctl_frame_type(head);
-
-        switch (type) {
-
-        case NGX_SPDY_SYN_STREAM:
-            return ngx_http_spdy_state_syn_stream(sc, pos, end);
-
-        case NGX_SPDY_SYN_REPLY:
-            ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
-                          "client sent unexpected SYN_REPLY frame");
-            return ngx_http_spdy_state_protocol_error(sc);
-
-        case NGX_SPDY_RST_STREAM:
-            return ngx_http_spdy_state_rst_stream(sc, pos, end);
-
-        case NGX_SPDY_SETTINGS:
-            return ngx_http_spdy_state_settings(sc, pos, end);
-
-        case NGX_SPDY_PING:
-            return ngx_http_spdy_state_ping(sc, pos, end);
-
-        case NGX_SPDY_GOAWAY:
-            return ngx_http_spdy_state_skip(sc, pos, end); /* TODO */
-
-        case NGX_SPDY_HEADERS:
-            ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
-                          "client sent unexpected HEADERS frame");
-            return ngx_http_spdy_state_protocol_error(sc);
-
-        case NGX_SPDY_WINDOW_UPDATE:
-            return ngx_http_spdy_state_window_update(sc, pos, end);
-
-        default:
-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
-                           "spdy control frame with unknown type %ui", type);
-            return ngx_http_spdy_state_skip(sc, pos, end);
-        }
-    }
-
-    if (ngx_spdy_data_frame_check(head)) {
-        sc->stream = ngx_http_spdy_get_stream_by_id(sc, head);
-        return ngx_http_spdy_state_data(sc, pos, end);
-    }
-
-    ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
-                  "client sent invalid frame");
-
-    return ngx_http_spdy_state_protocol_error(sc);
-}
-
-
-static u_char *
-ngx_http_spdy_state_syn_stream(ngx_http_spdy_connection_t *sc, u_char *pos,
-    u_char *end)
-{
-    ngx_uint_t                 sid, prio;
-    ngx_http_spdy_stream_t    *stream;
-    ngx_http_spdy_srv_conf_t  *sscf;
-
-    if (end - pos < NGX_SPDY_SYN_STREAM_SIZE) {
-        return ngx_http_spdy_state_save(sc, pos, end,
-                                        ngx_http_spdy_state_syn_stream);
-    }
-
-    if (sc->length <= NGX_SPDY_SYN_STREAM_SIZE) {
-        ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
-                      "client sent SYN_STREAM frame with incorrect length %uz",
-                      sc->length);
-
-        return ngx_http_spdy_state_protocol_error(sc);
-    }
-
-    sc->length -= NGX_SPDY_SYN_STREAM_SIZE;
-
-    sid = ngx_spdy_frame_parse_sid(pos);
-    prio = pos[8] >> 5;
-
-    pos += NGX_SPDY_SYN_STREAM_SIZE;
-
-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
-                   "spdy SYN_STREAM frame sid:%ui prio:%ui", sid, prio);
-
-    if (sid % 2 == 0 || sid <= sc->last_sid) {
-        ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
-                      "client sent SYN_STREAM frame "
-                      "with invalid Stream-ID %ui", sid);
-
-        stream = ngx_http_spdy_get_stream_by_id(sc, sid);
-
-        if (stream) {
-            if (ngx_http_spdy_terminate_stream(sc, stream,
-                                               NGX_SPDY_PROTOCOL_ERROR)
-                != NGX_OK)
-            {
-                return ngx_http_spdy_state_internal_error(sc);
-            }
-        }
-
-        return ngx_http_spdy_state_protocol_error(sc);
-    }
-
-    sc->last_sid = sid;
-
-    sscf = ngx_http_get_module_srv_conf(sc->http_connection->conf_ctx,
-                                        ngx_http_spdy_module);
-
-    if (sc->processing >= sscf->concurrent_streams) {
-
-        ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
-                      "concurrent streams exceeded %ui", sc->processing);
-
-        if (ngx_http_spdy_send_rst_stream(sc, sid, NGX_SPDY_REFUSED_STREAM,
-                                          prio)
-            != NGX_OK)
-        {
-            return ngx_http_spdy_state_internal_error(sc);
-        }
-
-        return ngx_http_spdy_state_headers_skip(sc, pos, end);
-    }
-
-    stream = ngx_http_spdy_create_stream(sc, sid, prio);
-    if (stream == NULL) {
-        return ngx_http_spdy_state_internal_error(sc);
-    }
-
-    stream->in_closed = (sc->flags & NGX_SPDY_FLAG_FIN) ? 1 : 0;
-
-    stream->request->request_length = NGX_SPDY_FRAME_HEADER_SIZE
-                                      + NGX_SPDY_SYN_STREAM_SIZE
-                                      + sc->length;
-
-    sc->stream = stream;
-
-    return ngx_http_spdy_state_headers(sc, pos, end);
-}
-
-
-static u_char *
-ngx_http_spdy_state_headers(ngx_http_spdy_connection_t *sc, u_char *pos,
-    u_char *end)
-{
-    int                  z;
-    size_t               size;
-    ngx_buf_t           *buf;
-    ngx_int_t            rc;
-    ngx_http_request_t  *r;
-
-    size = end - pos;
-
-    if (size == 0) {
-        return ngx_http_spdy_state_save(sc, pos, end,
-                                        ngx_http_spdy_state_headers);
-    }
-
-    if (size > sc->length) {
-        size = sc->length;
-    }
-
-    r = sc->stream->request;
-
-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-                   "process spdy header block %uz of %uz", size, sc->length);
-
-    buf = r->header_in;
-
-    sc->zstream_in.next_in = pos;
-    sc->zstream_in.avail_in = size;
-    sc->zstream_in.next_out = buf->last;
-
-    /* one byte is reserved for null-termination of the last header value */
-    sc->zstream_in.avail_out = buf->end - buf->last - 1;
-
-    z = inflate(&sc->zstream_in, Z_NO_FLUSH);
-
-    if (z == Z_NEED_DICT) {
-        z = inflateSetDictionary(&sc->zstream_in, ngx_http_spdy_dict,
-                                 sizeof(ngx_http_spdy_dict));
-
-        if (z != Z_OK) {
-            if (z == Z_DATA_ERROR) {
-                ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
-                              "client sent SYN_STREAM frame with header "
-                              "block encoded using wrong dictionary: %ul",
-                              (u_long) sc->zstream_in.adler);
-
-                return ngx_http_spdy_state_protocol_error(sc);
-            }
-
-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
-                          "inflateSetDictionary() failed: %d", z);
-
-            return ngx_http_spdy_state_internal_error(sc);
-        }
-
-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-                       "spdy inflateSetDictionary(): %d", z);
-
-        z = sc->zstream_in.avail_in ? inflate(&sc->zstream_in, Z_NO_FLUSH)
-                                    : Z_OK;
-    }
-
-    ngx_log_debug5(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-                   "spdy inflate out: ni:%p no:%p ai:%ud ao:%ud rc:%d",
-                   sc->zstream_in.next_in, sc->zstream_in.next_out,
-                   sc->zstream_in.avail_in, sc->zstream_in.avail_out,
-                   z);
-
-    if (z != Z_OK) {
-        return ngx_http_spdy_state_inflate_error(sc, z);
-    }
-
-    sc->length -= sc->zstream_in.next_in - pos;
-    pos = sc->zstream_in.next_in;
-
-    buf->last = sc->zstream_in.next_out;
-
-    if (r->headers_in.headers.part.elts == NULL) {
-
-        if (buf->last - buf->pos < NGX_SPDY_NV_NUM_SIZE) {
-
-            if (sc->length == 0) {
-                ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-                               "premature end of spdy header block");
-
-                return ngx_http_spdy_state_headers_error(sc, pos, end);
-            }
-
-            return ngx_http_spdy_state_save(sc, pos, end,
-                                            ngx_http_spdy_state_headers);
-        }
-
-        sc->entries = ngx_spdy_frame_parse_uint32(buf->pos);
-
-        buf->pos += NGX_SPDY_NV_NUM_SIZE;
-
-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-                       "spdy header block has %ui entries",
-                       sc->entries);
-
-        if (ngx_list_init(&r->headers_in.headers, r->pool, 20,
-                          sizeof(ngx_table_elt_t))
-            != NGX_OK)
-        {
-            ngx_http_spdy_close_stream(sc->stream,
-                                       NGX_HTTP_INTERNAL_SERVER_ERROR);
-            return ngx_http_spdy_state_headers_skip(sc, pos, end);
-        }
-
-        if (ngx_array_init(&r->headers_in.cookies, r->pool, 2,
-                           sizeof(ngx_table_elt_t *))
-            != NGX_OK)
-        {
-            ngx_http_spdy_close_stream(sc->stream,
-                                       NGX_HTTP_INTERNAL_SERVER_ERROR);
-            return ngx_http_spdy_state_headers_skip(sc, pos, end);
-        }
-    }
-
-    while (sc->entries) {
-
-        rc = ngx_http_spdy_parse_header(r);
-
-        switch (rc) {
-
-        case NGX_DONE:
-            sc->entries--;
-
-        case NGX_OK:
-            break;
-
-        case NGX_AGAIN:
-
-            if (sc->zstream_in.avail_in) {
-
-                rc = ngx_http_spdy_alloc_large_header_buffer(r);
-
-                if (rc == NGX_DECLINED) {
-                    ngx_http_finalize_request(r,
-                                            NGX_HTTP_REQUEST_HEADER_TOO_LARGE);
-                    return ngx_http_spdy_state_headers_skip(sc, pos, end);
-                }
-
-                if (rc != NGX_OK) {
-                    ngx_http_spdy_close_stream(sc->stream,
-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);
-                    return ngx_http_spdy_state_headers_skip(sc, pos, end);
-                }
-
-                /* null-terminate the last processed header name or value */
-                *buf->pos = '\0';
-
-                buf = r->header_in;
-
-                sc->zstream_in.next_out = buf->last;
-
-                /* one byte is reserved for null-termination */
-                sc->zstream_in.avail_out = buf->end - buf->last - 1;
-
-                z = inflate(&sc->zstream_in, Z_NO_FLUSH);
-
-                ngx_log_debug5(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-                           "spdy inflate out: ni:%p no:%p ai:%ud ao:%ud rc:%d",
-                           sc->zstream_in.next_in, sc->zstream_in.next_out,
-                           sc->zstream_in.avail_in, sc->zstream_in.avail_out,
-                           z);
-
-                if (z != Z_OK) {
-                    return ngx_http_spdy_state_inflate_error(sc, z);
-                }
-
-                sc->length -= sc->zstream_in.next_in - pos;
-                pos = sc->zstream_in.next_in;
-
-                buf->last = sc->zstream_in.next_out;
-
-                continue;
-            }
-
-            if (sc->length == 0) {
-                ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-                               "premature end of spdy header block");
-
-                return ngx_http_spdy_state_headers_error(sc, pos, end);
-            }
-
-            return ngx_http_spdy_state_save(sc, pos, end,
-                                            ngx_http_spdy_state_headers);
-
-        case NGX_HTTP_PARSE_INVALID_HEADER:
-            ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);
-            return ngx_http_spdy_state_headers_skip(sc, pos, end);
-
-        default: /* NGX_ERROR */
-            return ngx_http_spdy_state_headers_error(sc, pos, end);
-        }
-
-        /* a header line has been parsed successfully */
-
-        rc = ngx_http_spdy_handle_request_header(r);
-
-        if (rc != NGX_OK) {
-            if (rc == NGX_HTTP_PARSE_INVALID_HEADER) {
-                ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);
-                return ngx_http_spdy_state_headers_skip(sc, pos, end);
-            }
-
-            if (rc != NGX_ABORT) {
-                ngx_http_spdy_close_stream(sc->stream,
-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);
-            }
-
-            return ngx_http_spdy_state_headers_skip(sc, pos, end);
-        }
-    }
-
-    if (buf->pos != buf->last || sc->zstream_in.avail_in) {
-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-                       "incorrect number of spdy header block entries");
-
-        return ngx_http_spdy_state_headers_error(sc, pos, end);
-    }
-
-    if (sc->length) {
-        return ngx_http_spdy_state_save(sc, pos, end,
-                                        ngx_http_spdy_state_headers);
-    }
-
-    /* null-terminate the last header value */
-    *buf->pos = '\0';
-
-    ngx_http_spdy_run_request(r);
-
-    return ngx_http_spdy_state_complete(sc, pos, end);
-}
-
-
-static u_char *
-ngx_http_spdy_state_headers_skip(ngx_http_spdy_connection_t *sc, u_char *pos,
-    u_char *end)
-{
-    int     n;
-    size_t  size;
-    u_char  buffer[NGX_SPDY_SKIP_HEADERS_BUFFER_SIZE];
-
-    if (sc->length == 0) {
-        return ngx_http_spdy_state_complete(sc, pos, end);
-    }
-
-    size = end - pos;
-
-    if (size == 0) {
-        return ngx_http_spdy_state_save(sc, pos, end,
-                                        ngx_http_spdy_state_headers_skip);
-    }
-
-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
-                   "spdy header block skip %uz of %uz", size, sc->length);
-
-    sc->zstream_in.next_in = pos;
-    sc->zstream_in.avail_in = (size < sc->length) ? size : sc->length;
-
-    while (sc->zstream_in.avail_in) {
-        sc->zstream_in.next_out = buffer;
-        sc->zstream_in.avail_out = NGX_SPDY_SKIP_HEADERS_BUFFER_SIZE;
-
-        n = inflate(&sc->zstream_in, Z_NO_FLUSH);
-
-        ngx_log_debug5(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
-                       "spdy inflate out: ni:%p no:%p ai:%ud ao:%ud rc:%d",
-                       sc->zstream_in.next_in, sc->zstream_in.next_out,
-                       sc->zstream_in.avail_in, sc->zstream_in.avail_out,
-                       n);
-
-        if (n != Z_OK) {
-            return ngx_http_spdy_state_inflate_error(sc, n);
-        }
-    }
-
-    pos = sc->zstream_in.next_in;
-
-    if (size < sc->length) {
-        sc->length -= size;
-        return ngx_http_spdy_state_save(sc, pos, end,
-                                        ngx_http_spdy_state_headers_skip);
-    }
-
-    return ngx_http_spdy_state_complete(sc, pos, end);
-}
-
-
-static u_char *
-ngx_http_spdy_state_headers_error(ngx_http_spdy_connection_t *sc, u_char *pos,
-    u_char *end)
-{
-    ngx_http_spdy_stream_t  *stream;
-
-    stream = sc->stream;
-
-    ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
-                  "client sent SYN_STREAM frame for stream %ui "
-                  "with invalid header block", stream->id);
-
-    if (ngx_http_spdy_send_rst_stream(sc, stream->id, NGX_SPDY_PROTOCOL_ERROR,
-                                      stream->priority)
-        != NGX_OK)
-    {
-        return ngx_http_spdy_state_internal_error(sc);
-    }
-
-    stream->out_closed = 1;
-
-    ngx_http_spdy_close_stream(stream, NGX_HTTP_BAD_REQUEST);
-
-    return ngx_http_spdy_state_headers_skip(sc, pos, end);
-}
-
-
-static u_char *
-ngx_http_spdy_state_window_update(ngx_http_spdy_connection_t *sc, u_char *pos,
-    u_char *end)
-{
-    size_t                   delta;
-    ngx_uint_t               sid;
-    ngx_event_t             *wev;
-    ngx_queue_t             *q;
-    ngx_http_spdy_stream_t  *stream;
-
-    if (end - pos < NGX_SPDY_WINDOW_UPDATE_SIZE) {
-        return ngx_http_spdy_state_save(sc, pos, end,
-                                        ngx_http_spdy_state_window_update);
-    }
-
-    if (sc->length != NGX_SPDY_WINDOW_UPDATE_SIZE) {
-        ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
-                      "client sent WINDOW_UPDATE frame "
-                      "with incorrect length %uz", sc->length);
-
-        return ngx_http_spdy_state_protocol_error(sc);
-    }
-
-    sid = ngx_spdy_frame_parse_sid(pos);
-
-    pos += NGX_SPDY_SID_SIZE;
-
-    delta = ngx_spdy_frame_parse_delta(pos);
-
-    pos += NGX_SPDY_DELTA_SIZE;
-
-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
-                   "spdy WINDOW_UPDATE sid:%ui delta:%uz", sid, delta);
-
-    if (sid) {
-        stream = ngx_http_spdy_get_stream_by_id(sc, sid);
-
-        if (stream == NULL) {
-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
-                           "unknown spdy stream");
-
-            return ngx_http_spdy_state_complete(sc, pos, end);
-        }
-
-        if (stream->send_window > (ssize_t) (NGX_SPDY_MAX_WINDOW - delta)) {
-
-            ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
-                          "client violated flow control for stream %ui: "
-                          "received WINDOW_UPDATE frame with delta %uz "
-                          "not allowed for window %z",
-                          sid, delta, stream->send_window);
-
-            if (ngx_http_spdy_terminate_stream(sc, stream,
-                                               NGX_SPDY_FLOW_CONTROL_ERROR)
-                == NGX_ERROR)
-            {
-                return ngx_http_spdy_state_internal_error(sc);
-            }
-
-            return ngx_http_spdy_state_complete(sc, pos, end);
-        }
-
-        stream->send_window += delta;
-
-        if (stream->exhausted) {
-            stream->exhausted = 0;
-
-            wev = stream->request->connection->write;
-
-            if (!wev->timer_set) {
-                wev->delayed = 0;
-                wev->handler(wev);
-            }
-        }
-
-    } else {
-        sc->send_window += delta;
-
-        if (sc->send_window > NGX_SPDY_MAX_WINDOW) {
-            ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
-                          "client violated connection flow control: "
-                          "received WINDOW_UPDATE frame with delta %uz "
-                          "not allowed for window %uz",
-                          delta, sc->send_window);
-
-            return ngx_http_spdy_state_protocol_error(sc);
-        }
-
-        while (!ngx_queue_empty(&sc->waiting)) {
-            q = ngx_queue_head(&sc->waiting);
-
-            ngx_queue_remove(q);
-
-            stream = ngx_queue_data(q, ngx_http_spdy_stream_t, queue);
-
-            stream->handled = 0;
-
-            wev = stream->request->connection->write;
-
-            if (!wev->timer_set) {
-                wev->delayed = 0;
-                wev->handler(wev);
-
-                if (sc->send_window == 0) {
-                    break;
-                }
-            }
-        }
-    }
-
-    return ngx_http_spdy_state_complete(sc, pos, end);
-}
-
-
-static u_char *
-ngx_http_spdy_state_data(ngx_http_spdy_connection_t *sc, u_char *pos,
-    u_char *end)
-{
-    ngx_http_spdy_stream_t  *stream;
-
-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
-                   "spdy DATA frame");
-
-    if (sc->length > sc->recv_window) {
-        ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
-                      "client violated connection flow control: "
-                      "received DATA frame length %uz, available window %uz",
-                      sc->length, sc->recv_window);
-
-        return ngx_http_spdy_state_protocol_error(sc);
-    }
-
-    sc->recv_window -= sc->length;
-
-    if (sc->recv_window < NGX_SPDY_MAX_WINDOW / 4) {
-
-        if (ngx_http_spdy_send_window_update(sc, 0,
-                                             NGX_SPDY_MAX_WINDOW
-                                             - sc->recv_window)
-            == NGX_ERROR)
-        {
-            return ngx_http_spdy_state_internal_error(sc);
-        }
-
-        sc->recv_window = NGX_SPDY_MAX_WINDOW;
-    }
-
-    stream = sc->stream;
-
-    if (stream == NULL) {
-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
-                       "unknown spdy stream");
-
-        return ngx_http_spdy_state_skip(sc, pos, end);
-    }
-
-    if (sc->length > stream->recv_window) {
-        ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
-                      "client violated flow control for stream %ui: "
-                      "received DATA frame length %uz, available window %uz",
-                      stream->id, sc->length, stream->recv_window);
-
-        if (ngx_http_spdy_terminate_stream(sc, stream,
-                                           NGX_SPDY_FLOW_CONTROL_ERROR)
-            == NGX_ERROR)
-        {
-            return ngx_http_spdy_state_internal_error(sc);
-        }
-
-        return ngx_http_spdy_state_skip(sc, pos, end);
-    }
-
-    stream->recv_window -= sc->length;
-
-    if (stream->recv_window < NGX_SPDY_STREAM_WINDOW / 4) {
-
-        if (ngx_http_spdy_send_window_update(sc, stream->id,
-                                             NGX_SPDY_STREAM_WINDOW
-                                             - stream->recv_window)
-            == NGX_ERROR)
-        {
-            return ngx_http_spdy_state_internal_error(sc);
-        }
-
-        stream->recv_window = NGX_SPDY_STREAM_WINDOW;
-    }
-
-    if (stream->in_closed) {
-        ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
-                      "client sent DATA frame for half-closed stream %ui",
-                      stream->id);
-
-        if (ngx_http_spdy_terminate_stream(sc, stream,
-                                           NGX_SPDY_STREAM_ALREADY_CLOSED)
-            == NGX_ERROR)
-        {
-            return ngx_http_spdy_state_internal_error(sc);
-        }
-
-        return ngx_http_spdy_state_skip(sc, pos, end);
-    }
-
-    return ngx_http_spdy_state_read_data(sc, pos, end);
-}
-
-
-static u_char *
-ngx_http_spdy_state_read_data(ngx_http_spdy_connection_t *sc, u_char *pos,
-    u_char *end)
-{
-    size_t                     size;
-    ssize_t                    n;
-    ngx_buf_t                 *buf;
-    ngx_int_t                  rc;
-    ngx_temp_file_t           *tf;
-    ngx_http_request_t        *r;
-    ngx_http_spdy_stream_t    *stream;
-    ngx_http_request_body_t   *rb;
-    ngx_http_core_loc_conf_t  *clcf;
-
-    stream = sc->stream;
-
-    if (stream == NULL) {
-        return ngx_http_spdy_state_skip(sc, pos, end);
-    }
-
-    if (stream->skip_data) {
-
-        if (sc->flags & NGX_SPDY_FLAG_FIN) {
-            stream->in_closed = 1;
-        }
-
-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
-                       "skipping spdy DATA frame, reason: %d",
-                       stream->skip_data);
-
-        return ngx_http_spdy_state_skip(sc, pos, end);
-    }
-
-    size = end - pos;
-
-    if (size > sc->length) {
-        size = sc->length;
-    }
-
-    r = stream->request;
-
-    if (r->request_body == NULL
-        && ngx_http_spdy_init_request_body(r) != NGX_OK)
-    {
-        stream->skip_data = NGX_SPDY_DATA_INTERNAL_ERROR;
-        return ngx_http_spdy_state_skip(sc, pos, end);
-    }
-
-    rb = r->request_body;
-    tf = rb->temp_file;
-    buf = rb->buf;
-
-    if (size) {
-        rb->rest += size;
-
-        if (r->headers_in.content_length_n != -1
-            && r->headers_in.content_length_n < rb->rest)
-        {
-            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
-                          "client intended to send body data "
-                          "larger than declared");
-
-            stream->skip_data = NGX_SPDY_DATA_ERROR;
-            goto error;
-
-        } else {
-            clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
-
-            if (clcf->client_max_body_size
-                && clcf->client_max_body_size < rb->rest)
-            {
-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
-                              "client intended to send "
-                              "too large chunked body: %O bytes", rb->rest);
-
-                stream->skip_data = NGX_SPDY_DATA_ERROR;
-                goto error;
-            }
-        }
-
-        sc->length -= size;
-
-        if (tf) {
-            buf->start = pos;
-            buf->pos = pos;
-
-            pos += size;
-
-            buf->end = pos;
-            buf->last = pos;
-
-            n = ngx_write_chain_to_temp_file(tf, rb->bufs);
-
-            /* TODO: n == 0 or not complete and level event */
-
-            if (n == NGX_ERROR) {
-                stream->skip_data = NGX_SPDY_DATA_INTERNAL_ERROR;
-                goto error;
-            }
-
-            tf->offset += n;
-
-        } else {
-            buf->last = ngx_cpymem(buf->last, pos, size);
-            pos += size;
-        }
-
-        r->request_length += size;
-    }
-
-    if (sc->length) {
-        return ngx_http_spdy_state_save(sc, pos, end,
-                                        ngx_http_spdy_state_read_data);
-    }
-
-    if (sc->flags & NGX_SPDY_FLAG_FIN) {
-
-        stream->in_closed = 1;
-
-        if (r->headers_in.content_length_n < 0) {
-            r->headers_in.content_length_n = rb->rest;
-
-        } else if (r->headers_in.content_length_n != rb->rest) {
-            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
-                          "client prematurely closed stream: "
-                          "only %O out of %O bytes of request body received",
-                          rb->rest, r->headers_in.content_length_n);
-
-            stream->skip_data = NGX_SPDY_DATA_ERROR;
-            goto error;
-        }
-
-        if (tf) {
-            ngx_memzero(buf, sizeof(ngx_buf_t));
-
-            buf->in_file = 1;
-            buf->file_last = tf->file.offset;
-            buf->file = &tf->file;
-
-            rb->buf = NULL;
-        }
-
-        if (rb->post_handler) {
-            r->read_event_handler = ngx_http_block_reading;
-            rb->post_handler(r);
-        }
-    }
-
-    return ngx_http_spdy_state_complete(sc, pos, end);
-
-error:
-
-    if (rb->post_handler) {
-
-        if (stream->skip_data == NGX_SPDY_DATA_ERROR) {
-            rc = (r->headers_in.content_length_n == -1)
-                 ? NGX_HTTP_REQUEST_ENTITY_TOO_LARGE
-                 : NGX_HTTP_BAD_REQUEST;
-
-        } else {
-            rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
-        }
-
-        ngx_http_finalize_request(r, rc);
-    }
-
-    return ngx_http_spdy_state_skip(sc, pos, end);
-}
-
-
-static u_char *
-ngx_http_spdy_state_rst_stream(ngx_http_spdy_connection_t *sc, u_char *pos,
-    u_char *end)
-{
-    ngx_uint_t               sid, status;
-    ngx_event_t             *ev;
-    ngx_connection_t        *fc;
-    ngx_http_spdy_stream_t  *stream;
-
-    if (end - pos < NGX_SPDY_RST_STREAM_SIZE) {
-        return ngx_http_spdy_state_save(sc, pos, end,
-                                        ngx_http_spdy_state_rst_stream);
-    }
-
-    if (sc->length != NGX_SPDY_RST_STREAM_SIZE) {
-        ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
-                      "client sent RST_STREAM frame with incorrect length %uz",
-                      sc->length);
-
-        return ngx_http_spdy_state_protocol_error(sc);
-    }
-
-    sid = ngx_spdy_frame_parse_sid(pos);
-
-    pos += NGX_SPDY_SID_SIZE;
-
-    status = ngx_spdy_frame_parse_uint32(pos);
-
-    pos += sizeof(uint32_t);
-
-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
-                   "spdy RST_STREAM sid:%ui st:%ui", sid, status);
-
-    stream = ngx_http_spdy_get_stream_by_id(sc, sid);
-
-    if (stream == NULL) {
-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
-                       "unknown spdy stream");
-
-        return ngx_http_spdy_state_complete(sc, pos, end);
-    }
-
-    stream->in_closed = 1;
-    stream->out_closed = 1;
-
-    fc = stream->request->connection;
-    fc->error = 1;
-
-    switch (status) {
-
-    case NGX_SPDY_CANCEL:
-        ngx_log_error(NGX_LOG_INFO, fc->log, 0,
-                      "client canceled stream %ui", sid);
-        break;
-
-    case NGX_SPDY_INTERNAL_ERROR:
-        ngx_log_error(NGX_LOG_INFO, fc->log, 0,
-                      "client terminated stream %ui due to internal error",
-                      sid);
-        break;
-
-    default:
-        ngx_log_error(NGX_LOG_INFO, fc->log, 0,
-                      "client terminated stream %ui with status %ui",
-                      sid, status);
-        break;
-    }
-
-    ev = fc->read;
-    ev->handler(ev);
-
-    return ngx_http_spdy_state_complete(sc, pos, end);
-}
-
-
-static u_char *
-ngx_http_spdy_state_ping(ngx_http_spdy_connection_t *sc, u_char *pos,
-    u_char *end)
-{
-    u_char                     *p;
-    ngx_buf_t                  *buf;
-    ngx_http_spdy_out_frame_t  *frame;
-
-    if (end - pos < NGX_SPDY_PING_SIZE) {
-        return ngx_http_spdy_state_save(sc, pos, end,
-                                        ngx_http_spdy_state_ping);
-    }
-
-    if (sc->length != NGX_SPDY_PING_SIZE) {
-        ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
-                      "client sent PING frame with incorrect length %uz",
-                      sc->length);
-
-        return ngx_http_spdy_state_protocol_error(sc);
-    }
-
-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
-                   "spdy PING frame");
-
-    frame = ngx_http_spdy_get_ctl_frame(sc, NGX_SPDY_PING_SIZE,
-                                        NGX_SPDY_HIGHEST_PRIORITY);
-    if (frame == NULL) {
-        return ngx_http_spdy_state_internal_error(sc);
-    }
-
-    buf = frame->first->buf;
-
-    p = buf->pos;
-
-    p = ngx_spdy_frame_write_head(p, NGX_SPDY_PING);
-    p = ngx_spdy_frame_write_flags_and_len(p, 0, NGX_SPDY_PING_SIZE);
-
-    p = ngx_cpymem(p, pos, NGX_SPDY_PING_SIZE);
-
-    buf->last = p;
-
-    ngx_http_spdy_queue_frame(sc, frame);
-
-    pos += NGX_SPDY_PING_SIZE;
-
-    return ngx_http_spdy_state_complete(sc, pos, end);
-}
-
-
-static u_char *
-ngx_http_spdy_state_skip(ngx_http_spdy_connection_t *sc, u_char *pos,
-    u_char *end)
-{
-    size_t  size;
-
-    size = end - pos;
-
-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
-                   "spdy frame skip %uz of %uz", size, sc->length);
-
-    if (size < sc->length) {
-        sc->length -= size;
-        return ngx_http_spdy_state_save(sc, end, end,
-                                        ngx_http_spdy_state_skip);
-    }
-
-    return ngx_http_spdy_state_complete(sc, pos + sc->length, end);
-}
-
-
-static u_char *
-ngx_http_spdy_state_settings(ngx_http_spdy_connection_t *sc, u_char *pos,
-    u_char *end)
-{
-    ngx_uint_t  fid, val;
-
-    if (sc->entries == 0) {
-
-        if (end - pos < NGX_SPDY_SETTINGS_NUM_SIZE) {
-            return ngx_http_spdy_state_save(sc, pos, end,
-                                            ngx_http_spdy_state_settings);
-        }
-
-        sc->entries = ngx_spdy_frame_parse_uint32(pos);
-
-        pos += NGX_SPDY_SETTINGS_NUM_SIZE;
-        sc->length -= NGX_SPDY_SETTINGS_NUM_SIZE;
-
-        if (sc->length < sc->entries * NGX_SPDY_SETTINGS_PAIR_SIZE) {
-            ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
-                          "client sent SETTINGS frame with incorrect "
-                          "length %uz or number of entries %ui",
-                          sc->length, sc->entries);
-
-            return ngx_http_spdy_state_protocol_error(sc);
-        }
-
-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
-                       "spdy SETTINGS frame has %ui entries", sc->entries);
-    }
-
-    while (sc->entries) {
-        if (end - pos < NGX_SPDY_SETTINGS_PAIR_SIZE) {
-            return ngx_http_spdy_state_save(sc, pos, end,
-                                            ngx_http_spdy_state_settings);
-        }
-
-        sc->entries--;
-        sc->length -= NGX_SPDY_SETTINGS_PAIR_SIZE;
-
-        fid = ngx_spdy_frame_parse_uint32(pos);
-
-        pos += NGX_SPDY_SETTINGS_FID_SIZE;
-
-        val = ngx_spdy_frame_parse_uint32(pos);
-
-        pos += NGX_SPDY_SETTINGS_VAL_SIZE;
-
-        ngx_log_debug3(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
-                       "spdy SETTINGS entry fl:%ui id:%ui val:%ui",
-                       ngx_spdy_frame_flags(fid), ngx_spdy_frame_id(fid), val);
-
-        if (ngx_spdy_frame_flags(fid) == NGX_SPDY_SETTINGS_FLAG_PERSISTED) {
-            continue;
-        }
-
-        switch (ngx_spdy_frame_id(fid)) {
-
-        case NGX_SPDY_SETTINGS_INIT_WINDOW:
-
-            if (val > NGX_SPDY_MAX_WINDOW) {
-                ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
-                              "client sent SETTINGS frame with "
-                              "incorrect INIT_WINDOW value: %ui", val);
-
-                return ngx_http_spdy_state_protocol_error(sc);
-            }
-
-            if (ngx_http_spdy_adjust_windows(sc, val - sc->init_window)
-                != NGX_OK)
-            {
-                return ngx_http_spdy_state_internal_error(sc);
-            }
-
-            sc->init_window = val;
-
-            continue;
-        }
-    }
-
-    return ngx_http_spdy_state_complete(sc, pos, end);
-}
-
-
-static u_char *
-ngx_http_spdy_state_complete(ngx_http_spdy_connection_t *sc, u_char *pos,
-    u_char *end)
-{
-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
-                   "spdy frame complete pos:%p end:%p", pos, end);
-
-    if (pos > end) {
-        ngx_log_error(NGX_LOG_ALERT, sc->connection->log, 0,
-                      "receive buffer overrun");
-
-        ngx_debug_point();
-        return ngx_http_spdy_state_internal_error(sc);
-    }
-
-    sc->handler = ngx_http_spdy_state_head;
-    sc->stream = NULL;
-
-    return pos;
-}
-
-
-static u_char *
-ngx_http_spdy_state_save(ngx_http_spdy_connection_t *sc,
-    u_char *pos, u_char *end, ngx_http_spdy_handler_pt handler)
-{
-    size_t  size;
-
-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
-                   "spdy frame state save pos:%p end:%p handler:%p",
-                   pos, end, handler);
-
-    size = end - pos;
-
-    if (size > NGX_SPDY_STATE_BUFFER_SIZE) {
-        ngx_log_error(NGX_LOG_ALERT, sc->connection->log, 0,
-                      "state buffer overflow: %uz bytes required", size);
-
-        ngx_debug_point();
-        return ngx_http_spdy_state_internal_error(sc);
-    }
-
-    ngx_memcpy(sc->buffer, pos, NGX_SPDY_STATE_BUFFER_SIZE);
-
-    sc->buffer_used = size;
-    sc->handler = handler;
-    sc->incomplete = 1;
-
-    return end;
-}
-
-
-static u_char *
-ngx_http_spdy_state_inflate_error(ngx_http_spdy_connection_t *sc, int rc)
-{
-    if (rc == Z_DATA_ERROR || rc == Z_STREAM_END) {
-        ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
-                      "client sent SYN_STREAM frame with "
-                      "corrupted header block, inflate() failed: %d", rc);
-
-        return ngx_http_spdy_state_protocol_error(sc);
-    }
-
-    ngx_log_error(NGX_LOG_ERR, sc->connection->log, 0,
-                  "inflate() failed: %d", rc);
-
-    return ngx_http_spdy_state_internal_error(sc);
-}
-
-
-static u_char *
-ngx_http_spdy_state_protocol_error(ngx_http_spdy_connection_t *sc)
-{
-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
-                   "spdy state protocol error");
-
-    if (sc->stream) {
-        sc->stream->out_closed = 1;
-        ngx_http_spdy_close_stream(sc->stream, NGX_HTTP_BAD_REQUEST);
-    }
-
-    ngx_http_spdy_finalize_connection(sc, NGX_HTTP_CLIENT_CLOSED_REQUEST);
-
-    return NULL;
-}
-
-
-static u_char *
-ngx_http_spdy_state_internal_error(ngx_http_spdy_connection_t *sc)
-{
-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
-                   "spdy state internal error");
-
-    if (sc->stream) {
-        sc->stream->out_closed = 1;
-        ngx_http_spdy_close_stream(sc->stream, NGX_HTTP_INTERNAL_SERVER_ERROR);
-    }
-
-    ngx_http_spdy_finalize_connection(sc, NGX_HTTP_INTERNAL_SERVER_ERROR);
-
-    return NULL;
-}
-
-
-static ngx_int_t
-ngx_http_spdy_send_window_update(ngx_http_spdy_connection_t *sc, ngx_uint_t sid,
-    ngx_uint_t delta)
-{
-    u_char                     *p;
-    ngx_buf_t                  *buf;
-    ngx_http_spdy_out_frame_t  *frame;
-
-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
-                   "spdy send WINDOW_UPDATE sid:%ui delta:%ui", sid, delta);
-
-    frame = ngx_http_spdy_get_ctl_frame(sc, NGX_SPDY_WINDOW_UPDATE_SIZE,
-                                        NGX_SPDY_HIGHEST_PRIORITY);
-    if (frame == NULL) {
-        return NGX_ERROR;
-    }
-
-    buf = frame->first->buf;
-
-    p = buf->pos;
-
-    p = ngx_spdy_frame_write_head(p, NGX_SPDY_WINDOW_UPDATE);
-    p = ngx_spdy_frame_write_flags_and_len(p, 0, NGX_SPDY_WINDOW_UPDATE_SIZE);
-
-    p = ngx_spdy_frame_write_sid(p, sid);
-    p = ngx_spdy_frame_aligned_write_uint32(p, delta);
-
-    buf->last = p;
-
-    ngx_http_spdy_queue_frame(sc, frame);
-
-    return NGX_OK;
-}
-
-
-static ngx_int_t
-ngx_http_spdy_send_rst_stream(ngx_http_spdy_connection_t *sc, ngx_uint_t sid,
-    ngx_uint_t status, ngx_uint_t priority)
-{
-    u_char                     *p;
-    ngx_buf_t                  *buf;
-    ngx_http_spdy_out_frame_t  *frame;
-
-    if (sc->connection->error) {
-        return NGX_OK;
-    }
-
-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
-                   "spdy send RST_STREAM sid:%ui st:%ui", sid, status);
-
-    frame = ngx_http_spdy_get_ctl_frame(sc, NGX_SPDY_RST_STREAM_SIZE,
-                                        priority);
-    if (frame == NULL) {
-        return NGX_ERROR;
-    }
-
-    buf = frame->first->buf;
-
-    p = buf->pos;
-
-    p = ngx_spdy_frame_write_head(p, NGX_SPDY_RST_STREAM);
-    p = ngx_spdy_frame_write_flags_and_len(p, 0, NGX_SPDY_RST_STREAM_SIZE);
-
-    p = ngx_spdy_frame_write_sid(p, sid);
-    p = ngx_spdy_frame_aligned_write_uint32(p, status);
-
-    buf->last = p;
-
-    ngx_http_spdy_queue_frame(sc, frame);
-
-    return NGX_OK;
-}
-
-
-#if 0
-static ngx_int_t
-ngx_http_spdy_send_goaway(ngx_http_spdy_connection_t *sc)
-{
-    u_char                     *p;
-    ngx_buf_t                  *buf;
-    ngx_http_spdy_out_frame_t  *frame;
-
-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
-                   "spdy send GOAWAY sid:%ui", sc->last_sid);
-
-    frame = ngx_http_spdy_get_ctl_frame(sc, NGX_SPDY_GOAWAY_SIZE,
-                                        NGX_SPDY_HIGHEST_PRIORITY);
-    if (frame == NULL) {
-        return NGX_ERROR;
-    }
-
-    buf = frame->first->buf;
-
-    p = buf->pos;
-
-    p = ngx_spdy_frame_write_head(p, NGX_SPDY_GOAWAY);
-    p = ngx_spdy_frame_write_flags_and_len(p, 0, NGX_SPDY_GOAWAY_SIZE);
-
-    p = ngx_spdy_frame_write_sid(p, sc->last_sid);
-
-    buf->last = p;
-
-    ngx_http_spdy_queue_frame(sc, frame);
-
-    return NGX_OK;
-}
-#endif
-
-
-static ngx_int_t
-ngx_http_spdy_send_settings(ngx_http_spdy_connection_t *sc)
-{
-    u_char                     *p;
-    ngx_buf_t                  *buf;
-    ngx_chain_t                *cl;
-    ngx_http_spdy_srv_conf_t   *sscf;
-    ngx_http_spdy_out_frame_t  *frame;
-
-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
-                   "spdy send SETTINGS frame");
-
-    frame = ngx_palloc(sc->pool, sizeof(ngx_http_spdy_out_frame_t));
-    if (frame == NULL) {
-        return NGX_ERROR;
-    }
-
-    cl = ngx_alloc_chain_link(sc->pool);
-    if (cl == NULL) {
-        return NGX_ERROR;
-    }
-
-    buf = ngx_create_temp_buf(sc->pool, NGX_SPDY_FRAME_HEADER_SIZE
-                                        + NGX_SPDY_SETTINGS_NUM_SIZE
-                                        + 2 * NGX_SPDY_SETTINGS_PAIR_SIZE);
-    if (buf == NULL) {
-        return NGX_ERROR;
-    }
-
-    buf->last_buf = 1;
-
-    cl->buf = buf;
-    cl->next = NULL;
-
-    frame->first = cl;
-    frame->last = cl;
-    frame->handler = ngx_http_spdy_settings_frame_handler;
-    frame->stream = NULL;
-#if (NGX_DEBUG)
-    frame->length = NGX_SPDY_SETTINGS_NUM_SIZE
-                    + 2 * NGX_SPDY_SETTINGS_PAIR_SIZE;
-#endif
-    frame->priority = NGX_SPDY_HIGHEST_PRIORITY;
-    frame->blocked = 0;
-
-    p = buf->pos;
-
-    p = ngx_spdy_frame_write_head(p, NGX_SPDY_SETTINGS);
-    p = ngx_spdy_frame_write_flags_and_len(p, NGX_SPDY_FLAG_CLEAR_SETTINGS,
-                                           NGX_SPDY_SETTINGS_NUM_SIZE
-                                           + 2 * NGX_SPDY_SETTINGS_PAIR_SIZE);
-
-    p = ngx_spdy_frame_aligned_write_uint32(p, 2);
-
-    sscf = ngx_http_get_module_srv_conf(sc->http_connection->conf_ctx,
-                                        ngx_http_spdy_module);
-
-    p = ngx_spdy_frame_write_flags_and_id(p, 0, NGX_SPDY_SETTINGS_MAX_STREAMS);
-    p = ngx_spdy_frame_aligned_write_uint32(p, sscf->concurrent_streams);
-
-    p = ngx_spdy_frame_write_flags_and_id(p, 0, NGX_SPDY_SETTINGS_INIT_WINDOW);
-    p = ngx_spdy_frame_aligned_write_uint32(p, NGX_SPDY_STREAM_WINDOW);
-
-    buf->last = p;
-
-    ngx_http_spdy_queue_frame(sc, frame);
-
-    return NGX_OK;
-}
-
-
-ngx_int_t
-ngx_http_spdy_settings_frame_handler(ngx_http_spdy_connection_t *sc,
-    ngx_http_spdy_out_frame_t *frame)
-{
-    ngx_buf_t  *buf;
-
-    buf = frame->first->buf;
-
-    if (buf->pos != buf->last) {
-        return NGX_AGAIN;
-    }
-
-    ngx_free_chain(sc->pool, frame->first);
-
-    return NGX_OK;
-}
-
-
-static ngx_http_spdy_out_frame_t *
-ngx_http_spdy_get_ctl_frame(ngx_http_spdy_connection_t *sc, size_t length,
-    ngx_uint_t priority)
-{
-    ngx_chain_t                *cl;
-    ngx_http_spdy_out_frame_t  *frame;
-
-    frame = sc->free_ctl_frames;
-
-    if (frame) {
-        sc->free_ctl_frames = frame->next;
-
-        cl = frame->first;
-        cl->buf->pos = cl->buf->start;
-
-    } else {
-        frame = ngx_palloc(sc->pool, sizeof(ngx_http_spdy_out_frame_t));
-        if (frame == NULL) {
-            return NULL;
-        }
-
-        cl = ngx_alloc_chain_link(sc->pool);
-        if (cl == NULL) {
-            return NULL;
-        }
-
-        cl->buf = ngx_create_temp_buf(sc->pool,
-                                      NGX_SPDY_CTL_FRAME_BUFFER_SIZE);
-        if (cl->buf == NULL) {
-            return NULL;
-        }
-
-        cl->buf->last_buf = 1;
-
-        frame->first = cl;
-        frame->last = cl;
-        frame->handler = ngx_http_spdy_ctl_frame_handler;
-        frame->stream = NULL;
-    }
-
-#if (NGX_DEBUG)
-    if (length > NGX_SPDY_CTL_FRAME_BUFFER_SIZE - NGX_SPDY_FRAME_HEADER_SIZE) {
-        ngx_log_error(NGX_LOG_ALERT, sc->pool->log, 0,
-                      "requested control frame is too large: %uz", length);
-        return NULL;
-    }
-
-    frame->length = length;
-#endif
-
-    frame->priority = priority;
-    frame->blocked = 0;
-
-    return frame;
-}
-
-
-static ngx_int_t
-ngx_http_spdy_ctl_frame_handler(ngx_http_spdy_connection_t *sc,
-    ngx_http_spdy_out_frame_t *frame)
-{
-    ngx_buf_t  *buf;
-
-    buf = frame->first->buf;
-
-    if (buf->pos != buf->last) {
-        return NGX_AGAIN;
-    }
-
-    frame->next = sc->free_ctl_frames;
-    sc->free_ctl_frames = frame;
-
-    return NGX_OK;
-}
-
-
-static ngx_http_spdy_stream_t *
-ngx_http_spdy_create_stream(ngx_http_spdy_connection_t *sc, ngx_uint_t id,
-    ngx_uint_t priority)
-{
-    ngx_log_t                 *log;
-    ngx_uint_t                 index;
-    ngx_event_t               *rev, *wev;
-    ngx_connection_t          *fc;
-    ngx_http_log_ctx_t        *ctx;
-    ngx_http_request_t        *r;
-    ngx_http_spdy_stream_t    *stream;
-    ngx_http_core_srv_conf_t  *cscf;
-    ngx_http_spdy_srv_conf_t  *sscf;
-
-    fc = sc->free_fake_connections;
-
-    if (fc) {
-        sc->free_fake_connections = fc->data;
-
-        rev = fc->read;
-        wev = fc->write;
-        log = fc->log;
-        ctx = log->data;
-
-    } else {
-        fc = ngx_palloc(sc->pool, sizeof(ngx_connection_t));
-        if (fc == NULL) {
-            return NULL;
-        }
-
-        rev = ngx_palloc(sc->pool, sizeof(ngx_event_t));
-        if (rev == NULL) {
-            return NULL;
-        }
-
-        wev = ngx_palloc(sc->pool, sizeof(ngx_event_t));
-        if (wev == NULL) {
-            return NULL;
-        }
-
-        log = ngx_palloc(sc->pool, sizeof(ngx_log_t));
-        if (log == NULL) {
-            return NULL;
-        }
-
-        ctx = ngx_palloc(sc->pool, sizeof(ngx_http_log_ctx_t));
-        if (ctx == NULL) {
-            return NULL;
-        }
-
-        ctx->connection = fc;
-        ctx->request = NULL;
-    }
-
-    ngx_memcpy(log, sc->connection->log, sizeof(ngx_log_t));
-
-    log->data = ctx;
-
-    ngx_memzero(rev, sizeof(ngx_event_t));
-
-    rev->data = fc;
-    rev->ready = 1;
-    rev->handler = ngx_http_spdy_close_stream_handler;
-    rev->log = log;
-
-    ngx_memcpy(wev, rev, sizeof(ngx_event_t));
-
-    wev->write = 1;
-
-    ngx_memcpy(fc, sc->connection, sizeof(ngx_connection_t));
-
-    fc->data = sc->http_connection;
-    fc->read = rev;
-    fc->write = wev;
-    fc->sent = 0;
-    fc->log = log;
-    fc->buffered = 0;
-    fc->sndlowat = 1;
-    fc->tcp_nodelay = NGX_TCP_NODELAY_DISABLED;
-
-    r = ngx_http_create_request(fc);
-    if (r == NULL) {
-        return NULL;
-    }
-
-    r->valid_location = 1;
-
-    fc->data = r;
-    sc->connection->requests++;
-
-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);
-
-    r->header_in = ngx_create_temp_buf(r->pool,
-                                       cscf->client_header_buffer_size);
-    if (r->header_in == NULL) {
-        ngx_http_free_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
-        return NULL;
-    }
-
-    r->headers_in.connection_type = NGX_HTTP_CONNECTION_CLOSE;
-
-    stream = ngx_pcalloc(r->pool, sizeof(ngx_http_spdy_stream_t));
-    if (stream == NULL) {
-        ngx_http_free_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
-        return NULL;
-    }
-
-    r->spdy_stream = stream;
-
-    stream->id = id;
-    stream->request = r;
-    stream->connection = sc;
-
-    stream->send_window = sc->init_window;
-    stream->recv_window = NGX_SPDY_STREAM_WINDOW;
-
-    stream->priority = priority;
-
-    sscf = ngx_http_get_module_srv_conf(r, ngx_http_spdy_module);
-
-    index = ngx_http_spdy_stream_index(sscf, id);
-
-    stream->index = sc->streams_index[index];
-    sc->streams_index[index] = stream;
-
-    sc->processing++;
-
-    return stream;
-}
-
-
-static ngx_http_spdy_stream_t *
-ngx_http_spdy_get_stream_by_id(ngx_http_spdy_connection_t *sc,
-    ngx_uint_t sid)
-{
-    ngx_http_spdy_stream_t    *stream;
-    ngx_http_spdy_srv_conf_t  *sscf;
-
-    sscf = ngx_http_get_module_srv_conf(sc->http_connection->conf_ctx,
-                                        ngx_http_spdy_module);
-
-    stream = sc->streams_index[ngx_http_spdy_stream_index(sscf, sid)];
-
-    while (stream) {
-        if (stream->id == sid) {
-            return stream;
-        }
-
-        stream = stream->index;
-    }
-
-    return NULL;
-}
-
-
-static ngx_int_t
-ngx_http_spdy_parse_header(ngx_http_request_t *r)
-{
-    u_char                     *p, *end, ch;
-    ngx_uint_t                  hash;
-    ngx_http_core_srv_conf_t   *cscf;
-
-    enum {
-        sw_name_len = 0,
-        sw_name,
-        sw_value_len,
-        sw_value
-    } state;
-
-    state = r->state;
-
-    p = r->header_in->pos;
-    end = r->header_in->last;
-
-    switch (state) {
-
-    case sw_name_len:
-
-        if (end - p < NGX_SPDY_NV_NLEN_SIZE) {
-            return NGX_AGAIN;
-        }
-
-        r->lowcase_index = ngx_spdy_frame_parse_uint32(p);
-
-        if (r->lowcase_index == 0) {
-            return NGX_ERROR;
-        }
-
-        /* null-terminate the previous header value */
-        *p = '\0';
-
-        p += NGX_SPDY_NV_NLEN_SIZE;
-
-        r->invalid_header = 0;
-
-        state = sw_name;
-
-        /* fall through */
-
-    case sw_name:
-
-        if ((ngx_uint_t) (end - p) < r->lowcase_index) {
-            break;
-        }
-
-        cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);
-
-        r->header_name_start = p;
-        r->header_name_end = p + r->lowcase_index;
-
-        if (p[0] == ':') {
-            p++;
-        }
-
-        hash = 0;
-
-        for ( /* void */ ; p != r->header_name_end; p++) {
-
-            ch = *p;
-
-            hash = ngx_hash(hash, ch);
-
-            if ((ch >= 'a' && ch <= 'z')
-                || (ch == '-')
-                || (ch >= '0' && ch <= '9')
-                || (ch == '_' && cscf->underscores_in_headers))
-            {
-                continue;
-            }
-
-            switch (ch) {
-            case '\0':
-            case LF:
-            case CR:
-            case ':':
-                ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
-                              "client sent invalid header name: \"%*s\"",
-                              r->lowcase_index, r->header_name_start);
-
-                return NGX_HTTP_PARSE_INVALID_HEADER;
-            }
-
-            if (ch >= 'A' && ch <= 'Z') {
-                return NGX_ERROR;
-            }
-
-            r->invalid_header = 1;
-        }
-
-        r->header_hash = hash;
-
-        state = sw_value_len;
-
-        /* fall through */
-
-    case sw_value_len:
-
-        if (end - p < NGX_SPDY_NV_VLEN_SIZE) {
-            break;
-        }
-
-        r->lowcase_index = ngx_spdy_frame_parse_uint32(p);
-
-        /* null-terminate header name */
-        *p = '\0';
-
-        p += NGX_SPDY_NV_VLEN_SIZE;
-
-        state = sw_value;
-
-        /* fall through */
-
-    case sw_value:
-
-        if ((ngx_uint_t) (end - p) < r->lowcase_index) {
-            break;
-        }
-
-        r->header_start = p;
-
-        while (r->lowcase_index--) {
-            ch = *p;
-
-            if (ch == '\0') {
-
-                if (p == r->header_start) {
-                    return NGX_ERROR;
-                }
-
-                r->header_end = p;
-                r->header_in->pos = p + 1;
-
-                r->state = sw_value;
-
-                return NGX_OK;
-            }
-
-            if (ch == CR || ch == LF) {
-                ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
-                              "client sent header \"%*s\" with "
-                              "invalid value: \"%*s\\%c...\"",
-                              r->header_name_end - r->header_name_start,
-                              r->header_name_start,
-                              p - r->header_start,
-                              r->header_start,
-                              ch == CR ? 'r' : 'n');
-
-                return NGX_HTTP_PARSE_INVALID_HEADER;
-            }
-
-            p++;
-        }
-
-        r->header_end = p;
-        r->header_in->pos = p;
-
-        r->state = 0;
-
-        return NGX_DONE;
-    }
-
-    r->header_in->pos = p;
-    r->state = state;
-
-    return NGX_AGAIN;
-}
-
-
-static ngx_int_t
-ngx_http_spdy_alloc_large_header_buffer(ngx_http_request_t *r)
-{
-    u_char                    *old, *new, *p;
-    size_t                     rest;
-    ngx_buf_t                 *buf;
-    ngx_http_spdy_stream_t    *stream;
-    ngx_http_core_srv_conf_t  *cscf;
-
-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-                   "spdy alloc large header buffer");
-
-    stream = r->spdy_stream;
-
-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);
-
-    if (stream->header_buffers
-        == (ngx_uint_t) cscf->large_client_header_buffers.num)
-    {
-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
-                      "client sent too large request");
-
-        return NGX_DECLINED;
-    }
-
-    rest = r->header_in->last - r->header_in->pos;
-
-    /*
-     * One more byte is needed for null-termination
-     * and another one for further progress.
-     */
-    if (rest > cscf->large_client_header_buffers.size - 2) {
-        p = r->header_in->pos;
-
-        if (rest > NGX_MAX_ERROR_STR - 300) {
-            rest = NGX_MAX_ERROR_STR - 300;
-        }
-
-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
-                      "client sent too long header name or value: \"%*s...\"",
-                      rest, p);
-
-        return NGX_DECLINED;
-    }
-
-    buf = ngx_create_temp_buf(r->pool, cscf->large_client_header_buffers.size);
-    if (buf == NULL) {
-        return NGX_ERROR;
-    }
-
-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-                   "spdy large header alloc: %p %uz",
-                   buf->pos, buf->end - buf->last);
-
-    old = r->header_in->pos;
-    new = buf->pos;
-
-    if (rest) {
-        buf->last = ngx_cpymem(new, old, rest);
-    }
-
-    r->header_in = buf;
-
-    stream->header_buffers++;
-
-    return NGX_OK;
-}
-
-
-static ngx_int_t
-ngx_http_spdy_handle_request_header(ngx_http_request_t *r)
-{
-    ngx_uint_t                       i;
-    ngx_table_elt_t                 *h;
-    ngx_http_core_srv_conf_t        *cscf;
-    ngx_http_spdy_request_header_t  *sh;
-
-    if (r->invalid_header) {
-        cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);
-
-        if (cscf->ignore_invalid_headers) {
-            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
-                          "client sent invalid header: \"%*s\"",
-                          r->header_end - r->header_name_start,
-                          r->header_name_start);
-            return NGX_OK;
-        }
-
-    }
-
-    if (r->header_name_start[0] == ':') {
-        r->header_name_start++;
-
-        for (i = 0; i < NGX_SPDY_REQUEST_HEADERS; i++) {
-            sh = &ngx_http_spdy_request_headers[i];
-
-            if (sh->hash != r->header_hash
-                || sh->len != r->header_name_end - r->header_name_start
-                || ngx_strncmp(sh->header, r->header_name_start, sh->len) != 0)
-            {
-                continue;
-            }
-
-            return sh->handler(r);
-        }
-
-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
-                      "client sent invalid header name: \":%*s\"",
-                      r->header_end - r->header_name_start,
-                      r->header_name_start);
-
-        return NGX_HTTP_PARSE_INVALID_HEADER;
-    }
-
-    h = ngx_list_push(&r->headers_in.headers);
-    if (h == NULL) {
-        return NGX_ERROR;
-    }
-
-    h->hash = r->header_hash;
-
-    h->key.len = r->header_name_end - r->header_name_start;
-    h->key.data = r->header_name_start;
-
-    h->value.len = r->header_end - r->header_start;
-    h->value.data = r->header_start;
-
-    h->lowcase_key = h->key.data;
-
-    return NGX_OK;
-}
-
-
-void
-ngx_http_spdy_request_headers_init(void)
-{
-    ngx_uint_t                       i;
-    ngx_http_spdy_request_header_t  *h;
-
-    for (i = 0; i < NGX_SPDY_REQUEST_HEADERS; i++) {
-        h = &ngx_http_spdy_request_headers[i];
-        h->hash = ngx_hash_key(h->header, h->len);
-    }
-}
-
-
-static ngx_int_t
-ngx_http_spdy_parse_method(ngx_http_request_t *r)
-{
-    size_t         k, len;
-    ngx_uint_t     n;
-    const u_char  *p, *m;
-
-    /*
-     * This array takes less than 256 sequential bytes,
-     * and if typical CPU cache line size is 64 bytes,
-     * it is prefetched for 4 load operations.
-     */
-    static const struct {
-        u_char            len;
-        const u_char      method[11];
-        uint32_t          value;
-    } tests[] = {
-        { 3, "GET",       NGX_HTTP_GET },
-        { 4, "POST",      NGX_HTTP_POST },
-        { 4, "HEAD",      NGX_HTTP_HEAD },
-        { 7, "OPTIONS",   NGX_HTTP_OPTIONS },
-        { 8, "PROPFIND",  NGX_HTTP_PROPFIND },
-        { 3, "PUT",       NGX_HTTP_PUT },
-        { 5, "MKCOL",     NGX_HTTP_MKCOL },
-        { 6, "DELETE",    NGX_HTTP_DELETE },
-        { 4, "COPY",      NGX_HTTP_COPY },
-        { 4, "MOVE",      NGX_HTTP_MOVE },
-        { 9, "PROPPATCH", NGX_HTTP_PROPPATCH },
-        { 4, "LOCK",      NGX_HTTP_LOCK },
-        { 6, "UNLOCK",    NGX_HTTP_UNLOCK },
-        { 5, "PATCH",     NGX_HTTP_PATCH },
-        { 5, "TRACE",     NGX_HTTP_TRACE }
-    }, *test;
-
-    if (r->method_name.len) {
-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
-                      "client sent duplicate :method header");
-
-        return NGX_HTTP_PARSE_INVALID_HEADER;
-    }
-
-    len = r->header_end - r->header_start;
-
-    r->method_name.len = len;
-    r->method_name.data = r->header_start;
-
-    test = tests;
-    n = sizeof(tests) / sizeof(tests[0]);
-
-    do {
-        if (len == test->len) {
-            p = r->method_name.data;
-            m = test->method;
-            k = len;
-
-            do {
-                if (*p++ != *m++) {
-                    goto next;
-                }
-            } while (--k);
-
-            r->method = test->value;
-            return NGX_OK;
-        }
-
-    next:
-        test++;
-
-    } while (--n);
-
-    p = r->method_name.data;
-
-    do {
-        if ((*p < 'A' || *p > 'Z') && *p != '_') {
-            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
-                          "client sent invalid method: \"%V\"",
-                          &r->method_name);
-
-            return NGX_HTTP_PARSE_INVALID_HEADER;
-        }
-
-        p++;
-
-    } while (--len);
-
-    return NGX_OK;
-}
-
-
-static ngx_int_t
-ngx_http_spdy_parse_scheme(ngx_http_request_t *r)
-{
-    if (r->schema_start) {
-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
-                      "client sent duplicate :schema header");
-
-        return NGX_HTTP_PARSE_INVALID_HEADER;
-    }
-
-    r->schema_start = r->header_start;
-    r->schema_end = r->header_end;
-
-    return NGX_OK;
-}
-
-
-static ngx_int_t
-ngx_http_spdy_parse_host(ngx_http_request_t *r)
-{
-    ngx_table_elt_t  *h;
-
-    if (r->headers_in.host) {
-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
-                      "client sent duplicate :host header");
-
-        return NGX_HTTP_PARSE_INVALID_HEADER;
-    }
-
-    h = ngx_list_push(&r->headers_in.headers);
-    if (h == NULL) {
-        return NGX_ERROR;
-    }
-
-    r->headers_in.host = h;
-
-    h->hash = r->header_hash;
-
-    h->key.len = r->header_name_end - r->header_name_start;
-    h->key.data = r->header_name_start;
-
-    h->value.len = r->header_end - r->header_start;
-    h->value.data = r->header_start;
-
-    h->lowcase_key = h->key.data;
-
-    return NGX_OK;
-}
-
-
-static ngx_int_t
-ngx_http_spdy_parse_path(ngx_http_request_t *r)
-{
-    if (r->unparsed_uri.len) {
-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
-                      "client sent duplicate :path header");
-
-        return NGX_HTTP_PARSE_INVALID_HEADER;
-    }
-
-    r->uri_start = r->header_start;
-    r->uri_end = r->header_end;
-
-    if (ngx_http_parse_uri(r) != NGX_OK) {
-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
-                      "client sent invalid URI: \"%*s\"",
-                      r->uri_end - r->uri_start, r->uri_start);
-
-        return NGX_HTTP_PARSE_INVALID_HEADER;
-    }
-
-    if (ngx_http_process_request_uri(r) != NGX_OK) {
-        /*
-         * request has been finalized already
-         * in ngx_http_process_request_uri()
-         */
-        return NGX_ABORT;
-    }
-
-    return NGX_OK;
-}
-
-
-static ngx_int_t
-ngx_http_spdy_parse_version(ngx_http_request_t *r)
-{
-    u_char  *p, ch;
-
-    if (r->http_protocol.len) {
-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
-                      "client sent duplicate :version header");
-
-        return NGX_HTTP_PARSE_INVALID_HEADER;
-    }
-
-    p = r->header_start;
-
-    if (r->header_end - p < 8 || !(ngx_str5cmp(p, 'H', 'T', 'T', 'P', '/'))) {
-        goto invalid;
-    }
-
-    ch = *(p + 5);
-
-    if (ch < '1' || ch > '9') {
-        goto invalid;
-    }
-
-    r->http_major = ch - '0';
-
-    for (p += 6; p != r->header_end - 2; p++) {
-
-        ch = *p;
-
-        if (ch == '.') {
-            break;
-        }
-
-        if (ch < '0' || ch > '9') {
-            goto invalid;
-        }
-
-        r->http_major = r->http_major * 10 + ch - '0';
-    }
-
-    if (*p != '.') {
-        goto invalid;
-    }
-
-    ch = *(p + 1);
-
-    if (ch < '0' || ch > '9') {
-        goto invalid;
-    }
-
-    r->http_minor = ch - '0';
-
-    for (p += 2; p != r->header_end; p++) {
-
-        ch = *p;
-
-        if (ch < '0' || ch > '9') {
-            goto invalid;
-        }
-
-        r->http_minor = r->http_minor * 10 + ch - '0';
-    }
-
-    r->http_protocol.len = r->header_end - r->header_start;
-    r->http_protocol.data = r->header_start;
-    r->http_version = r->http_major * 1000 + r->http_minor;
-
-    return NGX_OK;
-
-invalid:
-
-    ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
-                  "client sent invalid http version: \"%*s\"",
-                  r->header_end - r->header_start, r->header_start);
-
-    return NGX_HTTP_PARSE_INVALID_HEADER;
-}
-
-
-static ngx_int_t
-ngx_http_spdy_construct_request_line(ngx_http_request_t *r)
-{
-    u_char  *p;
-
-    if (r->method_name.len == 0
-        || r->unparsed_uri.len == 0
-        || r->http_protocol.len == 0)
-    {
-        ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);
-        return NGX_ERROR;
-    }
-
-    r->request_line.len = r->method_name.len + 1
-                          + r->unparsed_uri.len + 1
-                          + r->http_protocol.len;
-
-    p = ngx_pnalloc(r->pool, r->request_line.len + 1);
-    if (p == NULL) {
-        ngx_http_spdy_close_stream(r->spdy_stream,
-                                   NGX_HTTP_INTERNAL_SERVER_ERROR);
-        return NGX_ERROR;
-    }
-
-    r->request_line.data = p;
-
-    p = ngx_cpymem(p, r->method_name.data, r->method_name.len);
-
-    *p++ = ' ';
-
-    p = ngx_cpymem(p, r->unparsed_uri.data, r->unparsed_uri.len);
-
-    *p++ = ' ';
-
-    ngx_memcpy(p, r->http_protocol.data, r->http_protocol.len + 1);
-
-    /* some modules expect the space character after method name */
-    r->method_name.data = r->request_line.data;
-
-    return NGX_OK;
-}
-
-
-static void
-ngx_http_spdy_run_request(ngx_http_request_t *r)
-{
-    ngx_uint_t                  i;
-    ngx_list_part_t            *part;
-    ngx_table_elt_t            *h;
-    ngx_http_header_t          *hh;
-    ngx_http_core_main_conf_t  *cmcf;
-
-    if (ngx_http_spdy_construct_request_line(r) != NGX_OK) {
-        return;
-    }
-
-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-                   "spdy http request line: \"%V\"", &r->request_line);
-
-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);
-
-    part = &r->headers_in.headers.part;
-    h = part->elts;
-
-    for (i = 0 ;; i++) {
-
-        if (i >= part->nelts) {
-            if (part->next == NULL) {
-                break;
-            }
-
-            part = part->next;
-            h = part->elts;
-            i = 0;
-        }
-
-        hh = ngx_hash_find(&cmcf->headers_in_hash, h[i].hash,
-                           h[i].lowcase_key, h[i].key.len);
-
-        if (hh && hh->handler(r, &h[i], hh->offset) != NGX_OK) {
-            return;
-        }
-
-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-                       "spdy http header: \"%V: %V\"", &h[i].key, &h[i].value);
-    }
-
-    r->http_state = NGX_HTTP_PROCESS_REQUEST_STATE;
-
-    if (ngx_http_process_request_header(r) != NGX_OK) {
-        return;
-    }
-
-    if (r->headers_in.content_length_n > 0 && r->spdy_stream->in_closed) {
-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
-                      "client prematurely closed stream");
-
-        r->spdy_stream->skip_data = NGX_SPDY_DATA_ERROR;
-
-        ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);
-        return;
-    }
-
-    ngx_http_process_request(r);
-}
-
-
-static ngx_int_t
-ngx_http_spdy_init_request_body(ngx_http_request_t *r)
-{
-    ngx_buf_t                 *buf;
-    ngx_temp_file_t           *tf;
-    ngx_http_request_body_t   *rb;
-    ngx_http_core_loc_conf_t  *clcf;
-
-    rb = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t));
-    if (rb == NULL) {
-        return NGX_ERROR;
-    }
-
-    r->request_body = rb;
-
-    if (r->spdy_stream->in_closed) {
-        return NGX_OK;
-    }
-
-    rb->rest = r->headers_in.content_length_n;
-
-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
-
-    if (r->request_body_in_file_only
-        || rb->rest > (off_t) clcf->client_body_buffer_size
-        || rb->rest < 0)
-    {
-        tf = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t));
-        if (tf == NULL) {
-            return NGX_ERROR;
-        }
-
-        tf->file.fd = NGX_INVALID_FILE;
-        tf->file.log = r->connection->log;
-        tf->path = clcf->client_body_temp_path;
-        tf->pool = r->pool;
-        tf->warn = "a client request body is buffered to a temporary file";
-        tf->log_level = r->request_body_file_log_level;
-        tf->persistent = r->request_body_in_persistent_file;
-        tf->clean = r->request_body_in_clean_file;
-
-        if (r->request_body_file_group_access) {
-            tf->access = 0660;
-        }
-
-        rb->temp_file = tf;
-
-        if (r->spdy_stream->in_closed
-            && ngx_create_temp_file(&tf->file, tf->path, tf->pool,
-                                    tf->persistent, tf->clean, tf->access)
-               != NGX_OK)
-        {
-            return NGX_ERROR;
-        }
-
-        buf = ngx_calloc_buf(r->pool);
-        if (buf == NULL) {
-            return NGX_ERROR;
-        }
-
-    } else {
-
-        if (rb->rest == 0) {
-            return NGX_OK;
-        }
-
-        buf = ngx_create_temp_buf(r->pool, (size_t) rb->rest);
-        if (buf == NULL) {
-            return NGX_ERROR;
-        }
-    }
-
-    rb->buf = buf;
-
-    rb->bufs = ngx_alloc_chain_link(r->pool);
-    if (rb->bufs == NULL) {
-        return NGX_ERROR;
-    }
-
-    rb->bufs->buf = buf;
-    rb->bufs->next = NULL;
-
-    rb->rest = 0;
-
-    return NGX_OK;
-}
-
-
-ngx_int_t
-ngx_http_spdy_read_request_body(ngx_http_request_t *r,
-    ngx_http_client_body_handler_pt post_handler)
-{
-    ngx_http_spdy_stream_t  *stream;
-
-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-                   "spdy read request body");
-
-    stream = r->spdy_stream;
-
-    switch (stream->skip_data) {
-
-    case NGX_SPDY_DATA_DISCARD:
-        post_handler(r);
-        return NGX_OK;
-
-    case NGX_SPDY_DATA_ERROR:
-        if (r->headers_in.content_length_n == -1) {
-            return NGX_HTTP_REQUEST_ENTITY_TOO_LARGE;
-        } else {
-            return NGX_HTTP_BAD_REQUEST;
-        }
-
-    case NGX_SPDY_DATA_INTERNAL_ERROR:
-        return NGX_HTTP_INTERNAL_SERVER_ERROR;
-    }
-
-    if (!r->request_body && ngx_http_spdy_init_request_body(r) != NGX_OK) {
-        stream->skip_data = NGX_SPDY_DATA_INTERNAL_ERROR;
-        return NGX_HTTP_INTERNAL_SERVER_ERROR;
-    }
-
-    if (stream->in_closed) {
-        post_handler(r);
-        return NGX_OK;
-    }
-
-    r->request_body->post_handler = post_handler;
-
-    r->read_event_handler = ngx_http_test_reading;
-    r->write_event_handler = ngx_http_request_empty_handler;
-
-    return NGX_AGAIN;
-}
-
-
-static ngx_int_t
-ngx_http_spdy_terminate_stream(ngx_http_spdy_connection_t *sc,
-    ngx_http_spdy_stream_t *stream, ngx_uint_t status)
-{
-    ngx_event_t       *rev;
-    ngx_connection_t  *fc;
-
-    if (ngx_http_spdy_send_rst_stream(sc, stream->id, status,
-                                      NGX_SPDY_HIGHEST_PRIORITY)
-        == NGX_ERROR)
-    {
-        return NGX_ERROR;
-    }
-
-    stream->out_closed = 1;
-
-    fc = stream->request->connection;
-    fc->error = 1;
-
-    rev = fc->read;
-    rev->handler(rev);
-
-    return NGX_OK;
-}
-
-
-static void
-ngx_http_spdy_close_stream_handler(ngx_event_t *ev)
-{
-    ngx_connection_t    *fc;
-    ngx_http_request_t  *r;
-
-    fc = ev->data;
-    r = fc->data;
-
-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-                   "spdy close stream handler");
-
-    ngx_http_spdy_close_stream(r->spdy_stream, 0);
-}
-
-
-void
-ngx_http_spdy_close_stream(ngx_http_spdy_stream_t *stream, ngx_int_t rc)
-{
-    ngx_event_t                  *ev;
-    ngx_connection_t             *fc;
-    ngx_http_spdy_stream_t      **index, *s;
-    ngx_http_spdy_srv_conf_t     *sscf;
-    ngx_http_spdy_connection_t   *sc;
-
-    sc = stream->connection;
-
-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
-                   "spdy close stream %ui, queued %ui, processing %ui",
-                   stream->id, stream->queued, sc->processing);
-
-    fc = stream->request->connection;
-
-    if (stream->queued) {
-        fc->write->handler = ngx_http_spdy_close_stream_handler;
-        return;
-    }
-
-    if (!stream->out_closed) {
-        if (ngx_http_spdy_send_rst_stream(sc, stream->id,
-                                          NGX_SPDY_INTERNAL_ERROR,
-                                          stream->priority)
-            != NGX_OK)
-        {
-            sc->connection->error = 1;
-        }
-    }
-
-    if (sc->stream == stream) {
-        sc->stream = NULL;
-    }
-
-    sscf = ngx_http_get_module_srv_conf(sc->http_connection->conf_ctx,
-                                        ngx_http_spdy_module);
-
-    index = sc->streams_index + ngx_http_spdy_stream_index(sscf, stream->id);
-
-    for ( ;; ) {
-        s = *index;
-
-        if (s == NULL) {
-            break;
-        }
-
-        if (s == stream) {
-            *index = s->index;
-            break;
-        }
-
-        index = &s->index;
-    }
-
-    ngx_http_free_request(stream->request, rc);
-
-    ev = fc->read;
-
-    if (ev->active || ev->disabled) {
-        ngx_log_error(NGX_LOG_ALERT, sc->connection->log, 0,
-                      "fake read event was activated");
-    }
-
-    if (ev->timer_set) {
-        ngx_del_timer(ev);
-    }
-
-    if (ev->posted) {
-        ngx_delete_posted_event(ev);
-    }
-
-    ev = fc->write;
-
-    if (ev->active || ev->disabled) {
-        ngx_log_error(NGX_LOG_ALERT, sc->connection->log, 0,
-                      "fake write event was activated");
-    }
-
-    if (ev->timer_set) {
-        ngx_del_timer(ev);
-    }
-
-    if (ev->posted) {
-        ngx_delete_posted_event(ev);
-    }
-
-    fc->data = sc->free_fake_connections;
-    sc->free_fake_connections = fc;
-
-    sc->processing--;
-
-    if (sc->processing || sc->blocked) {
-        return;
-    }
-
-    ev = sc->connection->read;
-
-    ev->handler = ngx_http_spdy_handle_connection_handler;
-    ngx_post_event(ev, &ngx_posted_events);
-}
-
-
-static void
-ngx_http_spdy_handle_connection_handler(ngx_event_t *rev)
-{
-    ngx_connection_t  *c;
-
-    rev->handler = ngx_http_spdy_read_handler;
-
-    if (rev->ready) {
-        ngx_http_spdy_read_handler(rev);
-        return;
-    }
-
-    c = rev->data;
-
-    ngx_http_spdy_handle_connection(c->data);
-}
-
-
-static void
-ngx_http_spdy_keepalive_handler(ngx_event_t *rev)
-{
-    ngx_connection_t            *c;
-    ngx_http_spdy_srv_conf_t    *sscf;
-    ngx_http_spdy_connection_t  *sc;
-
-    c = rev->data;
-
-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "spdy keepalive handler");
-
-    if (rev->timedout || c->close) {
-        ngx_http_close_connection(c);
-        return;
-    }
-
-#if (NGX_HAVE_KQUEUE)
-
-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {
-        if (rev->pending_eof) {
-            c->log->handler = NULL;
-            ngx_log_error(NGX_LOG_INFO, c->log, rev->kq_errno,
-                          "kevent() reported that client %V closed "
-                          "keepalive connection", &c->addr_text);
-#if (NGX_HTTP_SSL)
-            if (c->ssl) {
-                c->ssl->no_send_shutdown = 1;
-            }
-#endif
-            ngx_http_close_connection(c);
-            return;
-        }
-    }
-
-#endif
-
-    c->destroyed = 0;
-    c->idle = 0;
-    ngx_reusable_connection(c, 0);
-
-    sc = c->data;
-
-    sscf = ngx_http_get_module_srv_conf(sc->http_connection->conf_ctx,
-                                        ngx_http_spdy_module);
-
-    sc->pool = ngx_create_pool(sscf->pool_size, sc->connection->log);
-    if (sc->pool == NULL) {
-        ngx_http_close_connection(c);
-        return;
-    }
-
-    sc->streams_index = ngx_pcalloc(sc->pool,
-                                    ngx_http_spdy_streams_index_size(sscf)
-                                    * sizeof(ngx_http_spdy_stream_t *));
-    if (sc->streams_index == NULL) {
-        ngx_http_close_connection(c);
-        return;
-    }
-
-    c->write->handler = ngx_http_spdy_write_handler;
-
-    rev->handler = ngx_http_spdy_read_handler;
-    ngx_http_spdy_read_handler(rev);
-}
-
-
-static void
-ngx_http_spdy_finalize_connection(ngx_http_spdy_connection_t *sc,
-    ngx_int_t rc)
-{
-    ngx_uint_t                 i, size;
-    ngx_event_t               *ev;
-    ngx_connection_t          *c, *fc;
-    ngx_http_request_t        *r;
-    ngx_http_spdy_stream_t    *stream;
-    ngx_http_spdy_srv_conf_t  *sscf;
-
-    c = sc->connection;
-
-    if (!sc->processing) {
-        ngx_http_close_connection(c);
-        return;
-    }
-
-    c->error = 1;
-    c->read->handler = ngx_http_empty_handler;
-    c->write->handler = ngx_http_empty_handler;
-
-    sc->last_out = NULL;
-
-    sc->blocked = 1;
-
-    sscf = ngx_http_get_module_srv_conf(sc->http_connection->conf_ctx,
-                                        ngx_http_spdy_module);
-
-    size = ngx_http_spdy_streams_index_size(sscf);
-
-    for (i = 0; i < size; i++) {
-        stream = sc->streams_index[i];
-
-        while (stream) {
-            stream->handled = 0;
-
-            r = stream->request;
-            fc = r->connection;
-
-            fc->error = 1;
-
-            if (stream->queued) {
-                stream->queued = 0;
-
-                ev = fc->write;
-                ev->delayed = 0;
-
-            } else {
-                ev = fc->read;
-            }
-
-            stream = stream->index;
-
-            ev->eof = 1;
-            ev->handler(ev);
-        }
-    }
-
-    sc->blocked = 0;
-
-    if (sc->processing) {
-        return;
-    }
-
-    ngx_http_close_connection(c);
-}
-
-
-static ngx_int_t
-ngx_http_spdy_adjust_windows(ngx_http_spdy_connection_t *sc, ssize_t delta)
-{
-    ngx_uint_t                 i, size;
-    ngx_event_t               *wev;
-    ngx_http_spdy_stream_t    *stream, *sn;
-    ngx_http_spdy_srv_conf_t  *sscf;
-
-    sscf = ngx_http_get_module_srv_conf(sc->http_connection->conf_ctx,
-                                        ngx_http_spdy_module);
-
-    size = ngx_http_spdy_streams_index_size(sscf);
-
-    for (i = 0; i < size; i++) {
-
-        for (stream = sc->streams_index[i]; stream; stream = sn) {
-            sn = stream->index;
-
-            if (delta > 0
-                && stream->send_window
-                      > (ssize_t) (NGX_SPDY_MAX_WINDOW - delta))
-            {
-                if (ngx_http_spdy_terminate_stream(sc, stream,
-                                                   NGX_SPDY_FLOW_CONTROL_ERROR)
-                    == NGX_ERROR)
-                {
-                    return NGX_ERROR;
-                }
-
-                continue;
-            }
-
-            stream->send_window += delta;
-
-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
-                           "spdy:%ui adjust window:%z",
-                           stream->id, stream->send_window);
-
-            if (stream->send_window > 0 && stream->exhausted) {
-                stream->exhausted = 0;
-
-                wev = stream->request->connection->write;
-
-                if (!wev->timer_set) {
-                    wev->delayed = 0;
-                    wev->handler(wev);
-                }
-            }
-        }
-    }
-
-    return NGX_OK;
-}
-
-
-static void
-ngx_http_spdy_pool_cleanup(void *data)
-{
-    ngx_http_spdy_connection_t  *sc = data;
-
-    if (sc->pool) {
-        ngx_destroy_pool(sc->pool);
-    }
-}
-
-
-static void *
-ngx_http_spdy_zalloc(void *opaque, u_int items, u_int size)
-{
-    ngx_http_spdy_connection_t *sc = opaque;
-
-    return ngx_palloc(sc->connection->pool, items * size);
-}
-
-
-static void
-ngx_http_spdy_zfree(void *opaque, void *address)
-{
-#if 0
-    ngx_http_spdy_connection_t *sc = opaque;
-
-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
-                   "spdy zfree: %p", address);
-#endif
-}

  Deleted: vendor/nginx-1.8.0/src/http/ngx_http_spdy.h (+0 -261) 100644
===================================================================
--- vendor/nginx-1.8.0/src/http/ngx_http_spdy.h    2015-09-27 18:09:01 +0900 (df24495)
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Copyright (C) Nginx, Inc.
- * Copyright (C) Valentin V. Bartenev
- */
-
-
-#ifndef _NGX_HTTP_SPDY_H_INCLUDED_
-#define _NGX_HTTP_SPDY_H_INCLUDED_
-
-
-#include <ngx_config.h>
-#include <ngx_core.h>
-#include <ngx_http.h>
-
-#include <zlib.h>
-
-
-#define NGX_SPDY_VERSION              3
-
-#define NGX_SPDY_NPN_ADVERTISE        "\x08spdy/3.1"
-#define NGX_SPDY_NPN_NEGOTIATED       "spdy/3.1"
-
-#define NGX_SPDY_STATE_BUFFER_SIZE    16
-
-#define NGX_SPDY_CTL_BIT              1
-
-#define NGX_SPDY_SYN_STREAM           1
-#define NGX_SPDY_SYN_REPLY            2
-#define NGX_SPDY_RST_STREAM           3
-#define NGX_SPDY_SETTINGS             4
-#define NGX_SPDY_PING                 6
-#define NGX_SPDY_GOAWAY               7
-#define NGX_SPDY_HEADERS              8
-#define NGX_SPDY_WINDOW_UPDATE        9
-
-#define NGX_SPDY_FRAME_HEADER_SIZE    8
-
-#define NGX_SPDY_SID_SIZE             4
-#define NGX_SPDY_DELTA_SIZE           4
-
-#define NGX_SPDY_SYN_STREAM_SIZE      10
-#define NGX_SPDY_SYN_REPLY_SIZE       4
-#define NGX_SPDY_RST_STREAM_SIZE      8
-#define NGX_SPDY_PING_SIZE            4
-#define NGX_SPDY_GOAWAY_SIZE          8
-#define NGX_SPDY_WINDOW_UPDATE_SIZE   8
-#define NGX_SPDY_NV_NUM_SIZE          4
-#define NGX_SPDY_NV_NLEN_SIZE         4
-#define NGX_SPDY_NV_VLEN_SIZE         4
-#define NGX_SPDY_SETTINGS_NUM_SIZE    4
-#define NGX_SPDY_SETTINGS_FID_SIZE    4
-#define NGX_SPDY_SETTINGS_VAL_SIZE    4
-
-#define NGX_SPDY_SETTINGS_PAIR_SIZE                                           \
-    (NGX_SPDY_SETTINGS_FID_SIZE + NGX_SPDY_SETTINGS_VAL_SIZE)
-
-#define NGX_SPDY_HIGHEST_PRIORITY     0
-#define NGX_SPDY_LOWEST_PRIORITY      7
-
-#define NGX_SPDY_FLAG_FIN             0x01
-#define NGX_SPDY_FLAG_UNIDIRECTIONAL  0x02
-#define NGX_SPDY_FLAG_CLEAR_SETTINGS  0x01
-
-#define NGX_SPDY_MAX_FRAME_SIZE       ((1 << 24) - 1)
-
-#define NGX_SPDY_DATA_DISCARD         1
-#define NGX_SPDY_DATA_ERROR           2
-#define NGX_SPDY_DATA_INTERNAL_ERROR  3
-
-
-typedef struct ngx_http_spdy_connection_s   ngx_http_spdy_connection_t;
-typedef struct ngx_http_spdy_out_frame_s    ngx_http_spdy_out_frame_t;
-
-
-typedef u_char *(*ngx_http_spdy_handler_pt) (ngx_http_spdy_connection_t *sc,
-    u_char *pos, u_char *end);
-
-struct ngx_http_spdy_connection_s {
-    ngx_connection_t                *connection;
-    ngx_http_connection_t           *http_connection;
-
-    ngx_uint_t                       processing;
-
-    size_t                           send_window;
-    size_t                           recv_window;
-    size_t                           init_window;
-
-    ngx_queue_t                      waiting;
-
-    u_char                           buffer[NGX_SPDY_STATE_BUFFER_SIZE];
-    size_t                           buffer_used;
-    ngx_http_spdy_handler_pt         handler;
-
-    z_stream                         zstream_in;
-    z_stream                         zstream_out;
-
-    ngx_pool_t                      *pool;
-
-    ngx_http_spdy_out_frame_t       *free_ctl_frames;
-    ngx_connection_t                *free_fake_connections;
-
-    ngx_http_spdy_stream_t         **streams_index;
-
-    ngx_http_spdy_out_frame_t       *last_out;
-
-    ngx_queue_t                      posted;
-
-    ngx_http_spdy_stream_t          *stream;
-
-    ngx_uint_t                       entries;
-    size_t                           length;
-    u_char                           flags;
-
-    ngx_uint_t                       last_sid;
-
-    unsigned                         blocked:1;
-    unsigned                         incomplete:1;
-};
-
-
-struct ngx_http_spdy_stream_s {
-    ngx_uint_t                       id;
-    ngx_http_request_t              *request;
-    ngx_http_spdy_connection_t      *connection;
-    ngx_http_spdy_stream_t          *index;
-
-    ngx_uint_t                       header_buffers;
-    ngx_uint_t                       queued;
-
-    /*
-     * A change to SETTINGS_INITIAL_WINDOW_SIZE could cause the
-     * send_window to become negative, hence it's signed.
-     */
-    ssize_t                          send_window;
-    size_t                           recv_window;
-
-    ngx_http_spdy_out_frame_t       *free_frames;
-    ngx_chain_t                     *free_data_headers;
-    ngx_chain_t                     *free_bufs;
-
-    ngx_queue_t                      queue;
-
-    unsigned                         priority:3;
-    unsigned                         handled:1;
-    unsigned                         blocked:1;
-    unsigned                         exhausted:1;
-    unsigned                         in_closed:1;
-    unsigned                         out_closed:1;
-    unsigned                         skip_data:2;
-};
-
-
-struct ngx_http_spdy_out_frame_s {
-    ngx_http_spdy_out_frame_t       *next;
-    ngx_chain_t                     *first;
-    ngx_chain_t                     *last;
-    ngx_int_t                      (*handler)(ngx_http_spdy_connection_t *sc,
-                                        ngx_http_spdy_out_frame_t *frame);
-
-    ngx_http_spdy_stream_t          *stream;
-    size_t                           length;
-
-    ngx_uint_t                       priority;
-    unsigned                         blocked:1;
-    unsigned                         fin:1;
-};
-
-
-static ngx_inline void
-ngx_http_spdy_queue_frame(ngx_http_spdy_connection_t *sc,
-    ngx_http_spdy_out_frame_t *frame)
-{
-    ngx_http_spdy_out_frame_t  **out;
-
-    for (out = &sc->last_out; *out; out = &(*out)->next)
-    {
-        /*
-         * NB: higher values represent lower priorities.
-         */
-        if (frame->priority >= (*out)->priority) {
-            break;
-        }
-    }
-
-    frame->next = *out;
-    *out = frame;
-}
-
-
-static ngx_inline void
-ngx_http_spdy_queue_blocked_frame(ngx_http_spdy_connection_t *sc,
-    ngx_http_spdy_out_frame_t *frame)
-{
-    ngx_http_spdy_out_frame_t  **out;
-
-    for (out = &sc->last_out; *out; out = &(*out)->next)
-    {
-        if ((*out)->blocked) {
-            break;
-        }
-    }
-
-    frame->next = *out;
-    *out = frame;
-}
-
-
-void ngx_http_spdy_init(ngx_event_t *rev);
-void ngx_http_spdy_request_headers_init(void);
-
-ngx_int_t ngx_http_spdy_read_request_body(ngx_http_request_t *r,
-    ngx_http_client_body_handler_pt post_handler);
-
-void ngx_http_spdy_close_stream(ngx_http_spdy_stream_t *stream, ngx_int_t rc);
-
-ngx_int_t ngx_http_spdy_send_output_queue(ngx_http_spdy_connection_t *sc);
-
-
-#define ngx_spdy_frame_aligned_write_uint16(p, s)                             \
-    (*(uint16_t *) (p) = htons((uint16_t) (s)), (p) + sizeof(uint16_t))
-
-#define ngx_spdy_frame_aligned_write_uint32(p, s)                             \
-    (*(uint32_t *) (p) = htonl((uint32_t) (s)), (p) + sizeof(uint32_t))
-
-#if (NGX_HAVE_NONALIGNED)
-
-#define ngx_spdy_frame_write_uint16  ngx_spdy_frame_aligned_write_uint16
-#define ngx_spdy_frame_write_uint32  ngx_spdy_frame_aligned_write_uint32
-
-#else
-
-#define ngx_spdy_frame_write_uint16(p, s)                                     \
-    ((p)[0] = (u_char) ((s) >> 8),                                            \
-     (p)[1] = (u_char)  (s),                                                  \
-     (p) + sizeof(uint16_t))
-
-#define ngx_spdy_frame_write_uint32(p, s)                                     \
-    ((p)[0] = (u_char) ((s) >> 24),                                           \
-     (p)[1] = (u_char) ((s) >> 16),                                           \
-     (p)[2] = (u_char) ((s) >> 8),                                            \
-     (p)[3] = (u_char)  (s),                                                  \
-     (p) + sizeof(uint32_t))
-
-#endif
-
-
-#define ngx_spdy_ctl_frame_head(t)                                            \
-    ((uint32_t) NGX_SPDY_CTL_BIT << 31 | NGX_SPDY_VERSION << 16 | (t))
-
-#define ngx_spdy_frame_write_head(p, t)                                       \
-    ngx_spdy_frame_aligned_write_uint32(p, ngx_spdy_ctl_frame_head(t))
-
-#define ngx_spdy_frame_write_flags_and_len(p, f, l)                           \
-    ngx_spdy_frame_aligned_write_uint32(p, (f) << 24 | (l))
-#define ngx_spdy_frame_write_flags_and_id(p, f, i)                            \
-    ngx_spdy_frame_aligned_write_uint32(p, (f) << 24 | (i))
-
-#define ngx_spdy_frame_write_sid     ngx_spdy_frame_aligned_write_uint32
-#define ngx_spdy_frame_write_window  ngx_spdy_frame_aligned_write_uint32
-
-#endif /* _NGX_HTTP_SPDY_H_INCLUDED_ */

  Deleted: vendor/nginx-1.8.0/src/http/ngx_http_spdy_filter_module.c (+0 -1222) 100644
===================================================================
--- vendor/nginx-1.8.0/src/http/ngx_http_spdy_filter_module.c    2015-09-27 18:09:01 +0900 (377e935)
+++ /dev/null
@@ -1,1222 +0,0 @@
-
-/*
- * Copyright (C) Nginx, Inc.
- * Copyright (C) Valentin V. Bartenev
- */
-
-
-#include <ngx_config.h>
-#include <ngx_core.h>
-#include <ngx_http.h>
-#include <nginx.h>
-#include <ngx_http_spdy_module.h>
-
-#include <zlib.h>
-
-
-#define ngx_http_spdy_nv_nsize(h)  (NGX_SPDY_NV_NLEN_SIZE + sizeof(h) - 1)
-#define ngx_http_spdy_nv_vsize(h)  (NGX_SPDY_NV_VLEN_SIZE + sizeof(h) - 1)
-
-#define ngx_http_spdy_nv_write_num   ngx_spdy_frame_write_uint32
-#define ngx_http_spdy_nv_write_nlen  ngx_spdy_frame_write_uint32
-#define ngx_http_spdy_nv_write_vlen  ngx_spdy_frame_write_uint32
-
-#define ngx_http_spdy_nv_write_name(p, h)                                     \
-    ngx_cpymem(ngx_http_spdy_nv_write_nlen(p, sizeof(h) - 1), h, sizeof(h) - 1)
-
-#define ngx_http_spdy_nv_write_val(p, h)                                      \
-    ngx_cpymem(ngx_http_spdy_nv_write_vlen(p, sizeof(h) - 1), h, sizeof(h) - 1)
-
-
-static ngx_chain_t *ngx_http_spdy_send_chain(ngx_connection_t *fc,
-    ngx_chain_t *in, off_t limit);
-
-static ngx_inline ngx_int_t ngx_http_spdy_filter_send(
-    ngx_connection_t *fc, ngx_http_spdy_stream_t *stream);
-static ngx_inline ngx_int_t ngx_http_spdy_flow_control(
-    ngx_http_spdy_connection_t *sc, ngx_http_spdy_stream_t *stream);
-static void ngx_http_spdy_waiting_queue(ngx_http_spdy_connection_t *sc,
-    ngx_http_spdy_stream_t *stream);
-
-static ngx_chain_t *ngx_http_spdy_filter_get_shadow(
-    ngx_http_spdy_stream_t *stream, ngx_buf_t *buf, off_t offset, off_t size);
-static ngx_http_spdy_out_frame_t *ngx_http_spdy_filter_get_data_frame(
-    ngx_http_spdy_stream_t *stream, size_t len, ngx_chain_t *first,
-    ngx_chain_t *last);
-
-static ngx_int_t ngx_http_spdy_syn_frame_handler(
-    ngx_http_spdy_connection_t *sc, ngx_http_spdy_out_frame_t *frame);
-static ngx_int_t ngx_http_spdy_data_frame_handler(
-    ngx_http_spdy_connection_t *sc, ngx_http_spdy_out_frame_t *frame);
-static ngx_inline void ngx_http_spdy_handle_frame(
-    ngx_http_spdy_stream_t *stream, ngx_http_spdy_out_frame_t *frame);
-static ngx_inline void ngx_http_spdy_handle_stream(
-    ngx_http_spdy_connection_t *sc, ngx_http_spdy_stream_t *stream);
-
-static void ngx_http_spdy_filter_cleanup(void *data);
-
-static ngx_int_t ngx_http_spdy_filter_init(ngx_conf_t *cf);
-
-
-static ngx_http_module_t  ngx_http_spdy_filter_module_ctx = {
-    NULL,                                  /* preconfiguration */
-    ngx_http_spdy_filter_init,             /* postconfiguration */
-
-    NULL,                                  /* create main configuration */
-    NULL,                                  /* init main configuration */
-
-    NULL,                                  /* create server configuration */
-    NULL,                                  /* merge server configuration */
-
-    NULL,                                  /* create location configuration */
-    NULL                                   /* merge location configuration */
-};
-
-
-ngx_module_t  ngx_http_spdy_filter_module = {
-    NGX_MODULE_V1,
-    &ngx_http_spdy_filter_module_ctx,      /* module context */
-    NULL,                                  /* module directives */
-    NGX_HTTP_MODULE,                       /* module type */
-    NULL,                                  /* init master */
-    NULL,                                  /* init module */
-    NULL,                                  /* init process */
-    NULL,                                  /* init thread */
-    NULL,                                  /* exit thread */
-    NULL,                                  /* exit process */
-    NULL,                                  /* exit master */
-    NGX_MODULE_V1_PADDING
-};
-
-
-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;
-
-
-static ngx_int_t
-ngx_http_spdy_header_filter(ngx_http_request_t *r)
-{
-    int                           rc;
-    size_t                        len;
-    u_char                       *p, *buf, *last;
-    ngx_buf_t                    *b;
-    ngx_str_t                     host;
-    ngx_uint_t                    i, j, count, port;
-    ngx_chain_t                  *cl;
-    ngx_list_part_t              *part, *pt;
-    ngx_table_elt_t              *header, *h;
-    ngx_connection_t             *c;
-    ngx_http_cleanup_t           *cln;
-    ngx_http_core_loc_conf_t     *clcf;
-    ngx_http_core_srv_conf_t     *cscf;
-    ngx_http_spdy_stream_t       *stream;
-    ngx_http_spdy_out_frame_t    *frame;
-    ngx_http_spdy_connection_t   *sc;
-    struct sockaddr_in           *sin;
-#if (NGX_HAVE_INET6)
-    struct sockaddr_in6          *sin6;
-#endif
-    u_char                        addr[NGX_SOCKADDR_STRLEN];
-
-    if (!r->spdy_stream) {
-        return ngx_http_next_header_filter(r);
-    }
-
-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-                   "spdy header filter");
-
-    if (r->header_sent) {
-        return NGX_OK;
-    }
-
-    r->header_sent = 1;
-
-    if (r != r->main) {
-        return NGX_OK;
-    }
-
-    c = r->connection;
-
-    if (r->method == NGX_HTTP_HEAD) {
-        r->header_only = 1;
-    }
-
-    switch (r->headers_out.status) {
-
-    case NGX_HTTP_OK:
-    case NGX_HTTP_PARTIAL_CONTENT:
-        break;
-
-    case NGX_HTTP_NOT_MODIFIED:
-        r->header_only = 1;
-        break;
-
-    case NGX_HTTP_NO_CONTENT:
-        r->header_only = 1;
-
-        ngx_str_null(&r->headers_out.content_type);
-
-        r->headers_out.content_length = NULL;
-        r->headers_out.content_length_n = -1;
-
-        /* fall through */
-
-    default:
-        r->headers_out.last_modified_time = -1;
-        r->headers_out.last_modified = NULL;
-    }
-
-    len = NGX_SPDY_NV_NUM_SIZE
-          + ngx_http_spdy_nv_nsize(":version")
-          + ngx_http_spdy_nv_vsize("HTTP/1.1")
-          + ngx_http_spdy_nv_nsize(":status")
-          + (r->headers_out.status_line.len
-             ? NGX_SPDY_NV_VLEN_SIZE + r->headers_out.status_line.len
-             : ngx_http_spdy_nv_vsize("418"));
-
-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
-
-    if (r->headers_out.server == NULL) {
-        len += ngx_http_spdy_nv_nsize("server");
-        len += clcf->server_tokens ? ngx_http_spdy_nv_vsize(NGINX_VER)
-                                   : ngx_http_spdy_nv_vsize("nginx");
-    }
-
-    if (r->headers_out.date == NULL) {
-        len += ngx_http_spdy_nv_nsize("date")
-               + ngx_http_spdy_nv_vsize("Wed, 31 Dec 1986 10:00:00 GMT");
-    }
-
-    if (r->headers_out.content_type.len) {
-        len += ngx_http_spdy_nv_nsize("content-type")
-               + NGX_SPDY_NV_VLEN_SIZE + r->headers_out.content_type.len;
-
-        if (r->headers_out.content_type_len == r->headers_out.content_type.len
-            && r->headers_out.charset.len)
-        {
-            len += sizeof("; charset=") - 1 + r->headers_out.charset.len;
-        }
-    }
-
-    if (r->headers_out.content_length == NULL
-        && r->headers_out.content_length_n >= 0)
-    {
-        len += ngx_http_spdy_nv_nsize("content-length")
-               + NGX_SPDY_NV_VLEN_SIZE + NGX_OFF_T_LEN;
-    }
-
-    if (r->headers_out.last_modified == NULL
-        && r->headers_out.last_modified_time != -1)
-    {
-        len += ngx_http_spdy_nv_nsize("last-modified")
-               + ngx_http_spdy_nv_vsize("Wed, 31 Dec 1986 10:00:00 GMT");
-    }
-
-    if (r->headers_out.location
-        && r->headers_out.location->value.len
-        && r->headers_out.location->value.data[0] == '/')
-    {
-        r->headers_out.location->hash = 0;
-
-        if (clcf->server_name_in_redirect) {
-            cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);
-            host = cscf->server_name;
-
-        } else if (r->headers_in.server.len) {
-            host = r->headers_in.server;
-
-        } else {
-            host.len = NGX_SOCKADDR_STRLEN;
-            host.data = addr;
-
-            if (ngx_connection_local_sockaddr(c, &host, 0) != NGX_OK) {
-                return NGX_ERROR;
-            }
-        }
-
-        switch (c->local_sockaddr->sa_family) {
-
-#if (NGX_HAVE_INET6)
-        case AF_INET6:
-            sin6 = (struct sockaddr_in6 *) c->local_sockaddr;
-            port = ntohs(sin6->sin6_port);
-            break;
-#endif
-#if (NGX_HAVE_UNIX_DOMAIN)
-        case AF_UNIX:
-            port = 0;
-            break;
-#endif
-        default: /* AF_INET */
-            sin = (struct sockaddr_in *) c->local_sockaddr;
-            port = ntohs(sin->sin_port);
-            break;
-        }
-
-        len += ngx_http_spdy_nv_nsize("location")
-               + ngx_http_spdy_nv_vsize("https://")
-               + host.len
-               + r->headers_out.location->value.len;
-
-        if (clcf->port_in_redirect) {
-
-#if (NGX_HTTP_SSL)
-            if (c->ssl)
-                port = (port == 443) ? 0 : port;
-            else
-#endif
-                port = (port == 80) ? 0 : port;
-
-        } else {
-            port = 0;
-        }
-
-        if (port) {
-            len += sizeof(":65535") - 1;
-        }
-
-    } else {
-        ngx_str_null(&host);
-        port = 0;
-    }
-
-    part = &r->headers_out.headers.part;
-    header = part->elts;
-
-    for (i = 0; /* void */; i++) {
-
-        if (i >= part->nelts) {
-            if (part->next == NULL) {
-                break;
-            }
-
-            part = part->next;
-            header = part->elts;
-            i = 0;
-        }
-
-        if (header[i].hash == 0) {
-            continue;
-        }
-
-        len += NGX_SPDY_NV_NLEN_SIZE + header[i].key.len
-               + NGX_SPDY_NV_VLEN_SIZE  + header[i].value.len;
-    }
-
-    buf = ngx_alloc(len, r->pool->log);
-    if (buf == NULL) {
-        return NGX_ERROR;
-    }
-
-    last = buf + NGX_SPDY_NV_NUM_SIZE;
-
-    last = ngx_http_spdy_nv_write_name(last, ":version");
-    last = ngx_http_spdy_nv_write_val(last, "HTTP/1.1");
-
-    last = ngx_http_spdy_nv_write_name(last, ":status");
-
-    if (r->headers_out.status_line.len) {
-        last = ngx_http_spdy_nv_write_vlen(last,
-                                           r->headers_out.status_line.len);
-        last = ngx_cpymem(last, r->headers_out.status_line.data,
-                          r->headers_out.status_line.len);
-    } else {
-        last = ngx_http_spdy_nv_write_vlen(last, 3);
-        last = ngx_sprintf(last, "%03ui", r->headers_out.status);
-    }
-
-    count = 2;
-
-    if (r->headers_out.server == NULL) {
-        last = ngx_http_spdy_nv_write_name(last, "server");
-        last = clcf->server_tokens
-               ? ngx_http_spdy_nv_write_val(last, NGINX_VER)
-               : ngx_http_spdy_nv_write_val(last, "nginx");
-
-        count++;
-    }
-
-    if (r->headers_out.date == NULL) {
-        last = ngx_http_spdy_nv_write_name(last, "date");
-
-        last = ngx_http_spdy_nv_write_vlen(last, ngx_cached_http_time.len);
-
-        last = ngx_cpymem(last, ngx_cached_http_time.data,
-                          ngx_cached_http_time.len);
-
-        count++;
-    }
-
-    if (r->headers_out.content_type.len) {
-
-        last = ngx_http_spdy_nv_write_name(last, "content-type");
-
-        p = last + NGX_SPDY_NV_VLEN_SIZE;
-
-        last = ngx_cpymem(p, r->headers_out.content_type.data,
-                          r->headers_out.content_type.len);
-
-        if (r->headers_out.content_type_len == r->headers_out.content_type.len
-            && r->headers_out.charset.len)
-        {
-            last = ngx_cpymem(last, "; charset=", sizeof("; charset=") - 1);
-
-            last = ngx_cpymem(last, r->headers_out.charset.data,
-                              r->headers_out.charset.len);
-
-            /* update r->headers_out.content_type for possible logging */
-
-            r->headers_out.content_type.len = last - p;
-            r->headers_out.content_type.data = p;
-        }
-
-        (void) ngx_http_spdy_nv_write_vlen(p - NGX_SPDY_NV_VLEN_SIZE,
-                                           r->headers_out.content_type.len);
-
-        count++;
-    }
-
-    if (r->headers_out.content_length == NULL
-        && r->headers_out.content_length_n >= 0)
-    {
-        last = ngx_http_spdy_nv_write_name(last, "content-length");
-
-        p = last + NGX_SPDY_NV_VLEN_SIZE;
-
-        last = ngx_sprintf(p, "%O", r->headers_out.content_length_n);
-
-        (void) ngx_http_spdy_nv_write_vlen(p - NGX_SPDY_NV_VLEN_SIZE,
-                                           last - p);
-
-        count++;
-    }
-
-    if (r->headers_out.last_modified == NULL
-        && r->headers_out.last_modified_time != -1)
-    {
-        last = ngx_http_spdy_nv_write_name(last, "last-modified");
-
-        p = last + NGX_SPDY_NV_VLEN_SIZE;
-
-        last = ngx_http_time(p, r->headers_out.last_modified_time);
-
-        (void) ngx_http_spdy_nv_write_vlen(p - NGX_SPDY_NV_VLEN_SIZE,
-                                           last - p);
-
-        count++;
-    }
-
-    if (host.data) {
-
-        last = ngx_http_spdy_nv_write_name(last, "location");
-
-        p = last + NGX_SPDY_NV_VLEN_SIZE;
-
-        last = ngx_cpymem(p, "http", sizeof("http") - 1);
-
-#if (NGX_HTTP_SSL)
-        if (c->ssl) {
-            *last++ ='s';
-        }
-#endif
-
-        *last++ = ':'; *last++ = '/'; *last++ = '/';
-
-        last = ngx_cpymem(last, host.data, host.len);
-
-        if (port) {
-            last = ngx_sprintf(last, ":%ui", port);
-        }
-
-        last = ngx_cpymem(last, r->headers_out.location->value.data,
-                          r->headers_out.location->value.len);
-
-        /* update r->headers_out.location->value for possible logging */
-
-        r->headers_out.location->value.len = last - p;
-        r->headers_out.location->value.data = p;
-        ngx_str_set(&r->headers_out.location->key, "location");
-
-        (void) ngx_http_spdy_nv_write_vlen(p - NGX_SPDY_NV_VLEN_SIZE,
-                                           r->headers_out.location->value.len);
-
-        count++;
-    }
-
-    part = &r->headers_out.headers.part;
-    header = part->elts;
-
-    for (i = 0; /* void */; i++) {
-
-        if (i >= part->nelts) {
-            if (part->next == NULL) {
-                break;
-            }
-
-            part = part->next;
-            header = part->elts;
-            i = 0;
-        }
-
-        if (header[i].hash == 0 || header[i].hash == 2) {
-            continue;
-        }
-
-        last = ngx_http_spdy_nv_write_nlen(last, header[i].key.len);
-
-        ngx_strlow(last, header[i].key.data, header[i].key.len);
-        last += header[i].key.len;
-
-        p = last + NGX_SPDY_NV_VLEN_SIZE;
-
-        last = ngx_cpymem(p, header[i].value.data, header[i].value.len);
-
-        pt = part;
-        h = header;
-
-        for (j = i + 1; /* void */; j++) {
-
-            if (j >= pt->nelts) {
-                if (pt->next == NULL) {
-                    break;
-                }
-
-                pt = pt->next;
-                h = pt->elts;
-                j = 0;
-            }
-
-            if (h[j].hash == 0 || h[j].hash == 2
-                || h[j].key.len != header[i].key.len
-                || ngx_strncasecmp(header[i].key.data, h[j].key.data,
-                                   header[i].key.len))
-            {
-                continue;
-            }
-
-            if (h[j].value.len) {
-                if (last != p) {
-                    *last++ = '\0';
-                }
-
-                last = ngx_cpymem(last, h[j].value.data, h[j].value.len);
-            }
-
-            h[j].hash = 2;
-        }
-
-        (void) ngx_http_spdy_nv_write_vlen(p - NGX_SPDY_NV_VLEN_SIZE,
-                                           last - p);
-
-        count++;
-    }
-
-    (void) ngx_http_spdy_nv_write_num(buf, count);
-
-    stream = r->spdy_stream;
-    sc = stream->connection;
-
-    len = last - buf;
-
-    b = ngx_create_temp_buf(r->pool, NGX_SPDY_FRAME_HEADER_SIZE
-                                     + NGX_SPDY_SYN_REPLY_SIZE
-                                     + deflateBound(&sc->zstream_out, len));
-    if (b == NULL) {
-        ngx_free(buf);
-        return NGX_ERROR;
-    }
-
-    b->last += NGX_SPDY_FRAME_HEADER_SIZE + NGX_SPDY_SYN_REPLY_SIZE;
-
-    sc->zstream_out.next_in = buf;
-    sc->zstream_out.avail_in = len;
-    sc->zstream_out.next_out = b->last;
-    sc->zstream_out.avail_out = b->end - b->last;
-
-    rc = deflate(&sc->zstream_out, Z_SYNC_FLUSH);
-
-    ngx_free(buf);
-
-    if (rc != Z_OK) {
-        ngx_log_error(NGX_LOG_ALERT, c->log, 0, "deflate() failed: %d", rc);
-        return NGX_ERROR;
-    }
-
-    ngx_log_debug5(NGX_LOG_DEBUG_HTTP, c->log, 0,
-                   "spdy deflate out: ni:%p no:%p ai:%ud ao:%ud rc:%d",
-                   sc->zstream_out.next_in, sc->zstream_out.next_out,
-                   sc->zstream_out.avail_in, sc->zstream_out.avail_out,
-                   rc);
-
-    b->last = sc->zstream_out.next_out;
-
-    p = b->pos;
-    p = ngx_spdy_frame_write_head(p, NGX_SPDY_SYN_REPLY);
-
-    len = b->last - b->pos;
-
-    r->header_size = len;
-
-    len -= NGX_SPDY_FRAME_HEADER_SIZE;
-
-    if (r->header_only) {
-        b->last_buf = 1;
-        p = ngx_spdy_frame_write_flags_and_len(p, NGX_SPDY_FLAG_FIN, len);
-
-    } else {
-        p = ngx_spdy_frame_write_flags_and_len(p, 0, len);
-    }
-
-    (void) ngx_spdy_frame_write_sid(p, stream->id);
-
-    cl = ngx_alloc_chain_link(r->pool);
-    if (cl == NULL) {
-        return NGX_ERROR;
-    }
-
-    cl->buf = b;
-    cl->next = NULL;
-
-    frame = ngx_palloc(r->pool, sizeof(ngx_http_spdy_out_frame_t));
-    if (frame == NULL) {
-        return NGX_ERROR;
-    }
-
-    frame->first = cl;
-    frame->last = cl;
-    frame->handler = ngx_http_spdy_syn_frame_handler;
-    frame->stream = stream;
-    frame->length = len;
-    frame->priority = stream->priority;
-    frame->blocked = 1;
-    frame->fin = r->header_only;
-
-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, stream->request->connection->log, 0,
-                   "spdy:%ui create SYN_REPLY frame %p: len:%uz",
-                   stream->id, frame, frame->length);
-
-    ngx_http_spdy_queue_blocked_frame(sc, frame);
-
-    cln = ngx_http_cleanup_add(r, 0);
-    if (cln == NULL) {
-        return NGX_ERROR;
-    }
-
-    cln->handler = ngx_http_spdy_filter_cleanup;
-    cln->data = stream;
-
-    stream->queued = 1;
-
-    c->send_chain = ngx_http_spdy_send_chain;
-    c->need_last_buf = 1;
-
-    return ngx_http_spdy_filter_send(c, stream);
-}
-
-
-static ngx_chain_t *
-ngx_http_spdy_send_chain(ngx_connection_t *fc, ngx_chain_t *in, off_t limit)
-{
-    off_t                        size, offset;
-    size_t                       rest, frame_size;
-    ngx_chain_t                 *cl, *out, **ln;
-    ngx_http_request_t          *r;
-    ngx_http_spdy_stream_t      *stream;
-    ngx_http_spdy_loc_conf_t    *slcf;
-    ngx_http_spdy_out_frame_t   *frame;
-    ngx_http_spdy_connection_t  *sc;
-
-    r = fc->data;
-    stream = r->spdy_stream;
-
-#if (NGX_SUPPRESS_WARN)
-    size = 0;
-#endif
-
-    while (in) {
-        size = ngx_buf_size(in->buf);
-
-        if (size || in->buf->last_buf) {
-            break;
-        }
-
-        in = in->next;
-    }
-
-    if (in == NULL) {
-
-        if (stream->queued) {
-            fc->write->delayed = 1;
-        } else {
-            fc->buffered &= ~NGX_SPDY_BUFFERED;
-        }
-
-        return NULL;
-    }
-
-    sc = stream->connection;
-
-    if (size && ngx_http_spdy_flow_control(sc, stream) == NGX_DECLINED) {
-        fc->write->delayed = 1;
-        return in;
-    }
-
-    if (limit == 0 || limit > (off_t) sc->send_window) {
-        limit = sc->send_window;
-    }
-
-    if (limit > stream->send_window) {
-        limit = (stream->send_window > 0) ? stream->send_window : 0;
-    }
-
-    if (in->buf->tag == (ngx_buf_tag_t) &ngx_http_spdy_filter_get_shadow) {
-        cl = ngx_alloc_chain_link(r->pool);
-        if (cl == NULL) {
-            return NGX_CHAIN_ERROR;
-        }
-
-        cl->buf = in->buf;
-        in->buf = cl->buf->shadow;
-
-        offset = ngx_buf_in_memory(in->buf)
-                 ? (cl->buf->pos - in->buf->pos)
-                 : (cl->buf->file_pos - in->buf->file_pos);
-
-        cl->next = stream->free_bufs;
-        stream->free_bufs = cl;
-
-    } else {
-        offset = 0;
-    }
-
-#if (NGX_SUPPRESS_WARN)
-    cl = NULL;
-#endif
-
-    slcf = ngx_http_get_module_loc_conf(r, ngx_http_spdy_module);
-
-    frame_size = (limit <= (off_t) slcf->chunk_size) ? (size_t) limit
-                                                     : slcf->chunk_size;
-
-    for ( ;; ) {
-        ln = &out;
-        rest = frame_size;
-
-        while ((off_t) rest >= size) {
-
-            if (offset) {
-                cl = ngx_http_spdy_filter_get_shadow(stream, in->buf,
-                                                     offset, size);
-                if (cl == NULL) {
-                    return NGX_CHAIN_ERROR;
-                }
-
-                offset = 0;
-
-            } else {
-                cl = ngx_alloc_chain_link(r->pool);
-                if (cl == NULL) {
-                    return NGX_CHAIN_ERROR;
-                }
-
-                cl->buf = in->buf;
-            }
-
-            *ln = cl;
-            ln = &cl->next;
-
-            rest -= (size_t) size;
-            in = in->next;
-
-            if (in == NULL) {
-                frame_size -= rest;
-                rest = 0;
-                break;
-            }
-
-            size = ngx_buf_size(in->buf);
-        }
-
-        if (rest) {
-            cl = ngx_http_spdy_filter_get_shadow(stream, in->buf,
-                                                 offset, rest);
-            if (cl == NULL) {
-                return NGX_CHAIN_ERROR;
-            }
-
-            cl->buf->flush = 0;
-            cl->buf->last_buf = 0;
-
-            *ln = cl;
-
-            offset += rest;
-            size -= rest;
-        }
-
-        frame = ngx_http_spdy_filter_get_data_frame(stream, frame_size,
-                                                    out, cl);
-        if (frame == NULL) {
-            return NGX_CHAIN_ERROR;
-        }
-
-        ngx_http_spdy_queue_frame(sc, frame);
-
-        sc->send_window -= frame_size;
-
-        stream->send_window -= frame_size;
-        stream->queued++;
-
-        if (in == NULL) {
-            break;
-        }
-
-        limit -= frame_size;
-
-        if (limit == 0) {
-            break;
-        }
-
-        if (limit < (off_t) slcf->chunk_size) {
-            frame_size = (size_t) limit;
-        }
-    }
-
-    if (offset) {
-        cl = ngx_http_spdy_filter_get_shadow(stream, in->buf, offset, size);
-        if (cl == NULL) {
-            return NGX_CHAIN_ERROR;
-        }
-
-        in->buf = cl->buf;
-        ngx_free_chain(r->pool, cl);
-    }
-
-    if (ngx_http_spdy_filter_send(fc, stream) == NGX_ERROR) {
-        return NGX_CHAIN_ERROR;
-    }
-
-    if (in && ngx_http_spdy_flow_control(sc, stream) == NGX_DECLINED) {
-        fc->write->delayed = 1;
-    }
-
-    return in;
-}
-
-
-static ngx_chain_t *
-ngx_http_spdy_filter_get_shadow(ngx_http_spdy_stream_t *stream, ngx_buf_t *buf,
-    off_t offset, off_t size)
-{
-    ngx_buf_t    *chunk;
-    ngx_chain_t  *cl;
-
-    cl = ngx_chain_get_free_buf(stream->request->pool, &stream->free_bufs);
-    if (cl == NULL) {
-        return NULL;
-    }
-
-    chunk = cl->buf;
-
-    ngx_memcpy(chunk, buf, sizeof(ngx_buf_t));
-
-    chunk->tag = (ngx_buf_tag_t) &ngx_http_spdy_filter_get_shadow;
-    chunk->shadow = buf;
-
-    if (ngx_buf_in_memory(chunk)) {
-        chunk->pos += offset;
-        chunk->last = chunk->pos + size;
-    }
-
-    if (chunk->in_file) {
-        chunk->file_pos += offset;
-        chunk->file_last = chunk->file_pos + size;
-    }
-
-    return cl;
-}
-
-
-static ngx_http_spdy_out_frame_t *
-ngx_http_spdy_filter_get_data_frame(ngx_http_spdy_stream_t *stream,
-    size_t len, ngx_chain_t *first, ngx_chain_t *last)
-{
-    u_char                     *p;
-    ngx_buf_t                  *buf;
-    ngx_uint_t                  flags;
-    ngx_chain_t                *cl;
-    ngx_http_spdy_out_frame_t  *frame;
-
-
-    frame = stream->free_frames;
-
-    if (frame) {
-        stream->free_frames = frame->next;
-
-    } else {
-        frame = ngx_palloc(stream->request->pool,
-                           sizeof(ngx_http_spdy_out_frame_t));
-        if (frame == NULL) {
-            return NULL;
-        }
-    }
-
-    flags = last->buf->last_buf ? NGX_SPDY_FLAG_FIN : 0;
-
-    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, stream->request->connection->log, 0,
-                   "spdy:%ui create DATA frame %p: len:%uz flags:%ui",
-                   stream->id, frame, len, flags);
-
-    cl = ngx_chain_get_free_buf(stream->request->pool,
-                                &stream->free_data_headers);
-    if (cl == NULL) {
-        return NULL;
-    }
-
-    buf = cl->buf;
-
-    if (buf->start) {
-        p = buf->start;
-        buf->pos = p;
-
-        p += NGX_SPDY_SID_SIZE;
-
-        (void) ngx_spdy_frame_write_flags_and_len(p, flags, len);
-
-    } else {
-        p = ngx_palloc(stream->request->pool, NGX_SPDY_FRAME_HEADER_SIZE);
-        if (p == NULL) {
-            return NULL;
-        }
-
-        buf->pos = p;
-        buf->start = p;
-
-        p = ngx_spdy_frame_write_sid(p, stream->id);
-        p = ngx_spdy_frame_write_flags_and_len(p, flags, len);
-
-        buf->last = p;
-        buf->end = p;
-
-        buf->tag = (ngx_buf_tag_t) &ngx_http_spdy_filter_get_data_frame;
-        buf->memory = 1;
-    }
-
-    cl->next = first;
-    first = cl;
-
-    last->buf->flush = 1;
-
-    frame->first = first;
-    frame->last = last;
-    frame->handler = ngx_http_spdy_data_frame_handler;
-    frame->stream = stream;
-    frame->length = len;
-    frame->priority = stream->priority;
-    frame->blocked = 0;
-    frame->fin = last->buf->last_buf;
-
-    return frame;
-}
-
-
-static ngx_inline ngx_int_t
-ngx_http_spdy_filter_send(ngx_connection_t *fc, ngx_http_spdy_stream_t *stream)
-{
-    stream->blocked = 1;
-
-    if (ngx_http_spdy_send_output_queue(stream->connection) == NGX_ERROR) {
-        fc->error = 1;
-        return NGX_ERROR;
-    }
-
-    stream->blocked = 0;
-
-    if (stream->queued) {
-        fc->buffered |= NGX_SPDY_BUFFERED;
-        fc->write->delayed = 1;
-        return NGX_AGAIN;
-    }
-
-    fc->buffered &= ~NGX_SPDY_BUFFERED;
-
-    return NGX_OK;
-}
-
-
-static ngx_inline ngx_int_t
-ngx_http_spdy_flow_control(ngx_http_spdy_connection_t *sc,
-    ngx_http_spdy_stream_t *stream)
-{
-    if (stream->send_window <= 0) {
-        stream->exhausted = 1;
-        return NGX_DECLINED;
-    }
-
-    if (sc->send_window == 0) {
-        ngx_http_spdy_waiting_queue(sc, stream);
-        return NGX_DECLINED;
-    }
-
-    return NGX_OK;
-}
-
-
-static void
-ngx_http_spdy_waiting_queue(ngx_http_spdy_connection_t *sc,
-    ngx_http_spdy_stream_t *stream)
-{
-    ngx_queue_t             *q;
-    ngx_http_spdy_stream_t  *s;
-
-    if (stream->handled) {
-        return;
-    }
-
-    stream->handled = 1;
-
-    for (q = ngx_queue_last(&sc->waiting);
-         q != ngx_queue_sentinel(&sc->waiting);
-         q = ngx_queue_prev(q))
-    {
-        s = ngx_queue_data(q, ngx_http_spdy_stream_t, queue);
-
-        /*
-         * NB: higher values represent lower priorities.
-         */
-        if (stream->priority >= s->priority) {
-            break;
-        }
-    }
-
-    ngx_queue_insert_after(q, &stream->queue);
-}
-
-
-static ngx_int_t
-ngx_http_spdy_syn_frame_handler(ngx_http_spdy_connection_t *sc,
-    ngx_http_spdy_out_frame_t *frame)
-{
-    ngx_buf_t               *buf;
-    ngx_http_spdy_stream_t  *stream;
-
-    buf = frame->first->buf;
-
-    if (buf->pos != buf->last) {
-        return NGX_AGAIN;
-    }
-
-    stream = frame->stream;
-
-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
-                   "spdy:%ui SYN_REPLY frame %p was sent", stream->id, frame);
-
-    ngx_free_chain(stream->request->pool, frame->first);
-
-    ngx_http_spdy_handle_frame(stream, frame);
-
-    ngx_http_spdy_handle_stream(sc, stream);
-
-    return NGX_OK;
-}
-
-
-static ngx_int_t
-ngx_http_spdy_data_frame_handler(ngx_http_spdy_connection_t *sc,
-    ngx_http_spdy_out_frame_t *frame)
-{
-    ngx_buf_t               *buf;
-    ngx_chain_t             *cl, *ln;
-    ngx_http_spdy_stream_t  *stream;
-
-    stream = frame->stream;
-
-    cl = frame->first;
-
-    if (cl->buf->tag == (ngx_buf_tag_t) &ngx_http_spdy_filter_get_data_frame) {
-
-        if (cl->buf->pos != cl->buf->last) {
-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
-                           "spdy:%ui DATA frame %p was sent partially",
-                           stream->id, frame);
-
-            return NGX_AGAIN;
-        }
-
-        ln = cl->next;
-
-        cl->next = stream->free_data_headers;
-        stream->free_data_headers = cl;
-
-        if (cl == frame->last) {
-            goto done;
-        }
-
-        cl = ln;
-    }
-
-    for ( ;; ) {
-        if (cl->buf->tag == (ngx_buf_tag_t) &ngx_http_spdy_filter_get_shadow) {
-            buf = cl->buf->shadow;
-
-            if (ngx_buf_in_memory(buf)) {
-                buf->pos = cl->buf->pos;
-            }
-
-            if (buf->in_file) {
-                buf->file_pos = cl->buf->file_pos;
-            }
-        }
-
-        if (ngx_buf_size(cl->buf) != 0) {
-
-            if (cl != frame->first) {
-                frame->first = cl;
-                ngx_http_spdy_handle_stream(sc, stream);
-            }
-
-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
-                           "spdy:%ui DATA frame %p was sent partially",
-                           stream->id, frame);
-
-            return NGX_AGAIN;
-        }
-
-        ln = cl->next;
-
-        if (cl->buf->tag == (ngx_buf_tag_t) &ngx_http_spdy_filter_get_shadow) {
-            cl->next = stream->free_bufs;
-            stream->free_bufs = cl;
-
-        } else {
-            ngx_free_chain(stream->request->pool, cl);
-        }
-
-        if (cl == frame->last) {
-            goto done;
-        }
-
-        cl = ln;
-    }
-
-done:
-
-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
-                   "spdy:%ui DATA frame %p was sent", stream->id, frame);
-
-    stream->request->header_size += NGX_SPDY_FRAME_HEADER_SIZE;
-
-    ngx_http_spdy_handle_frame(stream, frame);
-
-    ngx_http_spdy_handle_stream(sc, stream);
-
-    return NGX_OK;
-}
-
-
-static ngx_inline void
-ngx_http_spdy_handle_frame(ngx_http_spdy_stream_t *stream,
-    ngx_http_spdy_out_frame_t *frame)
-{
-    ngx_http_request_t  *r;
-
-    r = stream->request;
-
-    r->connection->sent += NGX_SPDY_FRAME_HEADER_SIZE + frame->length;
-
-    if (frame->fin) {
-        stream->out_closed = 1;
-    }
-
-    frame->next = stream->free_frames;
-    stream->free_frames = frame;
-
-    stream->queued--;
-}
-
-
-static ngx_inline void
-ngx_http_spdy_handle_stream(ngx_http_spdy_connection_t *sc,
-    ngx_http_spdy_stream_t *stream)
-{
-    ngx_event_t  *wev;
-
-    if (stream->handled || stream->blocked || stream->exhausted) {
-        return;
-    }
-
-    wev = stream->request->connection->write;
-
-    /*
-     * This timer can only be set if the stream was delayed because of rate
-     * limit.  In that case the event should be triggered by the timer.
-     */
-
-    if (!wev->timer_set) {
-        wev->delayed = 0;
-
-        stream->handled = 1;
-        ngx_queue_insert_tail(&sc->posted, &stream->queue);
-    }
-}
-
-
-static void
-ngx_http_spdy_filter_cleanup(void *data)
-{
-    ngx_http_spdy_stream_t *stream = data;
-
-    size_t                       delta;
-    ngx_http_spdy_out_frame_t   *frame, **fn;
-    ngx_http_spdy_connection_t  *sc;
-
-    if (stream->handled) {
-        stream->handled = 0;
-        ngx_queue_remove(&stream->queue);
-    }
-
-    if (stream->queued == 0) {
-        return;
-    }
-
-    delta = 0;
-    sc = stream->connection;
-    fn = &sc->last_out;
-
-    for ( ;; ) {
-        frame = *fn;
-
-        if (frame == NULL) {
-            break;
-        }
-
-        if (frame->stream == stream && !frame->blocked) {
-            *fn = frame->next;
-
-            delta += frame->length;
-
-            if (--stream->queued == 0) {
-                break;
-            }
-
-            continue;
-        }
-
-        fn = &frame->next;
-    }
-
-    if (sc->send_window == 0 && delta && !ngx_queue_empty(&sc->waiting)) {
-        ngx_queue_add(&sc->posted, &sc->waiting);
-        ngx_queue_init(&sc->waiting);
-    }
-
-    sc->send_window += delta;
-}
-
-
-static ngx_int_t
-ngx_http_spdy_filter_init(ngx_conf_t *cf)
-{
-    ngx_http_next_header_filter = ngx_http_top_header_filter;
-    ngx_http_top_header_filter = ngx_http_spdy_header_filter;
-
-    return NGX_OK;
-}

  Deleted: vendor/nginx-1.8.0/src/http/ngx_http_spdy_module.c (+0 -408) 100644
===================================================================
--- vendor/nginx-1.8.0/src/http/ngx_http_spdy_module.c    2015-09-27 18:09:01 +0900 (5178a36)
+++ /dev/null
@@ -1,408 +0,0 @@
-
-/*
- * Copyright (C) Nginx, Inc.
- * Copyright (C) Valentin V. Bartenev
- */
-
-
-#include <ngx_config.h>
-#include <ngx_core.h>
-#include <ngx_http.h>
-#include <ngx_http_spdy_module.h>
-
-
-static ngx_int_t ngx_http_spdy_add_variables(ngx_conf_t *cf);
-
-static ngx_int_t ngx_http_spdy_variable(ngx_http_request_t *r,
-    ngx_http_variable_value_t *v, uintptr_t data);
-static ngx_int_t ngx_http_spdy_request_priority_variable(ngx_http_request_t *r,
-    ngx_http_variable_value_t *v, uintptr_t data);
-
-static ngx_int_t ngx_http_spdy_module_init(ngx_cycle_t *cycle);
-
-static void *ngx_http_spdy_create_main_conf(ngx_conf_t *cf);
-static char *ngx_http_spdy_init_main_conf(ngx_conf_t *cf, void *conf);
-static void *ngx_http_spdy_create_srv_conf(ngx_conf_t *cf);
-static char *ngx_http_spdy_merge_srv_conf(ngx_conf_t *cf, void *parent,
-    void *child);
-static void *ngx_http_spdy_create_loc_conf(ngx_conf_t *cf);
-static char *ngx_http_spdy_merge_loc_conf(ngx_conf_t *cf, void *parent,
-    void *child);
-
-static char *ngx_http_spdy_recv_buffer_size(ngx_conf_t *cf, void *post,
-    void *data);
-static char *ngx_http_spdy_pool_size(ngx_conf_t *cf, void *post, void *data);
-static char *ngx_http_spdy_streams_index_mask(ngx_conf_t *cf, void *post,
-    void *data);
-static char *ngx_http_spdy_chunk_size(ngx_conf_t *cf, void *post, void *data);
-
-
-static ngx_conf_num_bounds_t  ngx_http_spdy_headers_comp_bounds = {
-    ngx_conf_check_num_bounds, 0, 9
-};
-
-static ngx_conf_post_t  ngx_http_spdy_recv_buffer_size_post =
-    { ngx_http_spdy_recv_buffer_size };
-static ngx_conf_post_t  ngx_http_spdy_pool_size_post =
-    { ngx_http_spdy_pool_size };
-static ngx_conf_post_t  ngx_http_spdy_streams_index_mask_post =
-    { ngx_http_spdy_streams_index_mask };
-static ngx_conf_post_t  ngx_http_spdy_chunk_size_post =
-    { ngx_http_spdy_chunk_size };
-
-
-static ngx_command_t  ngx_http_spdy_commands[] = {
-
-    { ngx_string("spdy_recv_buffer_size"),
-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,
-      ngx_conf_set_size_slot,
-      NGX_HTTP_MAIN_CONF_OFFSET,
-      offsetof(ngx_http_spdy_main_conf_t, recv_buffer_size),
-      &ngx_http_spdy_recv_buffer_size_post },
-
-    { ngx_string("spdy_pool_size"),
-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
-      ngx_conf_set_size_slot,
-      NGX_HTTP_SRV_CONF_OFFSET,
-      offsetof(ngx_http_spdy_srv_conf_t, pool_size),
-      &ngx_http_spdy_pool_size_post },
-
-    { ngx_string("spdy_max_concurrent_streams"),
-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
-      ngx_conf_set_num_slot,
-      NGX_HTTP_SRV_CONF_OFFSET,
-      offsetof(ngx_http_spdy_srv_conf_t, concurrent_streams),
-      NULL },
-
-    { ngx_string("spdy_streams_index_size"),
-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
-      ngx_conf_set_num_slot,
-      NGX_HTTP_SRV_CONF_OFFSET,
-      offsetof(ngx_http_spdy_srv_conf_t, streams_index_mask),
-      &ngx_http_spdy_streams_index_mask_post },
-
-    { ngx_string("spdy_recv_timeout"),
-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
-      ngx_conf_set_msec_slot,
-      NGX_HTTP_SRV_CONF_OFFSET,
-      offsetof(ngx_http_spdy_srv_conf_t, recv_timeout),
-      NULL },
-
-    { ngx_string("spdy_keepalive_timeout"),
-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
-      ngx_conf_set_msec_slot,
-      NGX_HTTP_SRV_CONF_OFFSET,
-      offsetof(ngx_http_spdy_srv_conf_t, keepalive_timeout),
-      NULL },
-
-    { ngx_string("spdy_headers_comp"),
-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
-      ngx_conf_set_num_slot,
-      NGX_HTTP_SRV_CONF_OFFSET,
-      offsetof(ngx_http_spdy_srv_conf_t, headers_comp),
-      &ngx_http_spdy_headers_comp_bounds },
-
-    { ngx_string("spdy_chunk_size"),
-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
-      ngx_conf_set_size_slot,
-      NGX_HTTP_LOC_CONF_OFFSET,
-      offsetof(ngx_http_spdy_loc_conf_t, chunk_size),
-      &ngx_http_spdy_chunk_size_post },
-
-      ngx_null_command
-};
-
-
-static ngx_http_module_t  ngx_http_spdy_module_ctx = {
-    ngx_http_spdy_add_variables,           /* preconfiguration */
-    NULL,                                  /* postconfiguration */
-
-    ngx_http_spdy_create_main_conf,        /* create main configuration */
-    ngx_http_spdy_init_main_conf,          /* init main configuration */
-
-    ngx_http_spdy_create_srv_conf,         /* create server configuration */
-    ngx_http_spdy_merge_srv_conf,          /* merge server configuration */
-
-    ngx_http_spdy_create_loc_conf,         /* create location configuration */
-    ngx_http_spdy_merge_loc_conf           /* merge location configuration */
-};
-
-
-ngx_module_t  ngx_http_spdy_module = {
-    NGX_MODULE_V1,
-    &ngx_http_spdy_module_ctx,             /* module context */
-    ngx_http_spdy_commands,                /* module directives */
-    NGX_HTTP_MODULE,                       /* module type */
-    NULL,                                  /* init master */
-    ngx_http_spdy_module_init,             /* init module */
-    NULL,                                  /* init process */
-    NULL,                                  /* init thread */
-    NULL,                                  /* exit thread */
-    NULL,                                  /* exit process */
-    NULL,                                  /* exit master */
-    NGX_MODULE_V1_PADDING
-};
-
-
-static ngx_http_variable_t  ngx_http_spdy_vars[] = {
-
-    { ngx_string("spdy"), NULL,
-      ngx_http_spdy_variable, 0, 0, 0 },
-
-    { ngx_string("spdy_request_priority"), NULL,
-      ngx_http_spdy_request_priority_variable, 0, 0, 0 },
-
-    { ngx_null_string, NULL, NULL, 0, 0, 0 }
-};
-
-
-static ngx_int_t
-ngx_http_spdy_add_variables(ngx_conf_t *cf)
-{
-   ngx_http_variable_t  *var, *v;
-
-    for (v = ngx_http_spdy_vars; v->name.len; v++) {
-        var = ngx_http_add_variable(cf, &v->name, v->flags);
-        if (var == NULL) {
-            return NGX_ERROR;
-        }
-
-        var->get_handler = v->get_handler;
-        var->data = v->data;
-    }
-
-    return NGX_OK;
-}
-
-
-static ngx_int_t
-ngx_http_spdy_variable(ngx_http_request_t *r,
-    ngx_http_variable_value_t *v, uintptr_t data)
-{
-    if (r->spdy_stream) {
-        v->len = sizeof("3.1") - 1;
-        v->valid = 1;
-        v->no_cacheable = 0;
-        v->not_found = 0;
-        v->data = (u_char *) "3.1";
-
-        return NGX_OK;
-    }
-
-    *v = ngx_http_variable_null_value;
-
-    return NGX_OK;
-}
-
-
-static ngx_int_t
-ngx_http_spdy_request_priority_variable(ngx_http_request_t *r,
-    ngx_http_variable_value_t *v, uintptr_t data)
-{
-    if (r->spdy_stream) {
-        v->len = 1;
-        v->valid = 1;
-        v->no_cacheable = 0;
-        v->not_found = 0;
-
-        v->data = ngx_pnalloc(r->pool, 1);
-        if (v->data == NULL) {
-            return NGX_ERROR;
-        }
-
-        v->data[0] = '0' + (u_char) r->spdy_stream->priority;
-
-        return NGX_OK;
-    }
-
-    *v = ngx_http_variable_null_value;
-
-    return NGX_OK;
-}
-
-
-static ngx_int_t
-ngx_http_spdy_module_init(ngx_cycle_t *cycle)
-{
-    ngx_http_spdy_request_headers_init();
-
-    return NGX_OK;
-}
-
-
-static void *
-ngx_http_spdy_create_main_conf(ngx_conf_t *cf)
-{
-    ngx_http_spdy_main_conf_t  *smcf;
-
-    smcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_spdy_main_conf_t));
-    if (smcf == NULL) {
-        return NULL;
-    }
-
-    smcf->recv_buffer_size = NGX_CONF_UNSET_SIZE;
-
-    return smcf;
-}
-
-
-static char *
-ngx_http_spdy_init_main_conf(ngx_conf_t *cf, void *conf)
-{
-    ngx_http_spdy_main_conf_t *smcf = conf;
-
-    ngx_conf_init_size_value(smcf->recv_buffer_size, 256 * 1024);
-
-    return NGX_CONF_OK;
-}
-
-
-static void *
-ngx_http_spdy_create_srv_conf(ngx_conf_t *cf)
-{
-    ngx_http_spdy_srv_conf_t  *sscf;
-
-    sscf = ngx_pcalloc(cf->pool, sizeof(ngx_http_spdy_srv_conf_t));
-    if (sscf == NULL) {
-        return NULL;
-    }
-
-    sscf->pool_size = NGX_CONF_UNSET_SIZE;
-
-    sscf->concurrent_streams = NGX_CONF_UNSET_UINT;
-    sscf->streams_index_mask = NGX_CONF_UNSET_UINT;
-
-    sscf->recv_timeout = NGX_CONF_UNSET_MSEC;
-    sscf->keepalive_timeout = NGX_CONF_UNSET_MSEC;
-
-    sscf->headers_comp = NGX_CONF_UNSET;
-
-    return sscf;
-}
-
-
-static char *
-ngx_http_spdy_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)
-{
-    ngx_http_spdy_srv_conf_t *prev = parent;
-    ngx_http_spdy_srv_conf_t *conf = child;
-
-    ngx_conf_merge_size_value(conf->pool_size, prev->pool_size, 4096);
-
-    ngx_conf_merge_uint_value(conf->concurrent_streams,
-                              prev->concurrent_streams, 100);
-
-    ngx_conf_merge_uint_value(conf->streams_index_mask,
-                              prev->streams_index_mask, 32 - 1);
-
-    ngx_conf_merge_msec_value(conf->recv_timeout,
-                              prev->recv_timeout, 30000);
-    ngx_conf_merge_msec_value(conf->keepalive_timeout,
-                              prev->keepalive_timeout, 180000);
-
-    ngx_conf_merge_value(conf->headers_comp, prev->headers_comp, 0);
-
-    return NGX_CONF_OK;
-}
-
-
-static void *
-ngx_http_spdy_create_loc_conf(ngx_conf_t *cf)
-{
-    ngx_http_spdy_loc_conf_t  *slcf;
-
-    slcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_spdy_loc_conf_t));
-    if (slcf == NULL) {
-        return NULL;
-    }
-
-    slcf->chunk_size = NGX_CONF_UNSET_SIZE;
-
-    return slcf;
-}
-
-
-static char *
-ngx_http_spdy_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
-{
-    ngx_http_spdy_loc_conf_t *prev = parent;
-    ngx_http_spdy_loc_conf_t *conf = child;
-
-    ngx_conf_merge_size_value(conf->chunk_size, prev->chunk_size, 8 * 1024);
-
-    return NGX_CONF_OK;
-}
-
-
-static char *
-ngx_http_spdy_recv_buffer_size(ngx_conf_t *cf, void *post, void *data)
-{
-    size_t *sp = data;
-
-    if (*sp <= 2 * NGX_SPDY_STATE_BUFFER_SIZE) {
-        return "value is too small";
-    }
-
-    return NGX_CONF_OK;
-}
-
-
-static char *
-ngx_http_spdy_pool_size(ngx_conf_t *cf, void *post, void *data)
-{
-    size_t *sp = data;
-
-    if (*sp < NGX_MIN_POOL_SIZE) {
-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
-                           "the pool size must be no less than %uz",
-                           NGX_MIN_POOL_SIZE);
-        return NGX_CONF_ERROR;
-    }
-
-    if (*sp % NGX_POOL_ALIGNMENT) {
-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
-                           "the pool size must be a multiple of %uz",
-                           NGX_POOL_ALIGNMENT);
-        return NGX_CONF_ERROR;
-    }
-
-    return NGX_CONF_OK;
-}
-
-
-static char *
-ngx_http_spdy_streams_index_mask(ngx_conf_t *cf, void *post, void *data)
-{
-    ngx_uint_t *np = data;
-
-    ngx_uint_t  mask;
-
-    mask = *np - 1;
-
-    if (*np == 0 || (*np & mask)) {
-        return "must be a power of two";
-    }
-
-    *np = mask;
-
-    return NGX_CONF_OK;
-}
-
-
-static char *
-ngx_http_spdy_chunk_size(ngx_conf_t *cf, void *post, void *data)
-{
-    size_t *sp = data;
-
-    if (*sp == 0) {
-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
-                           "the spdy chunk size cannot be zero");
-        return NGX_CONF_ERROR;
-    }
-
-    if (*sp > NGX_SPDY_MAX_FRAME_SIZE) {
-        *sp = NGX_SPDY_MAX_FRAME_SIZE;
-    }
-
-    return NGX_CONF_OK;
-}

  Deleted: vendor/nginx-1.8.0/src/http/ngx_http_upstream_round_robin.h (+0 -88) 100644
===================================================================
--- vendor/nginx-1.8.0/src/http/ngx_http_upstream_round_robin.h    2015-09-27 18:09:01 +0900 (3bbba0b)
+++ /dev/null
@@ -1,88 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) Nginx, Inc.
- */
-
-
-#ifndef _NGX_HTTP_UPSTREAM_ROUND_ROBIN_H_INCLUDED_
-#define _NGX_HTTP_UPSTREAM_ROUND_ROBIN_H_INCLUDED_
-
-
-#include <ngx_config.h>
-#include <ngx_core.h>
-#include <ngx_http.h>
-
-
-typedef struct {
-    struct sockaddr                *sockaddr;
-    socklen_t                       socklen;
-    ngx_str_t                       name;
-    ngx_str_t                       server;
-
-    ngx_int_t                       current_weight;
-    ngx_int_t                       effective_weight;
-    ngx_int_t                       weight;
-
-    ngx_uint_t                      fails;
-    time_t                          accessed;
-    time_t                          checked;
-
-    ngx_uint_t                      max_fails;
-    time_t                          fail_timeout;
-
-    ngx_uint_t                      down;          /* unsigned  down:1; */
-
-#if (NGX_HTTP_SSL)
-    ngx_ssl_session_t              *ssl_session;   /* local to a process */
-#endif
-} ngx_http_upstream_rr_peer_t;
-
-
-typedef struct ngx_http_upstream_rr_peers_s  ngx_http_upstream_rr_peers_t;
-
-struct ngx_http_upstream_rr_peers_s {
-    ngx_uint_t                      number;
-
-    ngx_uint_t                      total_weight;
-
-    unsigned                        single:1;
-    unsigned                        weighted:1;
-
-    ngx_str_t                      *name;
-
-    ngx_http_upstream_rr_peers_t   *next;
-
-    ngx_http_upstream_rr_peer_t     peer[1];
-};
-
-
-typedef struct {
-    ngx_http_upstream_rr_peers_t   *peers;
-    ngx_uint_t                      current;
-    uintptr_t                      *tried;
-    uintptr_t                       data;
-} ngx_http_upstream_rr_peer_data_t;
-
-
-ngx_int_t ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
-    ngx_http_upstream_srv_conf_t *us);
-ngx_int_t ngx_http_upstream_init_round_robin_peer(ngx_http_request_t *r,
-    ngx_http_upstream_srv_conf_t *us);
-ngx_int_t ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r,
-    ngx_http_upstream_resolved_t *ur);
-ngx_int_t ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc,
-    void *data);
-void ngx_http_upstream_free_round_robin_peer(ngx_peer_connection_t *pc,
-    void *data, ngx_uint_t state);
-
-#if (NGX_HTTP_SSL)
-ngx_int_t
-    ngx_http_upstream_set_round_robin_peer_session(ngx_peer_connection_t *pc,
-    void *data);
-void ngx_http_upstream_save_round_robin_peer_session(ngx_peer_connection_t *pc,
-    void *data);
-#endif
-
-
-#endif /* _NGX_HTTP_UPSTREAM_ROUND_ROBIN_H_INCLUDED_ */

  Deleted: vendor/nginx-1.8.0/src/os/unix/ngx_aio_read.c (+0 -109) 100644
===================================================================
--- vendor/nginx-1.8.0/src/os/unix/ngx_aio_read.c    2015-09-27 18:09:01 +0900 (7849881)
+++ /dev/null
@@ -1,109 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) Nginx, Inc.
- */
-
-
-#include <ngx_config.h>
-#include <ngx_core.h>
-#include <ngx_event.h>
-
-
-extern int  ngx_kqueue;
-
-
-ssize_t
-ngx_aio_read(ngx_connection_t *c, u_char *buf, size_t size)
-{
-    int           n;
-    ngx_event_t  *rev;
-
-    rev = c->read;
-
-    if (!rev->ready) {
-        ngx_log_error(NGX_LOG_ALERT, c->log, 0, "second aio post");
-        return NGX_AGAIN;
-    }
-
-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
-                   "rev->complete: %d", rev->complete);
-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
-                   "aio size: %d", size);
-
-    if (!rev->complete) {
-        ngx_memzero(&rev->aiocb, sizeof(struct aiocb));
-
-        rev->aiocb.aio_fildes = c->fd;
-        rev->aiocb.aio_buf = buf;
-        rev->aiocb.aio_nbytes = size;
-
-#if (NGX_HAVE_KQUEUE)
-        rev->aiocb.aio_sigevent.sigev_notify_kqueue = ngx_kqueue;
-        rev->aiocb.aio_sigevent.sigev_notify = SIGEV_KEVENT;
-        rev->aiocb.aio_sigevent.sigev_value.sigval_ptr = rev;
-#endif
-
-        if (aio_read(&rev->aiocb) == -1) {
-            ngx_log_error(NGX_LOG_CRIT, rev->log, ngx_errno,
-                          "aio_read() failed");
-            rev->error = 1;
-            return NGX_ERROR;
-        }
-
-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
-                       "aio_read: #%d OK", c->fd);
-
-        rev->active = 1;
-        rev->ready = 0;
-    }
-
-    rev->complete = 0;
-
-    n = aio_error(&rev->aiocb);
-    if (n == -1) {
-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, "aio_error() failed");
-        rev->error = 1;
-        return NGX_ERROR;
-    }
-
-    if (n != 0) {
-        if (n == NGX_EINPROGRESS) {
-            if (rev->ready) {
-                ngx_log_error(NGX_LOG_ALERT, c->log, n,
-                              "aio_read() still in progress");
-                rev->ready = 0;
-            }
-            return NGX_AGAIN;
-        }
-
-        ngx_log_error(NGX_LOG_CRIT, c->log, n, "aio_read() failed");
-        rev->error = 1;
-        rev->ready = 0;
-        return NGX_ERROR;
-    }
-
-    n = aio_return(&rev->aiocb);
-    if (n == -1) {
-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,
-                      "aio_return() failed");
-
-        rev->error = 1;
-        rev->ready = 0;
-        return NGX_ERROR;
-    }
-
-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, rev->log, 0,
-                   "aio_read: #%d %d", c->fd, n);
-
-    if (n == 0) {
-        rev->eof = 1;
-        rev->ready = 0;
-    } else {
-        rev->ready = 1;
-    }
-
-    rev->active = 0;
-
-    return n;
-}

  Deleted: vendor/nginx-1.8.0/src/os/unix/ngx_aio_read_chain.c (+0 -78) 100644
===================================================================
--- vendor/nginx-1.8.0/src/os/unix/ngx_aio_read_chain.c    2015-09-27 18:09:01 +0900 (d8722b2)
+++ /dev/null
@@ -1,78 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) Nginx, Inc.
- */
-
-
-#include <ngx_config.h>
-#include <ngx_core.h>
-#include <ngx_event.h>
-
-
-ssize_t
-ngx_aio_read_chain(ngx_connection_t *c, ngx_chain_t *cl, off_t limit)
-{
-    int           n;
-    u_char       *buf, *prev;
-    size_t        size;
-    ssize_t       total;
-
-    if (c->read->pending_eof) {
-        c->read->ready = 0;
-        return 0;
-    }
-
-    total = 0;
-
-    while (cl) {
-
-        /* we can post the single aio operation only */
-
-        if (!c->read->ready) {
-            return total ? total : NGX_AGAIN;
-        }
-
-        buf = cl->buf->last;
-        prev = cl->buf->last;
-        size = 0;
-
-        /* coalesce the neighbouring bufs */
-
-        while (cl && prev == cl->buf->last) {
-            size += cl->buf->end - cl->buf->last;
-            prev = cl->buf->end;
-            cl = cl->next;
-        }
-
-        n = ngx_aio_read(c, buf, size);
-
-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "aio_read: %d", n);
-
-        if (n == NGX_AGAIN) {
-            return total ? total : NGX_AGAIN;
-        }
-
-        if (n == NGX_ERROR) {
-            return NGX_ERROR;
-        }
-
-        if (n == 0) {
-            c->read->pending_eof = 1;
-            if (total) {
-                c->read->eof = 0;
-                c->read->ready = 1;
-            }
-            return total;
-        }
-
-        if (n > 0) {
-            total += n;
-        }
-
-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
-                       "aio_read total: %d", total);
-    }
-
-    return total ? total : NGX_AGAIN;
-}

  Deleted: vendor/nginx-1.8.0/src/os/unix/ngx_aio_write.c (+0 -109) 100644
===================================================================
--- vendor/nginx-1.8.0/src/os/unix/ngx_aio_write.c    2015-09-27 18:09:01 +0900 (f0d9391)
+++ /dev/null
@@ -1,109 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) Nginx, Inc.
- */
-
-
-#include <ngx_config.h>
-#include <ngx_core.h>
-#include <ngx_event.h>
-
-
-extern int  ngx_kqueue;
-
-
-ssize_t
-ngx_aio_write(ngx_connection_t *c, u_char *buf, size_t size)
-{
-    int           n;
-    ngx_event_t  *wev;
-
-    wev = c->write;
-
-    if (!wev->ready) {
-        return NGX_AGAIN;
-    }
-
-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, wev->log, 0,
-                   "aio: wev->complete: %d", wev->complete);
-
-    if (!wev->complete) {
-        ngx_memzero(&wev->aiocb, sizeof(struct aiocb));
-
-        wev->aiocb.aio_fildes = c->fd;
-        wev->aiocb.aio_buf = buf;
-        wev->aiocb.aio_nbytes = size;
-
-#if (NGX_HAVE_KQUEUE)
-        wev->aiocb.aio_sigevent.sigev_notify_kqueue = ngx_kqueue;
-        wev->aiocb.aio_sigevent.sigev_notify = SIGEV_KEVENT;
-        wev->aiocb.aio_sigevent.sigev_value.sigval_ptr = wev;
-#endif
-
-        if (aio_write(&wev->aiocb) == -1) {
-            ngx_log_error(NGX_LOG_CRIT, wev->log, ngx_errno,
-                          "aio_write() failed");
-            return NGX_ERROR;
-        }
-
-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, wev->log, 0, "aio_write: OK");
-
-        wev->active = 1;
-        wev->ready = 0;
-    }
-
-    wev->complete = 0;
-
-    n = aio_error(&wev->aiocb);
-    if (n == -1) {
-        ngx_log_error(NGX_LOG_CRIT, wev->log, ngx_errno, "aio_error() failed");
-        wev->error = 1;
-        return NGX_ERROR;
-    }
-
-    if (n != 0) {
-        if (n == NGX_EINPROGRESS) {
-            if (wev->ready) {
-                ngx_log_error(NGX_LOG_ALERT, wev->log, n,
-                              "aio_write() still in progress");
-                wev->ready = 0;
-            }
-            return NGX_AGAIN;
-        }
-
-        ngx_log_error(NGX_LOG_CRIT, wev->log, n, "aio_write() failed");
-        wev->error = 1;
-        wev->ready = 0;
-
-#if 1
-        n = aio_return(&wev->aiocb);
-        if (n == -1) {
-            ngx_log_error(NGX_LOG_ALERT, wev->log, ngx_errno,
-                          "aio_return() failed");
-        }
-
-        ngx_log_error(NGX_LOG_CRIT, wev->log, n, "aio_return() %d", n);
-#endif
-
-        return NGX_ERROR;
-    }
-
-    n = aio_return(&wev->aiocb);
-    if (n == -1) {
-        ngx_log_error(NGX_LOG_ALERT, wev->log, ngx_errno,
-                      "aio_return() failed");
-
-        wev->error = 1;
-        wev->ready = 0;
-        return NGX_ERROR;
-    }
-
-
-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, wev->log, 0, "aio_write: %d", n);
-
-    wev->active = 0;
-    wev->ready = 1;
-
-    return n;
-}

  Deleted: vendor/nginx-1.8.0/src/os/unix/ngx_aio_write_chain.c (+0 -100) 100644
===================================================================
--- vendor/nginx-1.8.0/src/os/unix/ngx_aio_write_chain.c    2015-09-27 18:09:01 +0900 (b0c2508)
+++ /dev/null
@@ -1,100 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) Nginx, Inc.
- */
-
-
-#include <ngx_config.h>
-#include <ngx_core.h>
-#include <ngx_event.h>
-
-
-ngx_chain_t *
-ngx_aio_write_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
-{
-    u_char       *buf, *prev;
-    off_t         send, sent;
-    size_t        len;
-    ssize_t       n, size;
-    ngx_chain_t  *cl;
-
-    /* the maximum limit size is the maximum size_t value - the page size */
-
-    if (limit == 0 || limit > (off_t) (NGX_MAX_SIZE_T_VALUE - ngx_pagesize)) {
-        limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize;
-    }
-
-    send = 0;
-    sent = 0;
-    cl = in;
-
-    while (cl) {
-
-        if (cl->buf->pos == cl->buf->last) {
-            cl = cl->next;
-            continue;
-        }
-
-        /* we can post the single aio operation only */
-
-        if (!c->write->ready) {
-            return cl;
-        }
-
-        buf = cl->buf->pos;
-        prev = buf;
-        len = 0;
-
-        /* coalesce the neighbouring bufs */
-
-        while (cl && prev == cl->buf->pos && send < limit) {
-            if (ngx_buf_special(cl->buf)) {
-                continue;
-            }
-
-            size = cl->buf->last - cl->buf->pos;
-
-            if (send + size > limit) {
-                size = limit - send;
-            }
-
-            len += size;
-            prev = cl->buf->pos + size;
-            send += size;
-            cl = cl->next;
-        }
-
-        n = ngx_aio_write(c, buf, len);
-
-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "aio_write: %z", n);
-
-        if (n == NGX_ERROR) {
-            return NGX_CHAIN_ERROR;
-        }
-
-        if (n > 0) {
-            sent += n;
-            c->sent += n;
-        }
-
-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
-                       "aio_write sent: %O", c->sent);
-
-        for (cl = in; cl; cl = cl->next) {
-
-            if (sent >= cl->buf->last - cl->buf->pos) {
-                sent -= cl->buf->last - cl->buf->pos;
-                cl->buf->pos = cl->buf->last;
-
-                continue;
-            }
-
-            cl->buf->pos += sent;
-
-            break;
-        }
-    }
-
-    return cl;
-}

  Deleted: vendor/nginx-1.8.0/src/os/win32/ngx_shmem.c (+0 -83) 100644
===================================================================
--- vendor/nginx-1.8.0/src/os/win32/ngx_shmem.c    2015-09-27 18:09:01 +0900 (5f3af8b)
+++ /dev/null
@@ -1,83 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) Nginx, Inc.
- */
-
-
-#include <ngx_config.h>
-#include <ngx_core.h>
-
-
-ngx_int_t
-ngx_shm_alloc(ngx_shm_t *shm)
-{
-    u_char    *name;
-    uint64_t   size;
-
-    name = ngx_alloc(shm->name.len + 2 + NGX_INT32_LEN, shm->log);
-    if (name == NULL) {
-        return NGX_ERROR;
-    }
-
-    (void) ngx_sprintf(name, "%V_%s%Z", &shm->name, ngx_unique);
-
-    ngx_set_errno(0);
-
-    size = shm->size;
-
-    shm->handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,
-                                    (u_long) (size >> 32),
-                                    (u_long) (size & 0xffffffff),
-                                    (char *) name);
-
-    if (shm->handle == NULL) {
-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
-                      "CreateFileMapping(%uz, %s) failed",
-                      shm->size, name);
-        ngx_free(name);
-
-        return NGX_ERROR;
-    }
-
-    ngx_free(name);
-
-    if (ngx_errno == ERROR_ALREADY_EXISTS) {
-        shm->exists = 1;
-    }
-
-    shm->addr = MapViewOfFile(shm->handle, FILE_MAP_WRITE, 0, 0, 0);
-
-    if (shm->addr != NULL) {
-        return NGX_OK;
-    }
-
-    ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
-                  "MapViewOfFile(%uz) of file mapping \"%V\" failed",
-                  shm->size, &shm->name);
-
-    if (CloseHandle(shm->handle) == 0) {
-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
-                      "CloseHandle() of file mapping \"%V\" failed",
-                      &shm->name);
-    }
-
-    return NGX_ERROR;
-}
-
-
-void
-ngx_shm_free(ngx_shm_t *shm)
-{
-    if (UnmapViewOfFile(shm->addr) == 0) {
-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
-                      "UnmapViewOfFile(%p) of file mapping \"%V\" failed",
-                      shm->addr, &shm->name);
-    }
-
-    if (CloseHandle(shm->handle) == 0) {
-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
-                      "CloseHandle() of file mapping \"%V\" failed",
-                      &shm->name);
-    }
-}

  Deleted: vendor/nginx-1.8.0/src/os/win32/ngx_thread.c (+0 -69) 100644
===================================================================
--- vendor/nginx-1.8.0/src/os/win32/ngx_thread.c    2015-09-27 18:09:01 +0900 (3255e01)
+++ /dev/null
@@ -1,69 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) Nginx, Inc.
- */
-
-
-#include <ngx_config.h>
-#include <ngx_core.h>
-
-
-ngx_int_t      ngx_threads_n;
-
-
-static size_t  stack_size;
-
-
-ngx_err_t
-ngx_create_thread(ngx_tid_t *tid,
-    ngx_thread_value_t (__stdcall *func)(void *arg), void *arg, ngx_log_t *log)
-{
-    u_long     id;
-    ngx_err_t  err;
-
-    *tid = CreateThread(NULL, stack_size, func, arg, 0, &id);
-
-    if (*tid != NULL) {
-        ngx_log_error(NGX_LOG_NOTICE, log, 0,
-                      "create thread " NGX_TID_T_FMT, id);
-        return 0;
-    }
-
-    err = ngx_errno;
-    ngx_log_error(NGX_LOG_ALERT, log, err, "CreateThread() failed");
-    return err;
-}
-
-
-ngx_int_t
-ngx_init_threads(int n, size_t size, ngx_cycle_t *cycle)
-{
-    stack_size = size;
-
-    return NGX_OK;
-}
-
-
-ngx_err_t
-ngx_thread_key_create(ngx_tls_key_t *key)
-{
-    *key = TlsAlloc();
-
-    if (*key == TLS_OUT_OF_INDEXES) {
-        return ngx_errno;
-    }
-
-    return 0;
-}
-
-
-ngx_err_t
-ngx_thread_set_tls(ngx_tls_key_t *key, void *data)
-{
-    if (TlsSetValue(*key, data) == 0) {
-        return ngx_errno;
-    }
-
-    return 0;
-}

  Renamed: vendor/nginx-1.9.5/auto/cc/acc (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/cc/bcc (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/cc/ccc (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/cc/clang (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/cc/conf (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/cc/gcc (+1 -1) 99%
===================================================================
--- vendor/nginx-1.8.0/auto/cc/gcc    2015-09-27 18:09:01 +0900 (727f11e)
+++ vendor/nginx-1.9.5/auto/cc/gcc    2015-09-27 22:10:53 +0900 (c9101fe)
@@ -153,7 +153,7 @@ CFLAGS="$CFLAGS -Wall -Wpointer-arith"
 
 
 case "$NGX_GCC_VER" in
-    3.* | 4.* )
+    [3-5].*)
         # we have a lot of the unused function arguments
         CFLAGS="$CFLAGS -Wno-unused-parameter"
         # 4.2.1 shows the warning in wrong places

  Renamed: vendor/nginx-1.9.5/auto/cc/icc (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/cc/msvc (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/cc/name (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/cc/owc (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/cc/sunc (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/configure (+1 -1) 98%
===================================================================
--- vendor/nginx-1.8.0/auto/configure    2015-09-27 18:09:01 +0900 (617d992)
+++ vendor/nginx-1.9.5/auto/configure    2015-09-27 22:10:53 +0900 (ceff15e)
@@ -11,7 +11,7 @@ export LC_ALL
 . auto/init
 . auto/sources
 
-test -d $NGX_OBJS || mkdir $NGX_OBJS
+test -d $NGX_OBJS || mkdir -p $NGX_OBJS
 
 echo > $NGX_AUTO_HEADERS_H
 echo > $NGX_AUTOCONF_ERR

  Renamed: vendor/nginx-1.9.5/auto/define (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/endianness (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/feature (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/have (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/have_headers (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/headers (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/include (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/init (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/install (+0 -4) 98%
===================================================================
--- vendor/nginx-1.8.0/auto/install    2015-09-27 18:09:01 +0900 (254f9bc)
+++ vendor/nginx-1.9.5/auto/install    2015-09-27 22:10:53 +0900 (f7f686c)
@@ -20,10 +20,6 @@ case ".$NGX_SBIN_PATH" in
     ./*)
     ;;
 
-    .)
-        NGX_SBIN_PATH=$NGX_PREFIX/sbin/nginx
-    ;;
-
     *)
         NGX_SBIN_PATH=$NGX_PREFIX/$NGX_SBIN_PATH
     ;;

  Renamed: vendor/nginx-1.9.5/auto/lib/conf (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/geoip/conf (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/google-perftools/conf (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/libatomic/conf (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/libatomic/make (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/libgd/conf (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/libxslt/conf (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/make (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/md5/conf (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/md5/make (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/md5/makefile.bcc (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/md5/makefile.msvc (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/md5/makefile.owc (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/openssl/conf (+48 -0) 62%
===================================================================
--- vendor/nginx-1.8.0/auto/lib/openssl/conf    2015-09-27 18:09:01 +0900 (a65815f)
+++ vendor/nginx-1.9.5/auto/lib/openssl/conf    2015-09-27 22:10:53 +0900 (bca2050)
@@ -55,6 +55,54 @@ else
         ngx_feature_test="SSL_library_init()"
         . auto/feature
 
+        if [ $ngx_found = no ]; then
+
+            # FreeBSD port
+
+            ngx_feature="OpenSSL library in /usr/local/"
+            ngx_feature_path="/usr/local/include"
+
+            if [ $NGX_RPATH = YES ]; then
+                ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lssl -lcrypto"
+            else
+                ngx_feature_libs="-L/usr/local/lib -lssl -lcrypto"
+            fi
+
+            . auto/feature
+        fi
+
+        if [ $ngx_found = no ]; then
+
+            # NetBSD port
+
+            ngx_feature="OpenSSL library in /usr/pkg/"
+            ngx_feature_path="/usr/pkg/include"
+
+            if [ $NGX_RPATH = YES ]; then
+                ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lssl -lcrypto"
+            else
+                ngx_feature_libs="-L/usr/pkg/lib -lssl -lcrypto"
+            fi
+
+            . auto/feature
+        fi
+
+        if [ $ngx_found = no ]; then
+
+            # MacPorts
+
+            ngx_feature="OpenSSL library in /opt/local/"
+            ngx_feature_path="/opt/local/include"
+
+            if [ $NGX_RPATH = YES ]; then
+                ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lssl -lcrypto"
+            else
+                ngx_feature_libs="-L/opt/local/lib -lssl -lcrypto"
+            fi
+
+            . auto/feature
+        fi
+
         if [ $ngx_found = yes ]; then
             have=NGX_SSL . auto/have
             CORE_LIBS="$CORE_LIBS $ngx_feature_libs $NGX_LIBDL"

  Renamed: vendor/nginx-1.9.5/auto/lib/openssl/make (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/openssl/makefile.bcc (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/openssl/makefile.msvc (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/pcre/conf (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/pcre/make (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/pcre/makefile.bcc (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/pcre/makefile.msvc (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/pcre/makefile.owc (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/perl/conf (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/perl/make (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/sha1/conf (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/sha1/make (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/sha1/makefile.bcc (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/sha1/makefile.msvc (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/sha1/makefile.owc (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/test (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/zlib/conf (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/zlib/make (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/zlib/makefile.bcc (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/zlib/makefile.msvc (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/lib/zlib/makefile.owc (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/make (+62 -5) 85%
===================================================================
--- vendor/nginx-1.8.0/auto/make    2015-09-27 18:09:01 +0900 (ed94e8f)
+++ vendor/nginx-1.9.5/auto/make    2015-09-27 22:10:53 +0900 (dca011c)
@@ -7,9 +7,10 @@ echo "creating $NGX_MAKEFILE"
 
 mkdir -p $NGX_OBJS/src/core $NGX_OBJS/src/event $NGX_OBJS/src/event/modules \
          $NGX_OBJS/src/os/unix $NGX_OBJS/src/os/win32 \
-         $NGX_OBJS/src/http $NGX_OBJS/src/http/modules \
+         $NGX_OBJS/src/http $NGX_OBJS/src/http/v2 $NGX_OBJS/src/http/modules \
          $NGX_OBJS/src/http/modules/perl \
          $NGX_OBJS/src/mail \
+         $NGX_OBJS/src/stream \
          $NGX_OBJS/src/misc
 
 
@@ -35,7 +36,7 @@ fi
 
 # ALL_INCS, required by the addons and by OpenWatcom C precompiled headers
 
-ngx_incs=`echo $CORE_INCS $NGX_OBJS $HTTP_INCS $MAIL_INCS\
+ngx_incs=`echo $CORE_INCS $NGX_OBJS $HTTP_INCS $MAIL_INCS $STREAM_INCS\
     | sed -e "s/  *\([^ ][^ ]*\)/$ngx_regex_cont$ngx_include_opt\1/g" \
           -e "s/\//$ngx_regex_dirsep/g"`
 
@@ -49,7 +50,7 @@ END
 ngx_all_srcs="$CORE_SRCS"
 
 
-# the core dependences and include paths
+# the core dependencies and include paths
 
 ngx_deps=`echo $CORE_DEPS $NGX_AUTO_CONFIG_H $NGX_PCH \
     | sed -e "s/  *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \
@@ -69,7 +70,7 @@ CORE_INCS = $ngx_include_opt$ngx_incs
 END
 
 
-# the http dependences and include paths
+# the http dependencies and include paths
 
 if [ $HTTP = YES ]; then
 
@@ -95,7 +96,7 @@ END
 fi
 
 
-# the mail dependences and include paths
+# the mail dependencies and include paths
 
 if [ $MAIL = YES ]; then
 
@@ -121,6 +122,32 @@ END
 fi
 
 
+# the stream dependencies and include paths
+
+if [ $STREAM = YES ]; then
+
+    ngx_all_srcs="$ngx_all_srcs $STREAM_SRCS"
+
+    ngx_deps=`echo $STREAM_DEPS \
+        | sed -e "s/  *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \
+              -e "s/\//$ngx_regex_dirsep/g"`
+
+    ngx_incs=`echo $STREAM_INCS \
+        | sed -e "s/  *\([^ ][^ ]*\)/$ngx_regex_cont$ngx_include_opt\1/g" \
+              -e "s/\//$ngx_regex_dirsep/g"`
+
+    cat << END                                                >> $NGX_MAKEFILE
+
+STREAM_DEPS = $ngx_deps
+
+
+STREAM_INCS = $ngx_include_opt$ngx_incs
+
+END
+
+fi
+
+
 ngx_all_srcs="$ngx_all_srcs $NGX_MISC_SRCS"
 
 
@@ -306,6 +333,36 @@ END
 fi
 
 
+# the stream sources
+
+if [ $STREAM = YES ]; then
+
+    if test -n "$NGX_PCH"; then
+        ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) $ngx_use_pch \$(ALL_INCS)"
+    else
+        ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) \$(CORE_INCS) \$(STREAM_INCS)"
+    fi
+
+    for ngx_src in $STREAM_SRCS
+    do
+        ngx_src=`echo $ngx_src | sed -e "s/\//$ngx_regex_dirsep/g"`
+        ngx_obj=`echo $ngx_src \
+            | sed -e "s#^\(.*\.\)cpp\\$#$ngx_objs_dir\1$ngx_objext#g" \
+                  -e "s#^\(.*\.\)cc\\$#$ngx_objs_dir\1$ngx_objext#g" \
+                  -e "s#^\(.*\.\)c\\$#$ngx_objs_dir\1$ngx_objext#g" \
+                  -e "s#^\(.*\.\)S\\$#$ngx_objs_dir\1$ngx_objext#g"`
+
+        cat << END                                            >> $NGX_MAKEFILE
+
+$ngx_obj:	\$(CORE_DEPS) \$(STREAM_DEPS)$ngx_cont$ngx_src
+	$ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX
+
+END
+     done
+
+fi
+
+
 # the misc sources
 
 if test -n "$NGX_MISC_SRCS"; then

  Renamed: vendor/nginx-1.9.5/auto/modules (+61 -16) 87%
===================================================================
--- vendor/nginx-1.8.0/auto/modules    2015-09-27 18:09:01 +0900 (5a56957)
+++ vendor/nginx-1.9.5/auto/modules    2015-09-27 22:10:53 +0900 (5c734e1)
@@ -49,13 +49,6 @@ if [ $NGX_TEST_BUILD_EPOLL = YES ]; then
     CORE_SRCS="$CORE_SRCS $EPOLL_SRCS"
 fi
 
-if [ $NGX_TEST_BUILD_RTSIG = YES ]; then
-    have=NGX_HAVE_RTSIG . auto/have
-    have=NGX_TEST_BUILD_RTSIG . auto/have
-    EVENT_MODULES="$EVENT_MODULES $RTSIG_MODULE"
-    CORE_SRCS="$CORE_SRCS $RTSIG_SRCS"
-fi
-
 if [ $NGX_TEST_BUILD_SOLARIS_SENDFILEV = YES ]; then
     have=NGX_TEST_BUILD_SOLARIS_SENDFILEV . auto/have
     CORE_SRCS="$CORE_SRCS $SOLARIS_SENDFILEV_SRCS"
@@ -101,7 +94,7 @@ fi
 #     ngx_http_write_filter
 #     ngx_http_header_filter
 #     ngx_http_chunked_filter
-#     ngx_http_spdy_filter
+#     ngx_http_v2_filter
 #     ngx_http_range_header_filter
 #     ngx_http_gzip_filter
 #     ngx_http_postpone_filter
@@ -122,8 +115,8 @@ HTTP_FILTER_MODULES="$HTTP_WRITE_FILTER_MODULE \
                      $HTTP_HEADER_FILTER_MODULE \
                      $HTTP_CHUNKED_FILTER_MODULE"
 
-if [ $HTTP_SPDY = YES ]; then
-    HTTP_FILTER_MODULES="$HTTP_FILTER_MODULES $HTTP_SPDY_FILTER_MODULE"
+if [ $HTTP_V2 = YES ]; then
+    HTTP_FILTER_MODULES="$HTTP_FILTER_MODULES $HTTP_V2_FILTER_MODULE"
 fi
 
 HTTP_FILTER_MODULES="$HTTP_FILTER_MODULES $HTTP_RANGE_HEADER_FILTER_MODULE"
@@ -187,12 +180,12 @@ if [ $HTTP_USERID = YES ]; then
 fi
 
 
-if [ $HTTP_SPDY = YES ]; then
-    have=NGX_HTTP_SPDY . auto/have
-    USE_ZLIB=YES
-    HTTP_MODULES="$HTTP_MODULES $HTTP_SPDY_MODULE"
-    HTTP_DEPS="$HTTP_DEPS $HTTP_SPDY_DEPS"
-    HTTP_SRCS="$HTTP_SRCS $HTTP_SPDY_SRCS"
+if [ $HTTP_V2 = YES ]; then
+    have=NGX_HTTP_V2 . auto/have
+    HTTP_MODULES="$HTTP_MODULES $HTTP_V2_MODULE"
+    HTTP_INCS="$HTTP_INCS $HTTP_V2_INCS"
+    HTTP_DEPS="$HTTP_DEPS $HTTP_V2_DEPS"
+    HTTP_SRCS="$HTTP_SRCS $HTTP_V2_SRCS"
 fi
 
 HTTP_MODULES="$HTTP_MODULES $HTTP_STATIC_MODULE"
@@ -391,6 +384,12 @@ if [ $HTTP_UPSTREAM_KEEPALIVE = YES ]; then
     HTTP_SRCS="$HTTP_SRCS $HTTP_UPSTREAM_KEEPALIVE_SRCS"
 fi
 
+if [ $HTTP_UPSTREAM_ZONE = YES ]; then
+    have=NGX_HTTP_UPSTREAM_ZONE . auto/have
+    HTTP_MODULES="$HTTP_MODULES $HTTP_UPSTREAM_ZONE_MODULE"
+    HTTP_SRCS="$HTTP_SRCS $HTTP_UPSTREAM_ZONE_SRCS"
+fi
+
 if [ $HTTP_STUB_STATUS = YES ]; then
     have=NGX_STAT_STUB . auto/have
     HTTP_MODULES="$HTTP_MODULES ngx_http_stub_status_module"
@@ -429,6 +428,12 @@ if [ $MAIL_SSL = YES ]; then
 fi
 
 
+if [ $STREAM_SSL = YES ]; then
+    have=NGX_STREAM_SSL . auto/have
+    USE_OPENSSL=YES
+fi
+
+
 modules="$CORE_MODULES $EVENT_MODULES"
 
 
@@ -499,6 +504,46 @@ if [ $MAIL = YES ]; then
 fi
 
 
+if [ $STREAM = YES ]; then
+    have=NGX_STREAM . auto/have
+    modules="$modules $STREAM_MODULES"
+
+    if [ $STREAM_SSL = YES ]; then
+        modules="$modules $STREAM_SSL_MODULE"
+        STREAM_DEPS="$STREAM_DEPS $STREAM_SSL_DEPS"
+        STREAM_SRCS="$STREAM_SRCS $STREAM_SSL_SRCS"
+    fi
+
+    if [ $STREAM_LIMIT_CONN = YES ]; then
+        modules="$modules $STREAM_LIMIT_CONN_MODULE"
+        STREAM_SRCS="$STREAM_SRCS $STREAM_LIMIT_CONN_SRCS"
+    fi
+
+    if [ $STREAM_ACCESS = YES ]; then
+        modules="$modules $STREAM_ACCESS_MODULE"
+        STREAM_SRCS="$STREAM_SRCS $STREAM_ACCESS_SRCS"
+    fi
+
+    if [ $STREAM_UPSTREAM_HASH = YES ]; then
+        modules="$modules $STREAM_UPSTREAM_HASH_MODULE"
+        STREAM_SRCS="$STREAM_SRCS $STREAM_UPSTREAM_HASH_SRCS"
+    fi
+
+    if [ $STREAM_UPSTREAM_LEAST_CONN = YES ]; then
+        modules="$modules $STREAM_UPSTREAM_LEAST_CONN_MODULE"
+        STREAM_SRCS="$STREAM_SRCS $STREAM_UPSTREAM_LEAST_CONN_SRCS"
+    fi
+
+    if [ $STREAM_UPSTREAM_ZONE = YES ]; then
+        have=NGX_STREAM_UPSTREAM_ZONE . auto/have
+        modules="$modules $STREAM_UPSTREAM_ZONE_MODULE"
+        STREAM_SRCS="$STREAM_SRCS $STREAM_UPSTREAM_ZONE_SRCS"
+    fi
+
+    NGX_ADDON_DEPS="$NGX_ADDON_DEPS \$(STREAM_DEPS)"
+fi
+
+
 if [ $NGX_GOOGLE_PERFTOOLS = YES ]; then
     modules="$modules $NGX_GOOGLE_PERFTOOLS_MODULE"
     NGX_MISC_SRCS="$NGX_MISC_SRCS $NGX_GOOGLE_PERFTOOLS_SRCS"

  Renamed: vendor/nginx-1.9.5/auto/nohave (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/options (+51 -18) 89%
===================================================================
--- vendor/nginx-1.8.0/auto/options    2015-09-27 18:09:01 +0900 (763871f)
+++ vendor/nginx-1.9.5/auto/options    2015-09-27 22:10:53 +0900 (efc8943)
@@ -30,7 +30,6 @@ NGX_RPATH=NO
 NGX_TEST_BUILD_DEVPOLL=NO
 NGX_TEST_BUILD_EVENTPORT=NO
 NGX_TEST_BUILD_EPOLL=NO
-NGX_TEST_BUILD_RTSIG=NO
 NGX_TEST_BUILD_SOLARIS_SENDFILEV=NO
 
 NGX_PLATFORM=
@@ -38,10 +37,8 @@ NGX_WINE=
 
 EVENT_FOUND=NO
 
-EVENT_RTSIG=NO
 EVENT_SELECT=NO
 EVENT_POLL=NO
-EVENT_AIO=NO
 
 USE_THREADS=NO
 
@@ -61,7 +58,7 @@ HTTP_CACHE=YES
 HTTP_CHARSET=YES
 HTTP_GZIP=YES
 HTTP_SSL=NO
-HTTP_SPDY=NO
+HTTP_V2=NO
 HTTP_SSI=YES
 HTTP_POSTPONE=NO
 HTTP_REALIP=NO
@@ -103,6 +100,7 @@ HTTP_UPSTREAM_HASH=YES
 HTTP_UPSTREAM_IP_HASH=YES
 HTTP_UPSTREAM_LEAST_CONN=YES
 HTTP_UPSTREAM_KEEPALIVE=YES
+HTTP_UPSTREAM_ZONE=YES
 
 # STUB
 HTTP_STUB_STATUS=NO
@@ -113,6 +111,14 @@ MAIL_POP3=YES
 MAIL_IMAP=YES
 MAIL_SMTP=YES
 
+STREAM=NO
+STREAM_SSL=NO
+STREAM_LIMIT_CONN=YES
+STREAM_ACCESS=YES
+STREAM_UPSTREAM_HASH=YES
+STREAM_UPSTREAM_LEAST_CONN=YES
+STREAM_UPSTREAM_ZONE=YES
+
 NGX_ADDONS=
 
 USE_PCRE=NO
@@ -183,12 +189,10 @@ do
         --build=*)                       NGX_BUILD="$value"         ;;
         --builddir=*)                    NGX_OBJS="$value"          ;;
 
-        --with-rtsig_module)             EVENT_RTSIG=YES            ;;
         --with-select_module)            EVENT_SELECT=YES           ;;
         --without-select_module)         EVENT_SELECT=NONE          ;;
         --with-poll_module)              EVENT_POLL=YES             ;;
         --without-poll_module)           EVENT_POLL=NONE            ;;
-        --with-aio_module)               EVENT_AIO=YES              ;;
 
         --with-threads)                  USE_THREADS=YES            ;;
 
@@ -206,7 +210,7 @@ do
         --http-scgi-temp-path=*)         NGX_HTTP_SCGI_TEMP_PATH="$value" ;;
 
         --with-http_ssl_module)          HTTP_SSL=YES               ;;
-        --with-http_spdy_module)         HTTP_SPDY=YES              ;;
+        --with-http_v2_module)           HTTP_V2=YES                ;;
         --with-http_realip_module)       HTTP_REALIP=YES            ;;
         --with-http_addition_module)     HTTP_ADDITION=YES          ;;
         --with-http_xslt_module)         HTTP_XSLT=YES              ;;
@@ -241,12 +245,6 @@ do
         --without-http_uwsgi_module)     HTTP_UWSGI=NO              ;;
         --without-http_scgi_module)      HTTP_SCGI=NO               ;;
         --without-http_memcached_module) HTTP_MEMCACHED=NO          ;;
-        --without-http_limit_zone_module)
-            HTTP_LIMIT_CONN=NO
-            NGX_POST_CONF_MSG="$NGX_POST_CONF_MSG
-$0: warning: the \"--without-http_limit_zone_module\" option is deprecated, \
-use the \"--without-http_limit_conn_module\" option instead"
-        ;;
         --without-http_limit_conn_module) HTTP_LIMIT_CONN=NO        ;;
         --without-http_limit_req_module) HTTP_LIMIT_REQ=NO         ;;
         --without-http_empty_gif_module) HTTP_EMPTY_GIF=NO          ;;
@@ -256,6 +254,7 @@ use the \"--without-http_limit_conn_module\" option instead"
         --without-http_upstream_least_conn_module)
                                          HTTP_UPSTREAM_LEAST_CONN=NO ;;
         --without-http_upstream_keepalive_module) HTTP_UPSTREAM_KEEPALIVE=NO ;;
+        --without-http_upstream_zone_module) HTTP_UPSTREAM_ZONE=NO  ;;
 
         --with-http_perl_module)         HTTP_PERL=YES              ;;
         --with-perl_modules_path=*)      NGX_PERL_MODULES="$value"  ;;
@@ -267,12 +266,34 @@ use the \"--without-http_limit_conn_module\" option instead"
         --with-mail)                     MAIL=YES                   ;;
         --with-mail_ssl_module)          MAIL_SSL=YES               ;;
         # STUB
-        --with-imap)                     MAIL=YES                   ;;
-        --with-imap_ssl_module)          MAIL_SSL=YES               ;;
+        --with-imap)
+            MAIL=YES
+            NGX_POST_CONF_MSG="$NGX_POST_CONF_MSG
+$0: warning: the \"--with-imap\" option is deprecated, \
+use the \"--with-mail\" option instead"
+        ;;
+        --with-imap_ssl_module)
+            MAIL_SSL=YES
+            NGX_POST_CONF_MSG="$NGX_POST_CONF_MSG
+$0: warning: the \"--with-imap_ssl_module\" option is deprecated, \
+use the \"--with-mail_ssl_module\" option instead"
+        ;;
         --without-mail_pop3_module)      MAIL_POP3=NO               ;;
         --without-mail_imap_module)      MAIL_IMAP=NO               ;;
         --without-mail_smtp_module)      MAIL_SMTP=NO               ;;
 
+        --with-stream)                   STREAM=YES                 ;;
+        --with-stream_ssl_module)        STREAM_SSL=YES             ;;
+        --without-stream_limit_conn_module)
+                                         STREAM_LIMIT_CONN=NO       ;;
+        --without-stream_access_module)  STREAM_ACCESS=NO           ;;
+        --without-stream_upstream_hash_module)
+                                         STREAM_UPSTREAM_HASH=NO    ;;
+        --without-stream_upstream_least_conn_module)
+                                         STREAM_UPSTREAM_LEAST_CONN=NO ;;
+        --without-stream_upstream_zone_module)
+                                         STREAM_UPSTREAM_ZONE=NO    ;;
+
         --with-google_perftools_module)  NGX_GOOGLE_PERFTOOLS=YES   ;;
         --with-cpp_test_module)          NGX_CPP_TEST=YES           ;;
 
@@ -312,7 +333,6 @@ use the \"--without-http_limit_conn_module\" option instead"
         --test-build-devpoll)            NGX_TEST_BUILD_DEVPOLL=YES ;;
         --test-build-eventport)          NGX_TEST_BUILD_EVENTPORT=YES ;;
         --test-build-epoll)              NGX_TEST_BUILD_EPOLL=YES   ;;
-        --test-build-rtsig)              NGX_TEST_BUILD_RTSIG=YES   ;;
         --test-build-solaris-sendfilev)  NGX_TEST_BUILD_SOLARIS_SENDFILEV=YES ;;
 
         *)
@@ -347,7 +367,6 @@ cat << END
   --build=NAME                       set build name
   --builddir=DIR                     set build directory
 
-  --with-rtsig_module                enable rtsig module
   --with-select_module               enable select module
   --without-select_module            disable select module
   --with-poll_module                 enable poll module
@@ -359,7 +378,7 @@ cat << END
   --with-ipv6                        enable IPv6 support
 
   --with-http_ssl_module             enable ngx_http_ssl_module
-  --with-http_spdy_module            enable ngx_http_spdy_module
+  --with-http_v2_module              enable ngx_http_v2_module
   --with-http_realip_module          enable ngx_http_realip_module
   --with-http_addition_module        enable ngx_http_addition_module
   --with-http_xslt_module            enable ngx_http_xslt_module
@@ -406,6 +425,8 @@ cat << END
                                      disable ngx_http_upstream_least_conn_module
   --without-http_upstream_keepalive_module
                                      disable ngx_http_upstream_keepalive_module
+  --without-http_upstream_zone_module
+                                     disable ngx_http_upstream_zone_module
 
   --with-http_perl_module            enable ngx_http_perl_module
   --with-perl_modules_path=PATH      set Perl modules path
@@ -432,6 +453,17 @@ cat << END
   --without-mail_imap_module         disable ngx_mail_imap_module
   --without-mail_smtp_module         disable ngx_mail_smtp_module
 
+  --with-stream                      enable TCP proxy module
+  --with-stream_ssl_module           enable ngx_stream_ssl_module
+  --without-stream_limit_conn_module disable ngx_stream_limit_conn_module
+  --without-stream_access_module     disable ngx_stream_access_module
+  --without-stream_upstream_hash_module
+                                     disable ngx_stream_upstream_hash_module
+  --without-stream_upstream_least_conn_module
+                                     disable ngx_stream_upstream_least_conn_module
+  --without-stream_upstream_zone_module
+                                     disable ngx_stream_upstream_zone_module
+
   --with-google_perftools_module     enable ngx_google_perftools_module
   --with-cpp_test_module             enable ngx_cpp_test_module
 
@@ -497,6 +529,7 @@ if [ ".$NGX_PLATFORM" = ".win32" ]; then
 fi
 
 
+NGX_SBIN_PATH=${NGX_SBIN_PATH:-sbin/nginx}
 NGX_CONF_PATH=${NGX_CONF_PATH:-conf/nginx.conf}
 NGX_CONF_PREFIX=`dirname $NGX_CONF_PATH`
 NGX_PID_PATH=${NGX_PID_PATH:-logs/nginx.pid}

  Renamed: vendor/nginx-1.9.5/auto/os/conf (+9 -0) 89%
===================================================================
--- vendor/nginx-1.8.0/auto/os/conf    2015-09-27 18:09:01 +0900 (fe72016)
+++ vendor/nginx-1.9.5/auto/os/conf    2015-09-27 22:10:53 +0900 (6ad0e74)
@@ -60,6 +60,15 @@ case "$NGX_PLATFORM" in
         CORE_SRCS="$UNIX_SRCS"
     ;;
 
+    GNU:*)
+        # GNU Hurd
+        have=NGX_GNU_HURD . auto/have_headers
+        CORE_INCS="$UNIX_INCS"
+        CORE_DEPS="$UNIX_DEPS $POSIX_DEPS"
+        CORE_SRCS="$UNIX_SRCS"
+        CC_AUX_FLAGS="$CC_AUX_FLAGS -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64"
+    ;;
+
     *)
         CORE_INCS="$UNIX_INCS"
         CORE_DEPS="$UNIX_DEPS $POSIX_DEPS"

  Renamed: vendor/nginx-1.9.5/auto/os/darwin (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/os/freebsd (+0 -20) 85%
===================================================================
--- vendor/nginx-1.8.0/auto/os/freebsd    2015-09-27 18:09:01 +0900 (6c69632)
+++ vendor/nginx-1.9.5/auto/os/freebsd    2015-09-27 22:10:53 +0900 (937ca20)
@@ -99,26 +99,6 @@ then
 fi
 
 
-if [ $EVENT_AIO = YES ]; then
-    if [ \( $version -lt 500000 -a $version -ge 430000 \) \
-         -o $version -ge 500014 ]
-    then
-        have=NGX_HAVE_AIO . auto/have
-        EVENT_MODULES="$EVENT_MODULES $AIO_MODULE"
-        CORE_SRCS="$CORE_SRCS $AIO_SRCS"
-    else
-
-cat << END
-
-$0: error: the kqueue does not support AIO on this FreeBSD version
-
-END
-
-        exit 1
-    fi
-fi
-
-
 # cpuset_setaffinity()
 
 if [ $version -ge 701000 ]; then

  Renamed: vendor/nginx-1.9.5/auto/os/linux (+0 -12) 93%
===================================================================
--- vendor/nginx-1.8.0/auto/os/linux    2015-09-27 18:09:01 +0900 (19bf832)
+++ vendor/nginx-1.9.5/auto/os/linux    2015-09-27 22:10:53 +0900 (c932267)
@@ -26,18 +26,6 @@ version=$((`uname -r \
 version=${version:-0}
 
 
-# enable the rt signals on Linux between 2.2.19 and 2.6.17
-
-if [ \( $version -ge 131603 -a $version -lt 132626 \) -o $EVENT_RTSIG = YES ]
-then
-    echo " + rt signals found"
-    have=NGX_HAVE_RTSIG . auto/have
-    EVENT_MODULES="$EVENT_MODULES $RTSIG_MODULE"
-    CORE_SRCS="$CORE_SRCS $RTSIG_SRCS"
-    EVENT_FOUND=YES
-fi
-
-
 # posix_fadvise64() had been implemented in 2.5.60
 
 if [ $version -lt 132412 ]; then

  Renamed: vendor/nginx-1.9.5/auto/os/solaris (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/os/win32 (+0 -1) 96%
===================================================================
--- vendor/nginx-1.8.0/auto/os/win32    2015-09-27 18:09:01 +0900 (0b9b461)
+++ vendor/nginx-1.9.5/auto/os/win32    2015-09-27 22:10:53 +0900 (82fc212)
@@ -36,5 +36,4 @@ if [ $NGX_IPV6 = YES ]; then
     have=NGX_HAVE_INET6 . auto/have
 fi
 
-have=NGX_HAVE_AIO . auto/have
 have=NGX_HAVE_IOCP . auto/have

  Renamed: vendor/nginx-1.9.5/auto/sources (+60 -18) 88%
===================================================================
--- vendor/nginx-1.8.0/auto/sources    2015-09-27 18:09:01 +0900 (9003789)
+++ vendor/nginx-1.9.5/auto/sources    2015-09-27 22:10:53 +0900 (2abbc60)
@@ -19,6 +19,7 @@ CORE_DEPS="src/core/nginx.h \
            src/core/ngx_queue.h \
            src/core/ngx_string.h \
            src/core/ngx_parse.h \
+           src/core/ngx_parse_time.h \
            src/core/ngx_inet.h \
            src/core/ngx_file.h \
            src/core/ngx_crc.h \
@@ -28,6 +29,7 @@ CORE_DEPS="src/core/nginx.h \
            src/core/ngx_sha1.h \
            src/core/ngx_rbtree.h \
            src/core/ngx_radix_tree.h \
+           src/core/ngx_rwlock.h \
            src/core/ngx_slab.h \
            src/core/ngx_times.h \
            src/core/ngx_shmtx.h \
@@ -52,6 +54,7 @@ CORE_SRCS="src/core/nginx.c \
            src/core/ngx_output_chain.c \
            src/core/ngx_string.c \
            src/core/ngx_parse.c \
+           src/core/ngx_parse_time.c \
            src/core/ngx_inet.c \
            src/core/ngx_file.c \
            src/core/ngx_crc32.c \
@@ -65,6 +68,7 @@ CORE_SRCS="src/core/nginx.c \
            src/core/ngx_connection.c \
            src/core/ngx_cycle.c \
            src/core/ngx_spinlock.c \
+           src/core/ngx_rwlock.c \
            src/core/ngx_cpuinfo.c \
            src/core/ngx_conf_file.c \
            src/core/ngx_resolver.c \
@@ -122,19 +126,9 @@ EVENTPORT_SRCS=src/event/modules/ngx_eventport_module.c
 EPOLL_MODULE=ngx_epoll_module
 EPOLL_SRCS=src/event/modules/ngx_epoll_module.c
 
-RTSIG_MODULE=ngx_rtsig_module
-RTSIG_SRCS=src/event/modules/ngx_rtsig_module.c
-
 IOCP_MODULE=ngx_iocp_module
 IOCP_SRCS=src/event/modules/ngx_iocp_module.c
 
-AIO_MODULE=ngx_aio_module
-AIO_SRCS="src/event/modules/ngx_aio_module.c \
-          src/os/unix/ngx_aio_read.c \
-          src/os/unix/ngx_aio_write.c \
-          src/os/unix/ngx_aio_read_chain.c \
-          src/os/unix/ngx_aio_write_chain.c"
-
 FILE_AIO_SRCS="src/os/unix/ngx_file_aio_read.c"
 LINUX_AIO_SRCS="src/os/unix/ngx_linux_aio_read.c"
 
@@ -311,7 +305,6 @@ HTTP_SRCS="src/http/ngx_http.c \
            src/http/ngx_http_script.c \
            src/http/ngx_http_upstream.c \
            src/http/ngx_http_upstream_round_robin.c \
-           src/http/ngx_http_parse_time.c \
            src/http/modules/ngx_http_static_module.c \
            src/http/modules/ngx_http_index_module.c \
            src/http/modules/ngx_http_chunked_filter_module.c \
@@ -324,13 +317,17 @@ HTTP_POSTPONE_FILTER_SRCS=src/http/ngx_http_postpone_filter_module.c
 HTTP_FILE_CACHE_SRCS=src/http/ngx_http_file_cache.c
 
 
-HTTP_SPDY_MODULE=ngx_http_spdy_module
-HTTP_SPDY_FILTER_MODULE=ngx_http_spdy_filter_module
-HTTP_SPDY_DEPS="src/http/ngx_http_spdy.h \
-                src/http/ngx_http_spdy_module.h"
-HTTP_SPDY_SRCS="src/http/ngx_http_spdy.c \
-                src/http/ngx_http_spdy_module.c \
-                src/http/ngx_http_spdy_filter_module.c"
+HTTP_V2_MODULE=ngx_http_v2_module
+HTTP_V2_FILTER_MODULE=ngx_http_v2_filter_module
+HTTP_V2_INCS="src/http/v2"
+HTTP_V2_DEPS="src/http/v2/ngx_http_v2.h \
+              src/http/v2/ngx_http_v2_module.h"
+HTTP_V2_SRCS="src/http/v2/ngx_http_v2.c \
+              src/http/v2/ngx_http_v2_table.c \
+              src/http/v2/ngx_http_v2_huff_decode.c \
+              src/http/v2/ngx_http_v2_huff_encode.c \
+              src/http/v2/ngx_http_v2_module.c \
+              src/http/v2/ngx_http_v2_filter_module.c"
 
 
 HTTP_CHARSET_FILTER_MODULE=ngx_http_charset_filter_module
@@ -511,6 +508,11 @@ HTTP_UPSTREAM_KEEPALIVE_SRCS=" \
     src/http/modules/ngx_http_upstream_keepalive_module.c"
 
 
+HTTP_UPSTREAM_ZONE_MODULE=ngx_http_upstream_zone_module
+HTTP_UPSTREAM_ZONE_SRCS=" \
+    src/http/modules/ngx_http_upstream_zone_module.c"
+
+
 MAIL_INCS="src/mail"
 
 MAIL_DEPS="src/mail/ngx_mail.h"
@@ -547,6 +549,46 @@ MAIL_AUTH_HTTP_SRCS="src/mail/ngx_mail_auth_http_module.c"
 MAIL_PROXY_MODULE="ngx_mail_proxy_module"
 MAIL_PROXY_SRCS="src/mail/ngx_mail_proxy_module.c"
 
+
+STREAM_INCS="src/stream"
+
+STREAM_DEPS="src/stream/ngx_stream.h \
+             src/stream/ngx_stream_upstream.h \
+             src/stream/ngx_stream_upstream_round_robin.h"
+
+STREAM_MODULES="ngx_stream_module \
+                ngx_stream_core_module \
+                ngx_stream_proxy_module \
+                ngx_stream_upstream_module"
+
+STREAM_SRCS="src/stream/ngx_stream.c \
+             src/stream/ngx_stream_handler.c \
+             src/stream/ngx_stream_core_module.c \
+             src/stream/ngx_stream_proxy_module.c \
+             src/stream/ngx_stream_upstream.c \
+             src/stream/ngx_stream_upstream_round_robin.c"
+
+STREAM_SSL_MODULE="ngx_stream_ssl_module"
+STREAM_SSL_DEPS="src/stream/ngx_stream_ssl_module.h"
+STREAM_SSL_SRCS="src/stream/ngx_stream_ssl_module.c"
+
+STREAM_LIMIT_CONN_MODULE=ngx_stream_limit_conn_module
+STREAM_LIMIT_CONN_SRCS=src/stream/ngx_stream_limit_conn_module.c
+
+STREAM_ACCESS_MODULE=ngx_stream_access_module
+STREAM_ACCESS_SRCS=src/stream/ngx_stream_access_module.c
+
+STREAM_UPSTREAM_HASH_MODULE=ngx_stream_upstream_hash_module
+STREAM_UPSTREAM_HASH_SRCS=src/stream/ngx_stream_upstream_hash_module.c
+
+STREAM_UPSTREAM_LEAST_CONN_MODULE=ngx_stream_upstream_least_conn_module
+STREAM_UPSTREAM_LEAST_CONN_SRCS=" \
+    src/stream/ngx_stream_upstream_least_conn_module.c"
+
+STREAM_UPSTREAM_ZONE_MODULE=ngx_stream_upstream_zone_module
+STREAM_UPSTREAM_ZONE_SRCS=src/stream/ngx_stream_upstream_zone_module.c
+
+
 NGX_GOOGLE_PERFTOOLS_MODULE=ngx_google_perftools_module
 NGX_GOOGLE_PERFTOOLS_SRCS=src/misc/ngx_google_perftools_module.c
 

  Renamed: vendor/nginx-1.9.5/auto/stubs (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/summary (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/threads (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/types/sizeof (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/types/typedef (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/types/uintptr_t (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/types/value (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/auto/unix (+12 -9) 98%
===================================================================
--- vendor/nginx-1.8.0/auto/unix    2015-09-27 18:09:01 +0900 (6e54531)
+++ vendor/nginx-1.9.5/auto/unix    2015-09-27 22:10:53 +0900 (b7b7a25)
@@ -304,7 +304,17 @@ ngx_feature_run=no
 ngx_feature_incs="#include <sys/socket.h>"
 ngx_feature_path=
 ngx_feature_libs=
-ngx_feature_test="setsockopt(0, SOL_SOCKET, SO_SETFIB, NULL, 4)"
+ngx_feature_test="setsockopt(0, SOL_SOCKET, SO_SETFIB, NULL, 0)"
+. auto/feature
+
+
+ngx_feature="SO_REUSEPORT"
+ngx_feature_name="NGX_HAVE_REUSEPORT"
+ngx_feature_run=no
+ngx_feature_incs="#include <sys/socket.h>"
+ngx_feature_path=
+ngx_feature_libs=
+ngx_feature_test="setsockopt(0, SOL_SOCKET, SO_REUSEPORT, NULL, 0)"
 . auto/feature
 
 
@@ -495,14 +505,7 @@ ngx_param=NGX_PTR_SIZE; ngx_value=$ngx_size; . auto/types/value
 
 # POSIX types
 
-case "$NGX_AUTO_CONFIG_H" in
-    /*)
-        NGX_INCLUDE_AUTO_CONFIG_H="#include \"$NGX_AUTO_CONFIG_H\""
-    ;;
-    *)
-        NGX_INCLUDE_AUTO_CONFIG_H="#include \"../$NGX_AUTO_CONFIG_H\""
-    ;;
-esac
+NGX_INCLUDE_AUTO_CONFIG_H="#include \"ngx_auto_config.h\""
 
 ngx_type="uint64_t"; ngx_types="u_int64_t"; . auto/types/typedef
 

  Renamed: vendor/nginx-1.9.5/conf/fastcgi.conf (+1 -0) 96%
===================================================================
--- vendor/nginx-1.8.0/conf/fastcgi.conf    2015-09-27 18:09:01 +0900 (ac9ff92)
+++ vendor/nginx-1.9.5/conf/fastcgi.conf    2015-09-27 22:10:53 +0900 (091738c)
@@ -10,6 +10,7 @@ fastcgi_param  REQUEST_URI        $request_uri;
 fastcgi_param  DOCUMENT_URI       $document_uri;
 fastcgi_param  DOCUMENT_ROOT      $document_root;
 fastcgi_param  SERVER_PROTOCOL    $server_protocol;
+fastcgi_param  REQUEST_SCHEME     $scheme;
 fastcgi_param  HTTPS              $https if_not_empty;
 
 fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;

  Renamed: vendor/nginx-1.9.5/conf/fastcgi_params (+1 -0) 95%
===================================================================
--- vendor/nginx-1.8.0/conf/fastcgi_params    2015-09-27 18:09:01 +0900 (71e2c2e)
+++ vendor/nginx-1.9.5/conf/fastcgi_params    2015-09-27 22:10:53 +0900 (28decb9)
@@ -9,6 +9,7 @@ fastcgi_param  REQUEST_URI        $request_uri;
 fastcgi_param  DOCUMENT_URI       $document_uri;
 fastcgi_param  DOCUMENT_ROOT      $document_root;
 fastcgi_param  SERVER_PROTOCOL    $server_protocol;
+fastcgi_param  REQUEST_SCHEME     $scheme;
 fastcgi_param  HTTPS              $https if_not_empty;
 
 fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;

  Renamed: vendor/nginx-1.9.5/conf/koi-utf (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/conf/koi-win (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/conf/mime.types (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/conf/nginx.conf (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/conf/scgi_params (+1 -0) 93%
===================================================================
--- vendor/nginx-1.8.0/conf/scgi_params    2015-09-27 18:09:01 +0900 (47348ca)
+++ vendor/nginx-1.9.5/conf/scgi_params    2015-09-27 22:10:53 +0900 (6d4ce4f)
@@ -8,6 +8,7 @@ scgi_param  DOCUMENT_URI       $document_uri;
 scgi_param  DOCUMENT_ROOT      $document_root;
 scgi_param  SCGI               1;
 scgi_param  SERVER_PROTOCOL    $server_protocol;
+scgi_param  REQUEST_SCHEME     $scheme;
 scgi_param  HTTPS              $https if_not_empty;
 
 scgi_param  REMOTE_ADDR        $remote_addr;

  Renamed: vendor/nginx-1.9.5/conf/uwsgi_params (+1 -0) 93%
===================================================================
--- vendor/nginx-1.8.0/conf/uwsgi_params    2015-09-27 18:09:01 +0900 (f539451)
+++ vendor/nginx-1.9.5/conf/uwsgi_params    2015-09-27 22:10:53 +0900 (09c732c)
@@ -8,6 +8,7 @@ uwsgi_param  REQUEST_URI        $request_uri;
 uwsgi_param  PATH_INFO          $document_uri;
 uwsgi_param  DOCUMENT_ROOT      $document_root;
 uwsgi_param  SERVER_PROTOCOL    $server_protocol;
+uwsgi_param  REQUEST_SCHEME     $scheme;
 uwsgi_param  HTTPS              $https if_not_empty;
 
 uwsgi_param  REMOTE_ADDR        $remote_addr;

  Renamed: vendor/nginx-1.9.5/conf/win-utf (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/contrib/README (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/contrib/geo2nginx.pl (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/contrib/unicode2nginx/koi-utf (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/contrib/unicode2nginx/unicode-to-nginx.pl (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/contrib/unicode2nginx/win-utf (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/contrib/vim/ftdetect/nginx.vim (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/contrib/vim/indent/nginx.vim (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/contrib/vim/syntax/nginx.vim (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/docs/GNUmakefile (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/docs/dtd/change_log_conf.dtd (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/docs/dtd/changes.dtd (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/docs/html/50x.html (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/docs/html/index.html (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/docs/man/nginx.8 (+6 -2) 97%
===================================================================
--- vendor/nginx-1.8.0/docs/man/nginx.8    2015-09-27 18:09:01 +0900 (f119a23)
+++ vendor/nginx-1.9.5/docs/man/nginx.8    2015-09-27 22:10:53 +0900 (1f4dc89)
@@ -25,7 +25,7 @@
 .\" SUCH DAMAGE.
 .\"
 .\"
-.Dd March 6, 2012
+.Dd June 16, 2015
 .Dt NGINX 8
 .Os
 .Sh NAME
@@ -33,7 +33,7 @@
 .Nd "HTTP and reverse proxy server, mail proxy server"
 .Sh SYNOPSIS
 .Nm
-.Op Fl ?hqtVv
+.Op Fl ?hqTtVv
 .Op Fl c Ar file
 .Op Fl g Ar directives
 .Op Fl p Ar prefix
@@ -87,6 +87,10 @@ Do not run, just test the configuration file.
 .Nm
 checks the configuration file syntax and then tries to open files
 referenced in the configuration file.
+.It Fl T
+Same as
+.Fl t ,
+but additionally dump configuration files to standard output.
 .It Fl V
 Print the
 .Nm

  Renamed: vendor/nginx-1.9.5/docs/text/LICENSE (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/docs/text/README (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/docs/xml/change_log_conf.xml (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/docs/xml/nginx/changes.xml (+535 -15) 97%
===================================================================
--- vendor/nginx-1.8.0/docs/xml/nginx/changes.xml    2015-09-27 18:09:01 +0900 (36a83c6)
+++ vendor/nginx-1.9.5/docs/xml/nginx/changes.xml    2015-09-27 22:10:53 +0900 (79ade21)
@@ -5,14 +5,534 @@
 <change_log title="nginx">
 
 
-<changes ver="1.8.0" date="21.04.2015">
+<changes ver="1.9.5" date="22.09.2015">
 
-<change>
+<change type="feature">
+<para lang="ru">
+модуль ngx_http_v2_module (заменяет модуль ngx_http_spdy_module).<br/>
+Спасибо Dropbox и Automattic за спонсирование разработки.
+</para>
+<para lang="en">
+the ngx_http_v2_module (replaces ngx_http_spdy_module).<br/>
+Thanks to Dropbox and Automattic for sponsoring this work.
+</para>
+</change>
+
+<change type="change">
+<para lang="ru">
+теперь по умолчанию директива output_buffers использует два буфера.
+</para>
+<para lang="en">
+now the "output_buffers" directive uses two buffers by default.
+</para>
+</change>
+
+<change type="change">
+<para lang="ru">
+теперь nginx ограничивает максимальную вложенность подзапросов,
+а не количество одновременных подзапросов.
+</para>
+<para lang="en">
+now nginx limits subrequests recursion,
+not simultaneous subrequests.
+</para>
+</change>
+
+<change type="change">
+<para lang="ru">
+теперь при возврате ответов из кэша nginx проверяет ключ полностью.<br/>
+Спасибо Геннадию Махомеду и Сергею Брестеру.
+</para>
+<para lang="en">
+now nginx checks the whole cache key when returning a response from cache.<br/>
+Thanks to Gena Makhomed and Sergey Brester.
+</para>
+</change>
+
+<change type="bugfix">
+<para lang="ru">
+при использовании кэша
+в логах могли появляться сообщения "header already sent";
+ошибка появилась в 1.7.5.
+</para>
+<para lang="en">
+"header already sent" alerts might appear in logs
+when using cache;
+the bug had appeared in 1.7.5.
+</para>
+</change>
+
+<change type="bugfix">
+<para lang="ru">
+при использовании CephFS и директивы timer_resolution на Linux
+в логах могли появляться сообщения
+"writev() failed (4: Interrupted system call)".
+</para>
+<para lang="en">
+"writev() failed (4: Interrupted system call)"
+errors might appear in logs
+when using CephFS and the "timer_resolution" directive on Linux.
+</para>
+</change>
+
+<change type="bugfix">
+<para lang="ru">
+в обработке ошибок конфигурации.<br/>
+Спасибо Markus Linnala.
+</para>
+<para lang="en">
+in invalid configurations handling.<br/>
+Thanks to Markus Linnala.
+</para>
+</change>
+
+<change type="bugfix">
+<para lang="ru">
+при использовании директивы sub_filter на уровне http
+в рабочем процессе происходил segmentation fault;
+ошибка появилась в 1.9.4.
+</para>
+<para lang="en">
+a segmentation fault occurred in a worker process
+if the "sub_filter" directive was used at http level;
+the bug had appeared in 1.9.4.
+</para>
+</change>
+
+</changes>
+
+
+<changes ver="1.9.4" date="18.08.2015">
+
+<change type="change">
+<para lang="ru">
+директивы proxy_downstream_buffer и proxy_upstream_buffer в модуле stream
+заменены директивой proxy_buffer_size.
+</para>
+<para lang="en">
+the "proxy_downstream_buffer" and "proxy_upstream_buffer" directives
+of the stream module are replaced with the "proxy_buffer_size" directive.
+</para>
+</change>
+
+<change type="feature">
+<para lang="ru">
+директива tcp_nodelay в модуле stream.
+</para>
+<para lang="en">
+the "tcp_nodelay" directive in the stream module.
+</para>
+</change>
+
+<change type="feature">
+<para lang="ru">
+теперь можно указать несколько директив sub_filter одновременно.
+</para>
+<para lang="en">
+multiple "sub_filter" directives can be used simultaneously.
+</para>
+</change>
+
+<change type="feature">
+<para lang="ru">
+директива sub_filter поддерживает переменные в строке поиска.
+</para>
+<para lang="en">
+variables support in the search string of the "sub_filter" directive.
+</para>
+</change>
+
+<change type="workaround">
+<para lang="ru">
+тестирование конфигурации могло не работать под Linux OpenVZ.<br/>
+Спасибо Геннадию Махомеду.
+</para>
+<para lang="en">
+configuration testing might fail under Linux OpenVZ.<br/>
+Thanks to Gena Makhomed.
+</para>
+</change>
+
+<change type="bugfix">
+<para lang="ru">
+после переконфигурации старые рабочие процессы могли сильно нагружать процессор
+при больших значениях worker_connections.
+</para>
+<para lang="en">
+old worker processes might hog CPU after reconfiguration
+with a large number of worker_connections.
+</para>
+</change>
+
+<change type="bugfix">
+<para lang="ru">
+при совместном использовании директив try_files и alias
+внутри location'а, заданного регулярным выражением,
+в рабочем процессе мог произойти segmentation fault;
+ошибка появилась в 1.7.1.
+</para>
+<para lang="en">
+a segmentation fault might occur in a worker process
+if the "try_files" and "alias" directives were used
+inside a location given by a regular expression;
+the bug had appeared in 1.7.1.
+</para>
+</change>
+
+<change type="bugfix">
+<para lang="ru">
+директива try_files внутри вложенного location'а, заданного регулярным
+выражением, работала неправильно, если во внешнем location'е использовалась
+директива alias.
+</para>
+<para lang="en">
+the "try_files" directive inside a nested location
+given by a regular expression worked incorrectly
+if the "alias" directive was used in the outer location.
+</para>
+</change>
+
+<change type="bugfix">
+<para lang="ru">
+в обработке ошибок при построении хэш-таблиц.
+</para>
+<para lang="en">
+in hash table initialization error handling.
+</para>
+</change>
+
+<change type="bugfix">
+<para lang="ru">
+nginx не собирался с Visual Studio 2015.
+</para>
+<para lang="en">
+nginx could not be built with Visual Studio 2015.
+</para>
+</change>
+
+</changes>
+
+
+<changes ver="1.9.3" date="14.07.2015">
+
+<change type="change">
+<para lang="ru">
+дублирующиеся блоки http, mail и stream теперь запрещены.
+</para>
+<para lang="en">
+duplicate "http", "mail", and "stream" blocks are now disallowed.
+</para>
+</change>
+
+<change type="feature">
+<para lang="ru">
+ограничение количества соединений в модуле stream.
+</para>
+<para lang="en">
+connection limiting in the stream module.
+</para>
+</change>
+
+<change type="feature">
+<para lang="ru">
+органичение скорости в модуле stream.
+</para>
+<para lang="en">
+data rate limiting in the stream module.
+</para>
+</change>
+
+<change type="bugfix">
+<para lang="ru">
+директива zone в блоке upstream не работала на Windows.
+</para>
+<para lang="en">
+the "zone" directive inside the "upstream" block did not work on Windows.
+</para>
+</change>
+
+<change type="bugfix">
+<para lang="ru">
+совместимость с LibreSSL в модуле stream.<br/>
+Спасибо Piotr Sikora.
+</para>
+<para lang="en">
+compatibility with LibreSSL in the stream module.<br/>
+Thanks to Piotr Sikora.
+</para>
+</change>
+
+<change type="bugfix">
+<para lang="ru">
+в параметре --builddir в configure.<br/>
+Спасибо Piotr Sikora.
+</para>
+<para lang="en">
+in the "--builddir" configure parameter.<br/>
+Thanks to Piotr Sikora.
+</para>
+</change>
+
+<change type="bugfix">
+<para lang="ru">
+директива ssl_stapling_file не работала;
+ошибка появилась в 1.9.2.<br/>
+Спасибо Faidon Liambotis и Brandon Black.
+</para>
+<para lang="en">
+the "ssl_stapling_file" directive did not work;
+the bug had appeared in 1.9.2.<br/>
+Thanks to Faidon Liambotis and Brandon Black.
+</para>
+</change>
+
+<change type="bugfix">
+<para lang="ru">
+при использовании директивы ssl_stapling
+в рабочем процессе мог произойти segmentation fault;
+ошибка появилась в 1.9.2.<br/>
+Спасибо Matthew Baldwin.
+</para>
+<para lang="en">
+a segmentation fault might occur in a worker process
+if the "ssl_stapling" directive was used;
+the bug had appeared in 1.9.2.<br/>
+Thanks to Matthew Baldwin.
+</para>
+</change>
+
+</changes>
+
+
+<changes ver="1.9.2" date="16.06.2015">
+
+<change type="feature">
+<para lang="ru">
+параметр backlog директивы listen
+в почтовом прокси-сервере и модуле stream.
+</para>
+<para lang="en">
+the "backlog" parameter of the "listen" directives
+of the mail proxy and stream modules.
+</para>
+</change>
+
+<change type="feature">
+<para lang="ru">
+директивы allow и deny в модуле stream.
+</para>
+<para lang="en">
+the "allow" and "deny" directives in the stream module.
+</para>
+</change>
+
+<change type="feature">
+<para lang="ru">
+директива proxy_bind в модуле stream.
+</para>
+<para lang="en">
+the "proxy_bind" directive in the stream module.
+</para>
+</change>
+
+<change type="feature">
+<para lang="ru">
+директива proxy_protocol в модуле stream.
+</para>
+<para lang="en">
+the "proxy_protocol" directive in the stream module.
+</para>
+</change>
+
+<change type="feature">
+<para lang="ru">
+ключ -T.
+</para>
+<para lang="en">
+the -T switch.
+</para>
+</change>
+
+<change type="feature">
+<para lang="ru">
+параметр REQUEST_SCHEME добавлен в стандартные конфигурационные файлы
+fastcgi.conf, fastcgi_params, scgi_params и uwsgi_params.
+</para>
+<para lang="en">
+the REQUEST_SCHEME parameter added to the fastcgi.conf, fastcgi_params,
+scgi_params, and uwsgi_params standard configuration files.
+</para>
+</change>
+
+<change type="bugfix">
+<para lang="ru">
+параметр reuseport директивы listen в модуле stream
+не работал.
+</para>
+<para lang="en">
+the "reuseport" parameter of the "listen" directive of the stream module
+did not work.
+</para>
+</change>
+
+<change type="bugfix">
+<para lang="ru">
+OCSP stapling в некоторых случаях мог вернуть устаревший OCSP-ответ.
+</para>
+<para lang="en">
+OCSP stapling might return an expired OCSP response in some cases.
+</para>
+</change>
+
+</changes>
+
+
+<changes ver="1.9.1" date="26.05.2015">
+
+<change type="change">
+<para lang="ru">
+теперь протокол SSLv3 по умолчанию запрещён.
+</para>
+<para lang="en">
+now SSLv3 protocol is disabled by default.
+</para>
+</change>
+
+<change type="change">
+<para lang="ru">
+некоторые давно устаревшие директивы больше не поддерживаются.
+</para>
+<para lang="en">
+some long deprecated directives are not supported anymore.
+</para>
+</change>
+
+<change type="feature">
+<para lang="ru">
+параметр reuseport директивы listen.<br/>
+Спасибо Yingqi Lu из Intel и Sepherosa Ziehau.
+</para>
+<para lang="en">
+the "reuseport" parameter of the "listen" directive.<br/>
+Thanks to Yingqi Lu at Intel and Sepherosa Ziehau.
+</para>
+</change>
+
+<change type="feature">
+<para lang="ru">
+переменная $upstream_connect_time.
+</para>
+<para lang="en">
+the $upstream_connect_time variable.
+</para>
+</change>
+
+<change type="bugfix">
+<para lang="ru">
+в директиве hash на big-endian платформах.
+</para>
+<para lang="en">
+in the "hash" directive on big-endian platforms.
+</para>
+</change>
+
+<change type="bugfix">
+<para lang="ru">
+nginx мог не запускаться на некоторых старых версиях Linux;
+ошибка появилась в 1.7.11.
+</para>
+<para lang="en">
+nginx might fail to start on some old Linux variants;
+the bug had appeared in 1.7.11.
+</para>
+</change>
+
+<change type="bugfix">
+<para lang="ru">
+в парсинге IP-адресов.<br/>
+Спасибо Сергею Половко.
+</para>
+<para lang="en">
+in IP address parsing.<br/>
+Thanks to Sergey Polovko.
+</para>
+</change>
+
+</changes>
+
+
+<changes ver="1.9.0" date="28.04.2015">
+
+<change type="change">
+<para lang="ru">
+устаревшие методы обработки соединений aio и rtsig больше не поддерживаются.
+</para>
+<para lang="en">
+obsolete aio and rtsig event methods have been removed.
+</para>
+</change>
+
+<change type="feature">
+<para lang="ru">
+директива zone в блоке upstream.
+</para>
+<para lang="en">
+the "zone" directive inside the "upstream" block.
+</para>
+</change>
+
+<change type="feature">
+<para lang="ru">
+модуль stream.
+</para>
+<para lang="en">
+the stream module.
+</para>
+</change>
+
+<change type="feature">
+<para lang="ru">
+поддержка byte ranges для ответов модуля ngx_http_memcached_module.<br/>
+Спасибо Martin Mlynář.
+</para>
+<para lang="en">
+byte ranges support in the ngx_http_memcached_module.<br/>
+Thanks to Martin Mlynář.
+</para>
+</change>
+
+<change type="feature">
+<para lang="ru">
+разделяемую память теперь можно использовать на версиях Windows
+с рандомизацией адресного пространства.<br/>
+Спасибо Сергею Брестеру.
+</para>
+<para lang="en">
+shared memory can now be used on Windows versions
+with address space layout randomization.<br/>
+Thanks to Sergey Brester.
+</para>
+</change>
+
+<change type="feature">
+<para lang="ru">
+директиву error_log теперь можно использовать
+на уровнях mail и server в почтовом прокси-сервере.
+</para>
+<para lang="en">
+the "error_log" directive can now be used
+on mail and server levels in mail proxy.
+</para>
+</change>
+
+<change type="bugfix">
 <para lang="ru">
-Стабильная ветка 1.8.x.
+параметр proxy_protocol директивы listen не работал,
+если не был указан в первой директиве listen для данного listen-сокета.
 </para>
 <para lang="en">
-1.8.x stable branch.
+the "proxy_protocol" parameter of the "listen" directive did not work
+if not specified in the first "listen" directive for a listen socket.
 </para>
 </change>
 
@@ -140,7 +660,7 @@ Thanks to Sven Peter, Franck Levionnois, and Filipe Da Silva.
 <change type="feature">
 <para lang="ru">
 уменьшение времени запуска
-при использовании дирекивы "hash ... consistent" в блоке upstream.<br/>
+при использовании директивы "hash ... consistent" в блоке upstream.<br/>
 Спасибо Wai Keen Woon.
 </para>
 <para lang="en">
@@ -4839,7 +5359,7 @@ responses from cache might hang.
 ошибка появилась в 1.1.9.
 </para>
 <para lang="en">
-a segmentation fault occured in a worker process if AIO was used on Linux;
+a segmentation fault occurred in a worker process if AIO was used on Linux;
 the bug had appeared in 1.1.9.
 </para>
 </change>
@@ -5789,7 +6309,7 @@ Thanks to Maxim Dounin.
 Спасибо Lanshun Zhou.
 </para>
 <para lang="en">
-in parameter validaiton of a "proxy_pass" directive with variables.<br/>
+in parameter validation of a "proxy_pass" directive with variables.<br/>
 Thanks to Lanshun Zhou.
 </para>
 </change>
@@ -14761,7 +15281,7 @@ the bug had appeared in 0.5.21.
 </para>
 <para lang="en">
 if server has more than about ten locations, then regex locations
-might be choosen not in that order as they were specified.
+might be chosen not in that order as they were specified.
 </para>
 </change>
 
@@ -15047,7 +15567,7 @@ in the HTTPS protocol in the "proxy_pass" directive.
 возвращали старое закэшированное значение.
 </para>
 <para lang="en">
-in some cases non-cachable variables (such as $uri variable)
+in some cases non-cacheable variables (such as $uri variable)
 returned old cached value.
 </para>
 </change>
@@ -15114,12 +15634,12 @@ the bug had appeared in 0.5.15.
 <change type="feature">
 <para lang="ru">
 почтовый прокси-сервер поддерживает аутентифицированное SMTP-проксирование и
-директивы smtp_auth, smtp_capablities и xclient.<br/>
+директивы smtp_auth, smtp_capabilities и xclient.<br/>
 Спасибо Антону Южанинову и Максиму Дунину.
 </para>
 <para lang="en">
 the mail proxy supports authenticated SMTP proxying and
-the "smtp_auth", "smtp_capablities", and "xclient" directives.<br/>
+the "smtp_auth", "smtp_capabilities", and "xclient" directives.<br/>
 Thanks to Anton Yuzhaninov and Maxim Dounin.
 </para>
 </change>
@@ -18622,7 +19142,7 @@ the ngx_http_perl_module.
 директива valid_referers разрешает использовать рефереры совсем без URI.
 </para>
 <para lang="en">
-the "valid_referers" directive allows the referreres without URI part.
+the "valid_referers" directive allows the referrers without URI part.
 </para>
 </change>
 
@@ -18942,10 +19462,10 @@ the "so_keepalive" directive in IMAP/POP3 proxy.
 <change type="bugfix">
 <para lang="ru">
 nginx теперь вызывает abort() при обнаружении незакрытых соединений
-только при планом выходе и включённой директиве debug_points.
+только при плавном выходе и включённой директиве debug_points.
 </para>
 <para lang="en">
-if there are unclosed connection nginx now calls abort() only on gracefull
+if there are unclosed connection nginx now calls abort() only on graceful
 quit and active "debug_points" directive.
 </para>
 </change>
@@ -20724,7 +21244,7 @@ if many parts or the big parts were included by SSI.
 начинал запрашивать все бэкенды снова.
 </para>
 <para lang="en">
-if all backends had returned the 404 reponse and the "http_404" parameter of
+if all backends had returned the 404 response and the "http_404" parameter of
 the "proxy_next_upstream" or "fastcgi_next_upstream" directives was used,
 then nginx started to request all backends again.
 </para>

  Renamed: vendor/nginx-1.9.5/docs/xsls/changes.xsls (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/docs/xslt/changes.xslt (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/misc/GNUmakefile (+5 -3) 96%
===================================================================
--- vendor/nginx-1.8.0/misc/GNUmakefile    2015-09-27 18:09:01 +0900 (9a0cf74)
+++ vendor/nginx-1.9.5/misc/GNUmakefile    2015-09-27 22:10:53 +0900 (a20b8ff)
@@ -5,9 +5,9 @@ NGINX =		nginx-$(VER)
 TEMP =		tmp
 
 OBJS =		objs.msvc8
-OPENSSL =	openssl-1.0.1m
+OPENSSL =	openssl-1.0.2d
 ZLIB =		zlib-1.2.8
-PCRE =		pcre-8.35
+PCRE =		pcre-8.37
 
 
 release: export
@@ -80,10 +80,12 @@ win32:
 		--with-http_random_index_module				\
 		--with-http_secure_link_module				\
 		--with-mail						\
+		--with-stream						\
 		--with-openssl=$(OBJS)/lib/$(OPENSSL)			\
-		--with-openssl-opt=enable-tlsext			\
+		--with-openssl-opt=no-asm				\
 		--with-http_ssl_module					\
 		--with-mail_ssl_module					\
+		--with-stream_ssl_module				\
 		--with-ipv6
 
 

  Renamed: vendor/nginx-1.9.5/misc/README (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/nginx.c (+28 -41) 96%
===================================================================
--- vendor/nginx-1.8.0/src/core/nginx.c    2015-09-27 18:09:01 +0900 (4702d28)
+++ vendor/nginx-1.9.5/src/core/nginx.c    2015-09-27 22:10:53 +0900 (3213527)
@@ -118,13 +118,6 @@ static ngx_command_t  ngx_core_commands[] = {
       offsetof(ngx_core_conf_t, rlimit_core),
       NULL },
 
-    { ngx_string("worker_rlimit_sigpending"),
-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,
-      ngx_conf_set_num_slot,
-      0,
-      offsetof(ngx_core_conf_t, rlimit_sigpending),
-      NULL },
-
     { ngx_string("working_directory"),
       NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,
       ngx_conf_set_str_slot,
@@ -139,24 +132,6 @@ static ngx_command_t  ngx_core_commands[] = {
       0,
       NULL },
 
-#if (NGX_OLD_THREADS)
-
-    { ngx_string("worker_threads"),
-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,
-      ngx_conf_set_num_slot,
-      0,
-      offsetof(ngx_core_conf_t, worker_threads),
-      NULL },
-
-    { ngx_string("thread_stack_size"),
-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,
-      ngx_conf_set_size_slot,
-      0,
-      offsetof(ngx_core_conf_t, thread_stack_size),
-      NULL },
-
-#endif
-
       ngx_null_command
 };
 
@@ -201,9 +176,11 @@ static char **ngx_os_environ;
 int ngx_cdecl
 main(int argc, char *const *argv)
 {
-    ngx_int_t         i;
+    ngx_buf_t        *b;
     ngx_log_t        *log;
+    ngx_uint_t        i;
     ngx_cycle_t      *cycle, init_cycle;
+    ngx_conf_dump_t  *cd;
     ngx_core_conf_t  *ccf;
 
     ngx_debug_init();
@@ -221,7 +198,7 @@ main(int argc, char *const *argv)
 
         if (ngx_show_help) {
             ngx_write_stderr(
-                "Usage: nginx [-?hvVtq] [-s signal] [-c filename] "
+                "Usage: nginx [-?hvVtTq] [-s signal] [-c filename] "
                              "[-p prefix] [-g directives]" NGX_LINEFEED
                              NGX_LINEFEED
                 "Options:" NGX_LINEFEED
@@ -230,6 +207,8 @@ main(int argc, char *const *argv)
                 "  -V            : show version and configure options then exit"
                                    NGX_LINEFEED
                 "  -t            : test configuration and exit" NGX_LINEFEED
+                "  -T            : test configuration, dump it and exit"
+                                   NGX_LINEFEED
                 "  -q            : suppress non-error messages "
                                    "during configuration testing" NGX_LINEFEED
                 "  -s signal     : send signal to a master process: "
@@ -358,6 +337,23 @@ main(int argc, char *const *argv)
                            cycle->conf_file.data);
         }
 
+        if (ngx_dump_config) {
+            cd = cycle->config_dump.elts;
+
+            for (i = 0; i < cycle->config_dump.nelts; i++) {
+
+                ngx_write_stdout("# configuration file ");
+                (void) ngx_write_fd(ngx_stdout, cd[i].name.data,
+                                    cd[i].name.len);
+                ngx_write_stdout(":" NGX_LINEFEED);
+
+                b = cd[i].buffer;
+
+                (void) ngx_write_fd(ngx_stdout, b->pos, b->last - b->pos);
+                ngx_write_stdout(NGX_LINEFEED);
+            }
+        }
+
         return 0;
     }
 
@@ -714,6 +710,11 @@ ngx_get_options(int argc, char *const *argv)
                 ngx_test_config = 1;
                 break;
 
+            case 'T':
+                ngx_test_config = 1;
+                ngx_dump_config = 1;
+                break;
+
             case 'q':
                 ngx_quiet_mode = 1;
                 break;
@@ -966,16 +967,10 @@ ngx_core_module_create_conf(ngx_cycle_t *cycle)
 
     ccf->rlimit_nofile = NGX_CONF_UNSET;
     ccf->rlimit_core = NGX_CONF_UNSET;
-    ccf->rlimit_sigpending = NGX_CONF_UNSET;
 
     ccf->user = (ngx_uid_t) NGX_CONF_UNSET_UINT;
     ccf->group = (ngx_gid_t) NGX_CONF_UNSET_UINT;
 
-#if (NGX_OLD_THREADS)
-    ccf->worker_threads = NGX_CONF_UNSET;
-    ccf->thread_stack_size = NGX_CONF_UNSET_SIZE;
-#endif
-
     if (ngx_array_init(&ccf->env, cycle->pool, 1, sizeof(ngx_str_t))
         != NGX_OK)
     {
@@ -1012,14 +1007,6 @@ ngx_core_module_init_conf(ngx_cycle_t *cycle, void *conf)
 
 #endif
 
-#if (NGX_OLD_THREADS)
-
-    ngx_conf_init_value(ccf->worker_threads, 0);
-    ngx_threads_n = ccf->worker_threads;
-    ngx_conf_init_size_value(ccf->thread_stack_size, 2 * 1024 * 1024);
-
-#endif
-
 
     if (ccf->pid.len == 0) {
         ngx_str_set(&ccf->pid, NGX_PID_PATH);

  Renamed: vendor/nginx-1.9.5/src/core/nginx.h (+2 -2) 85%
===================================================================
--- vendor/nginx-1.8.0/src/core/nginx.h    2015-09-27 18:09:01 +0900 (9f3a656)
+++ vendor/nginx-1.9.5/src/core/nginx.h    2015-09-27 22:10:53 +0900 (34a6a80)
@@ -9,8 +9,8 @@
 #define _NGINX_H_INCLUDED_
 
 
-#define nginx_version      1008000
-#define NGINX_VERSION      "1.8.0"
+#define nginx_version      1009005
+#define NGINX_VERSION      "1.9.5"
 #define NGINX_VER          "nginx/" NGINX_VERSION
 
 #ifdef NGX_BUILD

  Renamed: vendor/nginx-1.9.5/src/core/ngx_array.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_array.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_buf.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_buf.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_conf_file.c (+44 -3) 96%
===================================================================
--- vendor/nginx-1.8.0/src/core/ngx_conf_file.c    2015-09-27 18:09:01 +0900 (ec3c1fa)
+++ vendor/nginx-1.9.5/src/core/ngx_conf_file.c    2015-09-27 22:10:53 +0900 (1c3238c)
@@ -101,10 +101,13 @@ char *
 ngx_conf_parse(ngx_conf_t *cf, ngx_str_t *filename)
 {
     char             *rv;
+    u_char           *p;
+    off_t             size;
     ngx_fd_t          fd;
     ngx_int_t         rc;
-    ngx_buf_t         buf;
+    ngx_buf_t         buf, *tbuf;
     ngx_conf_file_t  *prev, conf_file;
+    ngx_conf_dump_t  *cd;
     enum {
         parse_file = 0,
         parse_block,
@@ -158,6 +161,39 @@ ngx_conf_parse(ngx_conf_t *cf, ngx_str_t *filename)
 
         type = parse_file;
 
+        if (ngx_dump_config
+#if (NGX_DEBUG)
+            || 1
+#endif
+           )
+        {
+            p = ngx_pstrdup(cf->cycle->pool, filename);
+            if (p == NULL) {
+                goto failed;
+            }
+
+            size = ngx_file_size(&cf->conf_file->file.info);
+
+            tbuf = ngx_create_temp_buf(cf->cycle->pool, (size_t) size);
+            if (tbuf == NULL) {
+                goto failed;
+            }
+
+            cd = ngx_array_push(&cf->cycle->config_dump);
+            if (cd == NULL) {
+                goto failed;
+            }
+
+            cd->name.len = filename->len;
+            cd->name.data = p;
+            cd->buffer = tbuf;
+
+            cf->conf_file->dump = tbuf;
+
+        } else {
+            cf->conf_file->dump = NULL;
+        }
+
     } else if (cf->conf_file->file.fd != NGX_INVALID_FILE) {
 
         type = parse_block;
@@ -437,7 +473,7 @@ ngx_conf_read_token(ngx_conf_t *cf)
     ngx_uint_t   found, need_space, last_space, sharp_comment, variable;
     ngx_uint_t   quoted, s_quoted, d_quoted, start_line;
     ngx_str_t   *word;
-    ngx_buf_t   *b;
+    ngx_buf_t   *b, *dump;
 
     found = 0;
     need_space = 0;
@@ -450,6 +486,7 @@ ngx_conf_read_token(ngx_conf_t *cf)
 
     cf->args->nelts = 0;
     b = cf->conf_file->buffer;
+    dump = cf->conf_file->dump;
     start = b->pos;
     start_line = cf->conf_file->line;
 
@@ -531,6 +568,10 @@ ngx_conf_read_token(ngx_conf_t *cf)
             b->pos = b->start + len;
             b->last = b->pos + n;
             start = b->start;
+
+            if (dump) {
+                dump->last = ngx_cpymem(dump->last, b->pos, size);
+            }
         }
 
         ch = *b->pos++;
@@ -680,7 +721,7 @@ ngx_conf_read_token(ngx_conf_t *cf)
                     return NGX_ERROR;
                 }
 
-                word->data = ngx_pnalloc(cf->pool, b->pos - start + 1);
+                word->data = ngx_pnalloc(cf->pool, b->pos - 1 - start + 1);
                 if (word->data == NULL) {
                     return NGX_ERROR;
                 }

  Renamed: vendor/nginx-1.9.5/src/core/ngx_conf_file.h (+7 -0) 98%
===================================================================
--- vendor/nginx-1.8.0/src/core/ngx_conf_file.h    2015-09-27 18:09:01 +0900 (d73a6c8)
+++ vendor/nginx-1.9.5/src/core/ngx_conf_file.h    2015-09-27 22:10:53 +0900 (ee44306)
@@ -146,10 +146,17 @@ typedef struct {
 typedef struct {
     ngx_file_t            file;
     ngx_buf_t            *buffer;
+    ngx_buf_t            *dump;
     ngx_uint_t            line;
 } ngx_conf_file_t;
 
 
+typedef struct {
+    ngx_str_t             name;
+    ngx_buf_t            *buffer;
+} ngx_conf_dump_t;
+
+
 typedef char *(*ngx_conf_handler_pt)(ngx_conf_t *cf,
     ngx_command_t *dummy, void *conf);
 

  Renamed: vendor/nginx-1.9.5/src/core/ngx_config.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_connection.c (+154 -9) 88%
===================================================================
--- vendor/nginx-1.8.0/src/core/ngx_connection.c    2015-09-27 18:09:01 +0900 (9f8fbc3)
+++ vendor/nginx-1.9.5/src/core/ngx_connection.c    2015-09-27 22:10:53 +0900 (9f2675b)
@@ -91,6 +91,43 @@ ngx_create_listening(ngx_conf_t *cf, void *sockaddr, socklen_t socklen)
 
 
 ngx_int_t
+ngx_clone_listening(ngx_conf_t *cf, ngx_listening_t *ls)
+{
+#if (NGX_HAVE_REUSEPORT)
+
+    ngx_int_t         n;
+    ngx_core_conf_t  *ccf;
+    ngx_listening_t   ols;
+
+    if (!ls->reuseport) {
+        return NGX_OK;
+    }
+
+    ols = *ls;
+
+    ccf = (ngx_core_conf_t *) ngx_get_conf(cf->cycle->conf_ctx,
+                                           ngx_core_module);
+
+    for (n = 1; n < ccf->worker_processes; n++) {
+
+        /* create a socket for each worker process */
+
+        ls = ngx_array_push(&cf->cycle->listening);
+        if (ls == NULL) {
+            return NGX_ERROR;
+        }
+
+        *ls = ols;
+        ls->worker = n;
+    }
+
+#endif
+
+    return NGX_OK;
+}
+
+
+ngx_int_t
 ngx_set_inherited_sockets(ngx_cycle_t *cycle)
 {
     size_t                     len;
@@ -106,6 +143,9 @@ ngx_set_inherited_sockets(ngx_cycle_t *cycle)
 #if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)
     int                        timeout;
 #endif
+#if (NGX_HAVE_REUSEPORT)
+    int                        reuseport;
+#endif
 
     ls = cycle->listening.elts;
     for (i = 0; i < cycle->listening.nelts; i++) {
@@ -215,6 +255,25 @@ ngx_set_inherited_sockets(ngx_cycle_t *cycle)
 #endif
 #endif
 
+#if (NGX_HAVE_REUSEPORT)
+
+        reuseport = 0;
+        olen = sizeof(int);
+
+        if (getsockopt(ls[i].fd, SOL_SOCKET, SO_REUSEPORT,
+                       (void *) &reuseport, &olen)
+            == -1)
+        {
+            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,
+                          "getsockopt(SO_REUSEPORT) %V failed, ignored",
+                          &ls[i].addr_text);
+
+        } else {
+            ls[i].reuseport = reuseport ? 1 : 0;
+        }
+
+#endif
+
 #if (NGX_HAVE_TCP_FASTOPEN)
 
         olen = sizeof(int);
@@ -332,6 +391,31 @@ ngx_open_listening_sockets(ngx_cycle_t *cycle)
                 continue;
             }
 
+#if (NGX_HAVE_REUSEPORT)
+
+            if (ls[i].add_reuseport) {
+
+                /*
+                 * to allow transition from a socket without SO_REUSEPORT
+                 * to multiple sockets with SO_REUSEPORT, we have to set
+                 * SO_REUSEPORT on the old socket before opening new ones
+                 */
+
+                int  reuseport = 1;
+
+                if (setsockopt(ls[i].fd, SOL_SOCKET, SO_REUSEPORT,
+                               (const void *) &reuseport, sizeof(int))
+                    == -1)
+                {
+                    ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,
+                                  "setsockopt(SO_REUSEPORT) %V failed, ignored",
+                                  &ls[i].addr_text);
+                }
+
+                ls[i].add_reuseport = 0;
+            }
+#endif
+
             if (ls[i].fd != (ngx_socket_t) -1) {
                 continue;
             }
@@ -370,6 +454,32 @@ ngx_open_listening_sockets(ngx_cycle_t *cycle)
                 return NGX_ERROR;
             }
 
+#if (NGX_HAVE_REUSEPORT)
+
+            if (ls[i].reuseport) {
+                int  reuseport;
+
+                reuseport = 1;
+
+                if (setsockopt(s, SOL_SOCKET, SO_REUSEPORT,
+                               (const void *) &reuseport, sizeof(int))
+                    == -1)
+                {
+                    ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
+                                  "setsockopt(SO_REUSEPORT) %V failed, ignored",
+                                  &ls[i].addr_text);
+
+                    if (ngx_close_socket(s) == -1) {
+                        ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
+                                      ngx_close_socket_n " %V failed",
+                                      &ls[i].addr_text);
+                    }
+
+                    return NGX_ERROR;
+                }
+            }
+#endif
+
 #if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
 
             if (ls[i].sockaddr->sa_family == AF_INET6) {
@@ -389,7 +499,7 @@ ngx_open_listening_sockets(ngx_cycle_t *cycle)
 #endif
             /* TODO: close on exit */
 
-            if (!(ngx_event_flags & NGX_USE_AIO_EVENT)) {
+            if (!(ngx_event_flags & NGX_USE_IOCP_EVENT)) {
                 if (ngx_nonblocking(s) == -1) {
                     ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
                                   ngx_nonblocking_n " %V failed",
@@ -457,9 +567,19 @@ ngx_open_listening_sockets(ngx_cycle_t *cycle)
 #endif
 
             if (listen(s, ls[i].backlog) == -1) {
-                ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
-                              "listen() to %V, backlog %d failed",
-                              &ls[i].addr_text, ls[i].backlog);
+                err = ngx_socket_errno;
+
+                /*
+                 * on OpenVZ after suspend/resume EADDRINUSE
+                 * may be returned by listen() instead of bind(), see
+                 * https://bugzilla.openvz.org/show_bug.cgi?id=2470
+                 */
+
+                if (err != NGX_EADDRINUSE || !ngx_test_config) {
+                    ngx_log_error(NGX_LOG_EMERG, log, err,
+                                  "listen() to %V, backlog %d failed",
+                                  &ls[i].addr_text, ls[i].backlog);
+                }
 
                 if (ngx_close_socket(s) == -1) {
                     ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
@@ -467,7 +587,15 @@ ngx_open_listening_sockets(ngx_cycle_t *cycle)
                                   &ls[i].addr_text);
                 }
 
-                return NGX_ERROR;
+                if (err != NGX_EADDRINUSE) {
+                    return NGX_ERROR;
+                }
+
+                if (!ngx_test_config) {
+                    failed = 1;
+                }
+
+                continue;
             }
 
             ls[i].listen = 1;
@@ -764,10 +892,7 @@ ngx_close_listening_sockets(ngx_cycle_t *cycle)
 
         if (c) {
             if (c->read->active) {
-                if (ngx_event_flags & NGX_USE_RTSIG_EVENT) {
-                    ngx_del_conn(c, NGX_CLOSE_EVENT);
-
-                } else if (ngx_event_flags & NGX_USE_EPOLL_EVENT) {
+                if (ngx_event_flags & NGX_USE_EPOLL_EVENT) {
 
                     /*
                      * it seems that Linux-2.6.x OpenVZ sends events
@@ -1038,6 +1163,26 @@ ngx_drain_connections(void)
 }
 
 
+void
+ngx_close_idle_connections(ngx_cycle_t *cycle)
+{
+    ngx_uint_t         i;
+    ngx_connection_t  *c;
+
+    c = cycle->connections;
+
+    for (i = 0; i < cycle->connection_n; i++) {
+
+        /* THREAD: lock */
+
+        if (c[i].fd != -1 && c[i].idle) {
+            c[i].close = 1;
+            c[i].read->handler(c[i].read);
+        }
+    }
+}
+
+
 ngx_int_t
 ngx_connection_local_sockaddr(ngx_connection_t *c, ngx_str_t *s,
     ngx_uint_t port)

  Renamed: vendor/nginx-1.9.5/src/core/ngx_connection.h (+20 -1) 84%
===================================================================
--- vendor/nginx-1.8.0/src/core/ngx_connection.h    2015-09-27 18:09:01 +0900 (f1ca961)
+++ vendor/nginx-1.9.5/src/core/ngx_connection.h    2015-09-27 22:10:53 +0900 (977f028)
@@ -51,6 +51,8 @@ struct ngx_listening_s {
     ngx_listening_t    *previous;
     ngx_connection_t   *connection;
 
+    ngx_uint_t          worker;
+
     unsigned            open:1;
     unsigned            remain:1;
     unsigned            ignore:1;
@@ -66,6 +68,10 @@ struct ngx_listening_s {
 #if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
     unsigned            ipv6only:1;
 #endif
+#if (NGX_HAVE_REUSEPORT)
+    unsigned            reuseport:1;
+    unsigned            add_reuseport:1;
+#endif
     unsigned            keepalive:2;
 
 #if (NGX_HAVE_DEFERRED_ACCEPT)
@@ -112,7 +118,7 @@ typedef enum {
 
 #define NGX_LOWLEVEL_BUFFERED  0x0f
 #define NGX_SSL_BUFFERED       0x01
-#define NGX_SPDY_BUFFERED      0x02
+#define NGX_HTTP_V2_BUFFERED   0x02
 
 
 struct ngx_connection_s {
@@ -190,13 +196,26 @@ struct ngx_connection_s {
 };
 
 
+#define ngx_set_connection_log(c, l)                                         \
+                                                                             \
+    c->log->file = l->file;                                                  \
+    c->log->next = l->next;                                                  \
+    c->log->writer = l->writer;                                              \
+    c->log->wdata = l->wdata;                                                \
+    if (!(c->log->log_level & NGX_LOG_DEBUG_CONNECTION)) {                   \
+        c->log->log_level = l->log_level;                                    \
+    }
+
+
 ngx_listening_t *ngx_create_listening(ngx_conf_t *cf, void *sockaddr,
     socklen_t socklen);
+ngx_int_t ngx_clone_listening(ngx_conf_t *cf, ngx_listening_t *ls);
 ngx_int_t ngx_set_inherited_sockets(ngx_cycle_t *cycle);
 ngx_int_t ngx_open_listening_sockets(ngx_cycle_t *cycle);
 void ngx_configure_listening_sockets(ngx_cycle_t *cycle);
 void ngx_close_listening_sockets(ngx_cycle_t *cycle);
 void ngx_close_connection(ngx_connection_t *c);
+void ngx_close_idle_connections(ngx_cycle_t *cycle);
 ngx_int_t ngx_connection_local_sockaddr(ngx_connection_t *c, ngx_str_t *s,
     ngx_uint_t port);
 ngx_int_t ngx_connection_error(ngx_connection_t *c, ngx_err_t err, char *text);

  Renamed: vendor/nginx-1.9.5/src/core/ngx_core.h (+2 -0) 98%
===================================================================
--- vendor/nginx-1.8.0/src/core/ngx_core.h    2015-09-27 18:09:01 +0900 (97100f6)
+++ vendor/nginx-1.9.5/src/core/ngx_core.h    2015-09-27 22:10:53 +0900 (6b31705)
@@ -54,6 +54,7 @@ typedef void (*ngx_connection_handler_pt)(ngx_connection_t *c);
 #include <ngx_process.h>
 #include <ngx_user.h>
 #include <ngx_parse.h>
+#include <ngx_parse_time.h>
 #include <ngx_log.h>
 #include <ngx_alloc.h>
 #include <ngx_palloc.h>
@@ -71,6 +72,7 @@ typedef void (*ngx_connection_handler_pt)(ngx_connection_t *c);
 #endif
 #include <ngx_radix_tree.h>
 #include <ngx_times.h>
+#include <ngx_rwlock.h>
 #include <ngx_shmtx.h>
 #include <ngx_slab.h>
 #include <ngx_inet.h>

  Renamed: vendor/nginx-1.9.5/src/core/ngx_cpuinfo.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_crc.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_crc32.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_crc32.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_crypt.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_crypt.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_cycle.c (+45 -5) 97%
===================================================================
--- vendor/nginx-1.8.0/src/core/ngx_cycle.c    2015-09-27 18:09:01 +0900 (11e413f)
+++ vendor/nginx-1.9.5/src/core/ngx_cycle.c    2015-09-27 22:10:53 +0900 (ad4bf92)
@@ -24,12 +24,9 @@ static ngx_pool_t     *ngx_temp_pool;
 static ngx_event_t     ngx_cleaner_event;
 
 ngx_uint_t             ngx_test_config;
+ngx_uint_t             ngx_dump_config;
 ngx_uint_t             ngx_quiet_mode;
 
-#if (NGX_OLD_THREADS)
-ngx_tls_key_t          ngx_core_tls_key;
-#endif
-
 
 /* STUB NAME */
 static ngx_connection_t  dumb;
@@ -128,6 +125,13 @@ ngx_init_cycle(ngx_cycle_t *old_cycle)
     cycle->paths.pool = pool;
 
 
+    if (ngx_array_init(&cycle->config_dump, pool, 1, sizeof(ngx_conf_dump_t))
+        != NGX_OK)
+    {
+        ngx_destroy_pool(pool);
+        return NULL;
+    }
+
     if (old_cycle->open_files.part.nelts) {
         n = old_cycle->open_files.part.nelts;
         for (part = old_cycle->open_files.part.next; part; part = part->next) {
@@ -441,9 +445,13 @@ ngx_init_cycle(ngx_cycle_t *old_cycle)
             }
 
             if (shm_zone[i].tag == oshm_zone[n].tag
-                && shm_zone[i].shm.size == oshm_zone[n].shm.size)
+                && shm_zone[i].shm.size == oshm_zone[n].shm.size
+                && !shm_zone[i].noreuse)
             {
                 shm_zone[i].shm.addr = oshm_zone[n].shm.addr;
+#if (NGX_WIN32)
+                shm_zone[i].shm.handle = oshm_zone[n].shm.handle;
+#endif
 
                 if (shm_zone[i].init(&shm_zone[i], oshm_zone[n].data)
                     != NGX_OK)
@@ -493,6 +501,10 @@ ngx_init_cycle(ngx_cycle_t *old_cycle)
                     continue;
                 }
 
+                if (ls[i].remain) {
+                    continue;
+                }
+
                 if (ngx_cmp_sockaddr(nls[n].sockaddr, nls[n].socklen,
                                      ls[i].sockaddr, ls[i].socklen, 1)
                     == NGX_OK)
@@ -540,6 +552,13 @@ ngx_init_cycle(ngx_cycle_t *old_cycle)
                         nls[n].add_deferred = 1;
                     }
 #endif
+
+#if (NGX_HAVE_REUSEPORT)
+                    if (nls[n].reuseport && !ls[i].reuseport) {
+                        nls[n].add_reuseport = 1;
+                    }
+#endif
+
                     break;
                 }
             }
@@ -863,6 +882,22 @@ ngx_init_zone_pool(ngx_cycle_t *cycle, ngx_shm_zone_t *zn)
             return NGX_OK;
         }
 
+#if (NGX_WIN32)
+
+        /* remap at the required address */
+
+        if (ngx_shm_remap(&zn->shm, sp->addr) != NGX_OK) {
+            return NGX_ERROR;
+        }
+
+        sp = (ngx_slab_pool_t *) zn->shm.addr;
+
+        if (sp == sp->addr) {
+            return NGX_OK;
+        }
+
+#endif
+
         ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,
                       "shared zone \"%V\" has no equal addresses: %p vs %p",
                       &zn->shm.name, sp->addr, sp);
@@ -1210,6 +1245,10 @@ ngx_shared_memory_add(ngx_conf_t *cf, ngx_str_t *name, size_t size, void *tag)
             return NULL;
         }
 
+        if (shm_zone[i].shm.size == 0) {
+            shm_zone[i].shm.size = size;
+        }
+
         if (size && size != shm_zone[i].shm.size) {
             ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
                             "the size %uz of shared memory zone \"%V\" "
@@ -1234,6 +1273,7 @@ ngx_shared_memory_add(ngx_conf_t *cf, ngx_str_t *name, size_t size, void *tag)
     shm_zone->shm.exists = 0;
     shm_zone->init = NULL;
     shm_zone->tag = tag;
+    shm_zone->noreuse = 0;
 
     return shm_zone;
 }

  Renamed: vendor/nginx-1.9.5/src/core/ngx_cycle.h (+3 -19) 90%
===================================================================
--- vendor/nginx-1.8.0/src/core/ngx_cycle.h    2015-09-27 18:09:01 +0900 (be90a72)
+++ vendor/nginx-1.9.5/src/core/ngx_cycle.h    2015-09-27 22:10:53 +0900 (b77c109)
@@ -31,6 +31,7 @@ struct ngx_shm_zone_s {
     ngx_shm_t                 shm;
     ngx_shm_zone_init_pt      init;
     void                     *tag;
+    ngx_uint_t                noreuse;  /* unsigned  noreuse:1; */
 };
 
 
@@ -51,6 +52,7 @@ struct ngx_cycle_s {
 
     ngx_array_t               listening;
     ngx_array_t               paths;
+    ngx_array_t               config_dump;
     ngx_list_t                open_files;
     ngx_list_t                shared_memory;
 
@@ -82,7 +84,6 @@ typedef struct {
      ngx_int_t                debug_points;
 
      ngx_int_t                rlimit_nofile;
-     ngx_int_t                rlimit_sigpending;
      off_t                    rlimit_core;
 
      int                      priority;
@@ -102,24 +103,9 @@ typedef struct {
 
      ngx_array_t              env;
      char                   **environment;
-
-#if (NGX_OLD_THREADS)
-     ngx_int_t                worker_threads;
-     size_t                   thread_stack_size;
-#endif
-
 } ngx_core_conf_t;
 
 
-#if (NGX_OLD_THREADS)
-
-typedef struct {
-     ngx_pool_t              *pool;   /* pcre's malloc() pool */
-} ngx_core_tls_t;
-
-#endif
-
-
 #define ngx_is_init_cycle(cycle)  (cycle->conf_ctx == NULL)
 
 
@@ -139,10 +125,8 @@ extern volatile ngx_cycle_t  *ngx_cycle;
 extern ngx_array_t            ngx_old_cycles;
 extern ngx_module_t           ngx_core_module;
 extern ngx_uint_t             ngx_test_config;
+extern ngx_uint_t             ngx_dump_config;
 extern ngx_uint_t             ngx_quiet_mode;
-#if (NGX_OLD_THREADS)
-extern ngx_tls_key_t          ngx_core_tls_key;
-#endif
 
 
 #endif /* _NGX_CYCLE_H_INCLUDED_ */

  Renamed: vendor/nginx-1.9.5/src/core/ngx_file.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_file.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_hash.c (+13 -1) 97%
===================================================================
--- vendor/nginx-1.8.0/src/core/ngx_hash.c    2015-09-27 18:09:01 +0900 (e707c09)
+++ vendor/nginx-1.9.5/src/core/ngx_hash.c    2015-09-27 22:10:53 +0900 (151e643)
@@ -257,11 +257,19 @@ ngx_hash_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names, ngx_uint_t nelts)
     ngx_uint_t       i, n, key, size, start, bucket_size;
     ngx_hash_elt_t  *elt, **buckets;
 
+    if (hinit->max_size == 0) {
+        ngx_log_error(NGX_LOG_EMERG, hinit->pool->log, 0,
+                      "could not build %s, you should "
+                      "increase %s_max_size: %i",
+                      hinit->name, hinit->name, hinit->max_size);
+        return NGX_ERROR;
+    }
+
     for (n = 0; n < nelts; n++) {
         if (hinit->bucket_size < NGX_HASH_ELT_SIZE(&names[n]) + sizeof(void *))
         {
             ngx_log_error(NGX_LOG_EMERG, hinit->pool->log, 0,
-                          "could not build the %s, you should "
+                          "could not build %s, you should "
                           "increase %s_bucket_size: %i",
                           hinit->name, hinit->name, hinit->bucket_size);
             return NGX_ERROR;
@@ -735,6 +743,10 @@ ngx_hash_add_key(ngx_hash_keys_arrays_t *ha, ngx_str_t *key, void *value,
             if (key->data[i] == '.' && key->data[i + 1] == '.') {
                 return NGX_DECLINED;
             }
+
+            if (key->data[i] == '\0') {
+                return NGX_DECLINED;
+            }
         }
 
         if (key->len > 1 && key->data[0] == '.') {

  Renamed: vendor/nginx-1.9.5/src/core/ngx_hash.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_inet.c (+5 -5) 99%
===================================================================
--- vendor/nginx-1.8.0/src/core/ngx_inet.c    2015-09-27 18:09:01 +0900 (2c84daf)
+++ vendor/nginx-1.9.5/src/core/ngx_inet.c    2015-09-27 22:10:53 +0900 (96a04fd)
@@ -26,15 +26,15 @@ ngx_inet_addr(u_char *text, size_t len)
     n = 0;
 
     for (p = text; p < text + len; p++) {
-
-        if (octet > 255) {
-            return INADDR_NONE;
-        }
-
         c = *p;
 
         if (c >= '0' && c <= '9') {
             octet = octet * 10 + (c - '0');
+
+            if (octet > 255) {
+                return INADDR_NONE;
+            }
+
             continue;
         }
 

  Renamed: vendor/nginx-1.9.5/src/core/ngx_inet.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_list.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_list.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_log.c (+2 -2) 99%
===================================================================
--- vendor/nginx-1.8.0/src/core/ngx_log.c    2015-09-27 18:09:01 +0900 (bf00508)
+++ vendor/nginx-1.9.5/src/core/ngx_log.c    2015-09-27 22:10:53 +0900 (0893871)
@@ -86,7 +86,7 @@ static ngx_str_t err_levels[] = {
 
 static const char *debug_levels[] = {
     "debug_core", "debug_alloc", "debug_mutex", "debug_event",
-    "debug_http", "debug_mail", "debug_mysql"
+    "debug_http", "debug_mail", "debug_mysql", "debug_stream"
 };
 
 
@@ -609,7 +609,7 @@ ngx_log_set_log(ngx_conf_t *cf, ngx_log_t **head)
             return NGX_CONF_ERROR;
         }
 
-        buf = ngx_palloc(cf->pool, sizeof(ngx_log_memory_buf_t));
+        buf = ngx_pcalloc(cf->pool, sizeof(ngx_log_memory_buf_t));
         if (buf == NULL) {
             return NGX_CONF_ERROR;
         }

  Renamed: vendor/nginx-1.9.5/src/core/ngx_log.h (+13 -5) 96%
===================================================================
--- vendor/nginx-1.8.0/src/core/ngx_log.h    2015-09-27 18:09:01 +0900 (6b04b78)
+++ vendor/nginx-1.9.5/src/core/ngx_log.h    2015-09-27 22:10:53 +0900 (618d3ad)
@@ -30,6 +30,7 @@
 #define NGX_LOG_DEBUG_HTTP        0x100
 #define NGX_LOG_DEBUG_MAIL        0x200
 #define NGX_LOG_DEBUG_MYSQL       0x400
+#define NGX_LOG_DEBUG_STREAM      0x800
 
 /*
  * do not forget to update debug_levels[] in src/core/ngx_log.c
@@ -37,7 +38,7 @@
  */
 
 #define NGX_LOG_DEBUG_FIRST       NGX_LOG_DEBUG_CORE
-#define NGX_LOG_DEBUG_LAST        NGX_LOG_DEBUG_MYSQL
+#define NGX_LOG_DEBUG_LAST        NGX_LOG_DEBUG_STREAM
 #define NGX_LOG_DEBUG_CONNECTION  0x80000000
 #define NGX_LOG_DEBUG_ALL         0x7ffffff0
 
@@ -110,7 +111,7 @@ void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
 
 /*********************************/
 
-#else /* NO VARIADIC MACROS */
+#else /* no variadic macros */
 
 #define NGX_HAVE_VARIADIC_MACROS  0
 
@@ -122,7 +123,7 @@ void ngx_cdecl ngx_log_debug_core(ngx_log_t *log, ngx_err_t err,
     const char *fmt, ...);
 
 
-#endif /* VARIADIC MACROS */
+#endif /* variadic macros */
 
 
 /*********************************/
@@ -165,7 +166,7 @@ void ngx_cdecl ngx_log_debug_core(ngx_log_t *log, ngx_err_t err,
                        arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)
 
 
-#else /* NO VARIADIC MACROS */
+#else /* no variadic macros */
 
 #define ngx_log_debug0(level, log, err, fmt)                                  \
     if ((log)->log_level & level)                                             \
@@ -210,7 +211,7 @@ void ngx_cdecl ngx_log_debug_core(ngx_log_t *log, ngx_err_t err,
 
 #endif
 
-#else /* NO NGX_DEBUG */
+#else /* !NGX_DEBUG */
 
 #define ngx_log_debug0(level, log, err, fmt)
 #define ngx_log_debug1(level, log, err, fmt, arg1)
@@ -254,6 +255,13 @@ ngx_write_stderr(char *text)
 }
 
 
+static ngx_inline void
+ngx_write_stdout(char *text)
+{
+    (void) ngx_write_fd(ngx_stdout, text, ngx_strlen(text));
+}
+
+
 extern ngx_module_t  ngx_errlog_module;
 extern ngx_uint_t    ngx_use_stderr;
 

  Renamed: vendor/nginx-1.9.5/src/core/ngx_md5.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_md5.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_murmurhash.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_murmurhash.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_open_file_cache.c (+1 -1) 99%
===================================================================
--- vendor/nginx-1.8.0/src/core/ngx_open_file_cache.c    2015-09-27 18:09:01 +0900 (4df2134)
+++ vendor/nginx-1.9.5/src/core/ngx_open_file_cache.c    2015-09-27 22:10:53 +0900 (f8bb2e3)
@@ -128,7 +128,7 @@ ngx_open_file_cache_cleanup(void *data)
 
     if (cache->current) {
         ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,
-                      "%ui items still leave in open file cache",
+                      "%ui items still left in open file cache",
                       cache->current);
     }
 

  Renamed: vendor/nginx-1.9.5/src/core/ngx_open_file_cache.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_output_chain.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_palloc.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_palloc.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_parse.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_parse.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_parse_time.c (+1 -2) 98%
===================================================================
--- vendor/nginx-1.8.0/src/http/ngx_http_parse_time.c    2015-09-27 18:09:01 +0900 (985af31)
+++ vendor/nginx-1.9.5/src/core/ngx_parse_time.c    2015-09-27 22:10:53 +0900 (831cc71)
@@ -7,13 +7,12 @@
 
 #include <ngx_config.h>
 #include <ngx_core.h>
-#include <ngx_http.h>
 
 
 static ngx_uint_t  mday[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
 
 time_t
-ngx_http_parse_time(u_char *value, size_t len)
+ngx_parse_http_time(u_char *value, size_t len)
 {
     u_char      *p, *end;
     ngx_int_t    month;

  Added: vendor/nginx-1.9.5/src/core/ngx_parse_time.h (+22 -0) 100644
===================================================================
--- /dev/null
+++ vendor/nginx-1.9.5/src/core/ngx_parse_time.h    2015-09-27 22:10:53 +0900 (aa542eb)
@@ -0,0 +1,22 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) Nginx, Inc.
+ */
+
+
+#ifndef _NGX_PARSE_TIME_H_INCLUDED_
+#define _NGX_PARSE_TIME_H_INCLUDED_
+
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+
+
+time_t ngx_parse_http_time(u_char *value, size_t len);
+
+/* compatibility */
+#define ngx_http_parse_time(value, len)  ngx_parse_http_time(value, len)
+
+
+#endif /* _NGX_PARSE_TIME_H_INCLUDED_ */

  Renamed: vendor/nginx-1.9.5/src/core/ngx_proxy_protocol.c (+50 -1) 56%
===================================================================
--- vendor/nginx-1.8.0/src/core/ngx_proxy_protocol.c    2015-09-27 18:09:01 +0900 (59ef010)
+++ vendor/nginx-1.9.5/src/core/ngx_proxy_protocol.c    2015-09-27 22:10:53 +0900 (f347e7f)
@@ -10,7 +10,7 @@
 
 
 u_char *
-ngx_proxy_protocol_parse(ngx_connection_t *c, u_char *buf, u_char *last)
+ngx_proxy_protocol_read(ngx_connection_t *c, u_char *buf, u_char *last)
 {
     size_t  len;
     u_char  ch, *p, *addr;
@@ -89,3 +89,52 @@ invalid:
 
     return NULL;
 }
+
+
+u_char *
+ngx_proxy_protocol_write(ngx_connection_t *c, u_char *buf, u_char *last)
+{
+    ngx_uint_t  port, lport;
+
+    if (last - buf < NGX_PROXY_PROTOCOL_MAX_HEADER) {
+        return NULL;
+    }
+
+    if (ngx_connection_local_sockaddr(c, NULL, 0) != NGX_OK) {
+        return NULL;
+    }
+
+    switch (c->sockaddr->sa_family) {
+
+    case AF_INET:
+        buf = ngx_cpymem(buf, "PROXY TCP4 ", sizeof("PROXY TCP4 ") - 1);
+
+        port = ntohs(((struct sockaddr_in *) c->sockaddr)->sin_port);
+        lport = ntohs(((struct sockaddr_in *) c->local_sockaddr)->sin_port);
+
+        break;
+
+#if (NGX_HAVE_INET6)
+    case AF_INET6:
+        buf = ngx_cpymem(buf, "PROXY TCP6 ", sizeof("PROXY TCP6 ") - 1);
+
+        port = ntohs(((struct sockaddr_in6 *) c->sockaddr)->sin6_port);
+        lport = ntohs(((struct sockaddr_in6 *) c->local_sockaddr)->sin6_port);
+
+        break;
+#endif
+
+    default:
+        return ngx_cpymem(buf, "PROXY UNKNOWN" CRLF,
+                          sizeof("PROXY UNKNOWN" CRLF) - 1);
+    }
+
+    buf += ngx_sock_ntop(c->sockaddr, c->socklen, buf, last - buf, 0);
+
+    *buf++ = ' ';
+
+    buf += ngx_sock_ntop(c->local_sockaddr, c->local_socklen, buf, last - buf,
+                         0);
+
+    return ngx_slprintf(buf, last, " %ui %ui" CRLF, port, lport);
+}

  Renamed: vendor/nginx-1.9.5/src/core/ngx_proxy_protocol.h (+3 -1) 68%
===================================================================
--- vendor/nginx-1.8.0/src/core/ngx_proxy_protocol.h    2015-09-27 18:09:01 +0900 (4f39125)
+++ vendor/nginx-1.9.5/src/core/ngx_proxy_protocol.h    2015-09-27 22:10:53 +0900 (fb848f6)
@@ -16,7 +16,9 @@
 #define NGX_PROXY_PROTOCOL_MAX_HEADER  107
 
 
-u_char *ngx_proxy_protocol_parse(ngx_connection_t *c, u_char *buf,
+u_char *ngx_proxy_protocol_read(ngx_connection_t *c, u_char *buf,
+    u_char *last);
+u_char *ngx_proxy_protocol_write(ngx_connection_t *c, u_char *buf,
     u_char *last);
 
 

  Renamed: vendor/nginx-1.9.5/src/core/ngx_queue.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_queue.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_radix_tree.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_radix_tree.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_rbtree.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_rbtree.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_regex.c (+0 -37) 94%
===================================================================
--- vendor/nginx-1.8.0/src/core/ngx_regex.c    2015-09-27 18:09:01 +0900 (77c5947)
+++ vendor/nginx-1.9.5/src/core/ngx_regex.c    2015-09-27 22:10:53 +0900 (416622d)
@@ -80,17 +80,6 @@ ngx_regex_init(void)
 static ngx_inline void
 ngx_regex_malloc_init(ngx_pool_t *pool)
 {
-#if (NGX_OLD_THREADS)
-    ngx_core_tls_t  *tls;
-
-    if (ngx_threaded) {
-        tls = ngx_thread_get_tls(ngx_core_tls_key);
-        tls->pool = pool;
-        return;
-    }
-
-#endif
-
     ngx_pcre_pool = pool;
 }
 
@@ -98,17 +87,6 @@ ngx_regex_malloc_init(ngx_pool_t *pool)
 static ngx_inline void
 ngx_regex_malloc_done(void)
 {
-#if (NGX_OLD_THREADS)
-    ngx_core_tls_t  *tls;
-
-    if (ngx_threaded) {
-        tls = ngx_thread_get_tls(ngx_core_tls_key);
-        tls->pool = NULL;
-        return;
-    }
-
-#endif
-
     ngx_pcre_pool = NULL;
 }
 
@@ -253,23 +231,8 @@ static void * ngx_libc_cdecl
 ngx_regex_malloc(size_t size)
 {
     ngx_pool_t      *pool;
-#if (NGX_OLD_THREADS)
-    ngx_core_tls_t  *tls;
-
-    if (ngx_threaded) {
-        tls = ngx_thread_get_tls(ngx_core_tls_key);
-        pool = tls->pool;
-
-    } else {
-        pool = ngx_pcre_pool;
-    }
-
-#else
-
     pool = ngx_pcre_pool;
 
-#endif
-
     if (pool) {
         return ngx_palloc(pool, size);
     }

  Renamed: vendor/nginx-1.9.5/src/core/ngx_regex.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_resolver.c (+27 -17) 98%
===================================================================
--- vendor/nginx-1.8.0/src/core/ngx_resolver.c    2015-09-27 18:09:01 +0900 (4e9c85d)
+++ vendor/nginx-1.9.5/src/core/ngx_resolver.c    2015-09-27 22:10:53 +0900 (7013885)
@@ -71,6 +71,7 @@ static ngx_int_t ngx_resolver_create_addr_query(ngx_resolver_node_t *rn,
 static void ngx_resolver_resend_handler(ngx_event_t *ev);
 static time_t ngx_resolver_resend(ngx_resolver_t *r, ngx_rbtree_t *tree,
     ngx_queue_t *queue);
+static ngx_uint_t ngx_resolver_resend_empty(ngx_resolver_t *r);
 static void ngx_resolver_read_response(ngx_event_t *rev);
 static void ngx_resolver_process_response(ngx_resolver_t *r, u_char *buf,
     size_t n);
@@ -463,6 +464,10 @@ done:
     ngx_resolver_free_locked(r, ctx);
 
     /* unlock alloc mutex */
+
+    if (r->event->timer_set && ngx_resolver_resend_empty(r)) {
+        ngx_del_timer(r->event);
+    }
 }
 
 
@@ -1016,6 +1021,10 @@ done:
     ngx_resolver_free_locked(r, ctx);
 
     /* unlock alloc mutex */
+
+    if (r->event->timer_set && ngx_resolver_resend_empty(r)) {
+        ngx_del_timer(r->event);
+    }
 }
 
 
@@ -1225,6 +1234,17 @@ ngx_resolver_resend(ngx_resolver_t *r, ngx_rbtree_t *tree, ngx_queue_t *queue)
 }
 
 
+static ngx_uint_t
+ngx_resolver_resend_empty(ngx_resolver_t *r)
+{
+    return ngx_queue_empty(&r->name_resend_queue)
+#if (NGX_HAVE_INET6)
+           && ngx_queue_empty(&r->addr6_resend_queue)
+#endif
+           && ngx_queue_empty(&r->addr_resend_queue);
+}
+
+
 static void
 ngx_resolver_read_response(ngx_event_t *rev)
 {
@@ -3092,7 +3112,7 @@ ngx_udp_connect(ngx_udp_connection_t *uc)
 
     rc = connect(s, uc->sockaddr, uc->socklen);
 
-    /* TODO: aio, iocp */
+    /* TODO: iocp */
 
     if (rc == -1) {
         ngx_log_error(NGX_LOG_CRIT, &uc->log, ngx_socket_errno,
@@ -3104,23 +3124,13 @@ ngx_udp_connect(ngx_udp_connection_t *uc)
     /* UDP sockets are always ready to write */
     wev->ready = 1;
 
-    if (ngx_add_event) {
+    event = (ngx_event_flags & NGX_USE_CLEAR_EVENT) ?
+                /* kqueue, epoll */                 NGX_CLEAR_EVENT:
+                /* select, poll, /dev/poll */       NGX_LEVEL_EVENT;
+                /* eventport event type has no meaning: oneshot only */
 
-        event = (ngx_event_flags & NGX_USE_CLEAR_EVENT) ?
-                    /* kqueue, epoll */                 NGX_CLEAR_EVENT:
-                    /* select, poll, /dev/poll */       NGX_LEVEL_EVENT;
-                    /* eventport event type has no meaning: oneshot only */
-
-        if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) {
-            goto failed;
-        }
-
-    } else {
-        /* rtsig */
-
-        if (ngx_add_conn(c) == NGX_ERROR) {
-            goto failed;
-        }
+    if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) {
+        goto failed;
     }
 
     return NGX_OK;

  Renamed: vendor/nginx-1.9.5/src/core/ngx_resolver.h (+0 -0) 100%
===================================================================

  Added: vendor/nginx-1.9.5/src/core/ngx_rwlock.c (+120 -0) 100644
===================================================================
--- /dev/null
+++ vendor/nginx-1.9.5/src/core/ngx_rwlock.c    2015-09-27 22:10:53 +0900 (1404c6e)
@@ -0,0 +1,120 @@
+
+/*
+ * Copyright (C) Ruslan Ermilov
+ * Copyright (C) Nginx, Inc.
+ */
+
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+
+
+#if (NGX_HAVE_ATOMIC_OPS)
+
+
+#define NGX_RWLOCK_SPIN   2048
+#define NGX_RWLOCK_WLOCK  ((ngx_atomic_uint_t) -1)
+
+
+void
+ngx_rwlock_wlock(ngx_atomic_t *lock)
+{
+    ngx_uint_t  i, n;
+
+    for ( ;; ) {
+
+        if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, NGX_RWLOCK_WLOCK)) {
+            return;
+        }
+
+        if (ngx_ncpu > 1) {
+
+            for (n = 1; n < NGX_RWLOCK_SPIN; n <<= 1) {
+
+                for (i = 0; i < n; i++) {
+                    ngx_cpu_pause();
+                }
+
+                if (*lock == 0
+                    && ngx_atomic_cmp_set(lock, 0, NGX_RWLOCK_WLOCK))
+                {
+                    return;
+                }
+            }
+        }
+
+        ngx_sched_yield();
+    }
+}
+
+
+void
+ngx_rwlock_rlock(ngx_atomic_t *lock)
+{
+    ngx_uint_t         i, n;
+    ngx_atomic_uint_t  readers;
+
+    for ( ;; ) {
+        readers = *lock;
+
+        if (readers != NGX_RWLOCK_WLOCK
+            && ngx_atomic_cmp_set(lock, readers, readers + 1))
+        {
+            return;
+        }
+
+        if (ngx_ncpu > 1) {
+
+            for (n = 1; n < NGX_RWLOCK_SPIN; n <<= 1) {
+
+                for (i = 0; i < n; i++) {
+                    ngx_cpu_pause();
+                }
+
+                readers = *lock;
+
+                if (readers != NGX_RWLOCK_WLOCK
+                    && ngx_atomic_cmp_set(lock, readers, readers + 1))
+                {
+                    return;
+                }
+            }
+        }
+
+        ngx_sched_yield();
+    }
+}
+
+
+void
+ngx_rwlock_unlock(ngx_atomic_t *lock)
+{
+    ngx_atomic_uint_t  readers;
+
+    readers = *lock;
+
+    if (readers == NGX_RWLOCK_WLOCK) {
+        *lock = 0;
+        return;
+    }
+
+    for ( ;; ) {
+
+        if (ngx_atomic_cmp_set(lock, readers, readers - 1)) {
+            return;
+        }
+
+        readers = *lock;
+    }
+}
+
+
+#else
+
+#if (NGX_HTTP_UPSTREAM_ZONE)
+
+#error ngx_atomic_cmp_set() is not defined!
+
+#endif
+
+#endif

  Added: vendor/nginx-1.9.5/src/core/ngx_rwlock.h (+21 -0) 100644
===================================================================
--- /dev/null
+++ vendor/nginx-1.9.5/src/core/ngx_rwlock.h    2015-09-27 22:10:53 +0900 (8b16eca)
@@ -0,0 +1,21 @@
+
+/*
+ * Copyright (C) Ruslan Ermilov
+ * Copyright (C) Nginx, Inc.
+ */
+
+
+#ifndef _NGX_RWLOCK_H_INCLUDED_
+#define _NGX_RWLOCK_H_INCLUDED_
+
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+
+
+void ngx_rwlock_wlock(ngx_atomic_t *lock);
+void ngx_rwlock_rlock(ngx_atomic_t *lock);
+void ngx_rwlock_unlock(ngx_atomic_t *lock);
+
+
+#endif /* _NGX_RWLOCK_H_INCLUDED_ */

  Renamed: vendor/nginx-1.9.5/src/core/ngx_sha1.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_shmtx.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_shmtx.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_slab.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_slab.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_spinlock.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_string.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_string.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_syslog.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_syslog.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_thread_pool.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_thread_pool.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_times.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/core/ngx_times.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/event/modules/ngx_devpoll_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/event/modules/ngx_epoll_module.c (+1 -1) 99%
===================================================================
--- vendor/nginx-1.8.0/src/event/modules/ngx_epoll_module.c    2015-09-27 18:09:01 +0900 (3458b20)
+++ vendor/nginx-1.9.5/src/event/modules/ngx_epoll_module.c    2015-09-27 22:10:53 +0900 (d7f915d)
@@ -329,7 +329,7 @@ ngx_epoll_init(ngx_cycle_t *cycle, ngx_msec_t timer)
 
 #if (NGX_HAVE_EVENTFD)
         if (ngx_epoll_notify_init(cycle->log) != NGX_OK) {
-            return NGX_ERROR;
+            ngx_epoll_module_ctx.actions.notify = NULL;
         }
 #endif
 

  Renamed: vendor/nginx-1.9.5/src/event/modules/ngx_eventport_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/event/modules/ngx_iocp_module.c (+1 -1) 99%
===================================================================
--- vendor/nginx-1.8.0/src/event/modules/ngx_iocp_module.c    2015-09-27 18:09:01 +0900 (7514e6f)
+++ vendor/nginx-1.9.5/src/event/modules/ngx_iocp_module.c    2015-09-27 22:10:53 +0900 (e384707)
@@ -125,7 +125,7 @@ ngx_iocp_init(ngx_cycle_t *cycle, ngx_msec_t timer)
 
     ngx_event_actions = ngx_iocp_module_ctx.actions;
 
-    ngx_event_flags = NGX_USE_AIO_EVENT|NGX_USE_IOCP_EVENT;
+    ngx_event_flags = NGX_USE_IOCP_EVENT;
 
     if (timer == 0) {
         return NGX_OK;

  Renamed: vendor/nginx-1.9.5/src/event/modules/ngx_iocp_module.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/event/modules/ngx_kqueue_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/event/modules/ngx_poll_module.c (+0 -10) 98%
===================================================================
--- vendor/nginx-1.8.0/src/event/modules/ngx_poll_module.c    2015-09-27 18:09:01 +0900 (e48a822)
+++ vendor/nginx-1.9.5/src/event/modules/ngx_poll_module.c    2015-09-27 22:10:53 +0900 (4370950)
@@ -413,15 +413,5 @@ ngx_poll_init_conf(ngx_cycle_t *cycle, void *conf)
         return NGX_CONF_OK;
     }
 
-#if (NGX_OLD_THREADS)
-
-    ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,
-                  "poll() is not supported in the threaded mode");
-    return NGX_CONF_ERROR;
-
-#else
-
     return NGX_CONF_OK;
-
-#endif
 }

  Renamed: vendor/nginx-1.9.5/src/event/modules/ngx_select_module.c (+0 -10) 98%
===================================================================
--- vendor/nginx-1.8.0/src/event/modules/ngx_select_module.c    2015-09-27 18:09:01 +0900 (46004e5)
+++ vendor/nginx-1.9.5/src/event/modules/ngx_select_module.c    2015-09-27 22:10:53 +0900 (5a976bd)
@@ -419,15 +419,5 @@ ngx_select_init_conf(ngx_cycle_t *cycle, void *conf)
         return NGX_CONF_ERROR;
     }
 
-#if (NGX_OLD_THREADS)
-
-    ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,
-                  "select() is not supported in the threaded mode");
-    return NGX_CONF_ERROR;
-
-#else
-
     return NGX_CONF_OK;
-
-#endif
 }

  Renamed: vendor/nginx-1.9.5/src/event/modules/ngx_win32_select_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/event/ngx_event.c (+22 -71) 95%
===================================================================
--- vendor/nginx-1.8.0/src/event/ngx_event.c    2015-09-27 18:09:01 +0900 (31514c4)
+++ vendor/nginx-1.9.5/src/event/ngx_event.c    2015-09-27 22:10:53 +0900 (b8e0607)
@@ -17,7 +17,6 @@ extern ngx_module_t ngx_kqueue_module;
 extern ngx_module_t ngx_eventport_module;
 extern ngx_module_t ngx_devpoll_module;
 extern ngx_module_t ngx_epoll_module;
-extern ngx_module_t ngx_rtsig_module;
 extern ngx_module_t ngx_select_module;
 
 
@@ -127,13 +126,6 @@ static ngx_command_t  ngx_event_core_commands[] = {
       0,
       NULL },
 
-    { ngx_string("connections"),
-      NGX_EVENT_CONF|NGX_CONF_TAKE1,
-      ngx_event_connections,
-      0,
-      0,
-      NULL },
-
     { ngx_string("use"),
       NGX_EVENT_CONF|NGX_CONF_TAKE1,
       ngx_event_use,
@@ -212,7 +204,9 @@ ngx_process_events_and_timers(ngx_cycle_t *cycle)
         timer = ngx_event_find_timer();
         flags = NGX_UPDATE_TIME;
 
-#if (NGX_OLD_THREADS)
+#if (NGX_WIN32)
+
+        /* handle signals from master in case of network inactivity */
 
         if (timer == NGX_TIMER_INFINITE || timer > 500) {
             timer = 500;
@@ -328,7 +322,7 @@ ngx_handle_read_event(ngx_event_t *rev, ngx_uint_t flags)
         }
     }
 
-    /* aio, iocp, rtsig */
+    /* iocp */
 
     return NGX_OK;
 }
@@ -407,7 +401,7 @@ ngx_handle_write_event(ngx_event_t *wev, size_t lowat)
         }
     }
 
-    /* aio, iocp, rtsig */
+    /* iocp */
 
     return NGX_OK;
 }
@@ -506,7 +500,7 @@ ngx_event_module_init(ngx_cycle_t *cycle)
 #endif
 
     shm.size = size;
-    shm.name.len = sizeof("nginx_shared_zone");
+    shm.name.len = sizeof("nginx_shared_zone") - 1;
     shm.name.data = (u_char *) "nginx_shared_zone";
     shm.log = cycle->log;
 
@@ -731,6 +725,12 @@ ngx_event_process_init(ngx_cycle_t *cycle)
     ls = cycle->listening.elts;
     for (i = 0; i < cycle->listening.nelts; i++) {
 
+#if (NGX_HAVE_REUSEPORT)
+        if (ls[i].reuseport && ls[i].worker != ngx_worker) {
+            continue;
+        }
+#endif
+
         c = ngx_get_connection(ls[i].fd, cycle->log);
 
         if (c == NULL) {
@@ -811,19 +811,17 @@ ngx_event_process_init(ngx_cycle_t *cycle)
 
         rev->handler = ngx_event_accept;
 
-        if (ngx_use_accept_mutex) {
+        if (ngx_use_accept_mutex
+#if (NGX_HAVE_REUSEPORT)
+            && !ls[i].reuseport
+#endif
+           )
+        {
             continue;
         }
 
-        if (ngx_event_flags & NGX_USE_RTSIG_EVENT) {
-            if (ngx_add_conn(c) == NGX_ERROR) {
-                return NGX_ERROR;
-            }
-
-        } else {
-            if (ngx_add_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) {
-                return NGX_ERROR;
-            }
+        if (ngx_add_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) {
+            return NGX_ERROR;
         }
 
 #endif
@@ -929,8 +927,9 @@ ngx_events_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
 
     *cf = pcf;
 
-    if (rv != NGX_CONF_OK)
+    if (rv != NGX_CONF_OK) {
         return rv;
+    }
 
     for (i = 0; ngx_modules[i]; i++) {
         if (ngx_modules[i]->type != NGX_EVENT_MODULE) {
@@ -962,12 +961,6 @@ ngx_event_connections(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
         return "is duplicate";
     }
 
-    if (ngx_strcmp(cmd->name.data, "connections") == 0) {
-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
-                           "the \"connections\" directive is deprecated, "
-                           "use the \"worker_connections\" directive instead");
-    }
-
     value = cf->args->elts;
     ecf->connections = ngx_atoi(value[1].data, value[1].len);
     if (ecf->connections == (ngx_uint_t) NGX_ERROR) {
@@ -1189,10 +1182,6 @@ ngx_event_core_init_conf(ngx_cycle_t *cycle, void *conf)
 #if (NGX_HAVE_EPOLL) && !(NGX_TEST_BUILD_EPOLL)
     int                  fd;
 #endif
-#if (NGX_HAVE_RTSIG)
-    ngx_uint_t           rtsig;
-    ngx_core_conf_t     *ccf;
-#endif
     ngx_int_t            i;
     ngx_module_t        *module;
     ngx_event_module_t  *event_module;
@@ -1213,18 +1202,6 @@ ngx_event_core_init_conf(ngx_cycle_t *cycle, void *conf)
 
 #endif
 
-#if (NGX_HAVE_RTSIG)
-
-    if (module == NULL) {
-        module = &ngx_rtsig_module;
-        rtsig = 1;
-
-    } else {
-        rtsig = 0;
-    }
-
-#endif
-
 #if (NGX_HAVE_DEVPOLL)
 
     module = &ngx_devpoll_module;
@@ -1281,31 +1258,5 @@ ngx_event_core_init_conf(ngx_cycle_t *cycle, void *conf)
     ngx_conf_init_value(ecf->accept_mutex, 1);
     ngx_conf_init_msec_value(ecf->accept_mutex_delay, 500);
 
-
-#if (NGX_HAVE_RTSIG)
-
-    if (!rtsig) {
-        return NGX_CONF_OK;
-    }
-
-    if (ecf->accept_mutex) {
-        return NGX_CONF_OK;
-    }
-
-    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
-
-    if (ccf->worker_processes == 0) {
-        return NGX_CONF_OK;
-    }
-
-    ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,
-                  "the \"rtsig\" method requires \"accept_mutex\" to be on");
-
-    return NGX_CONF_ERROR;
-
-#else
-
     return NGX_CONF_OK;
-
-#endif
 }

  Renamed: vendor/nginx-1.9.5/src/event/ngx_event.h (+14 -23) 96%
===================================================================
--- vendor/nginx-1.8.0/src/event/ngx_event.h    2015-09-27 18:09:01 +0900 (b7009a3)
+++ vendor/nginx-1.9.5/src/event/ngx_event.h    2015-09-27 22:10:53 +0900 (855c58d)
@@ -34,7 +34,7 @@ struct ngx_event_s {
 
     unsigned         accept:1;
 
-    /* used to detect the stale events in kqueue, rtsig, and epoll */
+    /* used to detect the stale events in kqueue and epoll */
     unsigned         instance:1;
 
     /*
@@ -68,6 +68,14 @@ struct ngx_event_s {
 
     unsigned         posted:1;
 
+    unsigned         closed:1;
+
+    /* to test on worker exit */
+    unsigned         channel:1;
+    unsigned         resolver:1;
+
+    unsigned         cancelable:1;
+
 #if (NGX_WIN32)
     /* setsockopt(SO_UPDATE_ACCEPT_CONTEXT) was successful */
     unsigned         accept_context_updated:1;
@@ -103,14 +111,8 @@ struct ngx_event_s {
     ngx_event_handler_pt  handler;
 
 
-#if (NGX_HAVE_AIO)
-
 #if (NGX_HAVE_IOCP)
     ngx_event_ovlp_t ovlp;
-#else
-    struct aiocb     aiocb;
-#endif
-
 #endif
 
     ngx_uint_t       index;
@@ -122,15 +124,6 @@ struct ngx_event_s {
     /* the posted queue */
     ngx_queue_t      queue;
 
-    unsigned         closed:1;
-
-    /* to test on worker exit */
-    unsigned         channel:1;
-    unsigned         resolver:1;
-
-    unsigned         cancelable:1;
-
-
 #if 0
 
     /* the threads support */
@@ -236,7 +229,7 @@ extern ngx_event_actions_t   ngx_event_actions;
 #define NGX_USE_LOWAT_EVENT      0x00000010
 
 /*
- * The event filter requires to do i/o operation until EAGAIN: epoll, rtsig.
+ * The event filter requires to do i/o operation until EAGAIN: epoll.
  */
 #define NGX_USE_GREEDY_EVENT     0x00000020
 
@@ -246,25 +239,23 @@ extern ngx_event_actions_t   ngx_event_actions;
 #define NGX_USE_EPOLL_EVENT      0x00000040
 
 /*
- * No need to add or delete the event filters: rtsig.
+ * Obsolete.
  */
 #define NGX_USE_RTSIG_EVENT      0x00000080
 
 /*
- * No need to add or delete the event filters: overlapped, aio_read,
- * aioread, io_submit.
+ * Obsolete.
  */
 #define NGX_USE_AIO_EVENT        0x00000100
 
 /*
  * Need to add socket or handle only once: i/o completion port.
- * It also requires NGX_HAVE_AIO and NGX_USE_AIO_EVENT to be set.
  */
 #define NGX_USE_IOCP_EVENT       0x00000200
 
 /*
  * The event filter has no opaque data and requires file descriptors table:
- * poll, /dev/poll, rtsig.
+ * poll, /dev/poll.
  */
 #define NGX_USE_FD_EVENT         0x00000400
 
@@ -289,7 +280,7 @@ extern ngx_event_actions_t   ngx_event_actions;
 /*
  * The event filter is deleted just before the closing file.
  * Has no meaning for select and poll.
- * kqueue, epoll, rtsig, eventport:  allows to avoid explicit delete,
+ * kqueue, epoll, eventport:         allows to avoid explicit delete,
  *                                   because filter automatically is deleted
  *                                   on file close,
  *

  Renamed: vendor/nginx-1.9.5/src/event/ngx_event_accept.c (+30 -39) 88%
===================================================================
--- vendor/nginx-1.8.0/src/event/ngx_event_accept.c    2015-09-27 18:09:01 +0900 (6285baa)
+++ vendor/nginx-1.9.5/src/event/ngx_event_accept.c    2015-09-27 22:10:53 +0900 (8888f5a)
@@ -11,7 +11,7 @@
 
 
 static ngx_int_t ngx_enable_accept_events(ngx_cycle_t *cycle);
-static ngx_int_t ngx_disable_accept_events(ngx_cycle_t *cycle);
+static ngx_int_t ngx_disable_accept_events(ngx_cycle_t *cycle, ngx_uint_t all);
 static void ngx_close_accepted_connection(ngx_connection_t *c);
 
 
@@ -42,10 +42,7 @@ ngx_event_accept(ngx_event_t *ev)
 
     ecf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_core_module);
 
-    if (ngx_event_flags & NGX_USE_RTSIG_EVENT) {
-        ev->available = 1;
-
-    } else if (!(ngx_event_flags & NGX_USE_KQUEUE_EVENT)) {
+    if (!(ngx_event_flags & NGX_USE_KQUEUE_EVENT)) {
         ev->available = ecf->multi_accept;
     }
 
@@ -112,7 +109,7 @@ ngx_event_accept(ngx_event_t *ev)
             }
 
             if (err == NGX_EMFILE || err == NGX_ENFILE) {
-                if (ngx_disable_accept_events((ngx_cycle_t *) ngx_cycle)
+                if (ngx_disable_accept_events((ngx_cycle_t *) ngx_cycle, 1)
                     != NGX_OK)
                 {
                     return;
@@ -176,10 +173,10 @@ ngx_event_accept(ngx_event_t *ev)
             return;
         }
 
-        /* set a blocking mode for aio and non-blocking mode for others */
+        /* set a blocking mode for iocp and non-blocking mode for others */
 
         if (ngx_inherited_nonblocking) {
-            if (ngx_event_flags & NGX_USE_AIO_EVENT) {
+            if (ngx_event_flags & NGX_USE_IOCP_EVENT) {
                 if (ngx_blocking(s) == -1) {
                     ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,
                                   ngx_blocking_n " failed");
@@ -189,7 +186,7 @@ ngx_event_accept(ngx_event_t *ev)
             }
 
         } else {
-            if (!(ngx_event_flags & (NGX_USE_AIO_EVENT|NGX_USE_RTSIG_EVENT))) {
+            if (!(ngx_event_flags & NGX_USE_IOCP_EVENT)) {
                 if (ngx_nonblocking(s) == -1) {
                     ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,
                                   ngx_nonblocking_n " failed");
@@ -232,8 +229,7 @@ ngx_event_accept(ngx_event_t *ev)
 
         wev->ready = 1;
 
-        if (ngx_event_flags & (NGX_USE_AIO_EVENT|NGX_USE_RTSIG_EVENT)) {
-            /* rtsig, aio, iocp */
+        if (ngx_event_flags & NGX_USE_IOCP_EVENT) {
             rev->ready = 1;
         }
 
@@ -375,10 +371,7 @@ ngx_trylock_accept_mutex(ngx_cycle_t *cycle)
         ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
                        "accept mutex locked");
 
-        if (ngx_accept_mutex_held
-            && ngx_accept_events == 0
-            && !(ngx_event_flags & NGX_USE_RTSIG_EVENT))
-        {
+        if (ngx_accept_mutex_held && ngx_accept_events == 0) {
             return NGX_OK;
         }
 
@@ -397,7 +390,7 @@ ngx_trylock_accept_mutex(ngx_cycle_t *cycle)
                    "accept mutex lock failed: %ui", ngx_accept_mutex_held);
 
     if (ngx_accept_mutex_held) {
-        if (ngx_disable_accept_events(cycle) == NGX_ERROR) {
+        if (ngx_disable_accept_events(cycle, 0) == NGX_ERROR) {
             return NGX_ERROR;
         }
 
@@ -420,20 +413,12 @@ ngx_enable_accept_events(ngx_cycle_t *cycle)
 
         c = ls[i].connection;
 
-        if (c->read->active) {
+        if (c == NULL || c->read->active) {
             continue;
         }
 
-        if (ngx_event_flags & NGX_USE_RTSIG_EVENT) {
-
-            if (ngx_add_conn(c) == NGX_ERROR) {
-                return NGX_ERROR;
-            }
-
-        } else {
-            if (ngx_add_event(c->read, NGX_READ_EVENT, 0) == NGX_ERROR) {
-                return NGX_ERROR;
-            }
+        if (ngx_add_event(c->read, NGX_READ_EVENT, 0) == NGX_ERROR) {
+            return NGX_ERROR;
         }
     }
 
@@ -442,7 +427,7 @@ ngx_enable_accept_events(ngx_cycle_t *cycle)
 
 
 static ngx_int_t
-ngx_disable_accept_events(ngx_cycle_t *cycle)
+ngx_disable_accept_events(ngx_cycle_t *cycle, ngx_uint_t all)
 {
     ngx_uint_t         i;
     ngx_listening_t   *ls;
@@ -453,21 +438,27 @@ ngx_disable_accept_events(ngx_cycle_t *cycle)
 
         c = ls[i].connection;
 
-        if (!c->read->active) {
+        if (c == NULL || !c->read->active) {
             continue;
         }
 
-        if (ngx_event_flags & NGX_USE_RTSIG_EVENT) {
-            if (ngx_del_conn(c, NGX_DISABLE_EVENT) == NGX_ERROR) {
-                return NGX_ERROR;
-            }
+#if (NGX_HAVE_REUSEPORT)
 
-        } else {
-            if (ngx_del_event(c->read, NGX_READ_EVENT, NGX_DISABLE_EVENT)
-                == NGX_ERROR)
-            {
-                return NGX_ERROR;
-            }
+        /*
+         * do not disable accept on worker's own sockets
+         * when disabling accept events due to accept mutex
+         */
+
+        if (ls[i].reuseport && !all) {
+            continue;
+        }
+
+#endif
+
+        if (ngx_del_event(c->read, NGX_READ_EVENT, NGX_DISABLE_EVENT)
+            == NGX_ERROR)
+        {
+            return NGX_ERROR;
         }
     }
 

  Renamed: vendor/nginx-1.9.5/src/event/ngx_event_acceptex.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/event/ngx_event_connect.c (+1 -3) 98%
===================================================================
--- vendor/nginx-1.8.0/src/event/ngx_event_connect.c    2015-09-27 18:09:01 +0900 (a09d2e5)
+++ vendor/nginx-1.9.5/src/event/ngx_event_connect.c    2015-09-27 22:10:53 +0900 (1186958)
@@ -171,13 +171,11 @@ ngx_event_connect_peer(ngx_peer_connection_t *pc)
         return NGX_OK;
     }
 
-    if (ngx_event_flags & NGX_USE_AIO_EVENT) {
+    if (ngx_event_flags & NGX_USE_IOCP_EVENT) {
 
         ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pc->log, ngx_socket_errno,
                        "connect(): %d", rc);
 
-        /* aio, iocp */
-
         if (ngx_blocking(s) == -1) {
             ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,
                           ngx_blocking_n " failed");

  Renamed: vendor/nginx-1.9.5/src/event/ngx_event_connect.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/event/ngx_event_connectex.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/event/ngx_event_openssl.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/event/ngx_event_openssl.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/event/ngx_event_openssl_stapling.c (+68 -6) 95%
===================================================================
--- vendor/nginx-1.8.0/src/event/ngx_event_openssl_stapling.c    2015-09-27 18:09:01 +0900 (c39598f)
+++ vendor/nginx-1.9.5/src/event/ngx_event_openssl_stapling.c    2015-09-27 22:10:53 +0900 (fa77678)
@@ -32,6 +32,7 @@ typedef struct {
     X509                        *issuer;
 
     time_t                       valid;
+    time_t                       refresh;
 
     unsigned                     verify:1;
     unsigned                     loading:1;
@@ -93,6 +94,8 @@ static int ngx_ssl_certificate_status_callback(ngx_ssl_conn_t *ssl_conn,
 static void ngx_ssl_stapling_update(ngx_ssl_stapling_t *staple);
 static void ngx_ssl_stapling_ocsp_handler(ngx_ssl_ocsp_ctx_t *ctx);
 
+static time_t ngx_ssl_stapling_time(ASN1_GENERALIZEDTIME *asn1time);
+
 static void ngx_ssl_stapling_cleanup(void *data);
 
 static ngx_ssl_ocsp_ctx_t *ngx_ssl_ocsp_start(void);
@@ -242,6 +245,7 @@ ngx_ssl_stapling_file(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *file)
 
     staple->staple.data = buf;
     staple->staple.len = len;
+    staple->valid = NGX_MAX_TIME_T_VALUE;
 
     return NGX_OK;
 
@@ -462,7 +466,9 @@ ngx_ssl_certificate_status_callback(ngx_ssl_conn_t *ssl_conn, void *data)
     staple = data;
     rc = SSL_TLSEXT_ERR_NOACK;
 
-    if (staple->staple.len) {
+    if (staple->staple.len
+        && staple->valid >= ngx_time())
+    {
         /* we have to copy ocsp response as OpenSSL will free it by itself */
 
         p = OPENSSL_malloc(staple->staple.len);
@@ -490,7 +496,7 @@ ngx_ssl_stapling_update(ngx_ssl_stapling_t *staple)
     ngx_ssl_ocsp_ctx_t  *ctx;
 
     if (staple->host.len == 0
-        || staple->loading || staple->valid >= ngx_time())
+        || staple->loading || staple->refresh >= ngx_time())
     {
         return;
     }
@@ -532,6 +538,7 @@ ngx_ssl_stapling_ocsp_handler(ngx_ssl_ocsp_ctx_t *ctx)
     u_char                *p;
     int                    n;
     size_t                 len;
+    time_t                 now, valid;
     ngx_str_t              response;
     X509_STORE            *store;
     STACK_OF(X509)        *chain;
@@ -542,6 +549,7 @@ ngx_ssl_stapling_ocsp_handler(ngx_ssl_ocsp_ctx_t *ctx)
     ASN1_GENERALIZEDTIME  *thisupdate, *nextupdate;
 
     staple = ctx->data;
+    now = ngx_time();
     ocsp = NULL;
     basic = NULL;
     id = NULL;
@@ -629,17 +637,33 @@ ngx_ssl_stapling_ocsp_handler(ngx_ssl_ocsp_ctx_t *ctx)
         goto error;
     }
 
+    if (nextupdate) {
+        valid = ngx_ssl_stapling_time(nextupdate);
+        if (valid == (time_t) NGX_ERROR) {
+            ngx_log_error(NGX_LOG_ERR, ctx->log, 0,
+                          "invalid nextUpdate time in certificate status");
+            goto error;
+        }
+
+    } else {
+        valid = NGX_MAX_TIME_T_VALUE;
+    }
+
     OCSP_CERTID_free(id);
     OCSP_BASICRESP_free(basic);
     OCSP_RESPONSE_free(ocsp);
 
+    id = NULL;
+    basic = NULL;
+    ocsp = NULL;
+
     /* copy the response to memory not in ctx->pool */
 
     response.len = len;
     response.data = ngx_alloc(response.len, ctx->log);
 
     if (response.data == NULL) {
-        goto done;
+        goto error;
     }
 
     ngx_memcpy(response.data, ctx->response->pos, response.len);
@@ -653,11 +677,15 @@ ngx_ssl_stapling_ocsp_handler(ngx_ssl_ocsp_ctx_t *ctx)
     }
 
     staple->staple = response;
+    staple->valid = valid;
 
-done:
+    /*
+     * refresh before the response expires,
+     * but not earlier than in 5 minutes, and at least in an hour
+     */
 
     staple->loading = 0;
-    staple->valid = ngx_time() + 3600; /* ssl_stapling_valid */
+    staple->refresh = ngx_max(ngx_min(valid - 300, now + 3600), now + 300);
 
     ngx_ssl_ocsp_done(ctx);
     return;
@@ -665,7 +693,7 @@ done:
 error:
 
     staple->loading = 0;
-    staple->valid = ngx_time() + 300; /* ssl_stapling_err_valid */
+    staple->refresh = now + 300;
 
     if (id) {
         OCSP_CERTID_free(id);
@@ -683,6 +711,40 @@ error:
 }
 
 
+static time_t
+ngx_ssl_stapling_time(ASN1_GENERALIZEDTIME *asn1time)
+{
+    u_char  *value;
+    size_t   len;
+    time_t   time;
+    BIO     *bio;
+
+    /*
+     * OpenSSL doesn't provide a way to convert ASN1_GENERALIZEDTIME
+     * into time_t.  To do this, we use ASN1_GENERALIZEDTIME_print(),
+     * which uses the "MMM DD HH:MM:SS YYYY [GMT]" format (e.g.,
+     * "Feb  3 00:55:52 2015 GMT"), and parse the result.
+     */
+
+    bio = BIO_new(BIO_s_mem());
+    if (bio == NULL) {
+        return NGX_ERROR;
+    }
+
+    /* fake weekday prepended to match C asctime() format */
+
+    BIO_write(bio, "Tue ", sizeof("Tue ") - 1);
+    ASN1_GENERALIZEDTIME_print(bio, asn1time);
+    len = BIO_get_mem_data(bio, &value);
+
+    time = ngx_parse_http_time(value, len);
+
+    BIO_free(bio);
+
+    return time;
+}
+
+
 static void
 ngx_ssl_stapling_cleanup(void *data)
 {

  Renamed: vendor/nginx-1.9.5/src/event/ngx_event_pipe.c (+1 -1) 99%
===================================================================
--- vendor/nginx-1.8.0/src/event/ngx_event_pipe.c    2015-09-27 18:09:01 +0900 (8ba247f)
+++ vendor/nginx-1.9.5/src/event/ngx_event_pipe.c    2015-09-27 22:10:53 +0900 (2d0e7d3)
@@ -22,8 +22,8 @@ static ngx_int_t ngx_event_pipe_drain_chains(ngx_event_pipe_t *p);
 ngx_int_t
 ngx_event_pipe(ngx_event_pipe_t *p, ngx_int_t do_write)
 {
-    u_int         flags;
     ngx_int_t     rc;
+    ngx_uint_t    flags;
     ngx_event_t  *rev, *wev;
 
     for ( ;; ) {

  Renamed: vendor/nginx-1.9.5/src/event/ngx_event_pipe.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/event/ngx_event_posted.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/event/ngx_event_posted.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/event/ngx_event_timer.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/event/ngx_event_timer.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_access_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_addition_filter_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_auth_basic_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_auth_request_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_autoindex_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_browser_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_charset_filter_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_chunked_filter_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_dav_module.c (+1 -1) 99%
===================================================================
--- vendor/nginx-1.8.0/src/http/modules/ngx_http_dav_module.c    2015-09-27 18:09:01 +0900 (529aba5)
+++ vendor/nginx-1.9.5/src/http/modules/ngx_http_dav_module.c    2015-09-27 22:10:53 +0900 (b9fadd0)
@@ -255,7 +255,7 @@ ngx_http_dav_put_handler(ngx_http_request_t *r)
     ext.log = r->connection->log;
 
     if (r->headers_in.date) {
-        date = ngx_http_parse_time(r->headers_in.date->value.data,
+        date = ngx_parse_http_time(r->headers_in.date->value.data,
                                    r->headers_in.date->value.len);
 
         if (date != NGX_ERROR) {

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_degradation_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_empty_gif_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_fastcgi_module.c (+0 -1) 99%
===================================================================
--- vendor/nginx-1.8.0/src/http/modules/ngx_http_fastcgi_module.c    2015-09-27 18:09:01 +0900 (f3f78e8)
+++ vendor/nginx-1.9.5/src/http/modules/ngx_http_fastcgi_module.c    2015-09-27 22:10:53 +0900 (668719f)
@@ -1770,7 +1770,6 @@ ngx_http_fastcgi_process_header(ngx_http_request_t *r)
 #if (NGX_HTTP_CACHE)
 
         if (f->large_stderr && r->cache) {
-            u_char                     *start;
             ssize_t                     len;
             ngx_http_fastcgi_header_t  *fh;
 

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_flv_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_geo_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_geoip_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_gunzip_filter_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_gzip_filter_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_gzip_static_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_headers_filter_module.c (+1 -1) 99%
===================================================================
--- vendor/nginx-1.8.0/src/http/modules/ngx_http_headers_filter_module.c    2015-09-27 18:09:01 +0900 (a356814)
+++ vendor/nginx-1.9.5/src/http/modules/ngx_http_headers_filter_module.c    2015-09-27 22:10:53 +0900 (985e5b3)
@@ -498,7 +498,7 @@ ngx_http_set_last_modified(ngx_http_request_t *r, ngx_http_header_val_t *hv,
     }
 
     r->headers_out.last_modified_time =
-        (value->len) ? ngx_http_parse_time(value->data, value->len) : -1;
+        (value->len) ? ngx_parse_http_time(value->data, value->len) : -1;
 
     return NGX_OK;
 }

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_image_filter_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_index_module.c (+0 -0) 100%
===================================================================

  Copied: vendor/nginx-1.9.5/src/http/modules/ngx_http_limit_conn_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_limit_req_module.c (+0 -7) 99%
===================================================================
--- vendor/nginx-1.8.0/src/http/modules/ngx_http_limit_req_module.c    2015-09-27 18:09:01 +0900 (5d5cbe9)
+++ vendor/nginx-1.9.5/src/http/modules/ngx_http_limit_req_module.c    2015-09-27 22:10:53 +0900 (9059ac3)
@@ -919,13 +919,6 @@ ngx_http_limit_req(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
         return NGX_CONF_ERROR;
     }
 
-    if (shm_zone->data == NULL) {
-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
-                           "unknown limit_req_zone \"%V\"",
-                           &shm_zone->shm.name);
-        return NGX_CONF_ERROR;
-    }
-
     limits = lrcf->limits.elts;
 
     if (limits == NULL) {

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_log_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_map_module.c (+5 -5) 98%
===================================================================
--- vendor/nginx-1.8.0/src/http/modules/ngx_http_map_module.c    2015-09-27 18:09:01 +0900 (3245e04)
+++ vendor/nginx-1.9.5/src/http/modules/ngx_http_map_module.c    2015-09-27 22:10:53 +0900 (2b80d0f)
@@ -375,7 +375,7 @@ ngx_http_map_cmp_dns_wildcards(const void *one, const void *two)
 static char *
 ngx_http_map(ngx_conf_t *cf, ngx_command_t *dummy, void *conf)
 {
-    ngx_int_t                   rc, index;
+    ngx_int_t                   rv, index;
     ngx_str_t                  *value, name;
     ngx_uint_t                  i, key;
     ngx_http_map_conf_ctx_t    *ctx;
@@ -546,19 +546,19 @@ found:
         value[0].data++;
     }
 
-    rc = ngx_hash_add_key(&ctx->keys, &value[0], var,
+    rv = ngx_hash_add_key(&ctx->keys, &value[0], var,
                           (ctx->hostnames) ? NGX_HASH_WILDCARD_KEY : 0);
 
-    if (rc == NGX_OK) {
+    if (rv == NGX_OK) {
         return NGX_CONF_OK;
     }
 
-    if (rc == NGX_DECLINED) {
+    if (rv == NGX_DECLINED) {
         ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
                            "invalid hostname or wildcard \"%V\"", &value[0]);
     }
 
-    if (rc == NGX_BUSY) {
+    if (rv == NGX_BUSY) {
         ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
                            "conflicting parameter \"%V\"", &value[0]);
     }

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_memcached_module.c (+1 -0) 99%
===================================================================
--- vendor/nginx-1.8.0/src/http/modules/ngx_http_memcached_module.c    2015-09-27 18:09:01 +0900 (17f1d8e)
+++ vendor/nginx-1.9.5/src/http/modules/ngx_http_memcached_module.c    2015-09-27 22:10:53 +0900 (8341b92)
@@ -618,6 +618,7 @@ ngx_http_memcached_create_loc_conf(ngx_conf_t *cf)
     conf->upstream.intercept_404 = 1;
     conf->upstream.pass_request_headers = 0;
     conf->upstream.pass_request_body = 0;
+    conf->upstream.force_ranges = 1;
 
     conf->index = NGX_CONF_UNSET;
     conf->gzip_flag = NGX_CONF_UNSET_UINT;

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_mp4_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_not_modified_filter_module.c (+2 -2) 98%
===================================================================
--- vendor/nginx-1.8.0/src/http/modules/ngx_http_not_modified_filter_module.c    2015-09-27 18:09:01 +0900 (acc94de)
+++ vendor/nginx-1.9.5/src/http/modules/ngx_http_not_modified_filter_module.c    2015-09-27 22:10:53 +0900 (032ba96)
@@ -118,7 +118,7 @@ ngx_http_test_if_unmodified(ngx_http_request_t *r)
         return 0;
     }
 
-    iums = ngx_http_parse_time(r->headers_in.if_unmodified_since->value.data,
+    iums = ngx_parse_http_time(r->headers_in.if_unmodified_since->value.data,
                                r->headers_in.if_unmodified_since->value.len);
 
     ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
@@ -148,7 +148,7 @@ ngx_http_test_if_modified(ngx_http_request_t *r)
         return 1;
     }
 
-    ims = ngx_http_parse_time(r->headers_in.if_modified_since->value.data,
+    ims = ngx_parse_http_time(r->headers_in.if_modified_since->value.data,
                               r->headers_in.if_modified_since->value.len);
 
     ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_proxy_module.c (+2 -3) 99%
===================================================================
--- vendor/nginx-1.8.0/src/http/modules/ngx_http_proxy_module.c    2015-09-27 18:09:01 +0900 (00e8923)
+++ vendor/nginx-1.9.5/src/http/modules/ngx_http_proxy_module.c    2015-09-27 22:10:53 +0900 (514c23b)
@@ -3168,9 +3168,8 @@ ngx_http_proxy_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
                               prev->upstream.ssl_session_reuse, 1);
 
     ngx_conf_merge_bitmask_value(conf->ssl_protocols, prev->ssl_protocols,
-                                 (NGX_CONF_BITMASK_SET|NGX_SSL_SSLv3
-                                  |NGX_SSL_TLSv1|NGX_SSL_TLSv1_1
-                                  |NGX_SSL_TLSv1_2));
+                                 (NGX_CONF_BITMASK_SET|NGX_SSL_TLSv1
+                                  |NGX_SSL_TLSv1_1|NGX_SSL_TLSv1_2));
 
     ngx_conf_merge_str_value(conf->ssl_ciphers, prev->ssl_ciphers,
                              "DEFAULT");

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_random_index_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_range_filter_module.c (+1 -1) 99%
===================================================================
--- vendor/nginx-1.8.0/src/http/modules/ngx_http_range_filter_module.c    2015-09-27 18:09:01 +0900 (bb9a42c)
+++ vendor/nginx-1.9.5/src/http/modules/ngx_http_range_filter_module.c    2015-09-27 22:10:53 +0900 (952da75)
@@ -204,7 +204,7 @@ ngx_http_range_header_filter(ngx_http_request_t *r)
             goto next_filter;
         }
 
-        if_range_time = ngx_http_parse_time(if_range->data, if_range->len);
+        if_range_time = ngx_parse_http_time(if_range->data, if_range->len);
 
         ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
                        "http ir:%d lm:%d",

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_realip_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_referer_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_rewrite_module.c (+1 -1) 99%
===================================================================
--- vendor/nginx-1.8.0/src/http/modules/ngx_http_rewrite_module.c    2015-09-27 18:09:01 +0900 (f241196)
+++ vendor/nginx-1.9.5/src/http/modules/ngx_http_rewrite_module.c    2015-09-27 22:10:53 +0900 (754512f)
@@ -612,7 +612,7 @@ ngx_http_rewrite_if(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
     save = *cf;
     cf->ctx = ctx;
 
-    if (pclcf->name.len == 0) {
+    if (cf->cmd_type == NGX_HTTP_SRV_CONF) {
         if_code->loc_conf = NULL;
         cf->cmd_type = NGX_HTTP_SIF_CONF;
 

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_scgi_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_secure_link_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_split_clients_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_ssi_filter_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_ssi_filter_module.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_ssl_module.c (+14 -12) 97%
===================================================================
--- vendor/nginx-1.8.0/src/http/modules/ngx_http_ssl_module.c    2015-09-27 18:09:01 +0900 (275febe)
+++ vendor/nginx-1.9.5/src/http/modules/ngx_http_ssl_module.c    2015-09-27 22:10:53 +0900 (7b051ea)
@@ -326,10 +326,10 @@ ngx_http_ssl_alpn_select(ngx_ssl_conn_t *ssl_conn, const unsigned char **out,
 #if (NGX_DEBUG)
     unsigned int            i;
 #endif
-#if (NGX_HTTP_SPDY)
+#if (NGX_HTTP_V2)
     ngx_http_connection_t  *hc;
 #endif
-#if (NGX_HTTP_SPDY || NGX_DEBUG)
+#if (NGX_HTTP_V2 || NGX_DEBUG)
     ngx_connection_t       *c;
 
     c = ngx_ssl_get_connection(ssl_conn);
@@ -342,12 +342,13 @@ ngx_http_ssl_alpn_select(ngx_ssl_conn_t *ssl_conn, const unsigned char **out,
     }
 #endif
 
-#if (NGX_HTTP_SPDY)
+#if (NGX_HTTP_V2)
     hc = c->data;
 
-    if (hc->addr_conf->spdy) {
-        srv = (unsigned char *) NGX_SPDY_NPN_ADVERTISE NGX_HTTP_NPN_ADVERTISE;
-        srvlen = sizeof(NGX_SPDY_NPN_ADVERTISE NGX_HTTP_NPN_ADVERTISE) - 1;
+    if (hc->addr_conf->http2) {
+        srv =
+           (unsigned char *) NGX_HTTP_V2_ALPN_ADVERTISE NGX_HTTP_NPN_ADVERTISE;
+        srvlen = sizeof(NGX_HTTP_V2_ALPN_ADVERTISE NGX_HTTP_NPN_ADVERTISE) - 1;
 
     } else
 #endif
@@ -378,22 +379,23 @@ static int
 ngx_http_ssl_npn_advertised(ngx_ssl_conn_t *ssl_conn,
     const unsigned char **out, unsigned int *outlen, void *arg)
 {
-#if (NGX_HTTP_SPDY || NGX_DEBUG)
+#if (NGX_HTTP_V2 || NGX_DEBUG)
     ngx_connection_t  *c;
 
     c = ngx_ssl_get_connection(ssl_conn);
     ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "SSL NPN advertised");
 #endif
 
-#if (NGX_HTTP_SPDY)
+#if (NGX_HTTP_V2)
     {
     ngx_http_connection_t  *hc;
 
     hc = c->data;
 
-    if (hc->addr_conf->spdy) {
-        *out = (unsigned char *) NGX_SPDY_NPN_ADVERTISE NGX_HTTP_NPN_ADVERTISE;
-        *outlen = sizeof(NGX_SPDY_NPN_ADVERTISE NGX_HTTP_NPN_ADVERTISE) - 1;
+    if (hc->addr_conf->http2) {
+        *out =
+            (unsigned char *) NGX_HTTP_V2_NPN_ADVERTISE NGX_HTTP_NPN_ADVERTISE;
+        *outlen = sizeof(NGX_HTTP_V2_NPN_ADVERTISE NGX_HTTP_NPN_ADVERTISE) - 1;
 
         return SSL_TLSEXT_ERR_OK;
     }
@@ -561,7 +563,7 @@ ngx_http_ssl_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)
                          prev->prefer_server_ciphers, 0);
 
     ngx_conf_merge_bitmask_value(conf->protocols, prev->protocols,
-                         (NGX_CONF_BITMASK_SET|NGX_SSL_SSLv3|NGX_SSL_TLSv1
+                         (NGX_CONF_BITMASK_SET|NGX_SSL_TLSv1
                           |NGX_SSL_TLSv1_1|NGX_SSL_TLSv1_2));
 
     ngx_conf_merge_size_value(conf->buffer_size, prev->buffer_size,

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_ssl_module.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_static_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_stub_status_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_sub_filter_module.c (+372 -172) 57%
===================================================================
--- vendor/nginx-1.8.0/src/http/modules/ngx_http_sub_filter_module.c    2015-09-27 18:09:01 +0900 (e6a34a7)
+++ vendor/nginx-1.9.5/src/http/modules/ngx_http_sub_filter_module.c    2015-09-27 22:10:53 +0900 (8ba75ed)
@@ -11,8 +11,32 @@
 
 
 typedef struct {
-    ngx_str_t                  match;
+    ngx_http_complex_value_t   match;
     ngx_http_complex_value_t   value;
+} ngx_http_sub_pair_t;
+
+
+typedef struct {
+    ngx_str_t                  match;
+    ngx_http_complex_value_t  *value;
+} ngx_http_sub_match_t;
+
+
+typedef struct {
+    ngx_uint_t                 min_match_len;
+    ngx_uint_t                 max_match_len;
+
+    u_char                     index[257];
+    u_char                     shift[256];
+} ngx_http_sub_tables_t;
+
+
+typedef struct {
+    ngx_uint_t                 dynamic; /* unsigned dynamic:1; */
+
+    ngx_array_t               *pairs;
+
+    ngx_http_sub_tables_t     *tables;
 
     ngx_hash_t                 types;
 
@@ -20,17 +44,11 @@ typedef struct {
     ngx_flag_t                 last_modified;
 
     ngx_array_t               *types_keys;
+    ngx_array_t               *matches;
 } ngx_http_sub_loc_conf_t;
 
 
-typedef enum {
-    sub_start_state = 0,
-    sub_match_state,
-} ngx_http_sub_state_e;
-
-
 typedef struct {
-    ngx_str_t                  match;
     ngx_str_t                  saved;
     ngx_str_t                  looked;
 
@@ -48,12 +66,20 @@ typedef struct {
     ngx_chain_t               *busy;
     ngx_chain_t               *free;
 
-    ngx_str_t                  sub;
+    ngx_str_t                 *sub;
+    ngx_uint_t                 applied;
 
-    ngx_uint_t                 state;
+    ngx_int_t                  offset;
+    ngx_uint_t                 index;
+
+    ngx_http_sub_tables_t     *tables;
+    ngx_array_t               *matches;
 } ngx_http_sub_ctx_t;
 
 
+static ngx_uint_t ngx_http_sub_cmp_index;
+
+
 static ngx_int_t ngx_http_sub_output(ngx_http_request_t *r,
     ngx_http_sub_ctx_t *ctx);
 static ngx_int_t ngx_http_sub_parse(ngx_http_request_t *r,
@@ -64,6 +90,9 @@ static char * ngx_http_sub_filter(ngx_conf_t *cf, ngx_command_t *cmd,
 static void *ngx_http_sub_create_conf(ngx_conf_t *cf);
 static char *ngx_http_sub_merge_conf(ngx_conf_t *cf,
     void *parent, void *child);
+static void ngx_http_sub_init_tables(ngx_http_sub_tables_t *tables,
+    ngx_http_sub_match_t *match, ngx_uint_t n);
+static ngx_int_t ngx_http_sub_cmp_matches(const void *one, const void *two);
 static ngx_int_t ngx_http_sub_filter_init(ngx_conf_t *cf);
 
 
@@ -139,12 +168,16 @@ static ngx_http_output_body_filter_pt    ngx_http_next_body_filter;
 static ngx_int_t
 ngx_http_sub_header_filter(ngx_http_request_t *r)
 {
-    ngx_http_sub_ctx_t        *ctx;
+    ngx_str_t                *m;
+    ngx_uint_t                i, j, n;
+    ngx_http_sub_ctx_t       *ctx;
+    ngx_http_sub_pair_t      *pairs;
+    ngx_http_sub_match_t     *matches;
     ngx_http_sub_loc_conf_t  *slcf;
 
     slcf = ngx_http_get_module_loc_conf(r, ngx_http_sub_filter_module);
 
-    if (slcf->match.len == 0
+    if (slcf->pairs == NULL
         || r->headers_out.content_length_n == 0
         || ngx_http_test_content_type(r, &slcf->types) == NULL)
     {
@@ -156,19 +189,76 @@ ngx_http_sub_header_filter(ngx_http_request_t *r)
         return NGX_ERROR;
     }
 
-    ctx->saved.data = ngx_pnalloc(r->pool, slcf->match.len);
+    if (slcf->dynamic == 0) {
+        ctx->tables = slcf->tables;
+        ctx->matches = slcf->matches;
+
+    } else {
+        pairs = slcf->pairs->elts;
+        n = slcf->pairs->nelts;
+
+        matches = ngx_pcalloc(r->pool, sizeof(ngx_http_sub_match_t) * n);
+        if (matches == NULL) {
+            return NGX_ERROR;
+        }
+
+        j = 0;
+        for (i = 0; i < n; i++) {
+            matches[j].value = &pairs[i].value;
+
+            if (pairs[i].match.lengths == NULL) {
+                matches[j].match = pairs[i].match.value;
+                j++;
+                continue;
+            }
+
+            m = &matches[j].match;
+            if (ngx_http_complex_value(r, &pairs[i].match, m) != NGX_OK) {
+                return NGX_ERROR;
+            }
+
+            if (m->len == 0) {
+                continue;
+            }
+
+            ngx_strlow(m->data, m->data, m->len);
+            j++;
+        }
+
+        if (j == 0) {
+            return ngx_http_next_header_filter(r);
+        }
+
+        ctx->matches = ngx_pnalloc(r->pool, sizeof(ngx_array_t));
+        if (ctx->matches == NULL) {
+            return NGX_ERROR;
+        }
+
+        ctx->matches->elts = matches;
+        ctx->matches->nelts = j;
+
+        ctx->tables = ngx_pnalloc(r->pool, sizeof(ngx_http_sub_tables_t));
+        if (ctx->tables == NULL) {
+            return NGX_ERROR;
+        }
+
+        ngx_http_sub_init_tables(ctx->tables, ctx->matches->elts,
+                                 ctx->matches->nelts);
+    }
+
+    ngx_http_set_ctx(r, ctx, ngx_http_sub_filter_module);
+
+    ctx->saved.data = ngx_pnalloc(r->pool, ctx->tables->max_match_len - 1);
     if (ctx->saved.data == NULL) {
         return NGX_ERROR;
     }
 
-    ctx->looked.data = ngx_pnalloc(r->pool, slcf->match.len);
+    ctx->looked.data = ngx_pnalloc(r->pool, ctx->tables->max_match_len - 1);
     if (ctx->looked.data == NULL) {
         return NGX_ERROR;
     }
 
-    ngx_http_set_ctx(r, ctx, ngx_http_sub_filter_module);
-
-    ctx->match = slcf->match;
+    ctx->offset = ctx->tables->min_match_len - 1;
     ctx->last_out = &ctx->out;
 
     r->filter_need_in_memory = 1;
@@ -194,8 +284,10 @@ ngx_http_sub_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
 {
     ngx_int_t                  rc;
     ngx_buf_t                 *b;
+    ngx_str_t                 *sub;
     ngx_chain_t               *cl;
     ngx_http_sub_ctx_t        *ctx;
+    ngx_http_sub_match_t      *match;
     ngx_http_sub_loc_conf_t   *slcf;
 
     ctx = ngx_http_get_module_ctx(r, ngx_http_sub_filter_module);
@@ -242,18 +334,10 @@ ngx_http_sub_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
             ctx->pos = ctx->buf->pos;
         }
 
-        if (ctx->state == sub_start_state) {
-            ctx->copy_start = ctx->pos;
-            ctx->copy_end = ctx->pos;
-        }
-
         b = NULL;
 
         while (ctx->pos < ctx->buf->last) {
 
-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-                           "saved: \"%V\" state: %d", &ctx->saved, ctx->state);
-
             rc = ngx_http_sub_parse(r, ctx);
 
             ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
@@ -320,20 +404,6 @@ ngx_http_sub_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
                 ctx->last_out = &cl->next;
             }
 
-            if (ctx->state == sub_start_state) {
-                ctx->copy_start = ctx->pos;
-                ctx->copy_end = ctx->pos;
-
-            } else {
-                ctx->copy_start = NULL;
-                ctx->copy_end = NULL;
-            }
-
-            if (ctx->looked.len > (size_t) (ctx->pos - ctx->buf->pos)) {
-                ctx->saved.len = ctx->looked.len - (ctx->pos - ctx->buf->pos);
-                ngx_memcpy(ctx->saved.data, ctx->looked.data, ctx->saved.len);
-            }
-
             if (rc == NGX_AGAIN) {
                 continue;
             }
@@ -352,19 +422,30 @@ ngx_http_sub_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
 
             slcf = ngx_http_get_module_loc_conf(r, ngx_http_sub_filter_module);
 
-            if (ctx->sub.data == NULL) {
+            if (ctx->sub == NULL) {
+                ctx->sub = ngx_pcalloc(r->pool, sizeof(ngx_str_t)
+                                                * ctx->matches->nelts);
+                if (ctx->sub == NULL) {
+                    return NGX_ERROR;
+                }
+            }
+
+            sub = &ctx->sub[ctx->index];
+
+            if (sub->data == NULL) {
+                match = ctx->matches->elts;
 
-                if (ngx_http_complex_value(r, &slcf->value, &ctx->sub)
+                if (ngx_http_complex_value(r, match[ctx->index].value, sub)
                     != NGX_OK)
                 {
                     return NGX_ERROR;
                 }
             }
 
-            if (ctx->sub.len) {
+            if (sub->len) {
                 b->memory = 1;
-                b->pos = ctx->sub.data;
-                b->last = ctx->sub.data + ctx->sub.len;
+                b->pos = sub->data;
+                b->last = sub->data + sub->len;
 
             } else {
                 b->sync = 1;
@@ -373,7 +454,8 @@ ngx_http_sub_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
             *ctx->last_out = cl;
             ctx->last_out = &cl->next;
 
-            ctx->once = slcf->once;
+            ctx->index = 0;
+            ctx->once = slcf->once && (++ctx->applied == ctx->matches->nelts);
 
             continue;
         }
@@ -428,9 +510,6 @@ ngx_http_sub_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
         }
 
         ctx->buf = NULL;
-
-        ctx->saved.len = ctx->looked.len;
-        ngx_memcpy(ctx->saved.data, ctx->looked.data, ctx->looked.len);
     }
 
     if (ctx->out == NULL && ctx->busy == NULL) {
@@ -513,158 +592,142 @@ ngx_http_sub_output(ngx_http_request_t *r, ngx_http_sub_ctx_t *ctx)
 static ngx_int_t
 ngx_http_sub_parse(ngx_http_request_t *r, ngx_http_sub_ctx_t *ctx)
 {
-    u_char                *p, *last, *copy_end, ch, match;
-    size_t                 looked, i;
-    ngx_http_sub_state_e   state;
+    u_char                   *p, *last, *pat, *pat_end, c;
+    ngx_str_t                *m;
+    ngx_int_t                 offset, start, next, end, len, rc;
+    ngx_uint_t                shift, i, j;
+    ngx_http_sub_match_t     *match;
+    ngx_http_sub_tables_t    *tables;
+    ngx_http_sub_loc_conf_t  *slcf;
 
-    if (ctx->once) {
-        ctx->copy_start = ctx->pos;
-        ctx->copy_end = ctx->buf->last;
-        ctx->pos = ctx->buf->last;
-        ctx->looked.len = 0;
+    slcf = ngx_http_get_module_loc_conf(r, ngx_http_sub_filter_module);
+    tables = ctx->tables;
 
-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "once");
+    offset = ctx->offset;
+    end = ctx->buf->last - ctx->pos;
 
-        return NGX_AGAIN;
+    if (ctx->once) {
+        /* sets start and next to end */
+        offset = end + (ngx_int_t) tables->min_match_len - 1;
+        goto again;
     }
 
-    state = ctx->state;
-    looked = ctx->looked.len;
-    last = ctx->buf->last;
-    copy_end = ctx->copy_end;
+    while (offset < end) {
 
-    for (p = ctx->pos; p < last; p++) {
+        c = offset < 0 ? ctx->looked.data[ctx->looked.len + offset]
+                       : ctx->pos[offset];
 
-        ch = *p;
-        ch = ngx_tolower(ch);
+        c = ngx_tolower(c);
 
-        if (state == sub_start_state) {
+        shift = tables->shift[c];
+        if (shift > 0) {
+            offset += shift;
+            continue;
+        }
 
-            /* the tight loop */
+        /* a potential match */
 
-            match = ctx->match.data[0];
+        start = offset - (ngx_int_t) tables->min_match_len + 1;
+        match = ctx->matches->elts;
 
-            for ( ;; ) {
-                if (ch == match) {
+        i = ngx_max(tables->index[c], ctx->index);
+        j = tables->index[c + 1];
 
-                    if (ctx->match.len == 1) {
-                        ctx->pos = p + 1;
-                        ctx->copy_end = p;
+        while (i != j) {
 
-                        return NGX_OK;
-                    }
+            if (slcf->once && ctx->sub && ctx->sub[i].data) {
+                goto next;
+            }
 
-                    copy_end = p;
-                    ctx->looked.data[0] = *p;
-                    looked = 1;
-                    state = sub_match_state;
+            m = &match[i].match;
 
-                    goto match_started;
-                }
+            pat = m->data;
+            pat_end = m->data + m->len;
 
-                if (++p == last) {
-                    break;
-                }
+            if (start >= 0) {
+                p = ctx->pos + start;
 
-                ch = *p;
-                ch = ngx_tolower(ch);
-            }
+            } else {
+                last = ctx->looked.data + ctx->looked.len;
+                p = last + start;
 
-            ctx->state = state;
-            ctx->pos = p;
-            ctx->looked.len = looked;
-            ctx->copy_end = p;
+                while (p < last && pat < pat_end) {
+                    if (ngx_tolower(*p) != *pat) {
+                        goto next;
+                    }
 
-            if (ctx->copy_start == NULL) {
-                ctx->copy_start = ctx->buf->pos;
+                    p++;
+                    pat++;
+                }
+
+                p = ctx->pos;
             }
 
-            return NGX_AGAIN;
+            while (p < ctx->buf->last && pat < pat_end) {
+                if (ngx_tolower(*p) != *pat) {
+                    goto next;
+                }
 
-        match_started:
+                p++;
+                pat++;
+            }
 
-            continue;
-        }
+            ctx->index = i;
 
-        /* state == sub_match_state */
+            if (pat != pat_end) {
+                /* partial match */
+                goto again;
+            }
 
-        if (ch == ctx->match.data[looked]) {
-            ctx->looked.data[looked] = *p;
-            looked++;
+            ctx->offset = offset + (ngx_int_t) m->len;
+            next = start + (ngx_int_t) m->len;
+            end = ngx_max(next, 0);
+            rc = NGX_OK;
 
-            if (looked == ctx->match.len) {
+            goto done;
 
-                ctx->state = sub_start_state;
-                ctx->pos = p + 1;
-                ctx->looked.len = 0;
-                ctx->saved.len = 0;
-                ctx->copy_end = copy_end;
+        next:
 
-                if (ctx->copy_start == NULL && copy_end) {
-                    ctx->copy_start = ctx->buf->pos;
-                }
+            i++;
+        }
 
-                return NGX_OK;
-            }
+        offset++;
+        ctx->index = 0;
+    }
 
-        } else {
-            /*
-             * check if there is another partial match in previously
-             * matched substring to catch cases like "aab" in "aaab"
-             */
-
-            ctx->looked.data[looked] = *p;
-            looked++;
-
-            for (i = 1; i < looked; i++) {
-                if (ngx_strncasecmp(ctx->looked.data + i,
-                                    ctx->match.data, looked - i)
-                    == 0)
-                {
-                    break;
-                }
-            }
+again:
 
-            if (i < looked) {
-                if (ctx->saved.len > i) {
-                    ctx->saved.len = i;
-                }
+    ctx->offset = offset;
+    start = offset - (ngx_int_t) tables->min_match_len + 1;
+    next = start;
+    rc = NGX_AGAIN;
 
-                if ((size_t) (p + 1 - ctx->buf->pos) >= looked - i) {
-                    copy_end = p + 1 - (looked - i);
-                }
+done:
 
-                ngx_memmove(ctx->looked.data, ctx->looked.data + i, looked - i);
-                looked = looked - i;
+    /* send [ - looked.len, start ] to client */
 
-            } else {
-                copy_end = p;
-                looked = 0;
-                state = sub_start_state;
-            }
+    ctx->saved.len = ctx->looked.len + ngx_min(start, 0);
+    ngx_memcpy(ctx->saved.data, ctx->looked.data, ctx->saved.len);
 
-            if (ctx->saved.len) {
-                p++;
-                goto out;
-            }
-        }
-    }
+    ctx->copy_start = ctx->pos;
+    ctx->copy_end = ctx->pos + ngx_max(start, 0);
 
-    ctx->saved.len = 0;
+    /* save [ next, end ] in looked */
 
-out:
+    len = ngx_min(next, 0);
+    p = ctx->looked.data;
+    p = ngx_movemem(p, p + ctx->looked.len + len, - len);
 
-    ctx->state = state;
-    ctx->pos = p;
-    ctx->looked.len = looked;
+    len = ngx_max(next, 0);
+    p = ngx_cpymem(p, ctx->pos + len, end - len);
+    ctx->looked.len = p - ctx->looked.data;
 
-    ctx->copy_end = (state == sub_start_state) ? p : copy_end;
+    /* update position */
 
-    if (ctx->copy_start == NULL && ctx->copy_end) {
-        ctx->copy_start = ctx->buf->pos;
-    }
+    ctx->pos += end;
+    ctx->offset -= end;
 
-    return NGX_AGAIN;
+    return rc;
 }
 
 
@@ -674,23 +737,60 @@ ngx_http_sub_filter(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
     ngx_http_sub_loc_conf_t *slcf = conf;
 
     ngx_str_t                         *value;
+    ngx_http_sub_pair_t               *pair;
     ngx_http_compile_complex_value_t   ccv;
 
-    if (slcf->match.data) {
-        return "is duplicate";
+    value = cf->args->elts;
+
+    if (value[1].len == 0) {
+        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "empty search pattern");
+        return NGX_CONF_ERROR;
     }
 
-    value = cf->args->elts;
+    if (slcf->pairs == NULL) {
+        slcf->pairs = ngx_array_create(cf->pool, 1,
+                                       sizeof(ngx_http_sub_pair_t));
+        if (slcf->pairs == NULL) {
+            return NGX_CONF_ERROR;
+        }
+    }
+
+    if (slcf->pairs->nelts == 255) {
+        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
+                           "number of search patterns exceeds 255");
+        return NGX_CONF_ERROR;
+    }
 
     ngx_strlow(value[1].data, value[1].data, value[1].len);
 
-    slcf->match = value[1];
+    pair = ngx_array_push(slcf->pairs);
+    if (pair == NULL) {
+        return NGX_CONF_ERROR;
+    }
+
+    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
+
+    ccv.cf = cf;
+    ccv.value = &value[1];
+    ccv.complex_value = &pair->match;
+
+    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
+        return NGX_CONF_ERROR;
+    }
+
+    if (ccv.complex_value->lengths != NULL) {
+        slcf->dynamic = 1;
+
+    } else {
+        ngx_strlow(pair->match.value.data, pair->match.value.data,
+                   pair->match.value.len);
+    }
 
     ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
 
     ccv.cf = cf;
     ccv.value = &value[2];
-    ccv.complex_value = &slcf->value;
+    ccv.complex_value = &pair->value;
 
     if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
         return NGX_CONF_ERROR;
@@ -713,9 +813,12 @@ ngx_http_sub_create_conf(ngx_conf_t *cf)
     /*
      * set by ngx_pcalloc():
      *
-     *     conf->match = { 0, NULL };
+     *     conf->dynamic = 0;
+     *     conf->pairs = NULL;
+     *     conf->tables = NULL;
      *     conf->types = { NULL };
      *     conf->types_keys = NULL;
+     *     conf->matches = NULL;
      */
 
     slcf->once = NGX_CONF_UNSET;
@@ -728,17 +831,15 @@ ngx_http_sub_create_conf(ngx_conf_t *cf)
 static char *
 ngx_http_sub_merge_conf(ngx_conf_t *cf, void *parent, void *child)
 {
-    ngx_http_sub_loc_conf_t *prev = parent;
-    ngx_http_sub_loc_conf_t *conf = child;
+    ngx_uint_t                i, n;
+    ngx_http_sub_pair_t      *pairs;
+    ngx_http_sub_match_t     *matches;
+    ngx_http_sub_loc_conf_t  *prev = parent;
+    ngx_http_sub_loc_conf_t  *conf = child;
 
     ngx_conf_merge_value(conf->once, prev->once, 1);
-    ngx_conf_merge_str_value(conf->match, prev->match, "");
     ngx_conf_merge_value(conf->last_modified, prev->last_modified, 0);
 
-    if (conf->value.value.data == NULL) {
-        conf->value = prev->value;
-    }
-
     if (ngx_http_merge_types(cf, &conf->types_keys, &conf->types,
                              &prev->types_keys, &prev->types,
                              ngx_http_html_default_types)
@@ -747,10 +848,109 @@ ngx_http_sub_merge_conf(ngx_conf_t *cf, void *parent, void *child)
         return NGX_CONF_ERROR;
     }
 
+    if (conf->pairs == NULL) {
+        conf->dynamic = prev->dynamic;
+        conf->pairs = prev->pairs;
+        conf->matches = prev->matches;
+        conf->tables = prev->tables;
+    }
+
+    if (conf->pairs && conf->dynamic == 0 && conf->tables == NULL) {
+        pairs = conf->pairs->elts;
+        n = conf->pairs->nelts;
+
+        matches = ngx_pnalloc(cf->pool, sizeof(ngx_http_sub_match_t) * n);
+        if (matches == NULL) {
+            return NGX_CONF_ERROR;
+        }
+
+        for (i = 0; i < n; i++) {
+            matches[i].match = pairs[i].match.value;
+            matches[i].value = &pairs[i].value;
+        }
+
+        conf->matches = ngx_pnalloc(cf->pool, sizeof(ngx_array_t));
+        if (conf->matches == NULL) {
+            return NGX_CONF_ERROR;
+        }
+
+        conf->matches->elts = matches;
+        conf->matches->nelts = n;
+
+        conf->tables = ngx_palloc(cf->pool, sizeof(ngx_http_sub_tables_t));
+        if (conf->tables == NULL) {
+            return NGX_CONF_ERROR;
+        }
+
+        ngx_http_sub_init_tables(conf->tables, conf->matches->elts,
+                                 conf->matches->nelts);
+    }
+
     return NGX_CONF_OK;
 }
 
 
+static void
+ngx_http_sub_init_tables(ngx_http_sub_tables_t *tables,
+    ngx_http_sub_match_t *match, ngx_uint_t n)
+{
+    u_char      c;
+    ngx_uint_t  i, j, min, max, ch;
+
+    min = match[0].match.len;
+    max = match[0].match.len;
+
+    for (i = 1; i < n; i++) {
+        min = ngx_min(min, match[i].match.len);
+        max = ngx_max(max, match[i].match.len);
+    }
+
+    tables->min_match_len = min;
+    tables->max_match_len = max;
+
+    ngx_http_sub_cmp_index = tables->min_match_len - 1;
+    ngx_sort(match, n, sizeof(ngx_http_sub_match_t), ngx_http_sub_cmp_matches);
+
+    min = ngx_min(min, 255);
+    ngx_memset(tables->shift, min, 256);
+
+    ch = 0;
+
+    for (i = 0; i < n; i++) {
+
+        for (j = 0; j < min; j++) {
+            c = match[i].match.data[tables->min_match_len - 1 - j];
+            tables->shift[c] = ngx_min(tables->shift[c], (u_char) j);
+        }
+
+        c = match[i].match.data[tables->min_match_len - 1];
+        while (ch <= c) {
+            tables->index[ch++] = (u_char) i;
+        }
+    }
+
+    while (ch < 257) {
+        tables->index[ch++] = (u_char) n;
+    }
+}
+
+
+static ngx_int_t
+ngx_http_sub_cmp_matches(const void *one, const void *two)
+{
+    ngx_int_t              c1, c2;
+    ngx_http_sub_match_t  *first, *second;
+
+    first = (ngx_http_sub_match_t *) one;
+    second = (ngx_http_sub_match_t *) two;
+
+    c1 = first->match.data[ngx_http_sub_cmp_index];
+    c2 = second->match.data[ngx_http_sub_cmp_index];
+
+    return c1 - c2;
+}
+
+
 static ngx_int_t
 ngx_http_sub_filter_init(ngx_conf_t *cf)
 {

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_upstream_hash_module.c (+72 -46) 88%
===================================================================
--- vendor/nginx-1.8.0/src/http/modules/ngx_http_upstream_hash_module.c    2015-09-27 18:09:01 +0900 (a1f0ff3)
+++ vendor/nginx-1.9.5/src/http/modules/ngx_http_upstream_hash_module.c    2015-09-27 22:10:53 +0900 (1e2e05c)
@@ -170,13 +170,16 @@ ngx_http_upstream_get_hash_peer(ngx_peer_connection_t *pc, void *data)
     uint32_t                      hash;
     ngx_int_t                     w;
     uintptr_t                     m;
-    ngx_uint_t                    i, n, p;
+    ngx_uint_t                    n, p;
     ngx_http_upstream_rr_peer_t  *peer;
 
     ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
                    "get hash peer, try: %ui", pc->tries);
 
+    ngx_http_upstream_rr_peers_wlock(hp->rrp.peers);
+
     if (hp->tries > 20 || hp->rrp.peers->single) {
+        ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);
         return hp->get_rr_peer(pc, &hp->rrp);
     }
 
@@ -208,20 +211,14 @@ ngx_http_upstream_get_hash_peer(ngx_peer_connection_t *pc, void *data)
         hp->hash += hash;
         hp->rehash++;
 
-        if (!hp->rrp.peers->weighted) {
-            p = hp->hash % hp->rrp.peers->number;
-
-        } else {
-            w = hp->hash % hp->rrp.peers->total_weight;
-
-            for (i = 0; i < hp->rrp.peers->number; i++) {
-                w -= hp->rrp.peers->peer[i].weight;
-                if (w < 0) {
-                    break;
-                }
-            }
+        w = hp->hash % hp->rrp.peers->total_weight;
+        peer = hp->rrp.peers->peer;
+        p = 0;
 
-            p = i;
+        while (w >= peer->weight) {
+            w -= peer->weight;
+            peer = peer->next;
+            p++;
         }
 
         n = p / (8 * sizeof(uintptr_t));
@@ -234,8 +231,6 @@ ngx_http_upstream_get_hash_peer(ngx_peer_connection_t *pc, void *data)
         ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,
                        "get hash peer, value:%uD, peer:%ui", hp->hash, p);
 
-        peer = &hp->rrp.peers->peer[p];
-
         if (peer->down) {
             goto next;
         }
@@ -252,20 +247,25 @@ ngx_http_upstream_get_hash_peer(ngx_peer_connection_t *pc, void *data)
     next:
 
         if (++hp->tries > 20) {
+            ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);
             return hp->get_rr_peer(pc, &hp->rrp);
         }
     }
 
-    hp->rrp.current = p;
+    hp->rrp.current = peer;
 
     pc->sockaddr = peer->sockaddr;
     pc->socklen = peer->socklen;
     pc->name = &peer->name;
 
+    peer->conns++;
+
     if (now - peer->checked > peer->fail_timeout) {
         peer->checked = now;
     }
 
+    ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);
+
     hp->rrp.tried[n] |= m;
 
     return NGX_OK;
@@ -277,13 +277,17 @@ ngx_http_upstream_init_chash(ngx_conf_t *cf, ngx_http_upstream_srv_conf_t *us)
 {
     u_char                             *host, *port, c;
     size_t                              host_len, port_len, size;
-    uint32_t                            hash, base_hash, prev_hash;
+    uint32_t                            hash, base_hash;
     ngx_str_t                          *server;
     ngx_uint_t                          npoints, i, j;
     ngx_http_upstream_rr_peer_t        *peer;
     ngx_http_upstream_rr_peers_t       *peers;
     ngx_http_upstream_chash_points_t   *points;
     ngx_http_upstream_hash_srv_conf_t  *hcf;
+    union {
+        uint32_t                        value;
+        u_char                          byte[4];
+    } prev_hash;
 
     if (ngx_http_upstream_init_round_robin(cf, us) != NGX_OK) {
         return NGX_ERROR;
@@ -304,8 +308,7 @@ ngx_http_upstream_init_chash(ngx_conf_t *cf, ngx_http_upstream_srv_conf_t *us)
 
     points->number = 0;
 
-    for (i = 0; i < peers->number; i++) {
-        peer = &peers->peer[i];
+    for (peer = peers->peer; peer; peer = peer->next) {
         server = &peer->server;
 
         /*
@@ -351,20 +354,27 @@ ngx_http_upstream_init_chash(ngx_conf_t *cf, ngx_http_upstream_srv_conf_t *us)
         ngx_crc32_update(&base_hash, (u_char *) "", 1);
         ngx_crc32_update(&base_hash, port, port_len);
 
-        prev_hash = 0;
+        prev_hash.value = 0;
         npoints = peer->weight * 160;
 
         for (j = 0; j < npoints; j++) {
             hash = base_hash;
 
-            ngx_crc32_update(&hash, (u_char *) &prev_hash, sizeof(uint32_t));
+            ngx_crc32_update(&hash, prev_hash.byte, 4);
             ngx_crc32_final(hash);
 
             points->point[points->number].hash = hash;
             points->point[points->number].server = server;
             points->number++;
 
-            prev_hash = hash;
+#if (NGX_HAVE_LITTLE_ENDIAN)
+            prev_hash.value = hash;
+#else
+            prev_hash.byte[0] = (u_char) (hash & 0xff);
+            prev_hash.byte[1] = (u_char) ((hash >> 8) & 0xff);
+            prev_hash.byte[2] = (u_char) ((hash >> 16) & 0xff);
+            prev_hash.byte[3] = (u_char) ((hash >> 24) & 0xff);
+#endif
         }
     }
 
@@ -458,8 +468,13 @@ ngx_http_upstream_init_chash_peer(ngx_http_request_t *r,
     hcf = ngx_http_conf_upstream_srv_conf(us, ngx_http_upstream_hash_module);
 
     hash = ngx_crc32_long(hp->key.data, hp->key.len);
+
+    ngx_http_upstream_rr_peers_rlock(hp->rrp.peers);
+
     hp->hash = ngx_http_upstream_find_chash_point(hcf->points, hash);
 
+    ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);
+
     return NGX_OK;
 }
 
@@ -473,7 +488,7 @@ ngx_http_upstream_get_chash_peer(ngx_peer_connection_t *pc, void *data)
     intptr_t                            m;
     ngx_str_t                          *server;
     ngx_int_t                           total;
-    ngx_uint_t                          i, n;
+    ngx_uint_t                          i, n, best_i;
     ngx_http_upstream_rr_peer_t        *peer, *best;
     ngx_http_upstream_chash_point_t    *point;
     ngx_http_upstream_chash_points_t   *points;
@@ -482,6 +497,8 @@ ngx_http_upstream_get_chash_peer(ngx_peer_connection_t *pc, void *data)
     ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
                    "get consistent hash peer, try: %ui", pc->tries);
 
+    ngx_http_upstream_rr_peers_wlock(hp->rrp.peers);
+
     pc->cached = 0;
     pc->connection = NULL;
 
@@ -499,9 +516,13 @@ ngx_http_upstream_get_chash_peer(ngx_peer_connection_t *pc, void *data)
                        hp->hash, server);
 
         best = NULL;
+        best_i = 0;
         total = 0;
 
-        for (i = 0; i < hp->rrp.peers->number; i++) {
+        for (peer = hp->rrp.peers->peer, i = 0;
+             peer;
+             peer = peer->next, i++)
+        {
 
             n = i / (8 * sizeof(uintptr_t));
             m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));
@@ -510,8 +531,6 @@ ngx_http_upstream_get_chash_peer(ngx_peer_connection_t *pc, void *data)
                 continue;
             }
 
-            peer = &hp->rrp.peers->peer[i];
-
             if (peer->down) {
                 continue;
             }
@@ -539,39 +558,46 @@ ngx_http_upstream_get_chash_peer(ngx_peer_connection_t *pc, void *data)
 
             if (best == NULL || peer->current_weight > best->current_weight) {
                 best = peer;
+                best_i = i;
             }
         }
 
         if (best) {
             best->current_weight -= total;
-
-            i = best - &hp->rrp.peers->peer[0];
-
-            hp->rrp.current = i;
-
-            n = i / (8 * sizeof(uintptr_t));
-            m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));
-
-            hp->rrp.tried[n] |= m;
-
-            if (now - best->checked > best->fail_timeout) {
-                best->checked = now;
-            }
-
-            pc->sockaddr = best->sockaddr;
-            pc->socklen = best->socklen;
-            pc->name = &best->name;
-
-            return NGX_OK;
+            goto found;
         }
 
         hp->hash++;
         hp->tries++;
 
         if (hp->tries >= points->number) {
+            ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);
             return NGX_BUSY;
         }
     }
+
+found:
+
+    hp->rrp.current = best;
+
+    pc->sockaddr = best->sockaddr;
+    pc->socklen = best->socklen;
+    pc->name = &best->name;
+
+    best->conns++;
+
+    if (now - best->checked > best->fail_timeout) {
+        best->checked = now;
+    }
+
+    ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);
+
+    n = best_i / (8 * sizeof(uintptr_t));
+    m = (uintptr_t) 1 << best_i % (8 * sizeof(uintptr_t));
+
+    hp->rrp.tried[n] |= m;
+
+    return NGX_OK;
 }
 
 

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_upstream_ip_hash_module.c (+17 -29) 89%
===================================================================
--- vendor/nginx-1.8.0/src/http/modules/ngx_http_upstream_ip_hash_module.c    2015-09-27 18:09:01 +0900 (148d73a)
+++ vendor/nginx-1.9.5/src/http/modules/ngx_http_upstream_ip_hash_module.c    2015-09-27 22:10:53 +0900 (401b58e)
@@ -161,7 +161,10 @@ ngx_http_upstream_get_ip_hash_peer(ngx_peer_connection_t *pc, void *data)
 
     /* TODO: cached */
 
+    ngx_http_upstream_rr_peers_wlock(iphp->rrp.peers);
+
     if (iphp->tries > 20 || iphp->rrp.peers->single) {
+        ngx_http_upstream_rr_peers_unlock(iphp->rrp.peers);
         return iphp->get_rr_peer(pc, &iphp->rrp);
     }
 
@@ -178,20 +181,14 @@ ngx_http_upstream_get_ip_hash_peer(ngx_peer_connection_t *pc, void *data)
             hash = (hash * 113 + iphp->addr[i]) % 6271;
         }
 
-        if (!iphp->rrp.peers->weighted) {
-            p = hash % iphp->rrp.peers->number;
-
-        } else {
-            w = hash % iphp->rrp.peers->total_weight;
-
-            for (i = 0; i < iphp->rrp.peers->number; i++) {
-                w -= iphp->rrp.peers->peer[i].weight;
-                if (w < 0) {
-                    break;
-                }
-            }
+        w = hash % iphp->rrp.peers->total_weight;
+        peer = iphp->rrp.peers->peer;
+        p = 0;
 
-            p = i;
+        while (w >= peer->weight) {
+            w -= peer->weight;
+            peer = peer->next;
+            p++;
         }
 
         n = p / (8 * sizeof(uintptr_t));
@@ -204,49 +201,40 @@ ngx_http_upstream_get_ip_hash_peer(ngx_peer_connection_t *pc, void *data)
         ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,
                        "get ip hash peer, hash: %ui %04XA", p, m);
 
-        peer = &iphp->rrp.peers->peer[p];
-
-        /* ngx_lock_mutex(iphp->rrp.peers->mutex); */
-
         if (peer->down) {
-            goto next_try;
+            goto next;
         }
 
         if (peer->max_fails
             && peer->fails >= peer->max_fails
             && now - peer->checked <= peer->fail_timeout)
         {
-            goto next_try;
+            goto next;
         }
 
         break;
 
-    next_try:
-
-        iphp->rrp.tried[n] |= m;
-
-        /* ngx_unlock_mutex(iphp->rrp.peers->mutex); */
-
-        pc->tries--;
-
     next:
 
         if (++iphp->tries > 20) {
+            ngx_http_upstream_rr_peers_unlock(iphp->rrp.peers);
             return iphp->get_rr_peer(pc, &iphp->rrp);
         }
     }
 
-    iphp->rrp.current = p;
+    iphp->rrp.current = peer;
 
     pc->sockaddr = peer->sockaddr;
     pc->socklen = peer->socklen;
     pc->name = &peer->name;
 
+    peer->conns++;
+
     if (now - peer->checked > peer->fail_timeout) {
         peer->checked = now;
     }
 
-    /* ngx_unlock_mutex(iphp->rrp.peers->mutex); */
+    ngx_http_upstream_rr_peers_unlock(iphp->rrp.peers);
 
     iphp->rrp.tried[n] |= m;
     iphp->hash = hash;

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_upstream_keepalive_module.c (+46 -39) 96%
===================================================================
--- vendor/nginx-1.8.0/src/http/modules/ngx_http_upstream_keepalive_module.c    2015-09-27 18:09:01 +0900 (4e005fc)
+++ vendor/nginx-1.9.5/src/http/modules/ngx_http_upstream_keepalive_module.c    2015-09-27 22:10:53 +0900 (51887b4)
@@ -25,6 +25,18 @@ typedef struct {
 typedef struct {
     ngx_http_upstream_keepalive_srv_conf_t  *conf;
 
+    ngx_queue_t                        queue;
+    ngx_connection_t                  *connection;
+
+    socklen_t                          socklen;
+    u_char                             sockaddr[NGX_SOCKADDRLEN];
+
+} ngx_http_upstream_keepalive_cache_t;
+
+
+typedef struct {
+    ngx_http_upstream_keepalive_srv_conf_t  *conf;
+
     ngx_http_upstream_t               *upstream;
 
     void                              *data;
@@ -40,18 +52,6 @@ typedef struct {
 } ngx_http_upstream_keepalive_peer_data_t;
 
 
-typedef struct {
-    ngx_http_upstream_keepalive_srv_conf_t  *conf;
-
-    ngx_queue_t                        queue;
-    ngx_connection_t                  *connection;
-
-    socklen_t                          socklen;
-    u_char                             sockaddr[NGX_SOCKADDRLEN];
-
-} ngx_http_upstream_keepalive_cache_t;
-
-
 static ngx_int_t ngx_http_upstream_init_keepalive_peer(ngx_http_request_t *r,
     ngx_http_upstream_srv_conf_t *us);
 static ngx_int_t ngx_http_upstream_get_keepalive_peer(ngx_peer_connection_t *pc,
@@ -63,7 +63,6 @@ static void ngx_http_upstream_keepalive_dummy_handler(ngx_event_t *ev);
 static void ngx_http_upstream_keepalive_close_handler(ngx_event_t *ev);
 static void ngx_http_upstream_keepalive_close(ngx_connection_t *c);
 
-
 #if (NGX_HTTP_SSL)
 static ngx_int_t ngx_http_upstream_keepalive_set_session(
     ngx_peer_connection_t *pc, void *data);
@@ -244,24 +243,28 @@ ngx_http_upstream_get_keepalive_peer(ngx_peer_connection_t *pc, void *data)
             ngx_queue_remove(q);
             ngx_queue_insert_head(&kp->conf->free, q);
 
-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
-                           "get keepalive peer: using connection %p", c);
-
-            c->idle = 0;
-            c->sent = 0;
-            c->log = pc->log;
-            c->read->log = pc->log;
-            c->write->log = pc->log;
-            c->pool->log = pc->log;
-
-            pc->connection = c;
-            pc->cached = 1;
-
-            return NGX_DONE;
+            goto found;
         }
     }
 
     return NGX_OK;
+
+found:
+
+    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
+                   "get keepalive peer: using connection %p", c);
+
+    c->idle = 0;
+    c->sent = 0;
+    c->log = pc->log;
+    c->read->log = pc->log;
+    c->write->log = pc->log;
+    c->pool->log = pc->log;
+
+    pc->connection = c;
+    pc->cached = 1;
+
+    return NGX_DONE;
 }
 
 
@@ -299,6 +302,10 @@ ngx_http_upstream_free_keepalive_peer(ngx_peer_connection_t *pc, void *data,
         goto invalid;
     }
 
+    if (ngx_terminate || ngx_exiting) {
+        goto invalid;
+    }
+
     if (ngx_handle_read_event(c->read, 0) != NGX_OK) {
         goto invalid;
     }
@@ -322,9 +329,10 @@ ngx_http_upstream_free_keepalive_peer(ngx_peer_connection_t *pc, void *data,
         item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue);
     }
 
-    item->connection = c;
     ngx_queue_insert_head(&kp->conf->cache, q);
 
+    item->connection = c;
+
     pc->connection = NULL;
 
     if (c->read->timer_set) {
@@ -470,10 +478,9 @@ ngx_http_upstream_keepalive_create_conf(ngx_conf_t *cf)
      *
      *     conf->original_init_upstream = NULL;
      *     conf->original_init_peer = NULL;
+     *     conf->max_cached = 0;
      */
 
-    conf->max_cached = 1;
-
     return conf;
 }
 
@@ -487,18 +494,10 @@ ngx_http_upstream_keepalive(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
     ngx_int_t    n;
     ngx_str_t   *value;
 
-    uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module);
-
-    if (kcf->original_init_upstream) {
+    if (kcf->max_cached) {
         return "is duplicate";
     }
 
-    kcf->original_init_upstream = uscf->peer.init_upstream
-                                  ? uscf->peer.init_upstream
-                                  : ngx_http_upstream_init_round_robin;
-
-    uscf->peer.init_upstream = ngx_http_upstream_init_keepalive;
-
     /* read options */
 
     value = cf->args->elts;
@@ -514,5 +513,13 @@ ngx_http_upstream_keepalive(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
 
     kcf->max_cached = n;
 
+    uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module);
+
+    kcf->original_init_upstream = uscf->peer.init_upstream
+                                  ? uscf->peer.init_upstream
+                                  : ngx_http_upstream_init_round_robin;
+
+    uscf->peer.init_upstream = ngx_http_upstream_init_keepalive;
+
     return NGX_CONF_OK;
 }

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_upstream_least_conn_module.c (+38 -129) 64%
===================================================================
--- vendor/nginx-1.8.0/src/http/modules/ngx_http_upstream_least_conn_module.c    2015-09-27 18:09:01 +0900 (623bc9b)
+++ vendor/nginx-1.9.5/src/http/modules/ngx_http_upstream_least_conn_module.c    2015-09-27 22:10:53 +0900 (92951bd)
@@ -10,29 +10,10 @@
 #include <ngx_http.h>
 
 
-typedef struct {
-    ngx_uint_t                        *conns;
-} ngx_http_upstream_least_conn_conf_t;
-
-
-typedef struct {
-    /* the round robin data must be first */
-    ngx_http_upstream_rr_peer_data_t   rrp;
-
-    ngx_uint_t                        *conns;
-
-    ngx_event_get_peer_pt              get_rr_peer;
-    ngx_event_free_peer_pt             free_rr_peer;
-} ngx_http_upstream_lc_peer_data_t;
-
-
 static ngx_int_t ngx_http_upstream_init_least_conn_peer(ngx_http_request_t *r,
     ngx_http_upstream_srv_conf_t *us);
 static ngx_int_t ngx_http_upstream_get_least_conn_peer(
     ngx_peer_connection_t *pc, void *data);
-static void ngx_http_upstream_free_least_conn_peer(ngx_peer_connection_t *pc,
-    void *data, ngx_uint_t state);
-static void *ngx_http_upstream_least_conn_create_conf(ngx_conf_t *cf);
 static char *ngx_http_upstream_least_conn(ngx_conf_t *cf, ngx_command_t *cmd,
     void *conf);
 
@@ -57,7 +38,7 @@ static ngx_http_module_t  ngx_http_upstream_least_conn_module_ctx = {
     NULL,                                  /* create main configuration */
     NULL,                                  /* init main configuration */
 
-    ngx_http_upstream_least_conn_create_conf, /* create server configuration */
+    NULL,                                  /* create server configuration */
     NULL,                                  /* merge server configuration */
 
     NULL,                                  /* create location configuration */
@@ -85,10 +66,6 @@ static ngx_int_t
 ngx_http_upstream_init_least_conn(ngx_conf_t *cf,
     ngx_http_upstream_srv_conf_t *us)
 {
-    ngx_uint_t                            n;
-    ngx_http_upstream_rr_peers_t         *peers;
-    ngx_http_upstream_least_conn_conf_t  *lcf;
-
     ngx_log_debug0(NGX_LOG_DEBUG_HTTP, cf->log, 0,
                    "init least conn");
 
@@ -96,22 +73,6 @@ ngx_http_upstream_init_least_conn(ngx_conf_t *cf,
         return NGX_ERROR;
     }
 
-    peers = us->peer.data;
-
-    n = peers->number;
-
-    if (peers->next) {
-        n += peers->next->number;
-    }
-
-    lcf = ngx_http_conf_upstream_srv_conf(us,
-                                          ngx_http_upstream_least_conn_module);
-
-    lcf->conns = ngx_pcalloc(cf->pool, sizeof(ngx_uint_t) * n);
-    if (lcf->conns == NULL) {
-        return NGX_ERROR;
-    }
-
     us->peer.init = ngx_http_upstream_init_least_conn_peer;
 
     return NGX_OK;
@@ -122,33 +83,14 @@ static ngx_int_t
 ngx_http_upstream_init_least_conn_peer(ngx_http_request_t *r,
     ngx_http_upstream_srv_conf_t *us)
 {
-    ngx_http_upstream_lc_peer_data_t     *lcp;
-    ngx_http_upstream_least_conn_conf_t  *lcf;
-
     ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
                    "init least conn peer");
 
-    lcf = ngx_http_conf_upstream_srv_conf(us,
-                                          ngx_http_upstream_least_conn_module);
-
-    lcp = ngx_palloc(r->pool, sizeof(ngx_http_upstream_lc_peer_data_t));
-    if (lcp == NULL) {
-        return NGX_ERROR;
-    }
-
-    lcp->conns = lcf->conns;
-
-    r->upstream->peer.data = &lcp->rrp;
-
     if (ngx_http_upstream_init_round_robin_peer(r, us) != NGX_OK) {
         return NGX_ERROR;
     }
 
     r->upstream->peer.get = ngx_http_upstream_get_least_conn_peer;
-    r->upstream->peer.free = ngx_http_upstream_free_least_conn_peer;
-
-    lcp->get_rr_peer = ngx_http_upstream_get_round_robin_peer;
-    lcp->free_rr_peer = ngx_http_upstream_free_round_robin_peer;
 
     return NGX_OK;
 }
@@ -157,7 +99,7 @@ ngx_http_upstream_init_least_conn_peer(ngx_http_request_t *r,
 static ngx_int_t
 ngx_http_upstream_get_least_conn_peer(ngx_peer_connection_t *pc, void *data)
 {
-    ngx_http_upstream_lc_peer_data_t  *lcp = data;
+    ngx_http_upstream_rr_peer_data_t  *rrp = data;
 
     time_t                         now;
     uintptr_t                      m;
@@ -169,8 +111,8 @@ ngx_http_upstream_get_least_conn_peer(ngx_peer_connection_t *pc, void *data)
     ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
                    "get least conn peer, try: %ui", pc->tries);
 
-    if (lcp->rrp.peers->single) {
-        return lcp->get_rr_peer(pc, &lcp->rrp);
+    if (rrp->peers->single) {
+        return ngx_http_upstream_get_round_robin_peer(pc, rrp);
     }
 
     pc->cached = 0;
@@ -178,7 +120,9 @@ ngx_http_upstream_get_least_conn_peer(ngx_peer_connection_t *pc, void *data)
 
     now = ngx_time();
 
-    peers = lcp->rrp.peers;
+    peers = rrp->peers;
+
+    ngx_http_upstream_rr_peers_wlock(peers);
 
     best = NULL;
     total = 0;
@@ -188,17 +132,18 @@ ngx_http_upstream_get_least_conn_peer(ngx_peer_connection_t *pc, void *data)
     p = 0;
 #endif
 
-    for (i = 0; i < peers->number; i++) {
+    for (peer = peers->peer, i = 0;
+         peer;
+         peer = peer->next, i++)
+    {
 
         n = i / (8 * sizeof(uintptr_t));
         m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));
 
-        if (lcp->rrp.tried[n] & m) {
+        if (rrp->tried[n] & m) {
             continue;
         }
 
-        peer = &peers->peer[i];
-
         if (peer->down) {
             continue;
         }
@@ -217,15 +162,13 @@ ngx_http_upstream_get_least_conn_peer(ngx_peer_connection_t *pc, void *data)
          */
 
         if (best == NULL
-            || lcp->conns[i] * best->weight < lcp->conns[p] * peer->weight)
+            || peer->conns * best->weight < best->conns * peer->weight)
         {
             best = peer;
             many = 0;
             p = i;
 
-        } else if (lcp->conns[i] * best->weight
-                   == lcp->conns[p] * peer->weight)
-        {
+        } else if (peer->conns * best->weight == best->conns * peer->weight) {
             many = 1;
         }
     }
@@ -241,22 +184,22 @@ ngx_http_upstream_get_least_conn_peer(ngx_peer_connection_t *pc, void *data)
         ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,
                        "get least conn peer, many");
 
-        for (i = p; i < peers->number; i++) {
-
+        for (peer = best, i = p;
+             peer;
+             peer = peer->next, i++)
+        {
             n = i / (8 * sizeof(uintptr_t));
             m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));
 
-            if (lcp->rrp.tried[n] & m) {
+            if (rrp->tried[n] & m) {
                 continue;
             }
 
-            peer = &peers->peer[i];
-
             if (peer->down) {
                 continue;
             }
 
-            if (lcp->conns[i] * best->weight != lcp->conns[p] * peer->weight) {
+            if (peer->conns * best->weight != best->conns * peer->weight) {
                 continue;
             }
 
@@ -291,13 +234,16 @@ ngx_http_upstream_get_least_conn_peer(ngx_peer_connection_t *pc, void *data)
     pc->socklen = best->socklen;
     pc->name = &best->name;
 
-    lcp->rrp.current = p;
+    best->conns++;
+
+    rrp->current = best;
 
     n = p / (8 * sizeof(uintptr_t));
     m = (uintptr_t) 1 << p % (8 * sizeof(uintptr_t));
 
-    lcp->rrp.tried[n] |= m;
-    lcp->conns[p]++;
+    rrp->tried[n] |= m;
+
+    ngx_http_upstream_rr_peers_unlock(peers);
 
     return NGX_OK;
 
@@ -307,77 +253,40 @@ failed:
         ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,
                        "get least conn peer, backup servers");
 
-        lcp->conns += peers->number;
-
-        lcp->rrp.peers = peers->next;
+        rrp->peers = peers->next;
 
-        n = (lcp->rrp.peers->number + (8 * sizeof(uintptr_t) - 1))
+        n = (rrp->peers->number + (8 * sizeof(uintptr_t) - 1))
                 / (8 * sizeof(uintptr_t));
 
         for (i = 0; i < n; i++) {
-             lcp->rrp.tried[i] = 0;
+             rrp->tried[i] = 0;
         }
 
-        rc = ngx_http_upstream_get_least_conn_peer(pc, lcp);
+        ngx_http_upstream_rr_peers_unlock(peers);
+
+        rc = ngx_http_upstream_get_least_conn_peer(pc, rrp);
 
         if (rc != NGX_BUSY) {
             return rc;
         }
+
+        ngx_http_upstream_rr_peers_wlock(peers);
     }
 
     /* all peers failed, mark them as live for quick recovery */
 
-    for (i = 0; i < peers->number; i++) {
-        peers->peer[i].fails = 0;
+    for (peer = peers->peer; peer; peer = peer->next) {
+        peer->fails = 0;
     }
 
+    ngx_http_upstream_rr_peers_unlock(peers);
+
     pc->name = peers->name;
 
     return NGX_BUSY;
 }
 
 
-static void
-ngx_http_upstream_free_least_conn_peer(ngx_peer_connection_t *pc,
-    void *data, ngx_uint_t state)
-{
-    ngx_http_upstream_lc_peer_data_t  *lcp = data;
-
-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,
-                   "free least conn peer %ui %ui", pc->tries, state);
-
-    if (lcp->rrp.peers->single) {
-        lcp->free_rr_peer(pc, &lcp->rrp, state);
-        return;
-    }
-
-    lcp->conns[lcp->rrp.current]--;
-
-    lcp->free_rr_peer(pc, &lcp->rrp, state);
-}
-
-
-static void *
-ngx_http_upstream_least_conn_create_conf(ngx_conf_t *cf)
-{
-    ngx_http_upstream_least_conn_conf_t  *conf;
-
-    conf = ngx_pcalloc(cf->pool,
-                       sizeof(ngx_http_upstream_least_conn_conf_t));
-    if (conf == NULL) {
-        return NULL;
-    }
-
-    /*
-     * set by ngx_pcalloc():
-     *
-     *     conf->conns = NULL;
-     */
-
-    return conf;
-}
-
-
 static char *
 ngx_http_upstream_least_conn(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
 {

  Added: vendor/nginx-1.9.5/src/http/modules/ngx_http_upstream_zone_module.c (+246 -0) 100644
===================================================================
--- /dev/null
+++ vendor/nginx-1.9.5/src/http/modules/ngx_http_upstream_zone_module.c    2015-09-27 22:10:53 +0900 (7e5bd74)
@@ -0,0 +1,246 @@
+
+/*
+ * Copyright (C) Ruslan Ermilov
+ * Copyright (C) Nginx, Inc.
+ */
+
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+#include <ngx_http.h>
+
+
+static char *ngx_http_upstream_zone(ngx_conf_t *cf, ngx_command_t *cmd,
+    void *conf);
+static ngx_int_t ngx_http_upstream_init_zone(ngx_shm_zone_t *shm_zone,
+    void *data);
+static ngx_http_upstream_rr_peers_t *ngx_http_upstream_zone_copy_peers(
+    ngx_slab_pool_t *shpool, ngx_http_upstream_srv_conf_t *uscf);
+
+
+static ngx_command_t  ngx_http_upstream_zone_commands[] = {
+
+    { ngx_string("zone"),
+      NGX_HTTP_UPS_CONF|NGX_CONF_TAKE12,
+      ngx_http_upstream_zone,
+      0,
+      0,
+      NULL },
+
+      ngx_null_command
+};
+
+
+static ngx_http_module_t  ngx_http_upstream_zone_module_ctx = {
+    NULL,                                  /* preconfiguration */
+    NULL,                                  /* postconfiguration */
+
+    NULL,                                  /* create main configuration */
+    NULL,                                  /* init main configuration */
+
+    NULL,                                  /* create server configuration */
+    NULL,                                  /* merge server configuration */
+
+    NULL,                                  /* create location configuration */
+    NULL                                   /* merge location configuration */
+};
+
+
+ngx_module_t  ngx_http_upstream_zone_module = {
+    NGX_MODULE_V1,
+    &ngx_http_upstream_zone_module_ctx,    /* module context */
+    ngx_http_upstream_zone_commands,       /* module directives */
+    NGX_HTTP_MODULE,                       /* module type */
+    NULL,                                  /* init master */
+    NULL,                                  /* init module */
+    NULL,                                  /* init process */
+    NULL,                                  /* init thread */
+    NULL,                                  /* exit thread */
+    NULL,                                  /* exit process */
+    NULL,                                  /* exit master */
+    NGX_MODULE_V1_PADDING
+};
+
+
+static char *
+ngx_http_upstream_zone(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
+{
+    ssize_t                         size;
+    ngx_str_t                      *value;
+    ngx_http_upstream_srv_conf_t   *uscf;
+    ngx_http_upstream_main_conf_t  *umcf;
+
+    uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module);
+    umcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_upstream_module);
+
+    value = cf->args->elts;
+
+    if (!value[1].len) {
+        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
+                           "invalid zone name \"%V\"", &value[1]);
+        return NGX_CONF_ERROR;
+    }
+
+    if (cf->args->nelts == 3) {
+        size = ngx_parse_size(&value[2]);
+
+        if (size == NGX_ERROR) {
+            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
+                               "invalid zone size \"%V\"", &value[2]);
+            return NGX_CONF_ERROR;
+        }
+
+        if (size < (ssize_t) (8 * ngx_pagesize)) {
+            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
+                               "zone \"%V\" is too small", &value[1]);
+            return NGX_CONF_ERROR;
+        }
+
+    } else {
+        size = 0;
+    }
+
+    uscf->shm_zone = ngx_shared_memory_add(cf, &value[1], size,
+                                           &ngx_http_upstream_module);
+    if (uscf->shm_zone == NULL) {
+        return NGX_CONF_ERROR;
+    }
+
+    uscf->shm_zone->init = ngx_http_upstream_init_zone;
+    uscf->shm_zone->data = umcf;
+
+    uscf->shm_zone->noreuse = 1;
+
+    return NGX_CONF_OK;
+}
+
+
+static ngx_int_t
+ngx_http_upstream_init_zone(ngx_shm_zone_t *shm_zone, void *data)
+{
+    size_t                          len;
+    ngx_uint_t                      i;
+    ngx_slab_pool_t                *shpool;
+    ngx_http_upstream_rr_peers_t   *peers, **peersp;
+    ngx_http_upstream_srv_conf_t   *uscf, **uscfp;
+    ngx_http_upstream_main_conf_t  *umcf;
+
+    shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;
+    umcf = shm_zone->data;
+    uscfp = umcf->upstreams.elts;
+
+    if (shm_zone->shm.exists) {
+        peers = shpool->data;
+
+        for (i = 0; i < umcf->upstreams.nelts; i++) {
+            uscf = uscfp[i];
+
+            if (uscf->shm_zone != shm_zone) {
+                continue;
+            }
+
+            uscf->peer.data = peers;
+            peers = peers->zone_next;
+        }
+
+        return NGX_OK;
+    }
+
+    len = sizeof(" in upstream zone \"\"") + shm_zone->shm.name.len;
+
+    shpool->log_ctx = ngx_slab_alloc(shpool, len);
+    if (shpool->log_ctx == NULL) {
+        return NGX_ERROR;
+    }
+
+    ngx_sprintf(shpool->log_ctx, " in upstream zone \"%V\"%Z",
+                &shm_zone->shm.name);
+
+
+    /* copy peers to shared memory */
+
+    peersp = (ngx_http_upstream_rr_peers_t **) (void *) &shpool->data;
+
+    for (i = 0; i < umcf->upstreams.nelts; i++) {
+        uscf = uscfp[i];
+
+        if (uscf->shm_zone != shm_zone) {
+            continue;
+        }
+
+        peers = ngx_http_upstream_zone_copy_peers(shpool, uscf);
+        if (peers == NULL) {
+            return NGX_ERROR;
+        }
+
+        *peersp = peers;
+        peersp = &peers->zone_next;
+    }
+
+    return NGX_OK;
+}
+
+
+static ngx_http_upstream_rr_peers_t *
+ngx_http_upstream_zone_copy_peers(ngx_slab_pool_t *shpool,
+    ngx_http_upstream_srv_conf_t *uscf)
+{
+    ngx_http_upstream_rr_peer_t   *peer, **peerp;
+    ngx_http_upstream_rr_peers_t  *peers, *backup;
+
+    peers = ngx_slab_alloc(shpool, sizeof(ngx_http_upstream_rr_peers_t));
+    if (peers == NULL) {
+        return NULL;
+    }
+
+    ngx_memcpy(peers, uscf->peer.data, sizeof(ngx_http_upstream_rr_peers_t));
+
+    peers->shpool = shpool;
+
+    for (peerp = &peers->peer; *peerp; peerp = &peer->next) {
+        /* pool is unlocked */
+        peer = ngx_slab_calloc_locked(shpool,
+                                      sizeof(ngx_http_upstream_rr_peer_t));
+        if (peer == NULL) {
+            return NULL;
+        }
+
+        ngx_memcpy(peer, *peerp, sizeof(ngx_http_upstream_rr_peer_t));
+
+        *peerp = peer;
+    }
+
+    if (peers->next == NULL) {
+        goto done;
+    }
+
+    backup = ngx_slab_alloc(shpool, sizeof(ngx_http_upstream_rr_peers_t));
+    if (backup == NULL) {
+        return NULL;
+    }
+
+    ngx_memcpy(backup, peers->next, sizeof(ngx_http_upstream_rr_peers_t));
+
+    backup->shpool = shpool;
+
+    for (peerp = &backup->peer; *peerp; peerp = &peer->next) {
+        /* pool is unlocked */
+        peer = ngx_slab_calloc_locked(shpool,
+                                      sizeof(ngx_http_upstream_rr_peer_t));
+        if (peer == NULL) {
+            return NULL;
+        }
+
+        ngx_memcpy(peer, *peerp, sizeof(ngx_http_upstream_rr_peer_t));
+
+        *peerp = peer;
+    }
+
+    peers->next = backup;
+
+done:
+
+    uscf->peer.data = peers;
+
+    return peers;
+}

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_userid_filter_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_uwsgi_module.c (+2 -3) 99%
===================================================================
--- vendor/nginx-1.8.0/src/http/modules/ngx_http_uwsgi_module.c    2015-09-27 18:09:01 +0900 (0d0bc58)
+++ vendor/nginx-1.9.5/src/http/modules/ngx_http_uwsgi_module.c    2015-09-27 22:10:53 +0900 (a50c553)
@@ -1724,9 +1724,8 @@ ngx_http_uwsgi_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
                               prev->upstream.ssl_session_reuse, 1);
 
     ngx_conf_merge_bitmask_value(conf->ssl_protocols, prev->ssl_protocols,
-                                 (NGX_CONF_BITMASK_SET|NGX_SSL_SSLv3
-                                  |NGX_SSL_TLSv1|NGX_SSL_TLSv1_1
-                                  |NGX_SSL_TLSv1_2));
+                                 (NGX_CONF_BITMASK_SET|NGX_SSL_TLSv1
+                                  |NGX_SSL_TLSv1_1|NGX_SSL_TLSv1_2));
 
     ngx_conf_merge_str_value(conf->ssl_ciphers, prev->ssl_ciphers,
                              "DEFAULT");

  Renamed: vendor/nginx-1.9.5/src/http/modules/ngx_http_xslt_filter_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/perl/Makefile.PL (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/perl/nginx.pm (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/perl/nginx.xs (+9 -9) 98%
===================================================================
--- vendor/nginx-1.8.0/src/http/modules/perl/nginx.xs    2015-09-27 18:09:01 +0900 (71f17a8)
+++ vendor/nginx-1.9.5/src/http/modules/perl/nginx.xs    2015-09-27 22:10:53 +0900 (6716620)
@@ -98,6 +98,9 @@ ngx_http_perl_output(ngx_http_request_t *r, ngx_buf_t *b)
 MODULE = nginx    PACKAGE = nginx
 
 
+PROTOTYPES: DISABLE
+
+
 void
 status(r, code)
     CODE:
@@ -268,19 +271,16 @@ header_in(r, key)
         }
 #endif
 
-        if (hh->offset) {
-
-            ph = (ngx_table_elt_t **) ((char *) &r->headers_in + hh->offset);
+        ph = (ngx_table_elt_t **) ((char *) &r->headers_in + hh->offset);
 
-            if (*ph) {
-                ngx_http_perl_set_targ((*ph)->value.data, (*ph)->value.len);
-
-                goto done;
-            }
+        if (*ph) {
+            ngx_http_perl_set_targ((*ph)->value.data, (*ph)->value.len);
 
-            XSRETURN_UNDEF;
+            goto done;
         }
 
+        XSRETURN_UNDEF;
+
     multi:
 
         /* Cookie, X-Forwarded-For */

  Renamed: vendor/nginx-1.9.5/src/http/modules/perl/ngx_http_perl_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/perl/ngx_http_perl_module.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/modules/perl/typemap (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/ngx_http.c (+34 -22) 97%
===================================================================
--- vendor/nginx-1.8.0/src/http/ngx_http.c    2015-09-27 18:09:01 +0900 (72981c1)
+++ vendor/nginx-1.9.5/src/http/ngx_http.c    2015-09-27 22:10:53 +0900 (d09e3f0)
@@ -128,6 +128,10 @@ ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
     ngx_http_core_srv_conf_t   **cscfp;
     ngx_http_core_main_conf_t   *cmcf;
 
+    if (*(ngx_http_conf_ctx_t **) conf) {
+        return "is duplicate";
+    }
+
     /* the main http context */
 
     ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));
@@ -1220,7 +1224,7 @@ ngx_http_add_addresses(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
 {
     u_char                *p;
     size_t                 len, off;
-    ngx_uint_t             i, default_server;
+    ngx_uint_t             i, default_server, proxy_protocol;
     struct sockaddr       *sa;
     ngx_http_conf_addr_t  *addr;
 #if (NGX_HAVE_UNIX_DOMAIN)
@@ -1229,8 +1233,8 @@ ngx_http_add_addresses(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
 #if (NGX_HTTP_SSL)
     ngx_uint_t             ssl;
 #endif
-#if (NGX_HTTP_SPDY)
-    ngx_uint_t             spdy;
+#if (NGX_HTTP_V2)
+    ngx_uint_t             http2;
 #endif
 
     /*
@@ -1281,11 +1285,13 @@ ngx_http_add_addresses(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
         /* preserve default_server bit during listen options overwriting */
         default_server = addr[i].opt.default_server;
 
+        proxy_protocol = lsopt->proxy_protocol || addr[i].opt.proxy_protocol;
+
 #if (NGX_HTTP_SSL)
         ssl = lsopt->ssl || addr[i].opt.ssl;
 #endif
-#if (NGX_HTTP_SPDY)
-        spdy = lsopt->spdy || addr[i].opt.spdy;
+#if (NGX_HTTP_V2)
+        http2 = lsopt->http2 || addr[i].opt.http2;
 #endif
 
         if (lsopt->set) {
@@ -1314,11 +1320,12 @@ ngx_http_add_addresses(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
         }
 
         addr[i].opt.default_server = default_server;
+        addr[i].opt.proxy_protocol = proxy_protocol;
 #if (NGX_HTTP_SSL)
         addr[i].opt.ssl = ssl;
 #endif
-#if (NGX_HTTP_SPDY)
-        addr[i].opt.spdy = spdy;
+#if (NGX_HTTP_V2)
+        addr[i].opt.http2 = http2;
 #endif
 
         return NGX_OK;
@@ -1350,14 +1357,17 @@ ngx_http_add_address(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
         }
     }
 
-#if (NGX_HTTP_SPDY && NGX_HTTP_SSL                                            \
+#if (NGX_HTTP_V2 && NGX_HTTP_SSL                                              \
      && !defined TLSEXT_TYPE_application_layer_protocol_negotiation           \
      && !defined TLSEXT_TYPE_next_proto_neg)
-    if (lsopt->spdy && lsopt->ssl) {
+
+    if (lsopt->http2 && lsopt->ssl) {
         ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
-                           "nginx was built without OpenSSL ALPN or NPN "
-                           "support, SPDY is not enabled for %s", lsopt->addr);
+                           "nginx was built with OpenSSL that lacks ALPN "
+                           "and NPN support, HTTP/2 is not enabled for %s",
+                           lsopt->addr);
     }
+
 #endif
 
     addr = ngx_array_push(&port->addrs);
@@ -1716,13 +1726,7 @@ ngx_http_init_listening(ngx_conf_t *cf, ngx_http_conf_port_t *port)
 
         ls->servers = hport;
 
-        if (i == last - 1) {
-            hport->naddrs = last;
-
-        } else {
-            hport->naddrs = 1;
-            i = 0;
-        }
+        hport->naddrs = i + 1;
 
         switch (ls->sockaddr->sa_family) {
 
@@ -1740,6 +1744,10 @@ ngx_http_init_listening(ngx_conf_t *cf, ngx_http_conf_port_t *port)
             break;
         }
 
+        if (ngx_clone_listening(cf, ls) != NGX_OK) {
+            return NGX_ERROR;
+        }
+
         addr++;
         last--;
     }
@@ -1818,6 +1826,10 @@ ngx_http_add_listening(ngx_conf_t *cf, ngx_http_conf_addr_t *addr)
     ls->fastopen = addr->opt.fastopen;
 #endif
 
+#if (NGX_HAVE_REUSEPORT)
+    ls->reuseport = addr->opt.reuseport;
+#endif
+
     return ls;
 }
 
@@ -1847,8 +1859,8 @@ ngx_http_add_addrs(ngx_conf_t *cf, ngx_http_port_t *hport,
 #if (NGX_HTTP_SSL)
         addrs[i].conf.ssl = addr[i].opt.ssl;
 #endif
-#if (NGX_HTTP_SPDY)
-        addrs[i].conf.spdy = addr[i].opt.spdy;
+#if (NGX_HTTP_V2)
+        addrs[i].conf.http2 = addr[i].opt.http2;
 #endif
         addrs[i].conf.proxy_protocol = addr[i].opt.proxy_protocol;
 
@@ -1912,8 +1924,8 @@ ngx_http_add_addrs6(ngx_conf_t *cf, ngx_http_port_t *hport,
 #if (NGX_HTTP_SSL)
         addrs6[i].conf.ssl = addr[i].opt.ssl;
 #endif
-#if (NGX_HTTP_SPDY)
-        addrs6[i].conf.spdy = addr[i].opt.spdy;
+#if (NGX_HTTP_V2)
+        addrs6[i].conf.http2 = addr[i].opt.http2;
 #endif
 
         if (addr[i].hash.buckets == NULL

  Renamed: vendor/nginx-1.9.5/src/http/ngx_http.h (+4 -9) 96%
===================================================================
--- vendor/nginx-1.8.0/src/http/ngx_http.h    2015-09-27 18:09:01 +0900 (b1e5fae)
+++ vendor/nginx-1.9.5/src/http/ngx_http.h    2015-09-27 22:10:53 +0900 (19cb680)
@@ -20,8 +20,8 @@ typedef struct ngx_http_file_cache_s  ngx_http_file_cache_t;
 typedef struct ngx_http_log_ctx_s     ngx_http_log_ctx_t;
 typedef struct ngx_http_chunked_s     ngx_http_chunked_t;
 
-#if (NGX_HTTP_SPDY)
-typedef struct ngx_http_spdy_stream_s  ngx_http_spdy_stream_t;
+#if (NGX_HTTP_V2)
+typedef struct ngx_http_v2_stream_s   ngx_http_v2_stream_t;
 #endif
 
 typedef ngx_int_t (*ngx_http_header_handler_pt)(ngx_http_request_t *r,
@@ -38,8 +38,8 @@ typedef u_char *(*ngx_http_log_handler_pt)(ngx_http_request_t *r,
 #include <ngx_http_upstream_round_robin.h>
 #include <ngx_http_core_module.h>
 
-#if (NGX_HTTP_SPDY)
-#include <ngx_http_spdy.h>
+#if (NGX_HTTP_V2)
+#include <ngx_http_v2.h>
 #endif
 #if (NGX_HTTP_CACHE)
 #include <ngx_http_cache.h>
@@ -148,11 +148,6 @@ ngx_int_t ngx_http_filter_finalize_request(ngx_http_request_t *r,
 void ngx_http_clean_header(ngx_http_request_t *r);
 
 
-time_t ngx_http_parse_time(u_char *value, size_t len);
-size_t ngx_http_get_time(char *buf, time_t t);
-
-
-
 ngx_int_t ngx_http_discard_request_body(ngx_http_request_t *r);
 void ngx_http_discarded_request_body_handler(ngx_http_request_t *r);
 void ngx_http_block_reading(ngx_http_request_t *r);

  Renamed: vendor/nginx-1.9.5/src/http/ngx_http_cache.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/ngx_http_config.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/ngx_http_copy_filter_module.c (+1 -1) 99%
===================================================================
--- vendor/nginx-1.8.0/src/http/ngx_http_copy_filter_module.c    2015-09-27 18:09:01 +0900 (0f908ad)
+++ vendor/nginx-1.9.5/src/http/ngx_http_copy_filter_module.c    2015-09-27 22:10:53 +0900 (c6d03ee)
@@ -327,7 +327,7 @@ ngx_http_copy_filter_merge_conf(ngx_conf_t *cf, void *parent, void *child)
     ngx_http_copy_filter_conf_t *prev = parent;
     ngx_http_copy_filter_conf_t *conf = child;
 
-    ngx_conf_merge_bufs_value(conf->bufs, prev->bufs, 1, 32768);
+    ngx_conf_merge_bufs_value(conf->bufs, prev->bufs, 2, 32768);
 
     return NULL;
 }

  Renamed: vendor/nginx-1.9.5/src/http/ngx_http_core_module.c (+51 -58) 98%
===================================================================
--- vendor/nginx-1.8.0/src/http/ngx_http_core_module.c    2015-09-27 18:09:01 +0900 (096a561)
+++ vendor/nginx-1.9.5/src/http/ngx_http_core_module.c    2015-09-27 22:10:53 +0900 (36f00f6)
@@ -96,18 +96,6 @@ static ngx_conf_post_t  ngx_http_core_lowat_post =
 static ngx_conf_post_handler_pt  ngx_http_core_pool_size_p =
     ngx_http_core_pool_size;
 
-static ngx_conf_deprecated_t  ngx_conf_deprecated_optimize_server_names = {
-    ngx_conf_deprecated, "optimize_server_names", "server_name_in_redirect"
-};
-
-static ngx_conf_deprecated_t  ngx_conf_deprecated_open_file_cache_retest = {
-    ngx_conf_deprecated, "open_file_cache_retest", "open_file_cache_valid"
-};
-
-static ngx_conf_deprecated_t  ngx_conf_deprecated_satisfy_any = {
-    ngx_conf_deprecated, "satisfy_any", "satisfy"
-};
-
 
 static ngx_conf_enum_t  ngx_http_core_request_body_in_file[] = {
     { ngx_string("off"), NGX_HTTP_REQUEST_BODY_FILE_OFF },
@@ -255,13 +243,6 @@ static ngx_command_t  ngx_http_core_commands[] = {
       offsetof(ngx_http_core_srv_conf_t, large_client_header_buffers),
       NULL },
 
-    { ngx_string("optimize_server_names"),
-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,
-      ngx_conf_set_flag_slot,
-      NGX_HTTP_LOC_CONF_OFFSET,
-      offsetof(ngx_http_core_loc_conf_t, server_name_in_redirect),
-      &ngx_conf_deprecated_optimize_server_names },
-
     { ngx_string("ignore_invalid_headers"),
       NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,
       ngx_conf_set_flag_slot,
@@ -519,13 +500,6 @@ static ngx_command_t  ngx_http_core_commands[] = {
       offsetof(ngx_http_core_loc_conf_t, satisfy),
       &ngx_http_core_satisfy },
 
-    { ngx_string("satisfy_any"),
-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
-      ngx_conf_set_flag_slot,
-      NGX_HTTP_LOC_CONF_OFFSET,
-      offsetof(ngx_http_core_loc_conf_t, satisfy),
-      &ngx_conf_deprecated_satisfy_any },
-
     { ngx_string("internal"),
       NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,
       ngx_http_core_internal,
@@ -689,13 +663,6 @@ static ngx_command_t  ngx_http_core_commands[] = {
       offsetof(ngx_http_core_loc_conf_t, open_file_cache_valid),
       NULL },
 
-    { ngx_string("open_file_cache_retest"),
-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
-      ngx_conf_set_sec_slot,
-      NGX_HTTP_LOC_CONF_OFFSET,
-      offsetof(ngx_http_core_loc_conf_t, open_file_cache_valid),
-      &ngx_conf_deprecated_open_file_cache_retest },
-
     { ngx_string("open_file_cache_min_uses"),
       NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
       ngx_conf_set_num_slot,
@@ -1272,7 +1239,9 @@ ngx_http_core_try_files_phase(ngx_http_request_t *r,
 
             *e.pos = '\0';
 
-            if (alias && ngx_strncmp(name, clcf->name.data, alias) == 0) {
+            if (alias && alias != NGX_MAX_SIZE_T_VALUE
+                && ngx_strncmp(name, r->uri.data, alias) == 0)
+            {
                 ngx_memmove(name, name + alias, len - alias);
                 path.len -= alias;
             }
@@ -1355,6 +1324,8 @@ ngx_http_core_try_files_phase(ngx_http_request_t *r,
             }
 
         } else {
+            name = r->uri.data;
+
             r->uri.len = alias + path.len;
             r->uri.data = ngx_pnalloc(r->pool, r->uri.len);
             if (r->uri.data == NULL) {
@@ -1362,8 +1333,8 @@ ngx_http_core_try_files_phase(ngx_http_request_t *r,
                 return NGX_OK;
             }
 
-            p = ngx_copy(r->uri.data, clcf->name.data, alias);
-            ngx_memcpy(p, name, path.len);
+            p = ngx_copy(r->uri.data, name, alias);
+            ngx_memcpy(p, path.data, path.len);
         }
 
         ngx_http_set_exten(r);
@@ -1445,7 +1416,7 @@ ngx_http_update_location_config(ngx_http_request_t *r)
     }
 
     if (r == r->main) {
-        ngx_http_set_connection_log(r->connection, clcf->error_log);
+        ngx_set_connection_log(r->connection, clcf->error_log);
     }
 
     if ((ngx_io.flags & NGX_IO_SENDFILE) && clcf->sendfile) {
@@ -2161,13 +2132,6 @@ ngx_http_gzip_ok(ngx_http_request_t *r)
         return NGX_DECLINED;
     }
 
-#if (NGX_HTTP_SPDY)
-    if (r->spdy_stream) {
-        r->gzip_ok = 1;
-        return NGX_OK;
-    }
-#endif
-
     ae = r->headers_in.accept_encoding;
     if (ae == NULL) {
         return NGX_DECLINED;
@@ -2228,7 +2192,7 @@ ngx_http_gzip_ok(ngx_http_request_t *r)
             return NGX_DECLINED;
         }
 
-        expires = ngx_http_parse_time(e->value.data, e->value.len);
+        expires = ngx_parse_http_time(e->value.data, e->value.len);
         if (expires == NGX_ERROR) {
             return NGX_DECLINED;
         }
@@ -2236,7 +2200,7 @@ ngx_http_gzip_ok(ngx_http_request_t *r)
         d = r->headers_out.date;
 
         if (d) {
-            date = ngx_http_parse_time(d->value.data, d->value.len);
+            date = ngx_parse_http_time(d->value.data, d->value.len);
             if (date == NGX_ERROR) {
                 return NGX_DECLINED;
             }
@@ -2456,12 +2420,19 @@ ngx_http_subrequest(ngx_http_request_t *r,
     ngx_http_core_srv_conf_t      *cscf;
     ngx_http_postponed_request_t  *pr, *p;
 
-    r->main->subrequests--;
-
-    if (r->main->subrequests == 0) {
+    if (r->subrequests == 0) {
         ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
                       "subrequests cycle while processing \"%V\"", uri);
-        r->main->subrequests = 1;
+        return NGX_ERROR;
+    }
+
+    /*
+     * 1000 is reserved for other purposes.
+     */
+    if (r->main->count >= 65535 - 1000) {
+        ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,
+                      "request reference counter overflow "
+                      "while processing \"%V\"", uri);
         return NGX_ERROR;
     }
 
@@ -2502,8 +2473,8 @@ ngx_http_subrequest(ngx_http_request_t *r,
 
     sr->request_body = r->request_body;
 
-#if (NGX_HTTP_SPDY)
-    sr->spdy_stream = r->spdy_stream;
+#if (NGX_HTTP_V2)
+    sr->stream = r->stream;
 #endif
 
     sr->method = NGX_HTTP_GET;
@@ -2566,6 +2537,7 @@ ngx_http_subrequest(ngx_http_request_t *r,
     sr->main_filter_need_in_memory = r->main_filter_need_in_memory;
 
     sr->uri_changes = NGX_HTTP_MAX_URI_CHANGES + 1;
+    sr->subrequests = r->subrequests - 1;
 
     tp = ngx_timeofday();
     sr->start_sec = tp->sec;
@@ -3217,7 +3189,7 @@ ngx_http_core_location(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy)
 
     pclcf = pctx->loc_conf[ngx_http_core_module.ctx_index];
 
-    if (pclcf->name.len) {
+    if (cf->cmd_type == NGX_HTTP_LOC_CONF) {
 
         /* nested location */
 
@@ -4199,6 +4171,19 @@ ngx_http_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
 #endif
         }
 
+        if (ngx_strcmp(value[n].data, "reuseport") == 0) {
+#if (NGX_HAVE_REUSEPORT)
+            lsopt.reuseport = 1;
+            lsopt.set = 1;
+            lsopt.bind = 1;
+#else
+            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
+                               "reuseport is not supported "
+                               "on this platform, ignored");
+#endif
+            continue;
+        }
+
         if (ngx_strcmp(value[n].data, "ssl") == 0) {
 #if (NGX_HTTP_SSL)
             lsopt.ssl = 1;
@@ -4211,18 +4196,26 @@ ngx_http_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
 #endif
         }
 
-        if (ngx_strcmp(value[n].data, "spdy") == 0) {
-#if (NGX_HTTP_SPDY)
-            lsopt.spdy = 1;
+        if (ngx_strcmp(value[n].data, "http2") == 0) {
+#if (NGX_HTTP_V2)
+            lsopt.http2 = 1;
             continue;
 #else
             ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
-                               "the \"spdy\" parameter requires "
-                               "ngx_http_spdy_module");
+                               "the \"http2\" parameter requires "
+                               "ngx_http_v2_module");
             return NGX_CONF_ERROR;
 #endif
         }
 
+        if (ngx_strcmp(value[n].data, "spdy") == 0) {
+            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
+                               "invalid parameter \"spdy\": "
+                               "ngx_http_spdy_module was superseded "
+                               "by ngx_http_v2_module");
+            continue;
+        }
+
         if (ngx_strncmp(value[n].data, "so_keepalive=", 13) == 0) {
 
             if (ngx_strcmp(&value[n].data[13], "on") == 0) {

  Renamed: vendor/nginx-1.9.5/src/http/ngx_http_core_module.h (+7 -4) 99%
===================================================================
--- vendor/nginx-1.8.0/src/http/ngx_http_core_module.h    2015-09-27 18:09:01 +0900 (e0ca2ce)
+++ vendor/nginx-1.9.5/src/http/ngx_http_core_module.h    2015-09-27 22:10:53 +0900 (7dec9e1)
@@ -79,12 +79,15 @@ typedef struct {
 #if (NGX_HTTP_SSL)
     unsigned                   ssl:1;
 #endif
-#if (NGX_HTTP_SPDY)
-    unsigned                   spdy:1;
+#if (NGX_HTTP_V2)
+    unsigned                   http2:1;
 #endif
 #if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
     unsigned                   ipv6only:1;
 #endif
+#if (NGX_HAVE_REUSEPORT)
+    unsigned                   reuseport:1;
+#endif
     unsigned                   so_keepalive:2;
     unsigned                   proxy_protocol:1;
 
@@ -245,8 +248,8 @@ struct ngx_http_addr_conf_s {
 #if (NGX_HTTP_SSL)
     unsigned                   ssl:1;
 #endif
-#if (NGX_HTTP_SPDY)
-    unsigned                   spdy:1;
+#if (NGX_HTTP_V2)
+    unsigned                   http2:1;
 #endif
     unsigned                   proxy_protocol:1;
 };

  Renamed: vendor/nginx-1.9.5/src/http/ngx_http_file_cache.c (+19 -2) 98%
===================================================================
--- vendor/nginx-1.8.0/src/http/ngx_http_file_cache.c    2015-09-27 18:09:01 +0900 (fc14761)
+++ vendor/nginx-1.9.5/src/http/ngx_http_file_cache.c    2015-09-27 22:10:53 +0900 (6633918)
@@ -521,9 +521,12 @@ wakeup:
 static ngx_int_t
 ngx_http_file_cache_read(ngx_http_request_t *r, ngx_http_cache_t *c)
 {
+    u_char                        *p;
     time_t                         now;
     ssize_t                        n;
+    ngx_str_t                     *key;
     ngx_int_t                      rc;
+    ngx_uint_t                     i;
     ngx_http_file_cache_t         *cache;
     ngx_http_file_cache_header_t  *h;
 
@@ -547,12 +550,27 @@ ngx_http_file_cache_read(ngx_http_request_t *r, ngx_http_cache_t *c)
         return NGX_DECLINED;
     }
 
-    if (h->crc32 != c->crc32) {
+    if (h->crc32 != c->crc32 || h->header_start != c->header_start) {
         ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,
                       "cache file \"%s\" has md5 collision", c->file.name.data);
         return NGX_DECLINED;
     }
 
+    p = c->buf->pos + sizeof(ngx_http_file_cache_header_t)
+        + sizeof(ngx_http_file_cache_key);
+
+    key = c->keys.elts;
+    for (i = 0; i < c->keys.nelts; i++) {
+        if (ngx_memcmp(p, key[i].data, key[i].len) != 0) {
+            ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,
+                          "cache file \"%s\" has md5 collision",
+                          c->file.name.data);
+            return NGX_DECLINED;
+        }
+
+        p += key[i].len;
+    }
+
     if ((size_t) h->body_start > c->body_start) {
         ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,
                       "cache file \"%s\" has too long header",
@@ -583,7 +601,6 @@ ngx_http_file_cache_read(ngx_http_request_t *r, ngx_http_cache_t *c)
     c->last_modified = h->last_modified;
     c->date = h->date;
     c->valid_msec = h->valid_msec;
-    c->header_start = h->header_start;
     c->body_start = h->body_start;
     c->etag.len = h->etag_len;
     c->etag.data = h->etag;

  Renamed: vendor/nginx-1.9.5/src/http/ngx_http_header_filter_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/ngx_http_parse.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/ngx_http_postpone_filter_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/ngx_http_request.c (+25 -27) 98%
===================================================================
--- vendor/nginx-1.8.0/src/http/ngx_http_request.c    2015-09-27 18:09:01 +0900 (9f98799)
+++ vendor/nginx-1.9.5/src/http/ngx_http_request.c    2015-09-27 22:10:53 +0900 (9da972e)
@@ -312,9 +312,9 @@ ngx_http_init_connection(ngx_connection_t *c)
     rev->handler = ngx_http_wait_request_handler;
     c->write->handler = ngx_http_empty_handler;
 
-#if (NGX_HTTP_SPDY)
-    if (hc->addr_conf->spdy) {
-        rev->handler = ngx_http_spdy_init;
+#if (NGX_HTTP_V2)
+    if (hc->addr_conf->http2) {
+        rev->handler = ngx_http_v2_init;
     }
 #endif
 
@@ -349,7 +349,7 @@ ngx_http_init_connection(ngx_connection_t *c)
     }
 
     if (rev->ready) {
-        /* the deferred accept(), rtsig, aio, iocp */
+        /* the deferred accept(), iocp */
 
         if (ngx_use_accept_mutex) {
             ngx_post_event(rev, &ngx_posted_events);
@@ -467,7 +467,7 @@ ngx_http_wait_request_handler(ngx_event_t *rev)
     if (hc->proxy_protocol) {
         hc->proxy_protocol = 0;
 
-        p = ngx_proxy_protocol_parse(c, b->pos, b->last);
+        p = ngx_proxy_protocol_read(c, b->pos, b->last);
 
         if (p == NULL) {
             ngx_http_close_connection(c);
@@ -543,7 +543,7 @@ ngx_http_create_request(ngx_connection_t *c)
 
     clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
 
-    ngx_http_set_connection_log(r->connection, clcf->error_log);
+    ngx_set_connection_log(r->connection, clcf->error_log);
 
     r->header_in = hc->nbusy ? hc->busy[0] : c->buffer;
 
@@ -675,7 +675,7 @@ ngx_http_ssl_handshake(ngx_event_t *rev)
     if (hc->proxy_protocol) {
         hc->proxy_protocol = 0;
 
-        p = ngx_proxy_protocol_parse(c, buf, buf + n);
+        p = ngx_proxy_protocol_read(c, buf, buf + n);
 
         if (p == NULL) {
             ngx_http_close_connection(c);
@@ -764,13 +764,12 @@ ngx_http_ssl_handshake_handler(ngx_connection_t *c)
 
         c->ssl->no_wait_shutdown = 1;
 
-#if (NGX_HTTP_SPDY                                                            \
+#if (NGX_HTTP_V2                                                              \
      && (defined TLSEXT_TYPE_application_layer_protocol_negotiation           \
          || defined TLSEXT_TYPE_next_proto_neg))
         {
-        unsigned int             len;
-        const unsigned char     *data;
-        static const ngx_str_t   spdy = ngx_string(NGX_SPDY_NPN_NEGOTIATED);
+        unsigned int          len;
+        const unsigned char  *data;
 
 #ifdef TLSEXT_TYPE_application_layer_protocol_negotiation
         SSL_get0_alpn_selected(c->ssl->connection, &data, &len);
@@ -785,8 +784,8 @@ ngx_http_ssl_handshake_handler(ngx_connection_t *c)
         SSL_get0_next_proto_negotiated(c->ssl->connection, &data, &len);
 #endif
 
-        if (len == spdy.len && ngx_strncmp(data, spdy.data, spdy.len) == 0) {
-            ngx_http_spdy_init(c->read);
+        if (len == 2 && data[0] == 'h' && data[1] == '2') {
+            ngx_http_v2_init(c->read);
             return;
         }
         }
@@ -867,7 +866,7 @@ ngx_http_ssl_servername(ngx_ssl_conn_t *ssl_conn, int *ad, void *arg)
 
     clcf = ngx_http_get_module_loc_conf(hc->conf_ctx, ngx_http_core_module);
 
-    ngx_http_set_connection_log(c, clcf->error_log);
+    ngx_set_connection_log(c, clcf->error_log);
 
     sscf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_ssl_module);
 
@@ -2073,7 +2072,7 @@ ngx_http_set_virtual_server(ngx_http_request_t *r, ngx_str_t *host)
 
     clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
 
-    ngx_http_set_connection_log(r->connection, clcf->error_log);
+    ngx_set_connection_log(r->connection, clcf->error_log);
 
     return NGX_OK;
 }
@@ -2338,7 +2337,6 @@ ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc)
         if (r == c->data) {
 
             r->main->count--;
-            r->main->subrequests++;
 
             if (!r->logged) {
 
@@ -2500,8 +2498,8 @@ ngx_http_finalize_connection(ngx_http_request_t *r)
 {
     ngx_http_core_loc_conf_t  *clcf;
 
-#if (NGX_HTTP_SPDY)
-    if (r->spdy_stream) {
+#if (NGX_HTTP_V2)
+    if (r->stream) {
         ngx_http_close_request(r, 0);
         return;
     }
@@ -2566,8 +2564,8 @@ ngx_http_set_write_handler(ngx_http_request_t *r)
                                 ngx_http_test_reading;
     r->write_event_handler = ngx_http_writer;
 
-#if (NGX_HTTP_SPDY)
-    if (r->spdy_stream) {
+#if (NGX_HTTP_V2)
+    if (r->stream) {
         return NGX_OK;
     }
 #endif
@@ -2657,8 +2655,8 @@ ngx_http_writer(ngx_http_request_t *r)
 
     if (r->buffered || r->postponed || (r == r->main && c->buffered)) {
 
-#if (NGX_HTTP_SPDY)
-        if (r->spdy_stream) {
+#if (NGX_HTTP_V2)
+        if (r->stream) {
             return;
         }
 #endif
@@ -2725,9 +2723,9 @@ ngx_http_test_reading(ngx_http_request_t *r)
 
     ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http test reading");
 
-#if (NGX_HTTP_SPDY)
+#if (NGX_HTTP_V2)
 
-    if (r->spdy_stream) {
+    if (r->stream) {
         if (c->error) {
             err = 0;
             goto closed;
@@ -3400,9 +3398,9 @@ ngx_http_close_request(ngx_http_request_t *r, ngx_int_t rc)
         return;
     }
 
-#if (NGX_HTTP_SPDY)
-    if (r->spdy_stream) {
-        ngx_http_spdy_close_stream(r->spdy_stream, rc);
+#if (NGX_HTTP_V2)
+    if (r->stream) {
+        ngx_http_v2_close_stream(r->stream, rc);
         return;
     }
 #endif

  Renamed: vendor/nginx-1.9.5/src/http/ngx_http_request.h (+5 -15) 96%
===================================================================
--- vendor/nginx-1.8.0/src/http/ngx_http_request.h    2015-09-27 18:09:01 +0900 (ead4d23)
+++ vendor/nginx-1.9.5/src/http/ngx_http_request.h    2015-09-27 22:10:53 +0900 (967032a)
@@ -10,7 +10,7 @@
 
 
 #define NGX_HTTP_MAX_URI_CHANGES           10
-#define NGX_HTTP_MAX_SUBREQUESTS           200
+#define NGX_HTTP_MAX_SUBREQUESTS           50
 
 /* must be 2^n */
 #define NGX_HTTP_LC_HEADER_LEN             32
@@ -23,6 +23,7 @@
 #define NGX_HTTP_VERSION_9                 9
 #define NGX_HTTP_VERSION_10                1000
 #define NGX_HTTP_VERSION_11                1001
+#define NGX_HTTP_VERSION_20                2000
 
 #define NGX_HTTP_UNKNOWN                   0x0001
 #define NGX_HTTP_GET                       0x0002
@@ -431,16 +432,16 @@ struct ngx_http_request_s {
     ngx_uint_t                        err_status;
 
     ngx_http_connection_t            *http_connection;
-#if (NGX_HTTP_SPDY)
-    ngx_http_spdy_stream_t           *spdy_stream;
+#if (NGX_HTTP_V2)
+    ngx_http_v2_stream_t             *stream;
 #endif
 
     ngx_http_log_handler_pt           log_handler;
 
     ngx_http_cleanup_t               *cleanup;
 
+    unsigned                          count:16;
     unsigned                          subrequests:8;
-    unsigned                          count:8;
     unsigned                          blocked:8;
 
     unsigned                          aio:1;
@@ -586,17 +587,6 @@ extern ngx_http_header_t       ngx_http_headers_in[];
 extern ngx_http_header_out_t   ngx_http_headers_out[];
 
 
-#define ngx_http_set_connection_log(c, l)                                     \
-                                                                              \
-    c->log->file = l->file;                                                   \
-    c->log->next = l->next;                                                   \
-    c->log->writer = l->writer;                                               \
-    c->log->wdata = l->wdata;                                                 \
-    if (!(c->log->log_level & NGX_LOG_DEBUG_CONNECTION)) {                    \
-        c->log->log_level = l->log_level;                                     \
-    }
-
-
 #define ngx_http_set_log_request(log, r)                                      \
     ((ngx_http_log_ctx_t *) log->data)->current_request = r
 

  Renamed: vendor/nginx-1.9.5/src/http/ngx_http_request_body.c (+6 -6) 99%
===================================================================
--- vendor/nginx-1.8.0/src/http/ngx_http_request_body.c    2015-09-27 18:09:01 +0900 (9c16984)
+++ vendor/nginx-1.9.5/src/http/ngx_http_request_body.c    2015-09-27 22:10:53 +0900 (77e92e3)
@@ -40,10 +40,10 @@ ngx_http_read_client_request_body(ngx_http_request_t *r,
 
     r->main->count++;
 
-#if (NGX_HTTP_SPDY)
-    if (r->spdy_stream && r == r->main) {
+#if (NGX_HTTP_V2)
+    if (r->stream && r == r->main) {
         r->request_body_no_buffering = 0;
-        rc = ngx_http_spdy_read_request_body(r, post_handler);
+        rc = ngx_http_v2_read_request_body(r, post_handler);
         goto done;
     }
 #endif
@@ -570,9 +570,9 @@ ngx_http_discard_request_body(ngx_http_request_t *r)
     ngx_int_t     rc;
     ngx_event_t  *rev;
 
-#if (NGX_HTTP_SPDY)
-    if (r->spdy_stream && r == r->main) {
-        r->spdy_stream->skip_data = NGX_SPDY_DATA_DISCARD;
+#if (NGX_HTTP_V2)
+    if (r->stream && r == r->main) {
+        r->stream->skip_data = NGX_HTTP_V2_DATA_DISCARD;
         return NGX_OK;
     }
 #endif

  Renamed: vendor/nginx-1.9.5/src/http/ngx_http_script.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/ngx_http_script.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/ngx_http_special_response.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/ngx_http_upstream.c (+45 -45) 98%
===================================================================
--- vendor/nginx-1.8.0/src/http/ngx_http_upstream.c    2015-09-27 18:09:01 +0900 (56091fa)
+++ vendor/nginx-1.9.5/src/http/ngx_http_upstream.c    2015-09-27 22:10:53 +0900 (1530596)
@@ -363,6 +363,10 @@ static ngx_http_variable_t  ngx_http_upstream_vars[] = {
       ngx_http_upstream_status_variable, 0,
       NGX_HTTP_VAR_NOCACHEABLE, 0 },
 
+    { ngx_string("upstream_connect_time"), NULL,
+      ngx_http_upstream_response_time_variable, 2,
+      NGX_HTTP_VAR_NOCACHEABLE, 0 },
+
     { ngx_string("upstream_header_time"), NULL,
       ngx_http_upstream_response_time_variable, 1,
       NGX_HTTP_VAR_NOCACHEABLE, 0 },
@@ -471,8 +475,8 @@ ngx_http_upstream_init(ngx_http_request_t *r)
     ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
                    "http init upstream, client timer: %d", c->read->timer_set);
 
-#if (NGX_HTTP_SPDY)
-    if (r->spdy_stream) {
+#if (NGX_HTTP_V2)
+    if (r->stream) {
         ngx_http_upstream_init_request(r);
         return;
     }
@@ -530,15 +534,24 @@ ngx_http_upstream_init_request(ngx_http_request_t *r)
 
         r->write_event_handler = ngx_http_request_empty_handler;
 
-        if (rc == NGX_DONE) {
-            return;
-        }
-
         if (rc == NGX_ERROR) {
             ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
             return;
         }
 
+        if (rc == NGX_OK) {
+            rc = ngx_http_upstream_cache_send(r, u);
+
+            if (rc == NGX_DONE) {
+                return;
+            }
+
+            if (rc == NGX_HTTP_UPSTREAM_INVALID_HEADER) {
+                rc = NGX_DECLINED;
+                r->cached = 0;
+            }
+        }
+
         if (rc != NGX_DECLINED) {
             ngx_http_finalize_request(r, rc);
             return;
@@ -833,13 +846,7 @@ ngx_http_upstream_cache(ngx_http_request_t *r, ngx_http_upstream_t *u)
 
     case NGX_OK:
 
-        rc = ngx_http_upstream_cache_send(r, u);
-
-        if (rc != NGX_HTTP_UPSTREAM_INVALID_HEADER) {
-            return rc;
-        }
-
-        break;
+        return NGX_OK;
 
     case NGX_HTTP_CACHE_STALE:
 
@@ -1144,8 +1151,8 @@ ngx_http_upstream_check_broken_connection(ngx_http_request_t *r,
         return;
     }
 
-#if (NGX_HTTP_SPDY)
-    if (r->spdy_stream) {
+#if (NGX_HTTP_V2)
+    if (r->stream) {
         return;
     }
 #endif
@@ -1300,15 +1307,12 @@ static void
 ngx_http_upstream_connect(ngx_http_request_t *r, ngx_http_upstream_t *u)
 {
     ngx_int_t          rc;
-    ngx_time_t        *tp;
     ngx_connection_t  *c;
 
     r->connection->log->action = "connecting to upstream";
 
-    if (u->state && u->state->response_sec) {
-        tp = ngx_timeofday();
-        u->state->response_sec = tp->sec - u->state->response_sec;
-        u->state->response_msec = tp->msec - u->state->response_msec;
+    if (u->state && u->state->response_time) {
+        u->state->response_time = ngx_current_msec - u->state->response_time;
     }
 
     u->state = ngx_array_push(r->upstream_states);
@@ -1320,10 +1324,9 @@ ngx_http_upstream_connect(ngx_http_request_t *r, ngx_http_upstream_t *u)
 
     ngx_memzero(u->state, sizeof(ngx_http_upstream_state_t));
 
-    tp = ngx_timeofday();
-    u->state->response_sec = tp->sec;
-    u->state->response_msec = tp->msec;
-    u->state->header_sec = (time_t) NGX_ERROR;
+    u->state->response_time = ngx_current_msec;
+    u->state->connect_time = (ngx_msec_t) -1;
+    u->state->header_time = (ngx_msec_t) -1;
 
     rc = ngx_event_connect_peer(&u->peer);
 
@@ -1765,6 +1768,10 @@ ngx_http_upstream_send_request(ngx_http_request_t *r, ngx_http_upstream_t *u,
     ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
                    "http upstream send request");
 
+    if (u->state->connect_time == (ngx_msec_t) -1) {
+        u->state->connect_time = ngx_current_msec - u->state->response_time;
+    }
+
     if (!u->request_sent && ngx_http_upstream_test_connect(c) != NGX_OK) {
         ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);
         return;
@@ -2017,7 +2024,6 @@ ngx_http_upstream_process_header(ngx_http_request_t *r, ngx_http_upstream_t *u)
 {
     ssize_t            n;
     ngx_int_t          rc;
-    ngx_time_t        *tp;
     ngx_connection_t  *c;
 
     c = u->peer.connection;
@@ -2138,9 +2144,7 @@ ngx_http_upstream_process_header(ngx_http_request_t *r, ngx_http_upstream_t *u)
 
     /* rc == NGX_OK */
 
-    tp = ngx_timeofday();
-    u->state->header_sec = tp->sec - u->state->response_sec;
-    u->state->header_msec = tp->msec - u->state->response_msec;
+    u->state->header_time = ngx_current_msec - u->state->response_time;
 
     if (u->headers_in.status_n >= NGX_HTTP_SPECIAL_RESPONSE) {
 
@@ -2911,7 +2915,7 @@ ngx_http_upstream_send_response(ngx_http_request_t *r, ngx_http_upstream_t *u)
         p->buf_to_file->temporary = 1;
     }
 
-    if (ngx_event_flags & NGX_USE_AIO_EVENT) {
+    if (ngx_event_flags & NGX_USE_IOCP_EVENT) {
         /* the posted aio operation may corrupt a shadow buffer */
         p->single_buf = 1;
     }
@@ -3730,7 +3734,7 @@ ngx_http_upstream_store(ngx_http_request_t *r, ngx_http_upstream_t *u)
 
     if (u->headers_in.last_modified) {
 
-        lm = ngx_http_parse_time(u->headers_in.last_modified->value.data,
+        lm = ngx_parse_http_time(u->headers_in.last_modified->value.data,
                                  u->headers_in.last_modified->value.len);
 
         if (lm != NGX_ERROR) {
@@ -3923,8 +3927,7 @@ static void
 ngx_http_upstream_finalize_request(ngx_http_request_t *r,
     ngx_http_upstream_t *u, ngx_int_t rc)
 {
-    ngx_uint_t   flush;
-    ngx_time_t  *tp;
+    ngx_uint_t  flush;
 
     ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
                    "finalize http upstream request: %i", rc);
@@ -3943,10 +3946,8 @@ ngx_http_upstream_finalize_request(ngx_http_request_t *r,
         u->resolved->ctx = NULL;
     }
 
-    if (u->state && u->state->response_sec) {
-        tp = ngx_timeofday();
-        u->state->response_sec = tp->sec - u->state->response_sec;
-        u->state->response_msec = tp->msec - u->state->response_msec;
+    if (u->state && u->state->response_time) {
+        u->state->response_time = ngx_current_msec - u->state->response_time;
 
         if (u->pipe && u->pipe->read_length) {
             u->state->response_length = u->pipe->read_length;
@@ -4130,7 +4131,7 @@ ngx_http_upstream_process_last_modified(ngx_http_request_t *r,
 #if (NGX_HTTP_CACHE)
 
     if (u->cacheable) {
-        u->headers_in.last_modified_time = ngx_http_parse_time(h->value.data,
+        u->headers_in.last_modified_time = ngx_parse_http_time(h->value.data,
                                                                h->value.len);
     }
 
@@ -4294,7 +4295,7 @@ ngx_http_upstream_process_expires(ngx_http_request_t *r, ngx_table_elt_t *h,
         return NGX_OK;
     }
 
-    expires = ngx_http_parse_time(h->value.data, h->value.len);
+    expires = ngx_parse_http_time(h->value.data, h->value.len);
 
     if (expires == NGX_ERROR || expires < ngx_time()) {
         u->cacheable = 0;
@@ -5020,15 +5021,14 @@ ngx_http_upstream_response_time_variable(ngx_http_request_t *r,
     for ( ;; ) {
         if (state[i].status) {
 
-            if (data
-                && state[i].header_sec != (time_t) NGX_ERROR)
-            {
-                ms = (ngx_msec_int_t)
-                      (state[i].header_sec * 1000 + state[i].header_msec);
+            if (data == 1 && state[i].header_time != (ngx_msec_t) -1) {
+                ms = state[i].header_time;
+
+            } else if (data == 2 && state[i].connect_time != (ngx_msec_t) -1) {
+                ms = state[i].connect_time;
 
             } else {
-                ms = (ngx_msec_int_t)
-                      (state[i].response_sec * 1000 + state[i].response_msec);
+                ms = state[i].response_time;
             }
 
             ms = ngx_max(ms, 0);

  Renamed: vendor/nginx-1.9.5/src/http/ngx_http_upstream.h (+7 -4) 98%
===================================================================
--- vendor/nginx-1.8.0/src/http/ngx_http_upstream.h    2015-09-27 18:09:01 +0900 (895a559)
+++ vendor/nginx-1.9.5/src/http/ngx_http_upstream.h    2015-09-27 22:10:53 +0900 (64157e6)
@@ -58,10 +58,9 @@ typedef struct {
     ngx_uint_t                       bl_state;
 
     ngx_uint_t                       status;
-    time_t                           response_sec;
-    ngx_uint_t                       response_msec;
-    time_t                           header_sec;
-    ngx_uint_t                       header_msec;
+    ngx_msec_t                       response_time;
+    ngx_msec_t                       connect_time;
+    ngx_msec_t                       header_time;
     off_t                            response_length;
 
     ngx_str_t                       *peer;
@@ -123,6 +122,10 @@ struct ngx_http_upstream_srv_conf_s {
     in_port_t                        port;
     in_port_t                        default_port;
     ngx_uint_t                       no_port;  /* unsigned no_port:1 */
+
+#if (NGX_HTTP_UPSTREAM_ZONE)
+    ngx_shm_zone_t                  *shm_zone;
+#endif
 };
 
 

  Renamed: vendor/nginx-1.9.5/src/http/ngx_http_upstream_round_robin.c (+211 -64) 72%
===================================================================
--- vendor/nginx-1.8.0/src/http/ngx_http_upstream_round_robin.c    2015-09-27 18:09:01 +0900 (2d0649b)
+++ vendor/nginx-1.9.5/src/http/ngx_http_upstream_round_robin.c    2015-09-27 22:10:53 +0900 (d6ae33b)
@@ -34,7 +34,7 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
     ngx_url_t                      u;
     ngx_uint_t                     i, j, n, w;
     ngx_http_upstream_server_t    *server;
-    ngx_http_upstream_rr_peer_t   *peer;
+    ngx_http_upstream_rr_peer_t   *peer, **peerp;
     ngx_http_upstream_rr_peers_t  *peers, *backup;
 
     us->peer.init = ngx_http_upstream_init_round_robin_peer;
@@ -61,12 +61,16 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
             return NGX_ERROR;
         }
 
-        peers = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peers_t)
-                              + sizeof(ngx_http_upstream_rr_peer_t) * (n - 1));
+        peers = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peers_t));
         if (peers == NULL) {
             return NGX_ERROR;
         }
 
+        peer = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peer_t) * n);
+        if (peer == NULL) {
+            return NGX_ERROR;
+        }
+
         peers->single = (n == 1);
         peers->number = n;
         peers->weighted = (w != n);
@@ -74,7 +78,7 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
         peers->name = &us->host;
 
         n = 0;
-        peer = peers->peer;
+        peerp = &peers->peer;
 
         for (i = 0; i < us->servers->nelts; i++) {
             if (server[i].backup) {
@@ -92,6 +96,9 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
                 peer[n].fail_timeout = server[i].fail_timeout;
                 peer[n].down = server[i].down;
                 peer[n].server = server[i].name;
+
+                *peerp = &peer[n];
+                peerp = &peer[n].next;
                 n++;
             }
         }
@@ -116,12 +123,16 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
             return NGX_OK;
         }
 
-        backup = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peers_t)
-                              + sizeof(ngx_http_upstream_rr_peer_t) * (n - 1));
+        backup = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peers_t));
         if (backup == NULL) {
             return NGX_ERROR;
         }
 
+        peer = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peer_t) * n);
+        if (peer == NULL) {
+            return NGX_ERROR;
+        }
+
         peers->single = 0;
         backup->single = 0;
         backup->number = n;
@@ -130,7 +141,7 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
         backup->name = &us->host;
 
         n = 0;
-        peer = backup->peer;
+        peerp = &backup->peer;
 
         for (i = 0; i < us->servers->nelts; i++) {
             if (!server[i].backup) {
@@ -148,6 +159,9 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
                 peer[n].fail_timeout = server[i].fail_timeout;
                 peer[n].down = server[i].down;
                 peer[n].server = server[i].name;
+
+                *peerp = &peer[n];
+                peerp = &peer[n].next;
                 n++;
             }
         }
@@ -184,19 +198,23 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
 
     n = u.naddrs;
 
-    peers = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peers_t)
-                              + sizeof(ngx_http_upstream_rr_peer_t) * (n - 1));
+    peers = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peers_t));
     if (peers == NULL) {
         return NGX_ERROR;
     }
 
+    peer = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peer_t) * n);
+    if (peer == NULL) {
+        return NGX_ERROR;
+    }
+
     peers->single = (n == 1);
     peers->number = n;
     peers->weighted = 0;
     peers->total_weight = n;
     peers->name = &us->host;
 
-    peer = peers->peer;
+    peerp = &peers->peer;
 
     for (i = 0; i < u.naddrs; i++) {
         peer[i].sockaddr = u.addrs[i].sockaddr;
@@ -207,6 +225,8 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
         peer[i].current_weight = 0;
         peer[i].max_fails = 1;
         peer[i].fail_timeout = 10;
+        *peerp = &peer[i];
+        peerp = &peer[i].next;
     }
 
     us->peer.data = peers;
@@ -236,7 +256,7 @@ ngx_http_upstream_init_round_robin_peer(ngx_http_request_t *r,
     }
 
     rrp->peers = us->peer.data;
-    rrp->current = 0;
+    rrp->current = NULL;
 
     n = rrp->peers->number;
 
@@ -280,7 +300,7 @@ ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r,
     socklen_t                          socklen;
     ngx_uint_t                         i, n;
     struct sockaddr                   *sockaddr;
-    ngx_http_upstream_rr_peer_t       *peer;
+    ngx_http_upstream_rr_peer_t       *peer, **peerp;
     ngx_http_upstream_rr_peers_t      *peers;
     ngx_http_upstream_rr_peer_data_t  *rrp;
 
@@ -295,18 +315,21 @@ ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r,
         r->upstream->peer.data = rrp;
     }
 
-    peers = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_rr_peers_t)
-                     + sizeof(ngx_http_upstream_rr_peer_t) * (ur->naddrs - 1));
+    peers = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_rr_peers_t));
     if (peers == NULL) {
         return NGX_ERROR;
     }
 
+    peer = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_rr_peer_t)
+                                * ur->naddrs);
+    if (peer == NULL) {
+        return NGX_ERROR;
+    }
+
     peers->single = (ur->naddrs == 1);
     peers->number = ur->naddrs;
     peers->name = &ur->host;
 
-    peer = peers->peer;
-
     if (ur->sockaddr) {
         peer[0].sockaddr = ur->sockaddr;
         peer[0].socklen = ur->socklen;
@@ -316,8 +339,10 @@ ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r,
         peer[0].current_weight = 0;
         peer[0].max_fails = 1;
         peer[0].fail_timeout = 10;
+        peers->peer = peer;
 
     } else {
+        peerp = &peers->peer;
 
         for (i = 0; i < ur->naddrs; i++) {
 
@@ -356,11 +381,13 @@ ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r,
             peer[i].current_weight = 0;
             peer[i].max_fails = 1;
             peer[i].fail_timeout = 10;
+            *peerp = &peer[i];
+            peerp = &peer[i].next;
         }
     }
 
     rrp->peers = peers;
-    rrp->current = 0;
+    rrp->current = NULL;
 
     if (rrp->peers->number <= 8 * sizeof(uintptr_t)) {
         rrp->tried = &rrp->data;
@@ -405,16 +432,17 @@ ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, void *data)
     pc->connection = NULL;
 
     peers = rrp->peers;
-
-    /* ngx_lock_mutex(peers->mutex); */
+    ngx_http_upstream_rr_peers_wlock(peers);
 
     if (peers->single) {
-        peer = &peers->peer[0];
+        peer = peers->peer;
 
         if (peer->down) {
             goto failed;
         }
 
+        rrp->current = peer;
+
     } else {
 
         /* there are several peers */
@@ -426,15 +454,17 @@ ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, void *data)
         }
 
         ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,
-                       "get rr peer, current: %ui %i",
-                       rrp->current, peer->current_weight);
+                       "get rr peer, current: %p %i",
+                       peer, peer->current_weight);
     }
 
     pc->sockaddr = peer->sockaddr;
     pc->socklen = peer->socklen;
     pc->name = &peer->name;
 
-    /* ngx_unlock_mutex(peers->mutex); */
+    peer->conns++;
+
+    ngx_http_upstream_rr_peers_unlock(peers);
 
     return NGX_OK;
 
@@ -442,8 +472,6 @@ failed:
 
     if (peers->next) {
 
-        /* ngx_unlock_mutex(peers->mutex); */
-
         ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0, "backup servers");
 
         rrp->peers = peers->next;
@@ -455,22 +483,24 @@ failed:
              rrp->tried[i] = 0;
         }
 
+        ngx_http_upstream_rr_peers_unlock(peers);
+
         rc = ngx_http_upstream_get_round_robin_peer(pc, rrp);
 
         if (rc != NGX_BUSY) {
             return rc;
         }
 
-        /* ngx_lock_mutex(peers->mutex); */
+        ngx_http_upstream_rr_peers_wlock(peers);
     }
 
     /* all peers failed, mark them as live for quick recovery */
 
-    for (i = 0; i < peers->number; i++) {
-        peers->peer[i].fails = 0;
+    for (peer = peers->peer; peer; peer = peer->next) {
+        peer->fails = 0;
     }
 
-    /* ngx_unlock_mutex(peers->mutex); */
+    ngx_http_upstream_rr_peers_unlock(peers);
 
     pc->name = peers->name;
 
@@ -484,7 +514,7 @@ ngx_http_upstream_get_peer(ngx_http_upstream_rr_peer_data_t *rrp)
     time_t                        now;
     uintptr_t                     m;
     ngx_int_t                     total;
-    ngx_uint_t                    i, n;
+    ngx_uint_t                    i, n, p;
     ngx_http_upstream_rr_peer_t  *peer, *best;
 
     now = ngx_time();
@@ -492,7 +522,14 @@ ngx_http_upstream_get_peer(ngx_http_upstream_rr_peer_data_t *rrp)
     best = NULL;
     total = 0;
 
-    for (i = 0; i < rrp->peers->number; i++) {
+#if (NGX_SUPPRESS_WARN)
+    p = 0;
+#endif
+
+    for (peer = rrp->peers->peer, i = 0;
+         peer;
+         peer = peer->next, i++)
+    {
 
         n = i / (8 * sizeof(uintptr_t));
         m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));
@@ -501,8 +538,6 @@ ngx_http_upstream_get_peer(ngx_http_upstream_rr_peer_data_t *rrp)
             continue;
         }
 
-        peer = &rrp->peers->peer[i];
-
         if (peer->down) {
             continue;
         }
@@ -523,6 +558,7 @@ ngx_http_upstream_get_peer(ngx_http_upstream_rr_peer_data_t *rrp)
 
         if (best == NULL || peer->current_weight > best->current_weight) {
             best = peer;
+            p = i;
         }
     }
 
@@ -530,12 +566,10 @@ ngx_http_upstream_get_peer(ngx_http_upstream_rr_peer_data_t *rrp)
         return NULL;
     }
 
-    i = best - &rrp->peers->peer[0];
+    rrp->current = best;
 
-    rrp->current = i;
-
-    n = i / (8 * sizeof(uintptr_t));
-    m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));
+    n = p / (8 * sizeof(uintptr_t));
+    m = (uintptr_t) 1 << p % (8 * sizeof(uintptr_t));
 
     rrp->tried[n] |= m;
 
@@ -563,36 +597,46 @@ ngx_http_upstream_free_round_robin_peer(ngx_peer_connection_t *pc, void *data,
 
     /* TODO: NGX_PEER_KEEPALIVE */
 
+    peer = rrp->current;
+
+    ngx_http_upstream_rr_peers_rlock(rrp->peers);
+    ngx_http_upstream_rr_peer_lock(rrp->peers, peer);
+
     if (rrp->peers->single) {
+
+        peer->conns--;
+
+        ngx_http_upstream_rr_peer_unlock(rrp->peers, peer);
+        ngx_http_upstream_rr_peers_unlock(rrp->peers);
+
         pc->tries = 0;
         return;
     }
 
-    peer = &rrp->peers->peer[rrp->current];
-
     if (state & NGX_PEER_FAILED) {
         now = ngx_time();
 
-        /* ngx_lock_mutex(rrp->peers->mutex); */
-
         peer->fails++;
         peer->accessed = now;
         peer->checked = now;
 
         if (peer->max_fails) {
             peer->effective_weight -= peer->weight / peer->max_fails;
+
+            if (peer->fails >= peer->max_fails) {
+                ngx_log_error(NGX_LOG_WARN, pc->log, 0,
+                              "upstream server temporarily disabled");
+            }
         }
 
         ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,
-                       "free rr peer failed: %ui %i",
-                       rrp->current, peer->effective_weight);
+                       "free rr peer failed: %p %i",
+                       peer, peer->effective_weight);
 
         if (peer->effective_weight < 0) {
             peer->effective_weight = 0;
         }
 
-        /* ngx_unlock_mutex(rrp->peers->mutex); */
-
     } else {
 
         /* mark peer live if check passed */
@@ -602,11 +646,14 @@ ngx_http_upstream_free_round_robin_peer(ngx_peer_connection_t *pc, void *data,
         }
     }
 
+    peer->conns--;
+
+    ngx_http_upstream_rr_peer_unlock(rrp->peers, peer);
+    ngx_http_upstream_rr_peers_unlock(rrp->peers);
+
     if (pc->tries) {
         pc->tries--;
     }
-
-    /* ngx_unlock_mutex(rrp->peers->mutex); */
 }
 
 
@@ -618,14 +665,54 @@ ngx_http_upstream_set_round_robin_peer_session(ngx_peer_connection_t *pc,
 {
     ngx_http_upstream_rr_peer_data_t  *rrp = data;
 
-    ngx_int_t                     rc;
-    ngx_ssl_session_t            *ssl_session;
-    ngx_http_upstream_rr_peer_t  *peer;
+    ngx_int_t                      rc;
+    ngx_ssl_session_t             *ssl_session;
+    ngx_http_upstream_rr_peer_t   *peer;
+#if (NGX_HTTP_UPSTREAM_ZONE)
+    int                            len;
+#if OPENSSL_VERSION_NUMBER >= 0x0090707fL
+    const
+#endif
+    u_char                        *p;
+    ngx_http_upstream_rr_peers_t  *peers;
+    u_char                         buf[NGX_SSL_MAX_SESSION_SIZE];
+#endif
+
+    peer = rrp->current;
+
+#if (NGX_HTTP_UPSTREAM_ZONE)
+    peers = rrp->peers;
 
-    peer = &rrp->peers->peer[rrp->current];
+    if (peers->shpool) {
+        ngx_http_upstream_rr_peers_rlock(peers);
+        ngx_http_upstream_rr_peer_lock(peers, peer);
 
-    /* TODO: threads only mutex */
-    /* ngx_lock_mutex(rrp->peers->mutex); */
+        if (peer->ssl_session == NULL) {
+            ngx_http_upstream_rr_peer_unlock(peers, peer);
+            ngx_http_upstream_rr_peers_unlock(peers);
+            return NGX_OK;
+        }
+
+        len = peer->ssl_session_len;
+
+        ngx_memcpy(buf, peer->ssl_session, len);
+
+        ngx_http_upstream_rr_peer_unlock(peers, peer);
+        ngx_http_upstream_rr_peers_unlock(peers);
+
+        p = buf;
+        ssl_session = d2i_SSL_SESSION(NULL, &p, len);
+
+        rc = ngx_ssl_set_session(pc->connection, ssl_session);
+
+        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
+                       "set session: %p", ssl_session);
+
+        ngx_ssl_free_session(ssl_session);
+
+        return rc;
+    }
+#endif
 
     ssl_session = peer->ssl_session;
 
@@ -634,8 +721,6 @@ ngx_http_upstream_set_round_robin_peer_session(ngx_peer_connection_t *pc,
     ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
                    "set session: %p", ssl_session);
 
-    /* ngx_unlock_mutex(rrp->peers->mutex); */
-
     return rc;
 }
 
@@ -646,8 +731,75 @@ ngx_http_upstream_save_round_robin_peer_session(ngx_peer_connection_t *pc,
 {
     ngx_http_upstream_rr_peer_data_t  *rrp = data;
 
-    ngx_ssl_session_t            *old_ssl_session, *ssl_session;
-    ngx_http_upstream_rr_peer_t  *peer;
+    ngx_ssl_session_t             *old_ssl_session, *ssl_session;
+    ngx_http_upstream_rr_peer_t   *peer;
+#if (NGX_HTTP_UPSTREAM_ZONE)
+    int                            len;
+    u_char                        *p;
+    ngx_http_upstream_rr_peers_t  *peers;
+    u_char                         buf[NGX_SSL_MAX_SESSION_SIZE];
+#endif
+
+#if (NGX_HTTP_UPSTREAM_ZONE)
+    peers = rrp->peers;
+
+    if (peers->shpool) {
+
+        ssl_session = SSL_get0_session(pc->connection->ssl->connection);
+
+        if (ssl_session == NULL) {
+            return;
+        }
+
+        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
+                       "save session: %p", ssl_session);
+
+        len = i2d_SSL_SESSION(ssl_session, NULL);
+
+        /* do not cache too big session */
+
+        if (len > NGX_SSL_MAX_SESSION_SIZE) {
+            return;
+        }
+
+        p = buf;
+        (void) i2d_SSL_SESSION(ssl_session, &p);
+
+        peer = rrp->current;
+
+        ngx_http_upstream_rr_peers_rlock(peers);
+        ngx_http_upstream_rr_peer_lock(peers, peer);
+
+        if (len > peer->ssl_session_len) {
+            ngx_shmtx_lock(&peers->shpool->mutex);
+
+            if (peer->ssl_session) {
+                ngx_slab_free_locked(peers->shpool, peer->ssl_session);
+            }
+
+            peer->ssl_session = ngx_slab_alloc_locked(peers->shpool, len);
+
+            ngx_shmtx_unlock(&peers->shpool->mutex);
+
+            if (peer->ssl_session == NULL) {
+                peer->ssl_session_len = 0;
+
+                ngx_http_upstream_rr_peer_unlock(peers, peer);
+                ngx_http_upstream_rr_peers_unlock(peers);
+                return;
+            }
+
+            peer->ssl_session_len = len;
+        }
+
+        ngx_memcpy(peer->ssl_session, buf, len);
+
+        ngx_http_upstream_rr_peer_unlock(peers, peer);
+        ngx_http_upstream_rr_peers_unlock(peers);
+
+        return;
+    }
+#endif
 
     ssl_session = ngx_ssl_get_session(pc->connection);
 
@@ -658,16 +810,11 @@ ngx_http_upstream_save_round_robin_peer_session(ngx_peer_connection_t *pc,
     ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
                    "save session: %p", ssl_session);
 
-    peer = &rrp->peers->peer[rrp->current];
-
-    /* TODO: threads only mutex */
-    /* ngx_lock_mutex(rrp->peers->mutex); */
+    peer = rrp->current;
 
     old_ssl_session = peer->ssl_session;
     peer->ssl_session = ssl_session;
 
-    /* ngx_unlock_mutex(rrp->peers->mutex); */
-
     if (old_ssl_session) {
 
         ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,

  Added: vendor/nginx-1.9.5/src/http/ngx_http_upstream_round_robin.h (+149 -0) 100644
===================================================================
--- /dev/null
+++ vendor/nginx-1.9.5/src/http/ngx_http_upstream_round_robin.h    2015-09-27 22:10:53 +0900 (f2c573f)
@@ -0,0 +1,149 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) Nginx, Inc.
+ */
+
+
+#ifndef _NGX_HTTP_UPSTREAM_ROUND_ROBIN_H_INCLUDED_
+#define _NGX_HTTP_UPSTREAM_ROUND_ROBIN_H_INCLUDED_
+
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+#include <ngx_http.h>
+
+
+typedef struct ngx_http_upstream_rr_peer_s   ngx_http_upstream_rr_peer_t;
+
+struct ngx_http_upstream_rr_peer_s {
+    struct sockaddr                *sockaddr;
+    socklen_t                       socklen;
+    ngx_str_t                       name;
+    ngx_str_t                       server;
+
+    ngx_int_t                       current_weight;
+    ngx_int_t                       effective_weight;
+    ngx_int_t                       weight;
+
+    ngx_uint_t                      conns;
+
+    ngx_uint_t                      fails;
+    time_t                          accessed;
+    time_t                          checked;
+
+    ngx_uint_t                      max_fails;
+    time_t                          fail_timeout;
+
+    ngx_uint_t                      down;          /* unsigned  down:1; */
+
+#if (NGX_HTTP_SSL)
+    void                           *ssl_session;
+    int                             ssl_session_len;
+#endif
+
+    ngx_http_upstream_rr_peer_t    *next;
+
+#if (NGX_HTTP_UPSTREAM_ZONE)
+    ngx_atomic_t                    lock;
+#endif
+};
+
+
+typedef struct ngx_http_upstream_rr_peers_s  ngx_http_upstream_rr_peers_t;
+
+struct ngx_http_upstream_rr_peers_s {
+    ngx_uint_t                      number;
+
+#if (NGX_HTTP_UPSTREAM_ZONE)
+    ngx_slab_pool_t                *shpool;
+    ngx_atomic_t                    rwlock;
+    ngx_http_upstream_rr_peers_t   *zone_next;
+#endif
+
+    ngx_uint_t                      total_weight;
+
+    unsigned                        single:1;
+    unsigned                        weighted:1;
+
+    ngx_str_t                      *name;
+
+    ngx_http_upstream_rr_peers_t   *next;
+
+    ngx_http_upstream_rr_peer_t    *peer;
+};
+
+
+#if (NGX_HTTP_UPSTREAM_ZONE)
+
+#define ngx_http_upstream_rr_peers_rlock(peers)                               \
+                                                                              \
+    if (peers->shpool) {                                                      \
+        ngx_rwlock_rlock(&peers->rwlock);                                     \
+    }
+
+#define ngx_http_upstream_rr_peers_wlock(peers)                               \
+                                                                              \
+    if (peers->shpool) {                                                      \
+        ngx_rwlock_wlock(&peers->rwlock);                                     \
+    }
+
+#define ngx_http_upstream_rr_peers_unlock(peers)                              \
+                                                                              \
+    if (peers->shpool) {                                                      \
+        ngx_rwlock_unlock(&peers->rwlock);                                    \
+    }
+
+
+#define ngx_http_upstream_rr_peer_lock(peers, peer)                           \
+                                                                              \
+    if (peers->shpool) {                                                      \
+        ngx_rwlock_wlock(&peer->lock);                                        \
+    }
+
+#define ngx_http_upstream_rr_peer_unlock(peers, peer)                         \
+                                                                              \
+    if (peers->shpool) {                                                      \
+        ngx_rwlock_unlock(&peer->lock);                                       \
+    }
+
+#else
+
+#define ngx_http_upstream_rr_peers_rlock(peers)
+#define ngx_http_upstream_rr_peers_wlock(peers)
+#define ngx_http_upstream_rr_peers_unlock(peers)
+#define ngx_http_upstream_rr_peer_lock(peers, peer)
+#define ngx_http_upstream_rr_peer_unlock(peers, peer)
+
+#endif
+
+
+typedef struct {
+    ngx_http_upstream_rr_peers_t   *peers;
+    ngx_http_upstream_rr_peer_t    *current;
+    uintptr_t                      *tried;
+    uintptr_t                       data;
+} ngx_http_upstream_rr_peer_data_t;
+
+
+ngx_int_t ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
+    ngx_http_upstream_srv_conf_t *us);
+ngx_int_t ngx_http_upstream_init_round_robin_peer(ngx_http_request_t *r,
+    ngx_http_upstream_srv_conf_t *us);
+ngx_int_t ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r,
+    ngx_http_upstream_resolved_t *ur);
+ngx_int_t ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc,
+    void *data);
+void ngx_http_upstream_free_round_robin_peer(ngx_peer_connection_t *pc,
+    void *data, ngx_uint_t state);
+
+#if (NGX_HTTP_SSL)
+ngx_int_t
+    ngx_http_upstream_set_round_robin_peer_session(ngx_peer_connection_t *pc,
+    void *data);
+void ngx_http_upstream_save_round_robin_peer_session(ngx_peer_connection_t *pc,
+    void *data);
+#endif
+
+
+#endif /* _NGX_HTTP_UPSTREAM_ROUND_ROBIN_H_INCLUDED_ */

  Renamed: vendor/nginx-1.9.5/src/http/ngx_http_variables.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/ngx_http_variables.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/http/ngx_http_write_filter_module.c (+0 -0) 100%
===================================================================

  Added: vendor/nginx-1.9.5/src/http/v2/ngx_http_v2.c (+4036 -0) 100644
===================================================================
--- /dev/null
+++ vendor/nginx-1.9.5/src/http/v2/ngx_http_v2.c    2015-09-27 22:10:53 +0900 (bf07997)
@@ -0,0 +1,4036 @@
+
+/*
+ * Copyright (C) Nginx, Inc.
+ * Copyright (C) Valentin V. Bartenev
+ */
+
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+#include <ngx_http.h>
+#include <ngx_http_v2_module.h>
+
+
+/* errors */
+#define NGX_HTTP_V2_NO_ERROR                     0x0
+#define NGX_HTTP_V2_PROTOCOL_ERROR               0x1
+#define NGX_HTTP_V2_INTERNAL_ERROR               0x2
+#define NGX_HTTP_V2_FLOW_CTRL_ERROR              0x3
+#define NGX_HTTP_V2_SETTINGS_TIMEOUT             0x4
+#define NGX_HTTP_V2_STREAM_CLOSED                0x5
+#define NGX_HTTP_V2_SIZE_ERROR                   0x6
+#define NGX_HTTP_V2_REFUSED_STREAM               0x7
+#define NGX_HTTP_V2_CANCEL                       0x8
+#define NGX_HTTP_V2_COMP_ERROR                   0x9
+#define NGX_HTTP_V2_CONNECT_ERROR                0xa
+#define NGX_HTTP_V2_ENHANCE_YOUR_CALM            0xb
+#define NGX_HTTP_V2_INADEQUATE_SECURITY          0xc
+#define NGX_HTTP_V2_HTTP_1_1_REQUIRED            0xd
+
+/* frame sizes */
+#define NGX_HTTP_V2_RST_STREAM_SIZE              4
+#define NGX_HTTP_V2_PRIORITY_SIZE                5
+#define NGX_HTTP_V2_PING_SIZE                    8
+#define NGX_HTTP_V2_GOAWAY_SIZE                  8
+#define NGX_HTTP_V2_WINDOW_UPDATE_SIZE           4
+
+#define NGX_HTTP_V2_STREAM_ID_SIZE               4
+
+#define NGX_HTTP_V2_SETTINGS_PARAM_SIZE          6
+
+/* settings fields */
+#define NGX_HTTP_V2_HEADER_TABLE_SIZE_SETTING    0x1
+#define NGX_HTTP_V2_MAX_STREAMS_SETTING          0x3
+#define NGX_HTTP_V2_INIT_WINDOW_SIZE_SETTING     0x4
+#define NGX_HTTP_V2_MAX_FRAME_SIZE_SETTING       0x5
+
+#define NGX_HTTP_V2_FRAME_BUFFER_SIZE            24
+
+#define NGX_HTTP_V2_DEFAULT_FRAME_SIZE           (1 << 14)
+
+#define NGX_HTTP_V2_MAX_WINDOW                   ((1U << 31) - 1)
+#define NGX_HTTP_V2_DEFAULT_WINDOW               65535
+
+#define NGX_HTTP_V2_ROOT                         (void *) -1
+
+
+static void ngx_http_v2_read_handler(ngx_event_t *rev);
+static void ngx_http_v2_write_handler(ngx_event_t *wev);
+static void ngx_http_v2_handle_connection(ngx_http_v2_connection_t *h2c);
+
+static u_char *ngx_http_v2_state_proxy_protocol(ngx_http_v2_connection_t *h2c,
+    u_char *pos, u_char *end);
+static u_char *ngx_http_v2_state_preface(ngx_http_v2_connection_t *h2c,
+    u_char *pos, u_char *end);
+static u_char *ngx_http_v2_state_preface_end(ngx_http_v2_connection_t *h2c,
+    u_char *pos, u_char *end);
+static u_char *ngx_http_v2_state_head(ngx_http_v2_connection_t *h2c,
+    u_char *pos, u_char *end);
+static u_char *ngx_http_v2_state_data(ngx_http_v2_connection_t *h2c,
+    u_char *pos, u_char *end);
+static u_char *ngx_http_v2_state_read_data(ngx_http_v2_connection_t *h2c,
+    u_char *pos, u_char *end);
+static u_char *ngx_http_v2_state_headers(ngx_http_v2_connection_t *h2c,
+    u_char *pos, u_char *end);
+static u_char *ngx_http_v2_state_header_block(ngx_http_v2_connection_t *h2c,
+    u_char *pos, u_char *end);
+static u_char *ngx_http_v2_state_field_len(ngx_http_v2_connection_t *h2c,
+    u_char *pos, u_char *end);
+static u_char *ngx_http_v2_state_field_huff(ngx_http_v2_connection_t *h2c,
+    u_char *pos, u_char *end);
+static u_char *ngx_http_v2_state_field_raw(ngx_http_v2_connection_t *h2c,
+    u_char *pos, u_char *end);
+static u_char *ngx_http_v2_state_field_skip(ngx_http_v2_connection_t *h2c,
+    u_char *pos, u_char *end);
+static u_char *ngx_http_v2_state_process_header(ngx_http_v2_connection_t *h2c,
+    u_char *pos, u_char *end);
+static u_char *ngx_http_v2_state_header_complete(ngx_http_v2_connection_t *h2c,
+    u_char *pos, u_char *end);
+static u_char *ngx_http_v2_handle_continuation(ngx_http_v2_connection_t *h2c,
+    u_char *pos, u_char *end, ngx_http_v2_handler_pt handler);
+static u_char *ngx_http_v2_state_priority(ngx_http_v2_connection_t *h2c,
+    u_char *pos, u_char *end);
+static u_char *ngx_http_v2_state_rst_stream(ngx_http_v2_connection_t *h2c,
+    u_char *pos, u_char *end);
+static u_char *ngx_http_v2_state_settings(ngx_http_v2_connection_t *h2c,
+    u_char *pos, u_char *end);
+static u_char *ngx_http_v2_state_settings_params(ngx_http_v2_connection_t *h2c,
+    u_char *pos, u_char *end);
+static u_char *ngx_http_v2_state_push_promise(ngx_http_v2_connection_t *h2c,
+    u_char *pos, u_char *end);
+static u_char *ngx_http_v2_state_ping(ngx_http_v2_connection_t *h2c,
+    u_char *pos, u_char *end);
+static u_char *ngx_http_v2_state_goaway(ngx_http_v2_connection_t *h2c,
+    u_char *pos, u_char *end);
+static u_char *ngx_http_v2_state_window_update(ngx_http_v2_connection_t *h2c,
+    u_char *pos, u_char *end);
+static u_char *ngx_http_v2_state_continuation(ngx_http_v2_connection_t *h2c,
+    u_char *pos, u_char *end);
+static u_char *ngx_http_v2_state_complete(ngx_http_v2_connection_t *h2c,
+    u_char *pos, u_char *end);
+static u_char *ngx_http_v2_state_skip_padded(ngx_http_v2_connection_t *h2c,
+    u_char *pos, u_char *end);
+static u_char *ngx_http_v2_state_skip(ngx_http_v2_connection_t *h2c,
+    u_char *pos, u_char *end);
+static u_char *ngx_http_v2_state_skip_headers(ngx_http_v2_connection_t *h2c,
+    u_char *pos, u_char *end);
+static u_char *ngx_http_v2_state_save(ngx_http_v2_connection_t *h2c,
+    u_char *pos, u_char *end, ngx_http_v2_handler_pt handler);
+static u_char *ngx_http_v2_connection_error(ngx_http_v2_connection_t *h2c,
+    ngx_uint_t err);
+
+static ngx_int_t ngx_http_v2_parse_int(ngx_http_v2_connection_t *h2c,
+    u_char **pos, u_char *end, ngx_uint_t prefix);
+
+static ngx_http_v2_stream_t *ngx_http_v2_create_stream(
+    ngx_http_v2_connection_t *h2c);
+static ngx_http_v2_node_t *ngx_http_v2_get_node_by_id(
+    ngx_http_v2_connection_t *h2c, ngx_uint_t sid, ngx_uint_t alloc);
+static ngx_http_v2_node_t *ngx_http_v2_get_closed_node(
+    ngx_http_v2_connection_t *h2c);
+#define ngx_http_v2_index_size(h2scf)  (h2scf->streams_index_mask + 1)
+#define ngx_http_v2_index(h2scf, sid)  ((sid >> 1) & h2scf->streams_index_mask)
+
+static ngx_int_t ngx_http_v2_send_settings(ngx_http_v2_connection_t *h2c,
+    ngx_uint_t ack);
+static ngx_int_t ngx_http_v2_settings_frame_handler(
+    ngx_http_v2_connection_t *h2c, ngx_http_v2_out_frame_t *frame);
+static ngx_int_t ngx_http_v2_send_window_update(ngx_http_v2_connection_t *h2c,
+    ngx_uint_t sid, size_t window);
+static ngx_int_t ngx_http_v2_send_rst_stream(ngx_http_v2_connection_t *h2c,
+    ngx_uint_t sid, ngx_uint_t status);
+
+static ngx_http_v2_out_frame_t *ngx_http_v2_get_frame(
+    ngx_http_v2_connection_t *h2c, size_t length, ngx_uint_t type,
+    u_char flags, ngx_uint_t sid);
+static ngx_int_t ngx_http_v2_frame_handler(ngx_http_v2_connection_t *h2c,
+    ngx_http_v2_out_frame_t *frame);
+
+static ngx_int_t ngx_http_v2_validate_header(ngx_http_request_t *r,
+    ngx_http_v2_header_t *header);
+static ngx_int_t ngx_http_v2_pseudo_header(ngx_http_request_t *r,
+    ngx_http_v2_header_t *header);
+static ngx_int_t ngx_http_v2_parse_path(ngx_http_request_t *r,
+    ngx_http_v2_header_t *header);
+static ngx_int_t ngx_http_v2_parse_method(ngx_http_request_t *r,
+    ngx_http_v2_header_t *header);
+static ngx_int_t ngx_http_v2_parse_scheme(ngx_http_request_t *r,
+    ngx_http_v2_header_t *header);
+static ngx_int_t ngx_http_v2_parse_authority(ngx_http_request_t *r,
+    ngx_http_v2_header_t *header);
+static ngx_int_t ngx_http_v2_construct_request_line(ngx_http_request_t *r);
+static ngx_int_t ngx_http_v2_cookie(ngx_http_request_t *r,
+    ngx_http_v2_header_t *header);
+static ngx_int_t ngx_http_v2_construct_cookie_header(ngx_http_request_t *r);
+static void ngx_http_v2_run_request(ngx_http_request_t *r);
+static ngx_int_t ngx_http_v2_init_request_body(ngx_http_request_t *r);
+
+static ngx_int_t ngx_http_v2_terminate_stream(ngx_http_v2_connection_t *h2c,
+    ngx_http_v2_stream_t *stream, ngx_uint_t status);
+static void ngx_http_v2_close_stream_handler(ngx_event_t *ev);
+static void ngx_http_v2_handle_connection_handler(ngx_event_t *rev);
+static void ngx_http_v2_idle_handler(ngx_event_t *rev);
+static void ngx_http_v2_finalize_connection(ngx_http_v2_connection_t *h2c,
+    ngx_uint_t status);
+
+static ngx_int_t ngx_http_v2_adjust_windows(ngx_http_v2_connection_t *h2c,
+    ssize_t delta);
+static void ngx_http_v2_set_dependency(ngx_http_v2_connection_t *h2c,
+    ngx_http_v2_node_t *node, ngx_uint_t depend, ngx_uint_t exclusive);
+static void ngx_http_v2_node_children_update(ngx_http_v2_node_t *node);
+
+static void ngx_http_v2_pool_cleanup(void *data);
+
+
+static ngx_http_v2_handler_pt ngx_http_v2_frame_states[] = {
+    ngx_http_v2_state_data,
+    ngx_http_v2_state_headers,
+    ngx_http_v2_state_priority,
+    ngx_http_v2_state_rst_stream,
+    ngx_http_v2_state_settings,
+    ngx_http_v2_state_push_promise,
+    ngx_http_v2_state_ping,
+    ngx_http_v2_state_goaway,
+    ngx_http_v2_state_window_update,
+    ngx_http_v2_state_continuation
+};
+
+#define NGX_HTTP_V2_FRAME_STATES                                              \
+    (sizeof(ngx_http_v2_frame_states) / sizeof(ngx_http_v2_handler_pt))
+
+
+void
+ngx_http_v2_init(ngx_event_t *rev)
+{
+    ngx_connection_t          *c;
+    ngx_pool_cleanup_t        *cln;
+    ngx_http_connection_t     *hc;
+    ngx_http_v2_srv_conf_t    *h2scf;
+    ngx_http_v2_main_conf_t   *h2mcf;
+    ngx_http_v2_connection_t  *h2c;
+
+    c = rev->data;
+    hc = c->data;
+
+    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "init http2 connection");
+
+    c->log->action = "processing HTTP/2 connection";
+
+    h2mcf = ngx_http_get_module_main_conf(hc->conf_ctx, ngx_http_v2_module);
+
+    if (h2mcf->recv_buffer == NULL) {
+        h2mcf->recv_buffer = ngx_palloc(ngx_cycle->pool,
+                                        h2mcf->recv_buffer_size);
+        if (h2mcf->recv_buffer == NULL) {
+            ngx_http_close_connection(c);
+            return;
+        }
+    }
+
+    h2c = ngx_pcalloc(c->pool, sizeof(ngx_http_v2_connection_t));
+    if (h2c == NULL) {
+        ngx_http_close_connection(c);
+        return;
+    }
+
+    h2c->connection = c;
+    h2c->http_connection = hc;
+
+    h2c->send_window = NGX_HTTP_V2_DEFAULT_WINDOW;
+    h2c->recv_window = NGX_HTTP_V2_MAX_WINDOW;
+
+    h2c->init_window = NGX_HTTP_V2_DEFAULT_WINDOW;
+
+    h2c->frame_size = NGX_HTTP_V2_DEFAULT_FRAME_SIZE;
+
+    h2scf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_v2_module);
+
+    h2c->pool = ngx_create_pool(h2scf->pool_size, h2c->connection->log);
+    if (h2c->pool == NULL) {
+        ngx_http_close_connection(c);
+        return;
+    }
+
+    cln = ngx_pool_cleanup_add(c->pool, sizeof(ngx_pool_cleanup_file_t));
+    if (cln == NULL) {
+        ngx_http_close_connection(c);
+        return;
+    }
+
+    cln->handler = ngx_http_v2_pool_cleanup;
+    cln->data = h2c;
+
+    h2c->streams_index = ngx_pcalloc(c->pool, ngx_http_v2_index_size(h2scf)
+                                              * sizeof(ngx_http_v2_node_t *));
+    if (h2c->streams_index == NULL) {
+        ngx_http_close_connection(c);
+        return;
+    }
+
+    if (ngx_http_v2_send_settings(h2c, 0) == NGX_ERROR) {
+        ngx_http_close_connection(c);
+        return;
+    }
+
+    if (ngx_http_v2_send_window_update(h2c, 0, NGX_HTTP_V2_MAX_WINDOW
+                                               - NGX_HTTP_V2_DEFAULT_WINDOW)
+        == NGX_ERROR)
+    {
+        ngx_http_close_connection(c);
+        return;
+    }
+
+    h2c->state.handler = hc->proxy_protocol ? ngx_http_v2_state_proxy_protocol
+                                            : ngx_http_v2_state_preface;
+
+    ngx_queue_init(&h2c->waiting);
+    ngx_queue_init(&h2c->posted);
+    ngx_queue_init(&h2c->dependencies);
+    ngx_queue_init(&h2c->closed);
+
+    c->data = h2c;
+
+    rev->handler = ngx_http_v2_read_handler;
+    c->write->handler = ngx_http_v2_write_handler;
+
+    ngx_http_v2_read_handler(rev);
+}
+
+
+static void
+ngx_http_v2_read_handler(ngx_event_t *rev)
+{
+    u_char                    *p, *end;
+    size_t                     available;
+    ssize_t                    n;
+    ngx_connection_t          *c;
+    ngx_http_v2_main_conf_t   *h2mcf;
+    ngx_http_v2_connection_t  *h2c;
+
+    c = rev->data;
+    h2c = c->data;
+
+    if (rev->timedout) {
+        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");
+        ngx_http_v2_finalize_connection(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);
+        return;
+    }
+
+    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http2 read handler");
+
+    h2c->blocked = 1;
+
+    h2mcf = ngx_http_get_module_main_conf(h2c->http_connection->conf_ctx,
+                                          ngx_http_v2_module);
+
+    available = h2mcf->recv_buffer_size - 2 * NGX_HTTP_V2_STATE_BUFFER_SIZE;
+
+    do {
+        p = h2mcf->recv_buffer;
+
+        ngx_memcpy(p, h2c->state.buffer, NGX_HTTP_V2_STATE_BUFFER_SIZE);
+        end = p + h2c->state.buffer_used;
+
+        n = c->recv(c, end, available);
+
+        if (n == NGX_AGAIN) {
+            break;
+        }
+
+        if (n == 0 && (h2c->state.incomplete || h2c->processing)) {
+            ngx_log_error(NGX_LOG_INFO, c->log, 0,
+                          "client prematurely closed connection");
+        }
+
+        if (n == 0 || n == NGX_ERROR) {
+            c->error = 1;
+            ngx_http_v2_finalize_connection(h2c, 0);
+            return;
+        }
+
+        end += n;
+
+        h2c->state.buffer_used = 0;
+        h2c->state.incomplete = 0;
+
+        do {
+            p = h2c->state.handler(h2c, p, end);
+
+            if (p == NULL) {
+                return;
+            }
+
+        } while (p != end);
+
+    } while (rev->ready);
+
+    if (ngx_handle_read_event(rev, 0) != NGX_OK) {
+        ngx_http_v2_finalize_connection(h2c, NGX_HTTP_V2_INTERNAL_ERROR);
+        return;
+    }
+
+    if (h2c->last_out && ngx_http_v2_send_output_queue(h2c) == NGX_ERROR) {
+        ngx_http_v2_finalize_connection(h2c, 0);
+        return;
+    }
+
+    h2c->blocked = 0;
+
+    if (h2c->processing) {
+        if (rev->timer_set) {
+            ngx_del_timer(rev);
+        }
+
+        return;
+    }
+
+    ngx_http_v2_handle_connection(h2c);
+}
+
+
+static void
+ngx_http_v2_write_handler(ngx_event_t *wev)
+{
+    ngx_int_t                  rc;
+    ngx_queue_t               *q;
+    ngx_connection_t          *c;
+    ngx_http_v2_stream_t      *stream;
+    ngx_http_v2_connection_t  *h2c;
+
+    c = wev->data;
+    h2c = c->data;
+
+    if (wev->timedout) {
+        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
+                       "http2 write event timed out");
+        c->error = 1;
+        ngx_http_v2_finalize_connection(h2c, 0);
+        return;
+    }
+
+    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http2 write handler");
+
+    h2c->blocked = 1;
+
+    rc = ngx_http_v2_send_output_queue(h2c);
+
+    if (rc == NGX_ERROR) {
+        ngx_http_v2_finalize_connection(h2c, 0);
+        return;
+    }
+
+    while (!ngx_queue_empty(&h2c->posted)) {
+        q = ngx_queue_head(&h2c->posted);
+
+        ngx_queue_remove(q);
+
+        stream = ngx_queue_data(q, ngx_http_v2_stream_t, queue);
+
+        stream->handled = 0;
+
+        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
+                       "run http2 stream %ui", stream->node->id);
+
+        wev = stream->request->connection->write;
+        wev->handler(wev);
+    }
+
+    h2c->blocked = 0;
+
+    if (rc == NGX_AGAIN) {
+        return;
+    }
+
+    ngx_http_v2_handle_connection(h2c);
+}
+
+
+ngx_int_t
+ngx_http_v2_send_output_queue(ngx_http_v2_connection_t *h2c)
+{
+    int                        tcp_nodelay;
+    ngx_chain_t               *cl;
+    ngx_event_t               *wev;
+    ngx_connection_t          *c;
+    ngx_http_v2_out_frame_t   *out, *frame, *fn;
+    ngx_http_core_loc_conf_t  *clcf;
+
+    c = h2c->connection;
+
+    if (c->error) {
+        return NGX_ERROR;
+    }
+
+    wev = c->write;
+
+    if (!wev->ready) {
+        return NGX_OK;
+    }
+
+    cl = NULL;
+    out = NULL;
+
+    for (frame = h2c->last_out; frame; frame = fn) {
+        frame->last->next = cl;
+        cl = frame->first;
+
+        fn = frame->next;
+        frame->next = out;
+        out = frame;
+
+        ngx_log_debug4(NGX_LOG_DEBUG_HTTP, c->log, 0,
+                       "http2 frame out: %p sid:%ui bl:%d len:%uz",
+                       out, out->stream ? out->stream->node->id : 0,
+                       out->blocked, out->length);
+    }
+
+    cl = c->send_chain(c, cl, 0);
+
+    if (cl == NGX_CHAIN_ERROR) {
+        goto error;
+    }
+
+    clcf = ngx_http_get_module_loc_conf(h2c->http_connection->conf_ctx,
+                                        ngx_http_core_module);
+
+    if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) {
+        goto error;
+    }
+
+    if (c->tcp_nopush == NGX_TCP_NOPUSH_SET) {
+        if (ngx_tcp_push(c->fd) == -1) {
+            ngx_connection_error(c, ngx_socket_errno, ngx_tcp_push_n " failed");
+            goto error;
+        }
+
+        c->tcp_nopush = NGX_TCP_NOPUSH_UNSET;
+        tcp_nodelay = ngx_tcp_nodelay_and_tcp_nopush ? 1 : 0;
+
+    } else {
+        tcp_nodelay = 1;
+    }
+
+    if (tcp_nodelay
+        && clcf->tcp_nodelay
+        && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET)
+    {
+        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay");
+
+        if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,
+                       (const void *) &tcp_nodelay, sizeof(int))
+            == -1)
+        {
+#if (NGX_SOLARIS)
+            /* Solaris returns EINVAL if a socket has been shut down */
+            c->log_error = NGX_ERROR_IGNORE_EINVAL;
+#endif
+
+            ngx_connection_error(c, ngx_socket_errno,
+                                 "setsockopt(TCP_NODELAY) failed");
+
+            c->log_error = NGX_ERROR_INFO;
+            goto error;
+        }
+
+        c->tcp_nodelay = NGX_TCP_NODELAY_SET;
+    }
+
+    if (cl) {
+        ngx_add_timer(wev, clcf->send_timeout);
+
+    } else {
+        if (wev->timer_set) {
+            ngx_del_timer(wev);
+        }
+    }
+
+    for ( /* void */ ; out; out = fn) {
+        fn = out->next;
+
+        if (out->handler(h2c, out) != NGX_OK) {
+            out->blocked = 1;
+            break;
+        }
+
+        ngx_log_debug4(NGX_LOG_DEBUG_HTTP, c->log, 0,
+                       "http2 frame sent: %p sid:%ui bl:%d len:%uz",
+                       out, out->stream ? out->stream->node->id : 0,
+                       out->blocked, out->length);
+    }
+
+    frame = NULL;
+
+    for ( /* void */ ; out; out = fn) {
+        fn = out->next;
+        out->next = frame;
+        frame = out;
+    }
+
+    h2c->last_out = frame;
+
+    return NGX_OK;
+
+error:
+
+    c->error = 1;
+
+    if (!h2c->blocked) {
+        ngx_post_event(wev, &ngx_posted_events);
+    }
+
+    return NGX_ERROR;
+}
+
+
+static void
+ngx_http_v2_handle_connection(ngx_http_v2_connection_t *h2c)
+{
+    ngx_connection_t          *c;
+    ngx_http_v2_srv_conf_t  *h2scf;
+
+    if (h2c->last_out || h2c->processing) {
+        return;
+    }
+
+    c = h2c->connection;
+
+    if (c->error) {
+        ngx_http_close_connection(c);
+        return;
+    }
+
+    if (c->buffered) {
+        return;
+    }
+
+    h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx,
+                                         ngx_http_v2_module);
+    if (h2c->state.incomplete) {
+        ngx_add_timer(c->read, h2scf->recv_timeout);
+        return;
+    }
+
+    if (ngx_terminate || ngx_exiting) {
+        ngx_http_close_connection(c);
+        return;
+    }
+
+    ngx_destroy_pool(h2c->pool);
+
+    h2c->pool = NULL;
+    h2c->free_frames = NULL;
+    h2c->free_fake_connections = NULL;
+
+#if (NGX_HTTP_SSL)
+    if (c->ssl) {
+        ngx_ssl_free_buffer(c);
+    }
+#endif
+
+    c->destroyed = 1;
+    c->idle = 1;
+    ngx_reusable_connection(c, 1);
+
+    c->write->handler = ngx_http_empty_handler;
+    c->read->handler = ngx_http_v2_idle_handler;
+
+    if (c->write->timer_set) {
+        ngx_del_timer(c->write);
+    }
+
+    ngx_add_timer(c->read, h2scf->idle_timeout);
+}
+
+
+static u_char *
+ngx_http_v2_state_proxy_protocol(ngx_http_v2_connection_t *h2c, u_char *pos,
+    u_char *end)
+{
+    ngx_log_t  *log;
+
+    log = h2c->connection->log;
+    log->action = "reading PROXY protocol";
+
+    pos = ngx_proxy_protocol_read(h2c->connection, pos, end);
+
+    log->action = "processing HTTP/2 connection";
+
+    if (pos == NULL) {
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);
+    }
+
+    return ngx_http_v2_state_preface(h2c, pos, end);
+}
+
+
+static u_char *
+ngx_http_v2_state_preface(ngx_http_v2_connection_t *h2c, u_char *pos,
+    u_char *end)
+{
+    static const u_char preface[] = "PRI * HTTP/2.0\r\n";
+
+    if ((size_t) (end - pos) < sizeof(preface) - 1) {
+        return ngx_http_v2_state_save(h2c, pos, end, ngx_http_v2_state_preface);
+    }
+
+    if (ngx_memcmp(pos, preface, sizeof(preface) - 1) != 0) {
+        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                       "invalid http2 connection preface \"%*s\"",
+                       sizeof(preface) - 1, pos);
+
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);
+    }
+
+    return ngx_http_v2_state_preface_end(h2c, pos + sizeof(preface) - 1, end);
+}
+
+
+static u_char *
+ngx_http_v2_state_preface_end(ngx_http_v2_connection_t *h2c, u_char *pos,
+    u_char *end)
+{
+    static const u_char preface[] = "\r\nSM\r\n\r\n";
+
+    if ((size_t) (end - pos) < sizeof(preface) - 1) {
+        return ngx_http_v2_state_save(h2c, pos, end,
+                                      ngx_http_v2_state_preface_end);
+    }
+
+    if (ngx_memcmp(pos, preface, sizeof(preface) - 1) != 0) {
+        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                       "invalid http2 connection preface \"%*s\"",
+                       sizeof(preface) - 1, pos);
+
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);
+    }
+
+    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                   "http2 preface verified");
+
+    return ngx_http_v2_state_head(h2c, pos + sizeof(preface) - 1, end);
+}
+
+
+static u_char *
+ngx_http_v2_state_head(ngx_http_v2_connection_t *h2c, u_char *pos, u_char *end)
+{
+    uint32_t    head;
+    ngx_uint_t  type;
+
+    if (end - pos < NGX_HTTP_V2_FRAME_HEADER_SIZE) {
+        return ngx_http_v2_state_save(h2c, pos, end, ngx_http_v2_state_head);
+    }
+
+    head = ngx_http_v2_parse_uint32(pos);
+
+    h2c->state.length = ngx_http_v2_parse_length(head);
+    h2c->state.flags = pos[4];
+
+    h2c->state.sid = ngx_http_v2_parse_sid(&pos[5]);
+
+    pos += NGX_HTTP_V2_FRAME_HEADER_SIZE;
+
+    type = ngx_http_v2_parse_type(head);
+
+    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                   "process http2 frame type:%ui f:%Xd l:%uz sid:%ui",
+                   type, h2c->state.flags, h2c->state.length, h2c->state.sid);
+
+    if (type >= NGX_HTTP_V2_FRAME_STATES) {
+        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                       "http2 frame with unknown type %ui", type);
+        return ngx_http_v2_state_skip(h2c, pos, end);
+    }
+
+    return ngx_http_v2_frame_states[type](h2c, pos, end);
+}
+
+
+static u_char *
+ngx_http_v2_state_data(ngx_http_v2_connection_t *h2c, u_char *pos, u_char *end)
+{
+    ngx_http_v2_node_t    *node;
+    ngx_http_v2_stream_t  *stream;
+
+    if (h2c->state.flags & NGX_HTTP_V2_PADDED_FLAG) {
+
+        if (h2c->state.length == 0) {
+            ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                          "client sent padded DATA frame "
+                          "with incorrect length: %uz",
+                          h2c->state.length);
+
+            return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);
+        }
+
+        if (end - pos == 0) {
+            return ngx_http_v2_state_save(h2c, pos, end,
+                                          ngx_http_v2_state_data);
+        }
+
+        h2c->state.padding = *pos++;
+        h2c->state.length--;
+
+        if (h2c->state.padding > h2c->state.length) {
+            ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                          "client sent padded DATA frame "
+                          "with incorrect length: %uz, padding: %uz",
+                          h2c->state.length, h2c->state.padding);
+
+            return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);
+        }
+
+        h2c->state.length -= h2c->state.padding;
+    }
+
+    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                   "http2 DATA frame");
+
+    if (h2c->state.length > h2c->recv_window) {
+        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                      "client violated connection flow control: "
+                      "received DATA frame length %uz, available window %uz",
+                      h2c->state.length, h2c->recv_window);
+
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_FLOW_CTRL_ERROR);
+    }
+
+    h2c->recv_window -= h2c->state.length;
+
+    if (h2c->recv_window < NGX_HTTP_V2_MAX_WINDOW / 4) {
+
+        if (ngx_http_v2_send_window_update(h2c, 0, NGX_HTTP_V2_MAX_WINDOW
+                                                   - h2c->recv_window)
+            == NGX_ERROR)
+        {
+            return ngx_http_v2_connection_error(h2c,
+                                                NGX_HTTP_V2_INTERNAL_ERROR);
+        }
+
+        h2c->recv_window = NGX_HTTP_V2_MAX_WINDOW;
+    }
+
+    node = ngx_http_v2_get_node_by_id(h2c, h2c->state.sid, 0);
+
+    if (node == NULL || node->stream == NULL) {
+        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                       "unknown http2 stream");
+
+        return ngx_http_v2_state_skip_padded(h2c, pos, end);
+    }
+
+    stream = node->stream;
+
+    if (h2c->state.length > stream->recv_window) {
+        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                      "client violated flow control for stream %ui: "
+                      "received DATA frame length %uz, available window %uz",
+                      node->id, h2c->state.length, stream->recv_window);
+
+        if (ngx_http_v2_terminate_stream(h2c, stream,
+                                         NGX_HTTP_V2_FLOW_CTRL_ERROR)
+            == NGX_ERROR)
+        {
+            return ngx_http_v2_connection_error(h2c,
+                                                NGX_HTTP_V2_INTERNAL_ERROR);
+        }
+
+        return ngx_http_v2_state_skip_padded(h2c, pos, end);
+    }
+
+    stream->recv_window -= h2c->state.length;
+
+    if (stream->recv_window < NGX_HTTP_V2_MAX_WINDOW / 4) {
+
+        if (ngx_http_v2_send_window_update(h2c, node->id,
+                                           NGX_HTTP_V2_MAX_WINDOW
+                                           - stream->recv_window)
+            == NGX_ERROR)
+        {
+            return ngx_http_v2_connection_error(h2c,
+                                                NGX_HTTP_V2_INTERNAL_ERROR);
+        }
+
+        stream->recv_window = NGX_HTTP_V2_MAX_WINDOW;
+    }
+
+    if (stream->in_closed) {
+        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                      "client sent DATA frame for half-closed stream %ui",
+                      node->id);
+
+        if (ngx_http_v2_terminate_stream(h2c, stream,
+                                         NGX_HTTP_V2_STREAM_CLOSED)
+            == NGX_ERROR)
+        {
+            return ngx_http_v2_connection_error(h2c,
+                                                NGX_HTTP_V2_INTERNAL_ERROR);
+        }
+
+        return ngx_http_v2_state_skip_padded(h2c, pos, end);
+    }
+
+    h2c->state.stream = stream;
+
+    return ngx_http_v2_state_read_data(h2c, pos, end);
+}
+
+
+static u_char *
+ngx_http_v2_state_read_data(ngx_http_v2_connection_t *h2c, u_char *pos,
+    u_char *end)
+{
+    size_t                     size;
+    ssize_t                    n;
+    ngx_buf_t                 *buf;
+    ngx_int_t                  rc;
+    ngx_temp_file_t           *tf;
+    ngx_http_request_t        *r;
+    ngx_http_v2_stream_t      *stream;
+    ngx_http_request_body_t   *rb;
+    ngx_http_core_loc_conf_t  *clcf;
+
+    stream = h2c->state.stream;
+
+    if (stream == NULL) {
+        return ngx_http_v2_state_skip_padded(h2c, pos, end);
+    }
+
+    if (stream->skip_data) {
+        stream->in_closed = h2c->state.flags & NGX_HTTP_V2_END_STREAM_FLAG;
+
+        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                       "skipping http2 DATA frame, reason: %d",
+                       stream->skip_data);
+
+        return ngx_http_v2_state_skip_padded(h2c, pos, end);
+    }
+
+    size = end - pos;
+
+    if (size > h2c->state.length) {
+        size = h2c->state.length;
+    }
+
+    r = stream->request;
+
+    if (r->request_body == NULL
+        && ngx_http_v2_init_request_body(r) != NGX_OK)
+    {
+        stream->skip_data = NGX_HTTP_V2_DATA_INTERNAL_ERROR;
+        return ngx_http_v2_state_skip_padded(h2c, pos, end);
+    }
+
+    rb = r->request_body;
+    tf = rb->temp_file;
+    buf = rb->buf;
+
+    if (size) {
+        rb->rest += size;
+
+        if (r->headers_in.content_length_n != -1
+            && r->headers_in.content_length_n < rb->rest)
+        {
+            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
+                          "client intended to send body data "
+                          "larger than declared");
+
+            stream->skip_data = NGX_HTTP_V2_DATA_ERROR;
+            goto error;
+
+        } else {
+            clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
+
+            if (clcf->client_max_body_size
+                && clcf->client_max_body_size < rb->rest)
+            {
+                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
+                              "client intended to send "
+                              "too large chunked body: %O bytes", rb->rest);
+
+                stream->skip_data = NGX_HTTP_V2_DATA_ERROR;
+                goto error;
+            }
+        }
+
+        h2c->state.length -= size;
+
+        if (tf) {
+            buf->start = pos;
+            buf->pos = pos;
+
+            pos += size;
+
+            buf->end = pos;
+            buf->last = pos;
+
+            n = ngx_write_chain_to_temp_file(tf, rb->bufs);
+
+            /* TODO: n == 0 or not complete and level event */
+
+            if (n == NGX_ERROR) {
+                stream->skip_data = NGX_HTTP_V2_DATA_INTERNAL_ERROR;
+                goto error;
+            }
+
+            tf->offset += n;
+
+        } else {
+            buf->last = ngx_cpymem(buf->last, pos, size);
+            pos += size;
+        }
+
+        r->request_length += size;
+    }
+
+    if (h2c->state.length) {
+        return ngx_http_v2_state_save(h2c, pos, end,
+                                      ngx_http_v2_state_read_data);
+    }
+
+    if (h2c->state.flags & NGX_HTTP_V2_END_STREAM_FLAG) {
+        stream->in_closed = 1;
+
+        if (r->headers_in.content_length_n < 0) {
+            r->headers_in.content_length_n = rb->rest;
+
+        } else if (r->headers_in.content_length_n != rb->rest) {
+            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
+                          "client prematurely closed stream: "
+                          "only %O out of %O bytes of request body received",
+                          rb->rest, r->headers_in.content_length_n);
+
+            stream->skip_data = NGX_HTTP_V2_DATA_ERROR;
+            goto error;
+        }
+
+        if (tf) {
+            ngx_memzero(buf, sizeof(ngx_buf_t));
+
+            buf->in_file = 1;
+            buf->file_last = tf->file.offset;
+            buf->file = &tf->file;
+
+            rb->buf = NULL;
+        }
+
+        if (rb->post_handler) {
+            r->read_event_handler = ngx_http_block_reading;
+            rb->post_handler(r);
+        }
+    }
+
+    if (h2c->state.padding) {
+        return ngx_http_v2_state_skip_padded(h2c, pos, end);
+    }
+
+    return ngx_http_v2_state_complete(h2c, pos, end);
+
+error:
+
+    if (rb->post_handler) {
+
+        if (stream->skip_data == NGX_HTTP_V2_DATA_ERROR) {
+            rc = (r->headers_in.content_length_n == -1)
+                 ? NGX_HTTP_REQUEST_ENTITY_TOO_LARGE : NGX_HTTP_BAD_REQUEST;
+
+        } else {
+            rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
+        }
+
+        ngx_http_finalize_request(r, rc);
+    }
+
+    return ngx_http_v2_state_skip_padded(h2c, pos, end);
+}
+
+
+static u_char *
+ngx_http_v2_state_headers(ngx_http_v2_connection_t *h2c, u_char *pos,
+    u_char *end)
+{
+    size_t                   size;
+    ngx_uint_t               padded, priority, depend, dependency, excl, weight;
+    ngx_http_v2_node_t      *node;
+    ngx_http_v2_stream_t    *stream;
+    ngx_http_v2_srv_conf_t  *h2scf;
+
+    padded = h2c->state.flags & NGX_HTTP_V2_PADDED_FLAG;
+    priority = h2c->state.flags & NGX_HTTP_V2_PRIORITY_FLAG;
+
+    size = 0;
+
+    if (padded) {
+        size++;
+    }
+
+    if (priority) {
+        size += sizeof(uint32_t) + 1;
+    }
+
+    if (h2c->state.length < size) {
+        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                      "client sent HEADERS frame with incorrect length %uz",
+                      h2c->state.length);
+
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);
+    }
+
+    if (h2c->state.length == size) {
+        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                      "client sent HEADERS frame with empty header block");
+
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);
+    }
+
+    if ((size_t) (end - pos) < size) {
+        return ngx_http_v2_state_save(h2c, pos, end,
+                                      ngx_http_v2_state_headers);
+    }
+
+    h2c->state.length -= size;
+
+    if (padded) {
+        h2c->state.padding = *pos++;
+
+        if (h2c->state.padding > h2c->state.length) {
+            ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                          "client sent padded HEADERS frame "
+                          "with incorrect length: %uz, padding: %uz",
+                          h2c->state.length, h2c->state.padding);
+
+            return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);
+        }
+
+        h2c->state.length -= h2c->state.padding;
+    }
+
+    depend = 0;
+    excl = 0;
+    weight = 16;
+
+    if (priority) {
+        dependency = ngx_http_v2_parse_uint32(pos);
+
+        depend = dependency & 0x7fffffff;
+        excl = dependency >> 31;
+        weight = pos[4] + 1;
+
+        pos += sizeof(uint32_t) + 1;
+    }
+
+    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                   "http2 HEADERS frame sid:%ui on %ui excl:%ui weight:%ui",
+                   h2c->state.sid, depend, excl, weight);
+
+    if (h2c->state.sid % 2 == 0 || h2c->state.sid <= h2c->last_sid) {
+        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                      "client sent HEADERS frame with incorrect identifier "
+                      "%ui, the last was %ui", h2c->state.sid, h2c->last_sid);
+
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);
+    }
+
+    h2c->last_sid = h2c->state.sid;
+
+    h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx,
+                                         ngx_http_v2_module);
+
+    h2c->state.header_limit = h2scf->max_header_size;
+
+    if (h2c->processing >= h2scf->concurrent_streams) {
+        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                      "concurrent streams exceeded %ui", h2c->processing);
+
+        if (ngx_http_v2_send_rst_stream(h2c, h2c->state.sid,
+                                        NGX_HTTP_V2_REFUSED_STREAM)
+            != NGX_OK)
+        {
+            return ngx_http_v2_connection_error(h2c,
+                                                NGX_HTTP_V2_INTERNAL_ERROR);
+        }
+
+        return ngx_http_v2_state_skip_headers(h2c, pos, end);
+    }
+
+    node = ngx_http_v2_get_node_by_id(h2c, h2c->state.sid, 1);
+
+    if (node == NULL) {
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);
+    }
+
+    if (node->parent) {
+        ngx_queue_remove(&node->reuse);
+        h2c->closed_nodes--;
+    }
+
+    stream = ngx_http_v2_create_stream(h2c);
+    if (stream == NULL) {
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);
+    }
+
+    stream->in_closed = h2c->state.flags & NGX_HTTP_V2_END_STREAM_FLAG;
+    stream->node = node;
+
+    node->stream = stream;
+
+    h2c->state.stream = stream;
+    h2c->state.pool = stream->request->pool;
+
+    if (priority || node->parent == NULL) {
+        node->weight = weight;
+        ngx_http_v2_set_dependency(h2c, node, depend, excl);
+    }
+
+    return ngx_http_v2_state_header_block(h2c, pos, end);
+}
+
+
+static u_char *
+ngx_http_v2_state_header_block(ngx_http_v2_connection_t *h2c, u_char *pos,
+    u_char *end)
+{
+    u_char                   ch;
+    ngx_int_t                value;
+    ngx_uint_t               indexed, size_update, prefix;
+    ngx_http_v2_srv_conf_t  *h2scf;
+
+    if (end - pos < 1) {
+        return ngx_http_v2_state_save(h2c, pos, end,
+                                      ngx_http_v2_state_header_block);
+    }
+
+    if (!(h2c->state.flags & NGX_HTTP_V2_END_HEADERS_FLAG)
+        && h2c->state.length < NGX_HTTP_V2_INT_OCTETS)
+    {
+        return ngx_http_v2_handle_continuation(h2c, pos, end,
+                                               ngx_http_v2_state_header_block);
+    }
+
+    size_update = 0;
+    indexed = 0;
+
+    ch = *pos;
+
+    if (ch >= (1 << 7)) {
+        /* indexed header field */
+        indexed = 1;
+        prefix = ngx_http_v2_prefix(7);
+
+    } else if (ch >= (1 << 6)) {
+        /* literal header field with incremental indexing */
+        h2c->state.index = 1;
+        prefix = ngx_http_v2_prefix(6);
+
+    } else if (ch >= (1 << 5)) {
+        /* dynamic table size update */
+        size_update = 1;
+        prefix = ngx_http_v2_prefix(5);
+
+    } else if (ch >= (1 << 4)) {
+        /* literal header field never indexed */
+        prefix = ngx_http_v2_prefix(4);
+
+    } else {
+        /* literal header field without indexing */
+        prefix = ngx_http_v2_prefix(3);
+    }
+
+    value = ngx_http_v2_parse_int(h2c, &pos, end, prefix);
+
+    if (value < 0) {
+        if (value == NGX_AGAIN) {
+            return ngx_http_v2_state_save(h2c, pos, end,
+                                          ngx_http_v2_state_header_block);
+        }
+
+        if (value == NGX_DECLINED) {
+            ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                          "client sent header block with too long %s value",
+                          size_update ? "size update" : "header index");
+
+            return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_COMP_ERROR);
+        }
+
+        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                      "client sent header block with incorrect length");
+
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);
+    }
+
+    if (indexed) {
+        if (ngx_http_v2_get_indexed_header(h2c, value, 0) != NGX_OK) {
+            return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_COMP_ERROR);
+        }
+
+        return ngx_http_v2_state_process_header(h2c, pos, end);
+    }
+
+    if (size_update) {
+        if (ngx_http_v2_table_size(h2c, value) != NGX_OK) {
+            return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_COMP_ERROR);
+        }
+
+        return ngx_http_v2_state_header_complete(h2c, pos, end);
+    }
+
+    h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx,
+                                         ngx_http_v2_module);
+
+    h2c->state.field_limit = h2scf->max_field_size;
+
+    if (value == 0) {
+        h2c->state.parse_name = 1;
+
+    } else {
+        if (ngx_http_v2_get_indexed_header(h2c, value, 1) != NGX_OK) {
+            return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_COMP_ERROR);
+        }
+
+        h2c->state.field_limit -= h2c->state.header.name.len;
+    }
+
+    h2c->state.parse_value = 1;
+
+    return ngx_http_v2_state_field_len(h2c, pos, end);
+}
+
+
+static u_char *
+ngx_http_v2_state_field_len(ngx_http_v2_connection_t *h2c, u_char *pos,
+    u_char *end)
+{
+    size_t      alloc;
+    ngx_int_t   len;
+    ngx_uint_t  huff;
+
+    if (!(h2c->state.flags & NGX_HTTP_V2_END_HEADERS_FLAG)
+        && h2c->state.length < NGX_HTTP_V2_INT_OCTETS)
+    {
+        return ngx_http_v2_handle_continuation(h2c, pos, end,
+                                               ngx_http_v2_state_field_len);
+    }
+
+    if (h2c->state.length < 1) {
+        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                      "client sent header block with incorrect length");
+
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);
+    }
+
+    if (end - pos < 1) {
+        return ngx_http_v2_state_save(h2c, pos, end,
+                                      ngx_http_v2_state_field_len);
+    }
+
+    huff = *pos >> 7;
+    len = ngx_http_v2_parse_int(h2c, &pos, end, ngx_http_v2_prefix(7));
+
+    if (len < 0) {
+        if (len == NGX_AGAIN) {
+            return ngx_http_v2_state_save(h2c, pos, end,
+                                          ngx_http_v2_state_field_len);
+        }
+
+        if (len == NGX_DECLINED) {
+            ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                        "client sent header field with too long length value");
+
+            return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_COMP_ERROR);
+        }
+
+        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                      "client sent header block with incorrect length");
+
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);
+    }
+
+    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                   "http2 hpack %s string length: %i",
+                   huff ? "encoded" : "raw", len);
+
+    if ((size_t) len > h2c->state.field_limit) {
+        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                      "client exceeded http2_max_field_size limit");
+
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_ENHANCE_YOUR_CALM);
+    }
+
+    h2c->state.field_limit -= len;
+    h2c->state.field_rest = len;
+
+    if (h2c->state.stream == NULL && !h2c->state.index) {
+        return ngx_http_v2_state_field_skip(h2c, pos, end);
+    }
+
+    alloc = (huff ? len * 8 / 5 : len) + 1;
+
+    h2c->state.field_start = ngx_pnalloc(h2c->state.pool, alloc);
+    if (h2c->state.field_start == NULL) {
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);
+    }
+
+    h2c->state.field_end = h2c->state.field_start;
+
+    if (huff) {
+        return ngx_http_v2_state_field_huff(h2c, pos, end);
+    }
+
+    return ngx_http_v2_state_field_raw(h2c, pos, end);
+}
+
+
+static u_char *
+ngx_http_v2_state_field_huff(ngx_http_v2_connection_t *h2c, u_char *pos,
+    u_char *end)
+{
+    size_t  size;
+
+    size = end - pos;
+
+    if (size > h2c->state.field_rest) {
+        size = h2c->state.field_rest;
+    }
+
+    if (size > h2c->state.length) {
+        size = h2c->state.length;
+    }
+
+    h2c->state.length -= size;
+    h2c->state.field_rest -= size;
+
+    if (ngx_http_v2_huff_decode(&h2c->state.field_state, pos, size,
+                                &h2c->state.field_end,
+                                h2c->state.field_rest == 0,
+                                h2c->connection->log)
+        != NGX_OK)
+    {
+        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                      "client sent invalid encoded header field");
+
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_COMP_ERROR);
+    }
+
+    pos += size;
+
+    if (h2c->state.field_rest == 0) {
+        *h2c->state.field_end = '\0';
+        return ngx_http_v2_state_process_header(h2c, pos, end);
+    }
+
+    if (h2c->state.length) {
+        return ngx_http_v2_state_save(h2c, pos, end,
+                                      ngx_http_v2_state_field_huff);
+    }
+
+    if (h2c->state.flags & NGX_HTTP_V2_END_HEADERS_FLAG) {
+        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                      "client sent header field with incorrect length");
+
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);
+    }
+
+    return ngx_http_v2_handle_continuation(h2c, pos, end,
+                                           ngx_http_v2_state_field_huff);
+}
+
+
+static u_char *
+ngx_http_v2_state_field_raw(ngx_http_v2_connection_t *h2c, u_char *pos,
+    u_char *end)
+{
+    size_t  size;
+
+    size = end - pos;
+
+    if (size > h2c->state.field_rest) {
+        size = h2c->state.field_rest;
+    }
+
+    if (size > h2c->state.length) {
+        size = h2c->state.length;
+    }
+
+    h2c->state.length -= size;
+    h2c->state.field_rest -= size;
+
+    h2c->state.field_end = ngx_cpymem(h2c->state.field_end, pos, size);
+
+    pos += size;
+
+    if (h2c->state.field_rest == 0) {
+        *h2c->state.field_end = '\0';
+        return ngx_http_v2_state_process_header(h2c, pos, end);
+    }
+
+    if (h2c->state.length) {
+        return ngx_http_v2_state_save(h2c, pos, end,
+                                      ngx_http_v2_state_field_raw);
+    }
+
+    if (h2c->state.flags & NGX_HTTP_V2_END_HEADERS_FLAG) {
+        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                      "client sent header field with incorrect length");
+
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);
+    }
+
+    return ngx_http_v2_handle_continuation(h2c, pos, end,
+                                           ngx_http_v2_state_field_raw);
+}
+
+
+static u_char *
+ngx_http_v2_state_field_skip(ngx_http_v2_connection_t *h2c, u_char *pos,
+    u_char *end)
+{
+    size_t  size;
+
+    size = end - pos;
+
+    if (size > h2c->state.field_rest) {
+        size = h2c->state.field_rest;
+    }
+
+    if (size > h2c->state.length) {
+        size = h2c->state.length;
+    }
+
+    h2c->state.length -= size;
+    h2c->state.field_rest -= size;
+
+    pos += size;
+
+    if (h2c->state.field_rest == 0) {
+        return ngx_http_v2_state_process_header(h2c, pos, end);
+    }
+
+    if (h2c->state.length) {
+        return ngx_http_v2_state_save(h2c, pos, end,
+                                      ngx_http_v2_state_field_skip);
+    }
+
+    if (h2c->state.flags & NGX_HTTP_V2_END_HEADERS_FLAG) {
+        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                      "client sent header field with incorrect length");
+
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);
+    }
+
+    return ngx_http_v2_handle_continuation(h2c, pos, end,
+                                           ngx_http_v2_state_field_skip);
+}
+
+
+static u_char *
+ngx_http_v2_state_process_header(ngx_http_v2_connection_t *h2c, u_char *pos,
+    u_char *end)
+{
+    size_t                      len;
+    ngx_int_t                   rc;
+    ngx_table_elt_t            *h;
+    ngx_http_header_t          *hh;
+    ngx_http_request_t         *r;
+    ngx_http_v2_header_t       *header;
+    ngx_http_core_srv_conf_t   *cscf;
+    ngx_http_core_main_conf_t  *cmcf;
+
+    static ngx_str_t cookie = ngx_string("cookie");
+
+    header = &h2c->state.header;
+
+    if (h2c->state.parse_name) {
+        h2c->state.parse_name = 0;
+
+        header->name.len = h2c->state.field_end - h2c->state.field_start;
+        header->name.data = h2c->state.field_start;
+
+        return ngx_http_v2_state_field_len(h2c, pos, end);
+    }
+
+    if (h2c->state.parse_value) {
+        h2c->state.parse_value = 0;
+
+        header->value.len = h2c->state.field_end - h2c->state.field_start;
+        header->value.data = h2c->state.field_start;
+    }
+
+    len = header->name.len + header->value.len;
+
+    if (len > h2c->state.header_limit) {
+        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                      "client exceeded http2_max_header_size limit");
+
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_ENHANCE_YOUR_CALM);
+    }
+
+    h2c->state.header_limit -= len;
+
+    if (h2c->state.index) {
+        if (ngx_http_v2_add_header(h2c, header) != NGX_OK) {
+            return ngx_http_v2_connection_error(h2c,
+                                                NGX_HTTP_V2_INTERNAL_ERROR);
+        }
+
+        h2c->state.index = 0;
+    }
+
+    if (h2c->state.stream == NULL) {
+        return ngx_http_v2_state_header_complete(h2c, pos, end);
+    }
+
+    r = h2c->state.stream->request;
+
+    /* TODO Optimization: validate headers while parsing. */
+    if (ngx_http_v2_validate_header(r, header) != NGX_OK) {
+        if (ngx_http_v2_terminate_stream(h2c, h2c->state.stream,
+                                         NGX_HTTP_V2_PROTOCOL_ERROR)
+            == NGX_ERROR)
+        {
+            return ngx_http_v2_connection_error(h2c,
+                                                NGX_HTTP_V2_INTERNAL_ERROR);
+        }
+
+        goto error;
+    }
+
+    if (header->name.data[0] == ':') {
+        rc = ngx_http_v2_pseudo_header(r, header);
+
+        if (rc == NGX_OK) {
+            return ngx_http_v2_state_header_complete(h2c, pos, end);
+        }
+
+        if (rc == NGX_ABORT) {
+            goto error;
+        }
+
+        if (rc == NGX_DECLINED) {
+            if (ngx_http_v2_terminate_stream(h2c, h2c->state.stream,
+                                             NGX_HTTP_V2_PROTOCOL_ERROR)
+                == NGX_ERROR)
+            {
+                return ngx_http_v2_connection_error(h2c,
+                                                    NGX_HTTP_V2_INTERNAL_ERROR);
+            }
+
+            goto error;
+        }
+
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);
+    }
+
+    if (r->invalid_header) {
+        cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);
+
+        if (cscf->ignore_invalid_headers) {
+            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
+                          "client sent invalid header: \"%V\"", &header->name);
+
+            return ngx_http_v2_state_header_complete(h2c, pos, end);
+        }
+    }
+
+    if (header->name.len == cookie.len
+        && ngx_memcmp(header->name.data, cookie.data, cookie.len) == 0)
+    {
+        if (ngx_http_v2_cookie(r, header) != NGX_OK) {
+            return ngx_http_v2_connection_error(h2c,
+                                                NGX_HTTP_V2_INTERNAL_ERROR);
+        }
+
+        return ngx_http_v2_state_header_complete(h2c, pos, end);
+    }
+
+    h = ngx_list_push(&r->headers_in.headers);
+    if (h == NULL) {
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);
+    }
+
+    h->key.len = header->name.len;
+    h->key.data = header->name.data;
+
+    /* TODO Optimization: precalculate hash and hadnler for indexed headers. */
+    h->hash = ngx_hash_key(h->key.data, h->key.len);
+
+    h->value.len = header->value.len;
+    h->value.data = header->value.data;
+
+    h->lowcase_key = h->key.data;
+
+    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);
+
+    hh = ngx_hash_find(&cmcf->headers_in_hash, h->hash,
+                       h->lowcase_key, h->key.len);
+
+    if (hh && hh->handler(r, h, hh->offset) != NGX_OK) {
+        goto error;
+    }
+
+    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+                   "http2 http header: \"%V: %V\"", &h->key, &h->value);
+
+    return ngx_http_v2_state_header_complete(h2c, pos, end);
+
+error:
+
+    h2c->state.stream = NULL;
+    h2c->state.pool = NULL;
+
+    return ngx_http_v2_state_header_complete(h2c, pos, end);
+}
+
+
+static u_char *
+ngx_http_v2_state_header_complete(ngx_http_v2_connection_t *h2c, u_char *pos,
+    u_char *end)
+{
+    ngx_http_v2_stream_t  *stream;
+
+    if (h2c->state.length) {
+        h2c->state.handler = h2c->state.pool ? ngx_http_v2_state_header_block
+                                             : ngx_http_v2_state_skip_headers;
+        return pos;
+    }
+
+    if (!(h2c->state.flags & NGX_HTTP_V2_END_HEADERS_FLAG)) {
+        return ngx_http_v2_handle_continuation(h2c, pos, end,
+                                             ngx_http_v2_state_header_complete);
+    }
+
+    stream = h2c->state.stream;
+
+    if (stream) {
+        ngx_http_v2_run_request(stream->request);
+
+    } else if (h2c->state.pool) {
+        ngx_destroy_pool(h2c->state.pool);
+    }
+
+    h2c->state.pool = NULL;
+
+    if (h2c->state.padding) {
+        return ngx_http_v2_state_skip_padded(h2c, pos, end);
+    }
+
+    return ngx_http_v2_state_complete(h2c, pos, end);
+}
+
+
+static u_char *
+ngx_http_v2_handle_continuation(ngx_http_v2_connection_t *h2c, u_char *pos,
+    u_char *end, ngx_http_v2_handler_pt handler)
+{
+    u_char    *p;
+    size_t     len;
+    uint32_t   head;
+
+    len = h2c->state.length;
+
+    if ((size_t) (end - pos) < len + NGX_HTTP_V2_FRAME_HEADER_SIZE) {
+        return ngx_http_v2_state_save(h2c, pos, end, handler);
+    }
+
+    p = pos + len;
+
+    head = ngx_http_v2_parse_uint32(p);
+
+    if (ngx_http_v2_parse_type(head) != NGX_HTTP_V2_CONTINUATION_FRAME) {
+        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+             "client sent inappropriate frame while CONTINUATION was expected");
+
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);
+    }
+
+    h2c->state.length += ngx_http_v2_parse_length(head);
+    h2c->state.flags |= p[4];
+
+    if (h2c->state.sid != ngx_http_v2_parse_sid(&p[5])) {
+        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                    "client sent CONTINUATION frame with incorrect identifier");
+
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);
+    }
+
+    p = pos;
+    pos += NGX_HTTP_V2_FRAME_HEADER_SIZE;
+
+    ngx_memcpy(pos, p, len);
+
+    h2c->state.handler = handler;
+    return pos;
+}
+
+
+static u_char *
+ngx_http_v2_state_priority(ngx_http_v2_connection_t *h2c, u_char *pos,
+    u_char *end)
+{
+    ngx_uint_t           depend, dependency, excl, weight;
+    ngx_http_v2_node_t  *node;
+
+    if (h2c->state.length != NGX_HTTP_V2_PRIORITY_SIZE) {
+        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                      "client sent PRIORITY frame with incorrect length %uz",
+                      h2c->state.length);
+
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);
+    }
+
+    if (end - pos < NGX_HTTP_V2_PRIORITY_SIZE) {
+        return ngx_http_v2_state_save(h2c, pos, end,
+                                      ngx_http_v2_state_priority);
+    }
+
+    dependency = ngx_http_v2_parse_uint32(pos);
+
+    depend = dependency & 0x7fffffff;
+    excl = dependency >> 31;
+    weight = pos[4] + 1;
+
+    pos += NGX_HTTP_V2_PRIORITY_SIZE;
+
+    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                   "http2 PRIORITY frame sid:%ui on %ui excl:%ui weight:%ui",
+                   h2c->state.sid, depend, excl, weight);
+
+    if (h2c->state.sid == 0) {
+        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                      "client sent PRIORITY frame with incorrect identifier");
+
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);
+    }
+
+    if (depend == h2c->state.sid) {
+        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                      "client sent PRIORITY frame for stream %ui "
+                      "with incorrect dependancy", h2c->state.sid);
+
+        node = ngx_http_v2_get_node_by_id(h2c, h2c->state.sid, 0);
+
+        if (node && node->stream) {
+            if (ngx_http_v2_terminate_stream(h2c, node->stream,
+                                             NGX_HTTP_V2_PROTOCOL_ERROR)
+                == NGX_ERROR)
+            {
+                return ngx_http_v2_connection_error(h2c,
+                                                    NGX_HTTP_V2_INTERNAL_ERROR);
+            }
+
+        } else {
+            if (ngx_http_v2_send_rst_stream(h2c, h2c->state.sid,
+                                            NGX_HTTP_V2_PROTOCOL_ERROR)
+                == NGX_ERROR)
+            {
+                return ngx_http_v2_connection_error(h2c,
+                                                    NGX_HTTP_V2_INTERNAL_ERROR);
+            }
+        }
+
+        return ngx_http_v2_state_complete(h2c, pos, end);
+    }
+
+    node = ngx_http_v2_get_node_by_id(h2c, h2c->state.sid, 1);
+
+    if (node == NULL) {
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);
+    }
+
+    node->weight = weight;
+
+    if (node->stream == NULL) {
+        if (node->parent == NULL) {
+            h2c->closed_nodes++;
+
+        } else {
+            ngx_queue_remove(&node->reuse);
+        }
+
+        ngx_queue_insert_tail(&h2c->closed, &node->reuse);
+    }
+
+    ngx_http_v2_set_dependency(h2c, node, depend, excl);
+
+    return ngx_http_v2_state_complete(h2c, pos, end);
+}
+
+
+static u_char *
+ngx_http_v2_state_rst_stream(ngx_http_v2_connection_t *h2c, u_char *pos,
+    u_char *end)
+{
+    ngx_uint_t             status;
+    ngx_event_t           *ev;
+    ngx_connection_t      *fc;
+    ngx_http_v2_node_t    *node;
+    ngx_http_v2_stream_t  *stream;
+
+    if (h2c->state.length != NGX_HTTP_V2_RST_STREAM_SIZE) {
+        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                      "client sent RST_STREAM frame with incorrect length %uz",
+                      h2c->state.length);
+
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);
+    }
+
+    if (end - pos < NGX_HTTP_V2_RST_STREAM_SIZE) {
+        return ngx_http_v2_state_save(h2c, pos, end,
+                                      ngx_http_v2_state_rst_stream);
+    }
+
+    status = ngx_http_v2_parse_uint32(pos);
+
+    pos += NGX_HTTP_V2_RST_STREAM_SIZE;
+
+    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                   "http2 RST_STREAM frame, sid:%ui status:%ui",
+                   h2c->state.sid, status);
+
+    if (h2c->state.sid == 0) {
+        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                      "client sent RST_STREAM frame with incorrect identifier");
+
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);
+    }
+
+    node = ngx_http_v2_get_node_by_id(h2c, h2c->state.sid, 0);
+
+    if (node == NULL || node->stream == NULL) {
+        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                        "unknown http2 stream");
+
+        return ngx_http_v2_state_complete(h2c, pos, end);
+    }
+
+    stream = node->stream;
+
+    stream->in_closed = 1;
+    stream->out_closed = 1;
+
+    fc = stream->request->connection;
+    fc->error = 1;
+
+    switch (status) {
+
+    case NGX_HTTP_V2_CANCEL:
+        ngx_log_error(NGX_LOG_INFO, fc->log, 0,
+                      "client canceled stream %ui", h2c->state.sid);
+        break;
+
+    case NGX_HTTP_V2_INTERNAL_ERROR:
+        ngx_log_error(NGX_LOG_INFO, fc->log, 0,
+                      "client terminated stream %ui due to internal error",
+                      h2c->state.sid);
+        break;
+
+    default:
+        ngx_log_error(NGX_LOG_INFO, fc->log, 0,
+                      "client terminated stream %ui with status %ui",
+                      h2c->state.sid, status);
+        break;
+    }
+
+    ev = fc->read;
+    ev->handler(ev);
+
+    return ngx_http_v2_state_complete(h2c, pos, end);
+}
+
+
+static u_char *
+ngx_http_v2_state_settings(ngx_http_v2_connection_t *h2c, u_char *pos,
+    u_char *end)
+{
+    if (h2c->state.flags == NGX_HTTP_V2_ACK_FLAG) {
+
+        if (h2c->state.length != 0) {
+            ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                          "client sent SETTINGS frame with the ACK flag "
+                          "and nonzero length");
+
+            return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);
+        }
+
+        /* TODO settings acknowledged */
+
+        return ngx_http_v2_state_complete(h2c, pos, end);
+    }
+
+    if (h2c->state.length % NGX_HTTP_V2_SETTINGS_PARAM_SIZE) {
+        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                      "client sent SETTINGS frame with incorrect length %uz",
+                      h2c->state.length);
+
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);
+    }
+
+    ngx_http_v2_send_settings(h2c, 1);
+
+    return ngx_http_v2_state_settings_params(h2c, pos, end);
+}
+
+
+static u_char *
+ngx_http_v2_state_settings_params(ngx_http_v2_connection_t *h2c, u_char *pos,
+    u_char *end)
+{
+    ngx_uint_t  id, value;
+
+    while (h2c->state.length) {
+        if (end - pos < NGX_HTTP_V2_SETTINGS_PARAM_SIZE) {
+            return ngx_http_v2_state_save(h2c, pos, end,
+                                          ngx_http_v2_state_settings_params);
+        }
+
+        h2c->state.length -= NGX_HTTP_V2_SETTINGS_PARAM_SIZE;
+
+        id = ngx_http_v2_parse_uint16(pos);
+        value = ngx_http_v2_parse_uint32(&pos[2]);
+
+        switch (id) {
+
+        case NGX_HTTP_V2_INIT_WINDOW_SIZE_SETTING:
+
+            if (value > NGX_HTTP_V2_MAX_WINDOW) {
+                ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                              "client sent SETTINGS frame with incorrect "
+                              "INITIAL_WINDOW_SIZE value %ui", value);
+
+                return ngx_http_v2_connection_error(h2c,
+                                                  NGX_HTTP_V2_FLOW_CTRL_ERROR);
+            }
+
+            if (ngx_http_v2_adjust_windows(h2c, value - h2c->init_window)
+                != NGX_OK)
+            {
+                return ngx_http_v2_connection_error(h2c,
+                                                    NGX_HTTP_V2_INTERNAL_ERROR);
+            }
+
+            h2c->init_window = value;
+            break;
+
+        case NGX_HTTP_V2_MAX_FRAME_SIZE_SETTING:
+            if (value > NGX_HTTP_V2_MAX_FRAME_SIZE
+                || value < NGX_HTTP_V2_DEFAULT_FRAME_SIZE)
+            {
+                ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                              "client sent SETTINGS frame with incorrect "
+                              "MAX_FRAME_SIZE value %ui", value);
+
+                return ngx_http_v2_connection_error(h2c,
+                                                    NGX_HTTP_V2_PROTOCOL_ERROR);
+            }
+
+            h2c->frame_size = value;
+            break;
+
+        default:
+            break;
+        }
+
+        pos += NGX_HTTP_V2_SETTINGS_PARAM_SIZE;
+    }
+
+    return ngx_http_v2_state_complete(h2c, pos, end);
+}
+
+
+static u_char *
+ngx_http_v2_state_push_promise(ngx_http_v2_connection_t *h2c, u_char *pos,
+    u_char *end)
+{
+    ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                  "client sent PUSH_PROMISE frame");
+
+    return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);
+}
+
+
+static u_char *
+ngx_http_v2_state_ping(ngx_http_v2_connection_t *h2c, u_char *pos, u_char *end)
+{
+    ngx_buf_t                *buf;
+    ngx_http_v2_out_frame_t  *frame;
+
+    if (h2c->state.length != NGX_HTTP_V2_PING_SIZE) {
+        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                      "client sent PING frame with incorrect length %uz",
+                      h2c->state.length);
+
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);
+    }
+
+    if (end - pos < NGX_HTTP_V2_PING_SIZE) {
+        return ngx_http_v2_state_save(h2c, pos, end, ngx_http_v2_state_ping);
+    }
+
+    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                   "http2 PING frame, flags: %ui", h2c->state.flags);
+
+    if (h2c->state.flags & NGX_HTTP_V2_ACK_FLAG) {
+        return ngx_http_v2_state_skip(h2c, pos, end);
+    }
+
+    frame = ngx_http_v2_get_frame(h2c, NGX_HTTP_V2_PING_SIZE,
+                                  NGX_HTTP_V2_PING_FRAME,
+                                  NGX_HTTP_V2_ACK_FLAG, 0);
+    if (frame == NULL) {
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);
+    }
+
+    buf = frame->first->buf;
+
+    buf->last = ngx_cpymem(buf->last, pos, NGX_HTTP_V2_PING_SIZE);
+
+    ngx_http_v2_queue_blocked_frame(h2c, frame);
+
+    return ngx_http_v2_state_complete(h2c, pos + NGX_HTTP_V2_PING_SIZE, end);
+}
+
+
+static u_char *
+ngx_http_v2_state_goaway(ngx_http_v2_connection_t *h2c, u_char *pos,
+    u_char *end)
+{
+#if (NGX_DEBUG)
+    ngx_uint_t  last_sid, error;
+#endif
+
+    if (h2c->state.length < NGX_HTTP_V2_GOAWAY_SIZE) {
+        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                      "client sent GOAWAY frame "
+                      "with incorrect length %uz", h2c->state.length);
+
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);
+    }
+
+    if (end - pos < NGX_HTTP_V2_GOAWAY_SIZE) {
+        return ngx_http_v2_state_save(h2c, pos, end, ngx_http_v2_state_goaway);
+    }
+
+#if (NGX_DEBUG)
+    h2c->state.length -= NGX_HTTP_V2_GOAWAY_SIZE;
+
+    last_sid = ngx_http_v2_parse_sid(pos);
+    error = ngx_http_v2_parse_uint32(&pos[4]);
+
+    pos += NGX_HTTP_V2_GOAWAY_SIZE;
+
+    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                   "http2 GOAWAY frame: last sid %ui, error %ui",
+                   last_sid, error);
+#endif
+
+    return ngx_http_v2_state_skip(h2c, pos, end);
+}
+
+
+static u_char *
+ngx_http_v2_state_window_update(ngx_http_v2_connection_t *h2c, u_char *pos,
+    u_char *end)
+{
+    size_t                 window;
+    ngx_event_t           *wev;
+    ngx_queue_t           *q;
+    ngx_http_v2_node_t    *node;
+    ngx_http_v2_stream_t  *stream;
+
+    if (h2c->state.length != NGX_HTTP_V2_WINDOW_UPDATE_SIZE) {
+        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                      "client sent WINDOW_UPDATE frame "
+                      "with incorrect length %uz", h2c->state.length);
+
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);
+    }
+
+    if (end - pos < NGX_HTTP_V2_WINDOW_UPDATE_SIZE) {
+        return ngx_http_v2_state_save(h2c, pos, end,
+                                      ngx_http_v2_state_window_update);
+    }
+
+    window = ngx_http_v2_parse_window(pos);
+
+    pos += NGX_HTTP_V2_WINDOW_UPDATE_SIZE;
+
+    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                   "http2 WINDOW_UPDATE frame sid:%ui window:%uz",
+                   h2c->state.sid, window);
+
+    if (h2c->state.sid) {
+        node = ngx_http_v2_get_node_by_id(h2c, h2c->state.sid, 0);
+
+        if (node == NULL || node->stream == NULL) {
+            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                           "unknown http2 stream");
+
+            return ngx_http_v2_state_complete(h2c, pos, end);
+        }
+
+        stream = node->stream;
+
+        if (window > (size_t) (NGX_HTTP_V2_MAX_WINDOW - stream->send_window)) {
+
+            ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                          "client violated flow control for stream %ui: "
+                          "received WINDOW_UPDATE frame "
+                          "with window increment %uz "
+                          "not allowed for window %z",
+                          h2c->state.sid, window, stream->send_window);
+
+            if (ngx_http_v2_terminate_stream(h2c, stream,
+                                             NGX_HTTP_V2_FLOW_CTRL_ERROR)
+                == NGX_ERROR)
+            {
+                return ngx_http_v2_connection_error(h2c,
+                                                    NGX_HTTP_V2_INTERNAL_ERROR);
+            }
+
+            return ngx_http_v2_state_complete(h2c, pos, end);
+        }
+
+        stream->send_window += window;
+
+        if (stream->exhausted) {
+            stream->exhausted = 0;
+
+            wev = stream->request->connection->write;
+
+            if (!wev->timer_set) {
+                wev->delayed = 0;
+                wev->handler(wev);
+            }
+        }
+
+        return ngx_http_v2_state_complete(h2c, pos, end);
+    }
+
+    if (window > NGX_HTTP_V2_MAX_WINDOW - h2c->send_window) {
+        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                      "client violated connection flow control: "
+                      "received WINDOW_UPDATE frame "
+                      "with window increment %uz "
+                      "not allowed for window %uz",
+                      window, h2c->send_window);
+
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_FLOW_CTRL_ERROR);
+    }
+
+    h2c->send_window += window;
+
+    while (!ngx_queue_empty(&h2c->waiting)) {
+        q = ngx_queue_head(&h2c->waiting);
+
+        ngx_queue_remove(q);
+
+        stream = ngx_queue_data(q, ngx_http_v2_stream_t, queue);
+
+        stream->handled = 0;
+
+        wev = stream->request->connection->write;
+
+        if (!wev->timer_set) {
+            wev->delayed = 0;
+            wev->handler(wev);
+
+            if (h2c->send_window == 0) {
+                break;
+            }
+        }
+    }
+
+    return ngx_http_v2_state_complete(h2c, pos, end);
+}
+
+
+static u_char *
+ngx_http_v2_state_continuation(ngx_http_v2_connection_t *h2c, u_char *pos,
+    u_char *end)
+{
+    ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                  "client sent unexpected CONTINUATION frame");
+
+    return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);
+}
+
+
+static u_char *
+ngx_http_v2_state_complete(ngx_http_v2_connection_t *h2c, u_char *pos,
+    u_char *end)
+{
+    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                   "http2 frame complete pos:%p end:%p", pos, end);
+
+    if (pos > end) {
+        ngx_log_error(NGX_LOG_ALERT, h2c->connection->log, 0,
+                      "receive buffer overrun");
+
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);
+    }
+
+    h2c->state.stream = NULL;
+    h2c->state.handler = ngx_http_v2_state_head;
+
+    return pos;
+}
+
+
+static u_char *
+ngx_http_v2_state_skip_padded(ngx_http_v2_connection_t *h2c, u_char *pos,
+    u_char *end)
+{
+    h2c->state.length += h2c->state.padding;
+    h2c->state.padding = 0;
+
+    return ngx_http_v2_state_skip(h2c, pos, end);
+}
+
+
+static u_char *
+ngx_http_v2_state_skip(ngx_http_v2_connection_t *h2c, u_char *pos, u_char *end)
+{
+    size_t  size;
+
+    size = end - pos;
+
+    if (size < h2c->state.length) {
+        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                       "http2 frame skip %uz of %uz", size, h2c->state.length);
+
+        h2c->state.length -= size;
+        return ngx_http_v2_state_save(h2c, end, end, ngx_http_v2_state_skip);
+    }
+
+    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                   "http2 frame skip %uz", h2c->state.length);
+
+    return ngx_http_v2_state_complete(h2c, pos + h2c->state.length, end);
+}
+
+
+static u_char *
+ngx_http_v2_state_skip_headers(ngx_http_v2_connection_t *h2c, u_char *pos,
+    u_char *end)
+{
+    h2c->state.pool = ngx_create_pool(1024, h2c->connection->log);
+    if (h2c->state.pool == NULL) {
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);
+    }
+
+    return ngx_http_v2_state_header_block(h2c, pos, end);
+}
+
+
+static u_char *
+ngx_http_v2_state_save(ngx_http_v2_connection_t *h2c, u_char *pos, u_char *end,
+    ngx_http_v2_handler_pt handler)
+{
+    size_t  size;
+
+    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                   "http2 frame state save pos:%p end:%p handler:%p",
+                   pos, end, handler);
+
+    size = end - pos;
+
+    if (size > NGX_HTTP_V2_STATE_BUFFER_SIZE) {
+        ngx_log_error(NGX_LOG_ALERT, h2c->connection->log, 0,
+                      "state buffer overflow: %uz bytes required", size);
+
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);
+    }
+
+    ngx_memcpy(h2c->state.buffer, pos, NGX_HTTP_V2_STATE_BUFFER_SIZE);
+
+    h2c->state.buffer_used = size;
+    h2c->state.handler = handler;
+    h2c->state.incomplete = 1;
+
+    return end;
+}
+
+
+static u_char *
+ngx_http_v2_connection_error(ngx_http_v2_connection_t *h2c,
+    ngx_uint_t err)
+{
+    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                   "http2 state connection error");
+
+    if (err == NGX_HTTP_V2_INTERNAL_ERROR) {
+        ngx_debug_point();
+    }
+
+    if (h2c->state.stream) {
+        h2c->state.stream->out_closed = 1;
+        h2c->state.pool = NULL;
+        ngx_http_v2_close_stream(h2c->state.stream, NGX_HTTP_BAD_REQUEST);
+    }
+
+    ngx_http_v2_finalize_connection(h2c, err);
+
+    return NULL;
+}
+
+
+static ngx_int_t
+ngx_http_v2_parse_int(ngx_http_v2_connection_t *h2c, u_char **pos, u_char *end,
+    ngx_uint_t prefix)
+{
+    u_char      *start, *p;
+    ngx_uint_t   value, octet, shift;
+
+    start = *pos;
+    p = start;
+
+    value = *p++ & prefix;
+
+    if (value != prefix) {
+        if (h2c->state.length == 0) {
+            return NGX_ERROR;
+        }
+
+        h2c->state.length--;
+
+        *pos = p;
+        return value;
+    }
+
+    if (end - p > NGX_HTTP_V2_INT_OCTETS - 1) {
+        end = p + NGX_HTTP_V2_INT_OCTETS - 1;
+    }
+
+    for (shift = 0; p != end; shift += 7) {
+        octet = *p++;
+
+        value += (octet & 0x7f) << shift;
+
+        if (octet < 128) {
+            if ((size_t) (p - start) > h2c->state.length) {
+                return NGX_ERROR;
+            }
+
+            h2c->state.length -= p - start;
+
+            *pos = p;
+            return value;
+        }
+    }
+
+    if ((size_t) (end - start) >= NGX_HTTP_V2_INT_OCTETS) {
+        return NGX_DECLINED;
+    }
+
+    if ((size_t) (end - start) >= h2c->state.length) {
+        return NGX_ERROR;
+    }
+
+    return NGX_AGAIN;
+}
+
+
+static ngx_int_t
+ngx_http_v2_send_settings(ngx_http_v2_connection_t *h2c, ngx_uint_t ack)
+{
+    size_t                    len;
+    ngx_buf_t                *buf;
+    ngx_chain_t              *cl;
+    ngx_http_v2_srv_conf_t   *h2scf;
+    ngx_http_v2_out_frame_t  *frame;
+
+    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                   "http2 send SETTINGS frame");
+
+    frame = ngx_palloc(h2c->pool, sizeof(ngx_http_v2_out_frame_t));
+    if (frame == NULL) {
+        return NGX_ERROR;
+    }
+
+    cl = ngx_alloc_chain_link(h2c->pool);
+    if (cl == NULL) {
+        return NGX_ERROR;
+    }
+
+    len = ack ? 0 : (sizeof(uint16_t) + sizeof(uint32_t)) * 3;
+
+    buf = ngx_create_temp_buf(h2c->pool, NGX_HTTP_V2_FRAME_HEADER_SIZE + len);
+    if (buf == NULL) {
+        return NGX_ERROR;
+    }
+
+    buf->last_buf = 1;
+
+    cl->buf = buf;
+    cl->next = NULL;
+
+    frame->first = cl;
+    frame->last = cl;
+    frame->handler = ngx_http_v2_settings_frame_handler;
+    frame->stream = NULL;
+#if (NGX_DEBUG)
+    frame->length = len;
+#endif
+    frame->blocked = 0;
+
+    buf->last = ngx_http_v2_write_len_and_type(buf->last, len,
+                                               NGX_HTTP_V2_SETTINGS_FRAME);
+
+    *buf->last++ = ack ? NGX_HTTP_V2_ACK_FLAG : NGX_HTTP_V2_NO_FLAG;
+
+    buf->last = ngx_http_v2_write_sid(buf->last, 0);
+
+    if (!ack) {
+        h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx,
+                                             ngx_http_v2_module);
+
+        buf->last = ngx_http_v2_write_uint16(buf->last,
+                                             NGX_HTTP_V2_MAX_STREAMS_SETTING);
+        buf->last = ngx_http_v2_write_uint32(buf->last,
+                                             h2scf->concurrent_streams);
+
+        buf->last = ngx_http_v2_write_uint16(buf->last,
+                                         NGX_HTTP_V2_INIT_WINDOW_SIZE_SETTING);
+        buf->last = ngx_http_v2_write_uint32(buf->last,
+                                             NGX_HTTP_V2_MAX_WINDOW);
+
+        buf->last = ngx_http_v2_write_uint16(buf->last,
+                                           NGX_HTTP_V2_MAX_FRAME_SIZE_SETTING);
+        buf->last = ngx_http_v2_write_uint32(buf->last,
+                                             NGX_HTTP_V2_MAX_FRAME_SIZE);
+    }
+
+    ngx_http_v2_queue_blocked_frame(h2c, frame);
+
+    return NGX_OK;
+}
+
+
+static ngx_int_t
+ngx_http_v2_settings_frame_handler(ngx_http_v2_connection_t *h2c,
+    ngx_http_v2_out_frame_t *frame)
+{
+    ngx_buf_t  *buf;
+
+    buf = frame->first->buf;
+
+    if (buf->pos != buf->last) {
+        return NGX_AGAIN;
+    }
+
+    ngx_free_chain(h2c->pool, frame->first);
+
+    return NGX_OK;
+}
+
+
+static ngx_int_t
+ngx_http_v2_send_window_update(ngx_http_v2_connection_t *h2c, ngx_uint_t sid,
+    size_t window)
+{
+    ngx_buf_t                *buf;
+    ngx_http_v2_out_frame_t  *frame;
+
+    frame = ngx_http_v2_get_frame(h2c, NGX_HTTP_V2_WINDOW_UPDATE_SIZE,
+                                  NGX_HTTP_V2_WINDOW_UPDATE_FRAME,
+                                  NGX_HTTP_V2_NO_FLAG, sid);
+    if (frame == NULL) {
+        return NGX_ERROR;
+    }
+
+    buf = frame->first->buf;
+
+    buf->last = ngx_http_v2_write_uint32(buf->last, window);
+
+    ngx_http_v2_queue_blocked_frame(h2c, frame);
+
+    return NGX_OK;
+}
+
+
+static ngx_int_t
+ngx_http_v2_send_rst_stream(ngx_http_v2_connection_t *h2c, ngx_uint_t sid,
+    ngx_uint_t status)
+{
+    ngx_buf_t                *buf;
+    ngx_http_v2_out_frame_t  *frame;
+
+    frame = ngx_http_v2_get_frame(h2c, NGX_HTTP_V2_RST_STREAM_SIZE,
+                                  NGX_HTTP_V2_RST_STREAM_FRAME,
+                                  NGX_HTTP_V2_NO_FLAG, sid);
+    if (frame == NULL) {
+        return NGX_ERROR;
+    }
+
+    buf = frame->first->buf;
+
+    buf->last = ngx_http_v2_write_uint32(buf->last, status);
+
+    ngx_http_v2_queue_blocked_frame(h2c, frame);
+
+    return NGX_OK;
+}
+
+
+static ngx_int_t
+ngx_http_v2_send_goaway(ngx_http_v2_connection_t *h2c, ngx_uint_t status)
+{
+    ngx_buf_t                *buf;
+    ngx_http_v2_out_frame_t  *frame;
+
+    frame = ngx_http_v2_get_frame(h2c, NGX_HTTP_V2_GOAWAY_SIZE,
+                                  NGX_HTTP_V2_GOAWAY_FRAME,
+                                  NGX_HTTP_V2_NO_FLAG, 0);
+    if (frame == NULL) {
+        return NGX_ERROR;
+    }
+
+    buf = frame->first->buf;
+
+    buf->last = ngx_http_v2_write_sid(buf->last, h2c->last_sid);
+    buf->last = ngx_http_v2_write_uint32(buf->last, status);
+
+    ngx_http_v2_queue_blocked_frame(h2c, frame);
+
+    return NGX_OK;
+}
+
+
+static ngx_http_v2_out_frame_t *
+ngx_http_v2_get_frame(ngx_http_v2_connection_t *h2c, size_t length,
+    ngx_uint_t type, u_char flags, ngx_uint_t sid)
+{
+    ngx_buf_t                *buf;
+    ngx_pool_t               *pool;
+    ngx_http_v2_out_frame_t  *frame;
+
+    frame = h2c->free_frames;
+
+    if (frame) {
+        h2c->free_frames = frame->next;
+
+        buf = frame->first->buf;
+        buf->pos = buf->start;
+
+        frame->blocked = 0;
+
+    } else {
+        pool = h2c->pool ? h2c->pool : h2c->connection->pool;
+
+        frame = ngx_pcalloc(pool, sizeof(ngx_http_v2_out_frame_t));
+        if (frame == NULL) {
+            return NULL;
+        }
+
+        frame->first = ngx_alloc_chain_link(pool);
+        if (frame->first == NULL) {
+            return NULL;
+        }
+
+        buf = ngx_create_temp_buf(pool, NGX_HTTP_V2_FRAME_BUFFER_SIZE);
+        if (buf == NULL) {
+            return NULL;
+        }
+
+        buf->last_buf = 1;
+
+        frame->first->buf = buf;
+        frame->last = frame->first;
+
+        frame->handler = ngx_http_v2_frame_handler;
+    }
+
+#if (NGX_DEBUG)
+    if (length > NGX_HTTP_V2_FRAME_BUFFER_SIZE - NGX_HTTP_V2_FRAME_HEADER_SIZE)
+    {
+        ngx_log_error(NGX_LOG_ALERT, h2c->connection->log, 0,
+                      "requested control frame is too large: %uz", length);
+        return NULL;
+    }
+
+    frame->length = length;
+#endif
+
+    buf->last = ngx_http_v2_write_len_and_type(buf->pos, length, type);
+
+    *buf->last++ = flags;
+
+    buf->last = ngx_http_v2_write_sid(buf->last, sid);
+
+    return frame;
+}
+
+
+static ngx_int_t
+ngx_http_v2_frame_handler(ngx_http_v2_connection_t *h2c,
+    ngx_http_v2_out_frame_t *frame)
+{
+    ngx_buf_t  *buf;
+
+    buf = frame->first->buf;
+
+    if (buf->pos != buf->last) {
+        return NGX_AGAIN;
+    }
+
+    frame->next = h2c->free_frames;
+    h2c->free_frames = frame;
+
+    return NGX_OK;
+}
+
+
+static ngx_http_v2_stream_t *
+ngx_http_v2_create_stream(ngx_http_v2_connection_t *h2c)
+{
+    ngx_log_t                 *log;
+    ngx_event_t               *rev, *wev;
+    ngx_connection_t          *fc;
+    ngx_http_log_ctx_t        *ctx;
+    ngx_http_request_t        *r;
+    ngx_http_v2_stream_t      *stream;
+    ngx_http_core_srv_conf_t  *cscf;
+
+    fc = h2c->free_fake_connections;
+
+    if (fc) {
+        h2c->free_fake_connections = fc->data;
+
+        rev = fc->read;
+        wev = fc->write;
+        log = fc->log;
+        ctx = log->data;
+
+    } else {
+        fc = ngx_palloc(h2c->pool, sizeof(ngx_connection_t));
+        if (fc == NULL) {
+            return NULL;
+        }
+
+        rev = ngx_palloc(h2c->pool, sizeof(ngx_event_t));
+        if (rev == NULL) {
+            return NULL;
+        }
+
+        wev = ngx_palloc(h2c->pool, sizeof(ngx_event_t));
+        if (wev == NULL) {
+            return NULL;
+        }
+
+        log = ngx_palloc(h2c->pool, sizeof(ngx_log_t));
+        if (log == NULL) {
+            return NULL;
+        }
+
+        ctx = ngx_palloc(h2c->pool, sizeof(ngx_http_log_ctx_t));
+        if (ctx == NULL) {
+            return NULL;
+        }
+
+        ctx->connection = fc;
+        ctx->request = NULL;
+        ctx->current_request = NULL;
+    }
+
+    ngx_memcpy(log, h2c->connection->log, sizeof(ngx_log_t));
+
+    log->data = ctx;
+
+    ngx_memzero(rev, sizeof(ngx_event_t));
+
+    rev->data = fc;
+    rev->ready = 1;
+    rev->handler = ngx_http_v2_close_stream_handler;
+    rev->log = log;
+
+    ngx_memcpy(wev, rev, sizeof(ngx_event_t));
+
+    wev->write = 1;
+
+    ngx_memcpy(fc, h2c->connection, sizeof(ngx_connection_t));
+
+    fc->data = h2c->http_connection;
+    fc->read = rev;
+    fc->write = wev;
+    fc->sent = 0;
+    fc->log = log;
+    fc->buffered = 0;
+    fc->sndlowat = 1;
+    fc->tcp_nodelay = NGX_TCP_NODELAY_DISABLED;
+
+    r = ngx_http_create_request(fc);
+    if (r == NULL) {
+        return NULL;
+    }
+
+    r->http_version = NGX_HTTP_VERSION_20;
+    r->valid_location = 1;
+
+    fc->data = r;
+    h2c->connection->requests++;
+
+    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);
+
+    r->header_in = ngx_create_temp_buf(r->pool,
+                                       cscf->client_header_buffer_size);
+    if (r->header_in == NULL) {
+        ngx_http_free_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
+        return NULL;
+    }
+
+    if (ngx_list_init(&r->headers_in.headers, r->pool, 20,
+                      sizeof(ngx_table_elt_t))
+        != NGX_OK)
+    {
+        ngx_http_free_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
+        return NULL;
+    }
+
+    r->headers_in.connection_type = NGX_HTTP_CONNECTION_CLOSE;
+
+    stream = ngx_pcalloc(r->pool, sizeof(ngx_http_v2_stream_t));
+    if (stream == NULL) {
+        ngx_http_free_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
+        return NULL;
+    }
+
+    r->stream = stream;
+
+    stream->request = r;
+    stream->connection = h2c;
+
+    stream->send_window = h2c->init_window;
+    stream->recv_window = NGX_HTTP_V2_MAX_WINDOW;
+
+    h2c->processing++;
+
+    return stream;
+}
+
+
+static ngx_http_v2_node_t *
+ngx_http_v2_get_node_by_id(ngx_http_v2_connection_t *h2c, ngx_uint_t sid,
+    ngx_uint_t alloc)
+{
+    ngx_uint_t               index;
+    ngx_http_v2_node_t      *node;
+    ngx_http_v2_srv_conf_t  *h2scf;
+
+    h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx,
+                                         ngx_http_v2_module);
+
+    index = ngx_http_v2_index(h2scf, sid);
+
+    for (node = h2c->streams_index[index]; node; node = node->index) {
+
+        if (node->id == sid) {
+            return node;
+        }
+    }
+
+    if (!alloc) {
+        return NULL;
+    }
+
+    if (h2c->closed_nodes < 32) {
+        node = ngx_pcalloc(h2c->connection->pool, sizeof(ngx_http_v2_node_t));
+        if (node == NULL) {
+            return NULL;
+        }
+
+    } else {
+        node = ngx_http_v2_get_closed_node(h2c);
+    }
+
+    node->id = sid;
+
+    ngx_queue_init(&node->children);
+
+    node->index = h2c->streams_index[index];
+    h2c->streams_index[index] = node;
+
+    return node;
+}
+
+
+static ngx_http_v2_node_t *
+ngx_http_v2_get_closed_node(ngx_http_v2_connection_t *h2c)
+{
+    ngx_uint_t               weight;
+    ngx_queue_t             *q, *children;
+    ngx_http_v2_node_t      *node, **next, *n, *parent, *child;
+    ngx_http_v2_srv_conf_t  *h2scf;
+
+    h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx,
+                                         ngx_http_v2_module);
+
+    h2c->closed_nodes--;
+
+    q = ngx_queue_head(&h2c->closed);
+
+    ngx_queue_remove(q);
+
+    node = ngx_queue_data(q, ngx_http_v2_node_t, reuse);
+
+    next = &h2c->streams_index[ngx_http_v2_index(h2scf, node->id)];
+
+    for ( ;; ) {
+        n = *next;
+
+        if (n == node) {
+            *next = n->index;
+            break;
+        }
+
+        next = &n->index;
+    }
+
+    ngx_queue_remove(&node->queue);
+
+    weight = 0;
+
+    for (q = ngx_queue_head(&node->children);
+         q != ngx_queue_sentinel(&node->children);
+         q = ngx_queue_next(q))
+    {
+        child = ngx_queue_data(q, ngx_http_v2_node_t, queue);
+        weight += child->weight;
+    }
+
+    for (q = ngx_queue_head(&node->children);
+         q != ngx_queue_sentinel(&node->children);
+         q = ngx_queue_next(q))
+    {
+        child = ngx_queue_data(q, ngx_http_v2_node_t, queue);
+        child->weight = node->weight * child->weight / weight;
+
+        if (child->weight == 0) {
+            child->weight = 1;
+        }
+    }
+
+    parent = node->parent;
+
+    if (parent == NGX_HTTP_V2_ROOT) {
+        node->rank = 0;
+        node->rel_weight = 1.0;
+
+        children = &h2c->dependencies;
+
+    } else {
+        node->rank = parent->rank;
+        node->rel_weight = parent->rel_weight;
+
+        children = &parent->children;
+    }
+
+    ngx_http_v2_node_children_update(node);
+    ngx_queue_add(children, &node->children);
+
+    ngx_memzero(node, sizeof(ngx_http_v2_node_t));
+
+    return node;
+}
+
+
+static ngx_int_t
+ngx_http_v2_validate_header(ngx_http_request_t *r, ngx_http_v2_header_t *header)
+{
+    u_char                     ch;
+    ngx_uint_t                 i;
+    ngx_http_core_srv_conf_t  *cscf;
+
+    if (header->name.len == 0) {
+        return NGX_ERROR;
+    }
+
+    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);
+
+    for (i = (header->name.data[0] == ':'); i != header->name.len; i++) {
+        ch = header->name.data[i];
+
+        if ((ch >= 'a' && ch <= 'z')
+            || (ch == '-')
+            || (ch >= '0' && ch <= '9')
+            || (ch == '_' && cscf->underscores_in_headers))
+        {
+            continue;
+        }
+
+        switch (ch) {
+        case '\0':
+        case LF:
+        case CR:
+        case ':':
+            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
+                          "client sent invalid header name: \"%V\"",
+                          &header->name);
+
+            return NGX_ERROR;
+        }
+
+        if (ch >= 'A' && ch <= 'Z') {
+            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
+                          "client sent invalid header name: \"%V\"",
+                          &header->name);
+
+            return NGX_ERROR;
+        }
+
+        r->invalid_header = 1;
+    }
+
+    for (i = 0; i != header->value.len; i++) {
+        ch = header->value.data[i];
+
+        switch (ch) {
+        case '\0':
+        case LF:
+        case CR:
+            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
+                          "client sent header \"%V\" with "
+                          "invalid value: \"%V\"",
+                          &header->name, &header->value);
+
+            return NGX_ERROR;
+        }
+    }
+
+    return NGX_OK;
+}
+
+
+static ngx_int_t
+ngx_http_v2_pseudo_header(ngx_http_request_t *r, ngx_http_v2_header_t *header)
+{
+    header->name.len--;
+    header->name.data++;
+
+    switch (header->name.len) {
+    case 4:
+        if (ngx_memcmp(header->name.data, "path", sizeof("path") - 1)
+            == 0)
+        {
+            return ngx_http_v2_parse_path(r, header);
+        }
+
+        break;
+
+    case 6:
+        if (ngx_memcmp(header->name.data, "method", sizeof("method") - 1)
+            == 0)
+        {
+            return ngx_http_v2_parse_method(r, header);
+        }
+
+        if (ngx_memcmp(header->name.data, "scheme", sizeof("scheme") - 1)
+            == 0)
+        {
+            return ngx_http_v2_parse_scheme(r, header);
+        }
+
+        break;
+
+    case 9:
+        if (ngx_memcmp(header->name.data, "authority", sizeof("authority") - 1)
+            == 0)
+        {
+            return ngx_http_v2_parse_authority(r, header);
+        }
+
+        break;
+    }
+
+    ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
+                  "client sent unknown pseudo header \"%V\"",
+                  &header->name);
+
+    return NGX_DECLINED;
+}
+
+
+static ngx_int_t
+ngx_http_v2_parse_path(ngx_http_request_t *r, ngx_http_v2_header_t *header)
+{
+    if (r->unparsed_uri.len) {
+        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
+                      "client sent duplicate :path header");
+
+        return NGX_DECLINED;
+    }
+
+    if (header->value.len == 0) {
+        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
+                      "client sent empty :path header");
+
+        return NGX_DECLINED;
+    }
+
+    r->uri_start = header->value.data;
+    r->uri_end = header->value.data + header->value.len;
+
+    if (ngx_http_parse_uri(r) != NGX_OK) {
+        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
+                      "client sent invalid :path header: \"%V\"",
+                      &header->value);
+
+        return NGX_DECLINED;
+    }
+
+    if (ngx_http_process_request_uri(r) != NGX_OK) {
+        /*
+         * request has been finalized already
+         * in ngx_http_process_request_uri()
+         */
+        return NGX_ABORT;
+    }
+
+    return NGX_OK;
+}
+
+
+static ngx_int_t
+ngx_http_v2_parse_method(ngx_http_request_t *r, ngx_http_v2_header_t *header)
+{
+    size_t         k, len;
+    ngx_uint_t     n;
+    const u_char  *p, *m;
+
+    /*
+     * This array takes less than 256 sequential bytes,
+     * and if typical CPU cache line size is 64 bytes,
+     * it is prefetched for 4 load operations.
+     */
+    static const struct {
+        u_char            len;
+        const u_char      method[11];
+        uint32_t          value;
+    } tests[] = {
+        { 3, "GET",       NGX_HTTP_GET },
+        { 4, "POST",      NGX_HTTP_POST },
+        { 4, "HEAD",      NGX_HTTP_HEAD },
+        { 7, "OPTIONS",   NGX_HTTP_OPTIONS },
+        { 8, "PROPFIND",  NGX_HTTP_PROPFIND },
+        { 3, "PUT",       NGX_HTTP_PUT },
+        { 5, "MKCOL",     NGX_HTTP_MKCOL },
+        { 6, "DELETE",    NGX_HTTP_DELETE },
+        { 4, "COPY",      NGX_HTTP_COPY },
+        { 4, "MOVE",      NGX_HTTP_MOVE },
+        { 9, "PROPPATCH", NGX_HTTP_PROPPATCH },
+        { 4, "LOCK",      NGX_HTTP_LOCK },
+        { 6, "UNLOCK",    NGX_HTTP_UNLOCK },
+        { 5, "PATCH",     NGX_HTTP_PATCH },
+        { 5, "TRACE",     NGX_HTTP_TRACE }
+    }, *test;
+
+    if (r->method_name.len) {
+        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
+                      "client sent duplicate :method header");
+
+        return NGX_DECLINED;
+    }
+
+    if (header->value.len == 0) {
+        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
+                      "client sent empty :method header");
+
+        return NGX_DECLINED;
+    }
+
+    r->method_name.len = header->value.len;
+    r->method_name.data = header->value.data;
+
+    len = r->method_name.len;
+    n = sizeof(tests) / sizeof(tests[0]);
+    test = tests;
+
+    do {
+        if (len == test->len) {
+            p = r->method_name.data;
+            m = test->method;
+            k = len;
+
+            do {
+                if (*p++ != *m++) {
+                    goto next;
+                }
+            } while (--k);
+
+            r->method = test->value;
+            return NGX_OK;
+        }
+
+    next:
+        test++;
+
+    } while (--n);
+
+    p = r->method_name.data;
+
+    do {
+        if ((*p < 'A' || *p > 'Z') && *p != '_') {
+            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
+                          "client sent invalid method: \"%V\"",
+                          &r->method_name);
+
+            return NGX_DECLINED;
+        }
+
+        p++;
+
+    } while (--len);
+
+    return NGX_OK;
+}
+
+
+static ngx_int_t
+ngx_http_v2_parse_scheme(ngx_http_request_t *r, ngx_http_v2_header_t *header)
+{
+    if (r->schema_start) {
+        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
+                      "client sent duplicate :schema header");
+
+        return NGX_DECLINED;
+    }
+
+    if (header->value.len == 0) {
+        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
+                      "client sent empty :schema header");
+
+        return NGX_DECLINED;
+    }
+
+    r->schema_start = header->value.data;
+    r->schema_end = header->value.data + header->value.len;
+
+    return NGX_OK;
+}
+
+
+static ngx_int_t
+ngx_http_v2_parse_authority(ngx_http_request_t *r, ngx_http_v2_header_t *header)
+{
+    ngx_table_elt_t            *h;
+    ngx_http_header_t          *hh;
+    ngx_http_core_main_conf_t  *cmcf;
+
+    static ngx_str_t host = ngx_string("host");
+
+    h = ngx_list_push(&r->headers_in.headers);
+    if (h == NULL) {
+        return NGX_ERROR;
+    }
+
+    h->hash = ngx_hash_key(host.data, host.len);
+
+    h->key.len = host.len;
+    h->key.data = host.data;
+
+    h->value.len = header->value.len;
+    h->value.data = header->value.data;
+
+    h->lowcase_key = host.data;
+
+    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);
+
+    hh = ngx_hash_find(&cmcf->headers_in_hash, h->hash,
+                       h->lowcase_key, h->key.len);
+
+    if (hh == NULL) {
+        return NGX_ERROR;
+    }
+
+    if (hh->handler(r, h, hh->offset) != NGX_OK) {
+        /*
+         * request has been finalized already
+         * in ngx_http_process_host()
+         */
+        return NGX_ABORT;
+    }
+
+    return NGX_OK;
+}
+
+
+static ngx_int_t
+ngx_http_v2_construct_request_line(ngx_http_request_t *r)
+{
+    u_char  *p;
+
+    static const u_char ending[] = " HTTP/2.0";
+
+    if (r->method_name.len == 0
+        || r->unparsed_uri.len == 0)
+    {
+        ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);
+        return NGX_ERROR;
+    }
+
+    r->request_line.len = r->method_name.len + 1
+                          + r->unparsed_uri.len
+                          + sizeof(ending) - 1;
+
+    p = ngx_pnalloc(r->pool, r->request_line.len + 1);
+    if (p == NULL) {
+        ngx_http_v2_close_stream(r->stream, NGX_HTTP_INTERNAL_SERVER_ERROR);
+        return NGX_ERROR;
+    }
+
+    r->request_line.data = p;
+
+    p = ngx_cpymem(p, r->method_name.data, r->method_name.len);
+
+    *p++ = ' ';
+
+    p = ngx_cpymem(p, r->unparsed_uri.data, r->unparsed_uri.len);
+
+    ngx_memcpy(p, ending, sizeof(ending));
+
+    /* some modules expect the space character after method name */
+    r->method_name.data = r->request_line.data;
+
+    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+                   "http2 http request line: \"%V\"", &r->request_line);
+
+    return NGX_OK;
+}
+
+
+static ngx_int_t
+ngx_http_v2_cookie(ngx_http_request_t *r, ngx_http_v2_header_t *header)
+{
+    ngx_str_t    *val;
+    ngx_array_t  *cookies;
+
+    cookies = r->stream->cookies;
+
+    if (cookies == NULL) {
+        cookies = ngx_array_create(r->pool, 2, sizeof(ngx_str_t));
+        if (cookies == NULL) {
+            return NGX_ERROR;
+        }
+
+        r->stream->cookies = cookies;
+    }
+
+    val = ngx_array_push(cookies);
+    if (val == NULL) {
+        return NGX_ERROR;
+    }
+
+    val->len = header->value.len;
+    val->data = header->value.data;
+
+    return NGX_OK;
+}
+
+
+static ngx_int_t
+ngx_http_v2_construct_cookie_header(ngx_http_request_t *r)
+{
+    u_char                     *buf, *p, *end;
+    size_t                      len;
+    ngx_str_t                  *vals;
+    ngx_uint_t                  i;
+    ngx_array_t                *cookies;
+    ngx_table_elt_t            *h;
+    ngx_http_header_t          *hh;
+    ngx_http_core_main_conf_t  *cmcf;
+
+    static ngx_str_t cookie = ngx_string("cookie");
+
+    cookies = r->stream->cookies;
+
+    if (cookies == NULL) {
+        return NGX_OK;
+    }
+
+    vals = cookies->elts;
+
+    i = 0;
+    len = 0;
+
+    do {
+        len += vals[i].len + 2;
+    } while (++i != cookies->nelts);
+
+    len -= 2;
+
+    buf = ngx_pnalloc(r->pool, len + 1);
+    if (buf == NULL) {
+        ngx_http_v2_close_stream(r->stream, NGX_HTTP_INTERNAL_SERVER_ERROR);
+        return NGX_ERROR;
+    }
+
+    p = buf;
+    end = buf + len;
+
+    for (i = 0; /* void */ ; i++) {
+
+        p = ngx_cpymem(p, vals[i].data, vals[i].len);
+
+        if (p == end) {
+            *p = '\0';
+            break;
+        }
+
+        *p++ = ';'; *p++ = ' ';
+    }
+
+    h = ngx_list_push(&r->headers_in.headers);
+    if (h == NULL) {
+        ngx_http_v2_close_stream(r->stream, NGX_HTTP_INTERNAL_SERVER_ERROR);
+        return NGX_ERROR;
+    }
+
+    h->hash = ngx_hash_key(cookie.data, cookie.len);
+
+    h->key.len = cookie.len;
+    h->key.data = cookie.data;
+
+    h->value.len = len;
+    h->value.data = buf;
+
+    h->lowcase_key = cookie.data;
+
+    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);
+
+    hh = ngx_hash_find(&cmcf->headers_in_hash, h->hash,
+                       h->lowcase_key, h->key.len);
+
+    if (hh == NULL) {
+        ngx_http_v2_close_stream(r->stream, NGX_HTTP_INTERNAL_SERVER_ERROR);
+        return NGX_ERROR;
+    }
+
+    if (hh->handler(r, h, hh->offset) != NGX_OK) {
+        /*
+         * request has been finalized already
+         * in ngx_http_process_multi_header_lines()
+         */
+        return NGX_ERROR;
+    }
+
+    return NGX_OK;
+}
+
+
+static void
+ngx_http_v2_run_request(ngx_http_request_t *r)
+{
+    if (ngx_http_v2_construct_request_line(r) != NGX_OK) {
+        return;
+    }
+
+    if (ngx_http_v2_construct_cookie_header(r) != NGX_OK) {
+        return;
+    }
+
+    r->http_state = NGX_HTTP_PROCESS_REQUEST_STATE;
+
+    if (ngx_http_process_request_header(r) != NGX_OK) {
+        return;
+    }
+
+    if (r->headers_in.content_length_n > 0 && r->stream->in_closed) {
+        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
+                      "client prematurely closed stream");
+
+        r->stream->skip_data = NGX_HTTP_V2_DATA_ERROR;
+
+        ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);
+        return;
+    }
+
+    ngx_http_process_request(r);
+}
+
+
+static ngx_int_t
+ngx_http_v2_init_request_body(ngx_http_request_t *r)
+{
+    ngx_buf_t                 *buf;
+    ngx_temp_file_t           *tf;
+    ngx_http_request_body_t   *rb;
+    ngx_http_core_loc_conf_t  *clcf;
+
+    rb = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t));
+    if (rb == NULL) {
+        return NGX_ERROR;
+    }
+
+    r->request_body = rb;
+
+    if (r->stream->in_closed) {
+        return NGX_OK;
+    }
+
+    rb->rest = r->headers_in.content_length_n;
+
+    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
+
+    if (r->request_body_in_file_only
+        || rb->rest > (off_t) clcf->client_body_buffer_size
+        || rb->rest < 0)
+    {
+        tf = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t));
+        if (tf == NULL) {
+            return NGX_ERROR;
+        }
+
+        tf->file.fd = NGX_INVALID_FILE;
+        tf->file.log = r->connection->log;
+        tf->path = clcf->client_body_temp_path;
+        tf->pool = r->pool;
+        tf->warn = "a client request body is buffered to a temporary file";
+        tf->log_level = r->request_body_file_log_level;
+        tf->persistent = r->request_body_in_persistent_file;
+        tf->clean = r->request_body_in_clean_file;
+
+        if (r->request_body_file_group_access) {
+            tf->access = 0660;
+        }
+
+        rb->temp_file = tf;
+
+        if (r->stream->in_closed
+            && ngx_create_temp_file(&tf->file, tf->path, tf->pool,
+                                    tf->persistent, tf->clean, tf->access)
+               != NGX_OK)
+        {
+            return NGX_ERROR;
+        }
+
+        buf = ngx_calloc_buf(r->pool);
+        if (buf == NULL) {
+            return NGX_ERROR;
+        }
+
+    } else {
+
+        if (rb->rest == 0) {
+            return NGX_OK;
+        }
+
+        buf = ngx_create_temp_buf(r->pool, (size_t) rb->rest);
+        if (buf == NULL) {
+            return NGX_ERROR;
+        }
+    }
+
+    rb->buf = buf;
+
+    rb->bufs = ngx_alloc_chain_link(r->pool);
+    if (rb->bufs == NULL) {
+        return NGX_ERROR;
+    }
+
+    rb->bufs->buf = buf;
+    rb->bufs->next = NULL;
+
+    rb->rest = 0;
+
+    return NGX_OK;
+}
+
+
+ngx_int_t
+ngx_http_v2_read_request_body(ngx_http_request_t *r,
+    ngx_http_client_body_handler_pt post_handler)
+{
+    ngx_http_v2_stream_t  *stream;
+
+    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+                   "http2 read request body");
+
+    stream = r->stream;
+
+    switch (stream->skip_data) {
+
+    case NGX_HTTP_V2_DATA_DISCARD:
+        post_handler(r);
+        return NGX_OK;
+
+    case NGX_HTTP_V2_DATA_ERROR:
+        if (r->headers_in.content_length_n == -1) {
+            return NGX_HTTP_REQUEST_ENTITY_TOO_LARGE;
+        } else {
+            return NGX_HTTP_BAD_REQUEST;
+        }
+
+    case NGX_HTTP_V2_DATA_INTERNAL_ERROR:
+        return NGX_HTTP_INTERNAL_SERVER_ERROR;
+    }
+
+    if (!r->request_body && ngx_http_v2_init_request_body(r) != NGX_OK) {
+        stream->skip_data = NGX_HTTP_V2_DATA_INTERNAL_ERROR;
+        return NGX_HTTP_INTERNAL_SERVER_ERROR;
+    }
+
+    if (stream->in_closed) {
+        post_handler(r);
+        return NGX_OK;
+    }
+
+    r->request_body->post_handler = post_handler;
+
+    r->read_event_handler = ngx_http_test_reading;
+    r->write_event_handler = ngx_http_request_empty_handler;
+
+    return NGX_AGAIN;
+}
+
+
+static ngx_int_t
+ngx_http_v2_terminate_stream(ngx_http_v2_connection_t *h2c,
+    ngx_http_v2_stream_t *stream, ngx_uint_t status)
+{
+    ngx_event_t       *rev;
+    ngx_connection_t  *fc;
+
+    if (ngx_http_v2_send_rst_stream(h2c, stream->node->id, status)
+        == NGX_ERROR)
+    {
+        return NGX_ERROR;
+    }
+
+    stream->out_closed = 1;
+
+    fc = stream->request->connection;
+    fc->error = 1;
+
+    rev = fc->read;
+    rev->handler(rev);
+
+    return NGX_OK;
+}
+
+
+void
+ngx_http_v2_close_stream(ngx_http_v2_stream_t *stream, ngx_int_t rc)
+{
+    ngx_event_t               *ev;
+    ngx_connection_t          *fc;
+    ngx_http_v2_node_t        *node;
+    ngx_http_v2_connection_t  *h2c;
+
+    h2c = stream->connection;
+    node = stream->node;
+
+    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                   "http2 close stream %ui, queued %ui, processing %ui",
+                   node->id, stream->queued, h2c->processing);
+
+    fc = stream->request->connection;
+
+    if (stream->queued) {
+        fc->write->handler = ngx_http_v2_close_stream_handler;
+        return;
+    }
+
+    if (!stream->out_closed) {
+        if (ngx_http_v2_send_rst_stream(h2c, node->id,
+                                        NGX_HTTP_V2_INTERNAL_ERROR)
+            != NGX_OK)
+        {
+            h2c->connection->error = 1;
+        }
+    }
+
+    node->stream = NULL;
+
+    ngx_queue_insert_tail(&h2c->closed, &node->reuse);
+    h2c->closed_nodes++;
+
+    ngx_http_free_request(stream->request, rc);
+
+    ev = fc->read;
+
+    if (ev->active || ev->disabled) {
+        ngx_log_error(NGX_LOG_ALERT, h2c->connection->log, 0,
+                      "fake read event was activated");
+    }
+
+    if (ev->timer_set) {
+        ngx_del_timer(ev);
+    }
+
+    if (ev->posted) {
+        ngx_delete_posted_event(ev);
+    }
+
+    ev = fc->write;
+
+    if (ev->active || ev->disabled) {
+        ngx_log_error(NGX_LOG_ALERT, h2c->connection->log, 0,
+                      "fake write event was activated");
+    }
+
+    if (ev->timer_set) {
+        ngx_del_timer(ev);
+    }
+
+    if (ev->posted) {
+        ngx_delete_posted_event(ev);
+    }
+
+    fc->data = h2c->free_fake_connections;
+    h2c->free_fake_connections = fc;
+
+    h2c->processing--;
+
+    if (h2c->processing || h2c->blocked) {
+        return;
+    }
+
+    ev = h2c->connection->read;
+
+    ev->handler = ngx_http_v2_handle_connection_handler;
+    ngx_post_event(ev, &ngx_posted_events);
+}
+
+
+static void
+ngx_http_v2_close_stream_handler(ngx_event_t *ev)
+{
+    ngx_connection_t    *fc;
+    ngx_http_request_t  *r;
+
+    fc = ev->data;
+    r = fc->data;
+
+    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+                   "http2 close stream handler");
+
+    ngx_http_v2_close_stream(r->stream, 0);
+}
+
+
+static void
+ngx_http_v2_handle_connection_handler(ngx_event_t *rev)
+{
+    ngx_connection_t  *c;
+
+    rev->handler = ngx_http_v2_read_handler;
+
+    if (rev->ready) {
+        ngx_http_v2_read_handler(rev);
+        return;
+    }
+
+    c = rev->data;
+
+    ngx_http_v2_handle_connection(c->data);
+}
+
+
+static void
+ngx_http_v2_idle_handler(ngx_event_t *rev)
+{
+    ngx_connection_t          *c;
+    ngx_http_v2_srv_conf_t    *h2scf;
+    ngx_http_v2_connection_t  *h2c;
+
+    c = rev->data;
+    h2c = c->data;
+
+    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http2 idle handler");
+
+    if (rev->timedout || c->close) {
+        ngx_http_v2_finalize_connection(h2c, NGX_HTTP_V2_NO_ERROR);
+        return;
+    }
+
+#if (NGX_HAVE_KQUEUE)
+
+    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {
+        if (rev->pending_eof) {
+            c->log->handler = NULL;
+            ngx_log_error(NGX_LOG_INFO, c->log, rev->kq_errno,
+                          "kevent() reported that client %V closed "
+                          "idle connection", &c->addr_text);
+#if (NGX_HTTP_SSL)
+            if (c->ssl) {
+                c->ssl->no_send_shutdown = 1;
+            }
+#endif
+            ngx_http_close_connection(c);
+            return;
+        }
+    }
+
+#endif
+
+    c->destroyed = 0;
+    c->idle = 0;
+    ngx_reusable_connection(c, 0);
+
+    h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx,
+                                         ngx_http_v2_module);
+
+    h2c->pool = ngx_create_pool(h2scf->pool_size, h2c->connection->log);
+    if (h2c->pool == NULL) {
+        ngx_http_v2_finalize_connection(h2c, NGX_HTTP_V2_INTERNAL_ERROR);
+        return;
+    }
+
+    c->write->handler = ngx_http_v2_write_handler;
+
+    rev->handler = ngx_http_v2_read_handler;
+    ngx_http_v2_read_handler(rev);
+}
+
+
+static void
+ngx_http_v2_finalize_connection(ngx_http_v2_connection_t *h2c,
+    ngx_uint_t status)
+{
+    ngx_uint_t               i, size;
+    ngx_event_t             *ev;
+    ngx_connection_t        *c, *fc;
+    ngx_http_request_t      *r;
+    ngx_http_v2_node_t      *node;
+    ngx_http_v2_stream_t    *stream;
+    ngx_http_v2_srv_conf_t  *h2scf;
+
+    c = h2c->connection;
+
+    h2c->blocked = 1;
+
+    if (!c->error && ngx_http_v2_send_goaway(h2c, status) != NGX_ERROR) {
+        (void) ngx_http_v2_send_output_queue(h2c);
+    }
+
+    if (!h2c->processing) {
+        ngx_http_close_connection(c);
+        return;
+    }
+
+    c->error = 1;
+    c->read->handler = ngx_http_empty_handler;
+    c->write->handler = ngx_http_empty_handler;
+
+    h2c->last_out = NULL;
+
+    h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx,
+                                         ngx_http_v2_module);
+
+    size = ngx_http_v2_index_size(h2scf);
+
+    for (i = 0; i < size; i++) {
+
+        for (node = h2c->streams_index[i]; node; node = node->index) {
+            stream = node->stream;
+
+            if (stream == NULL) {
+                continue;
+            }
+
+            stream->handled = 0;
+
+            r = stream->request;
+            fc = r->connection;
+
+            fc->error = 1;
+
+            if (stream->queued) {
+                stream->queued = 0;
+
+                ev = fc->write;
+                ev->delayed = 0;
+
+            } else {
+                ev = fc->read;
+            }
+
+            ev->eof = 1;
+            ev->handler(ev);
+        }
+    }
+
+    h2c->blocked = 0;
+
+    if (h2c->processing) {
+        return;
+    }
+
+    ngx_http_close_connection(c);
+}
+
+
+static ngx_int_t
+ngx_http_v2_adjust_windows(ngx_http_v2_connection_t *h2c, ssize_t delta)
+{
+    ngx_uint_t               i, size;
+    ngx_event_t             *wev;
+    ngx_http_v2_node_t      *node;
+    ngx_http_v2_stream_t    *stream;
+    ngx_http_v2_srv_conf_t  *h2scf;
+
+    h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx,
+                                         ngx_http_v2_module);
+
+    size = ngx_http_v2_index_size(h2scf);
+
+    for (i = 0; i < size; i++) {
+
+        for (node = h2c->streams_index[i]; node; node = node->index) {
+            stream = node->stream;
+
+            if (stream == NULL) {
+                continue;
+            }
+
+            if (delta > 0
+                && stream->send_window
+                      > (ssize_t) (NGX_HTTP_V2_MAX_WINDOW - delta))
+            {
+                if (ngx_http_v2_terminate_stream(h2c, stream,
+                                                 NGX_HTTP_V2_FLOW_CTRL_ERROR)
+                    == NGX_ERROR)
+                {
+                    return NGX_ERROR;
+                }
+
+                continue;
+            }
+
+            stream->send_window += delta;
+
+            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                           "http2:%ui adjusted window: %z",
+                           node->id, stream->send_window);
+
+            if (stream->send_window > 0 && stream->exhausted) {
+                stream->exhausted = 0;
+
+                wev = stream->request->connection->write;
+
+                if (!wev->timer_set) {
+                    wev->delayed = 0;
+                    wev->handler(wev);
+                }
+            }
+        }
+    }
+
+    return NGX_OK;
+}
+
+
+static void
+ngx_http_v2_set_dependency(ngx_http_v2_connection_t *h2c,
+    ngx_http_v2_node_t *node, ngx_uint_t depend, ngx_uint_t exclusive)
+{
+    ngx_queue_t         *children;
+    ngx_http_v2_node_t  *parent, *next;
+
+    parent = depend ? ngx_http_v2_get_node_by_id(h2c, depend, 0) : NULL;
+
+    if (parent == NULL) {
+        parent = NGX_HTTP_V2_ROOT;
+
+        if (depend != 0) {
+            exclusive = 0;
+        }
+
+        node->rank = 1;
+        node->rel_weight = (1.0 / 256) * node->weight;
+
+        children = &h2c->dependencies;
+
+    } else {
+        if (node->parent != NULL) {
+
+            for (next = parent->parent;
+                 next != NGX_HTTP_V2_ROOT && next->rank >= node->rank;
+                 next = next->parent)
+            {
+                if (next != node) {
+                    continue;
+                }
+
+                ngx_queue_remove(&parent->queue);
+                ngx_queue_insert_after(&node->queue, &parent->queue);
+
+                parent->parent = node->parent;
+
+                if (node->parent == NGX_HTTP_V2_ROOT) {
+                    parent->rank = 1;
+                    parent->rel_weight = (1.0 / 256) * parent->weight;
+
+                } else {
+                    parent->rank = node->parent->rank + 1;
+                    parent->rel_weight = (node->parent->rel_weight / 256)
+                                         * parent->weight;
+                }
+
+                if (!exclusive) {
+                    ngx_http_v2_node_children_update(parent);
+                }
+
+                break;
+            }
+        }
+
+        node->rank = parent->rank + 1;
+        node->rel_weight = (parent->rel_weight / 256) * node->weight;
+
+        if (parent->stream == NULL) {
+            ngx_queue_remove(&parent->reuse);
+            ngx_queue_insert_tail(&h2c->closed, &parent->reuse);
+        }
+
+        children = &parent->children;
+    }
+
+    if (exclusive) {
+        ngx_queue_add(&node->children, children);
+        ngx_queue_init(children);
+    }
+
+    if (node->parent != NULL) {
+        ngx_queue_remove(&node->queue);
+    }
+
+    ngx_queue_insert_tail(children, &node->queue);
+
+    node->parent = parent;
+
+    ngx_http_v2_node_children_update(node);
+}
+
+
+static void
+ngx_http_v2_node_children_update(ngx_http_v2_node_t *node)
+{
+    ngx_queue_t         *q;
+    ngx_http_v2_node_t  *child;
+
+    for (q = ngx_queue_head(&node->children);
+         q != ngx_queue_sentinel(&node->children);
+         q = ngx_queue_next(q))
+    {
+        child = ngx_queue_data(q, ngx_http_v2_node_t, queue);
+
+        child->rank = node->rank + 1;
+        child->rel_weight = (node->rel_weight / 256) * child->weight;
+
+        ngx_http_v2_node_children_update(child);
+    }
+}
+
+
+static void
+ngx_http_v2_pool_cleanup(void *data)
+{
+    ngx_http_v2_connection_t  *h2c = data;
+
+    if (h2c->state.pool) {
+        ngx_destroy_pool(h2c->state.pool);
+    }
+
+    if (h2c->pool) {
+        ngx_destroy_pool(h2c->pool);
+    }
+}

  Added: vendor/nginx-1.9.5/src/http/v2/ngx_http_v2.h (+333 -0) 100644
===================================================================
--- /dev/null
+++ vendor/nginx-1.9.5/src/http/v2/ngx_http_v2.h    2015-09-27 22:10:53 +0900 (b7e73c9)
@@ -0,0 +1,333 @@
+/*
+ * Copyright (C) Nginx, Inc.
+ * Copyright (C) Valentin V. Bartenev
+ */
+
+
+#ifndef _NGX_HTTP_V2_H_INCLUDED_
+#define _NGX_HTTP_V2_H_INCLUDED_
+
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+#include <ngx_http.h>
+
+
+#define NGX_HTTP_V2_ALPN_ADVERTISE       "\x02h2"
+#define NGX_HTTP_V2_NPN_ADVERTISE        NGX_HTTP_V2_ALPN_ADVERTISE
+
+#define NGX_HTTP_V2_STATE_BUFFER_SIZE    16
+
+#define NGX_HTTP_V2_MAX_FRAME_SIZE       ((1 << 24) - 1)
+
+#define NGX_HTTP_V2_INT_OCTETS           4
+#define NGX_HTTP_V2_MAX_FIELD            ((1 << NGX_HTTP_V2_INT_OCTETS * 7) - 1)
+
+#define NGX_HTTP_V2_DATA_DISCARD         1
+#define NGX_HTTP_V2_DATA_ERROR           2
+#define NGX_HTTP_V2_DATA_INTERNAL_ERROR  3
+
+#define NGX_HTTP_V2_FRAME_HEADER_SIZE    9
+
+/* frame types */
+#define NGX_HTTP_V2_DATA_FRAME           0x0
+#define NGX_HTTP_V2_HEADERS_FRAME        0x1
+#define NGX_HTTP_V2_PRIORITY_FRAME       0x2
+#define NGX_HTTP_V2_RST_STREAM_FRAME     0x3
+#define NGX_HTTP_V2_SETTINGS_FRAME       0x4
+#define NGX_HTTP_V2_PUSH_PROMISE_FRAME   0x5
+#define NGX_HTTP_V2_PING_FRAME           0x6
+#define NGX_HTTP_V2_GOAWAY_FRAME         0x7
+#define NGX_HTTP_V2_WINDOW_UPDATE_FRAME  0x8
+#define NGX_HTTP_V2_CONTINUATION_FRAME   0x9
+
+/* frame flags */
+#define NGX_HTTP_V2_NO_FLAG              0x00
+#define NGX_HTTP_V2_ACK_FLAG             0x01
+#define NGX_HTTP_V2_END_STREAM_FLAG      0x01
+#define NGX_HTTP_V2_END_HEADERS_FLAG     0x04
+#define NGX_HTTP_V2_PADDED_FLAG          0x08
+#define NGX_HTTP_V2_PRIORITY_FLAG        0x20
+
+
+typedef struct ngx_http_v2_connection_s   ngx_http_v2_connection_t;
+typedef struct ngx_http_v2_node_s         ngx_http_v2_node_t;
+typedef struct ngx_http_v2_out_frame_s    ngx_http_v2_out_frame_t;
+
+
+typedef u_char *(*ngx_http_v2_handler_pt) (ngx_http_v2_connection_t *h2c,
+    u_char *pos, u_char *end);
+
+
+typedef struct {
+    ngx_str_t                        name;
+    ngx_str_t                        value;
+} ngx_http_v2_header_t;
+
+
+typedef struct {
+    ngx_uint_t                       sid;
+    size_t                           length;
+    size_t                           padding;
+    unsigned                         flags:8;
+
+    unsigned                         incomplete:1;
+
+    /* HPACK */
+    unsigned                         parse_name:1;
+    unsigned                         parse_value:1;
+    unsigned                         index:1;
+    ngx_http_v2_header_t             header;
+    size_t                           header_limit;
+    size_t                           field_limit;
+    u_char                           field_state;
+    u_char                          *field_start;
+    u_char                          *field_end;
+    size_t                           field_rest;
+    ngx_pool_t                      *pool;
+
+    ngx_http_v2_stream_t            *stream;
+
+    u_char                           buffer[NGX_HTTP_V2_STATE_BUFFER_SIZE];
+    size_t                           buffer_used;
+    ngx_http_v2_handler_pt           handler;
+} ngx_http_v2_state_t;
+
+
+
+typedef struct {
+    ngx_http_v2_header_t           **entries;
+
+    ngx_uint_t                       added;
+    ngx_uint_t                       deleted;
+    ngx_uint_t                       reused;
+    ngx_uint_t                       allocated;
+
+    size_t                           size;
+    size_t                           free;
+    u_char                          *storage;
+    u_char                          *pos;
+} ngx_http_v2_hpack_t;
+
+
+struct ngx_http_v2_connection_s {
+    ngx_connection_t                *connection;
+    ngx_http_connection_t           *http_connection;
+
+    ngx_uint_t                       processing;
+
+    size_t                           send_window;
+    size_t                           recv_window;
+    size_t                           init_window;
+
+    size_t                           frame_size;
+
+    ngx_queue_t                      waiting;
+
+    ngx_http_v2_state_t              state;
+
+    ngx_http_v2_hpack_t              hpack;
+
+    ngx_pool_t                      *pool;
+
+    ngx_http_v2_out_frame_t         *free_frames;
+    ngx_connection_t                *free_fake_connections;
+
+    ngx_http_v2_node_t             **streams_index;
+
+    ngx_http_v2_out_frame_t         *last_out;
+
+    ngx_queue_t                      posted;
+    ngx_queue_t                      dependencies;
+    ngx_queue_t                      closed;
+
+    ngx_uint_t                       last_sid;
+
+    unsigned                         closed_nodes:8;
+    unsigned                         blocked:1;
+};
+
+
+struct ngx_http_v2_node_s {
+    ngx_uint_t                       id;
+    ngx_http_v2_node_t              *index;
+    ngx_http_v2_node_t              *parent;
+    ngx_queue_t                      queue;
+    ngx_queue_t                      children;
+    ngx_queue_t                      reuse;
+    ngx_uint_t                       rank;
+    ngx_uint_t                       weight;
+    double                           rel_weight;
+    ngx_http_v2_stream_t            *stream;
+};
+
+
+struct ngx_http_v2_stream_s {
+    ngx_http_request_t              *request;
+    ngx_http_v2_connection_t        *connection;
+    ngx_http_v2_node_t              *node;
+
+    ngx_uint_t                       header_buffers;
+    ngx_uint_t                       queued;
+
+    /*
+     * A change to SETTINGS_INITIAL_WINDOW_SIZE could cause the
+     * send_window to become negative, hence it's signed.
+     */
+    ssize_t                          send_window;
+    size_t                           recv_window;
+
+    ngx_http_v2_out_frame_t         *free_frames;
+    ngx_chain_t                     *free_data_headers;
+    ngx_chain_t                     *free_bufs;
+
+    ngx_queue_t                      queue;
+
+    ngx_array_t                     *cookies;
+
+    size_t                           header_limit;
+
+    unsigned                         handled:1;
+    unsigned                         blocked:1;
+    unsigned                         exhausted:1;
+    unsigned                         in_closed:1;
+    unsigned                         out_closed:1;
+    unsigned                         skip_data:2;
+};
+
+
+struct ngx_http_v2_out_frame_s {
+    ngx_http_v2_out_frame_t         *next;
+    ngx_chain_t                     *first;
+    ngx_chain_t                     *last;
+    ngx_int_t                      (*handler)(ngx_http_v2_connection_t *h2c,
+                                        ngx_http_v2_out_frame_t *frame);
+
+    ngx_http_v2_stream_t            *stream;
+    size_t                           length;
+
+    unsigned                         blocked:1;
+    unsigned                         fin:1;
+};
+
+
+static ngx_inline void
+ngx_http_v2_queue_frame(ngx_http_v2_connection_t *h2c,
+    ngx_http_v2_out_frame_t *frame)
+{
+    ngx_http_v2_out_frame_t  **out;
+
+    for (out = &h2c->last_out; *out; out = &(*out)->next) {
+
+        if ((*out)->blocked || (*out)->stream == NULL) {
+            break;
+        }
+
+        if ((*out)->stream->node->rank < frame->stream->node->rank
+            || ((*out)->stream->node->rank == frame->stream->node->rank
+                && (*out)->stream->node->rel_weight
+                   >= frame->stream->node->rel_weight))
+        {
+            break;
+        }
+    }
+
+    frame->next = *out;
+    *out = frame;
+}
+
+
+static ngx_inline void
+ngx_http_v2_queue_blocked_frame(ngx_http_v2_connection_t *h2c,
+    ngx_http_v2_out_frame_t *frame)
+{
+    ngx_http_v2_out_frame_t  **out;
+
+    for (out = &h2c->last_out; *out; out = &(*out)->next)
+    {
+        if ((*out)->blocked || (*out)->stream == NULL) {
+            break;
+        }
+    }
+
+    frame->next = *out;
+    *out = frame;
+}
+
+
+void ngx_http_v2_init(ngx_event_t *rev);
+void ngx_http_v2_request_headers_init(void);
+
+ngx_int_t ngx_http_v2_read_request_body(ngx_http_request_t *r,
+    ngx_http_client_body_handler_pt post_handler);
+
+void ngx_http_v2_close_stream(ngx_http_v2_stream_t *stream, ngx_int_t rc);
+
+ngx_int_t ngx_http_v2_send_output_queue(ngx_http_v2_connection_t *h2c);
+
+
+ngx_int_t ngx_http_v2_get_indexed_header(ngx_http_v2_connection_t *h2c,
+    ngx_uint_t index, ngx_uint_t name_only);
+ngx_int_t ngx_http_v2_add_header(ngx_http_v2_connection_t *h2c,
+    ngx_http_v2_header_t *header);
+ngx_int_t ngx_http_v2_table_size(ngx_http_v2_connection_t *h2c, size_t size);
+
+
+ngx_int_t ngx_http_v2_huff_decode(u_char *state, u_char *src, size_t len,
+    u_char **dst, ngx_uint_t last, ngx_log_t *log);
+
+
+#define ngx_http_v2_prefix(bits)  ((1 << (bits)) - 1)
+
+
+#if (NGX_HAVE_NONALIGNED)
+
+#define ngx_http_v2_parse_uint16(p)  ntohs(*(uint16_t *) (p))
+#define ngx_http_v2_parse_uint32(p)  ntohl(*(uint32_t *) (p))
+
+#else
+
+#define ngx_http_v2_parse_uint16(p)  ((p)[0] << 8 | (p)[1])
+#define ngx_http_v2_parse_uint32(p)                                           \
+    ((p)[0] << 24 | (p)[1] << 16 | (p)[2] << 8 | (p)[3])
+
+#endif
+
+#define ngx_http_v2_parse_length(p)  ((p) >> 8)
+#define ngx_http_v2_parse_type(p)    ((p) & 0xff)
+#define ngx_http_v2_parse_sid(p)     (ngx_http_v2_parse_uint32(p) & 0x7fffffff)
+#define ngx_http_v2_parse_window(p)  (ngx_http_v2_parse_uint32(p) & 0x7fffffff)
+
+
+#define ngx_http_v2_write_uint16_aligned(p, s)                                \
+    (*(uint16_t *) (p) = htons((uint16_t) (s)), (p) + sizeof(uint16_t))
+#define ngx_http_v2_write_uint32_aligned(p, s)                                \
+    (*(uint32_t *) (p) = htonl((uint32_t) (s)), (p) + sizeof(uint32_t))
+
+#if (NGX_HAVE_NONALIGNED)
+
+#define ngx_http_v2_write_uint16  ngx_http_v2_write_uint16_aligned
+#define ngx_http_v2_write_uint32  ngx_http_v2_write_uint32_aligned
+
+#else
+
+#define ngx_http_v2_write_uint16(p, s)                                        \
+    ((p)[0] = (u_char) ((s) >> 8),                                            \
+     (p)[1] = (u_char)  (s),                                                  \
+     (p) + sizeof(uint16_t))
+
+#define ngx_http_v2_write_uint32(p, s)                                        \
+    ((p)[0] = (u_char) ((s) >> 24),                                           \
+     (p)[1] = (u_char) ((s) >> 16),                                           \
+     (p)[2] = (u_char) ((s) >> 8),                                            \
+     (p)[3] = (u_char)  (s),                                                  \
+     (p) + sizeof(uint32_t))
+
+#endif
+
+#define ngx_http_v2_write_len_and_type(p, l, t)                               \
+    ngx_http_v2_write_uint32_aligned(p, (l) << 8 | (t))
+
+#define ngx_http_v2_write_sid  ngx_http_v2_write_uint32
+
+#endif /* _NGX_HTTP_V2_H_INCLUDED_ */

  Added: vendor/nginx-1.9.5/src/http/v2/ngx_http_v2_filter_module.c (+1291 -0) 100644
===================================================================
--- /dev/null
+++ vendor/nginx-1.9.5/src/http/v2/ngx_http_v2_filter_module.c    2015-09-27 22:10:53 +0900 (17cfcd8)
@@ -0,0 +1,1291 @@
+
+/*
+ * Copyright (C) Nginx, Inc.
+ * Copyright (C) Valentin V. Bartenev
+ */
+
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+#include <ngx_http.h>
+#include <nginx.h>
+#include <ngx_http_v2_module.h>
+
+
+#define ngx_http_v2_integer_octets(v)  (((v) + 127) / 128)
+
+#define ngx_http_v2_literal_size(h)                                           \
+    (ngx_http_v2_integer_octets(sizeof(h) - 1) + sizeof(h) - 1)
+
+#define ngx_http_v2_indexed(i)      (128 + (i))
+#define ngx_http_v2_inc_indexed(i)  (64 + (i))
+
+
+#define NGX_HTTP_V2_STATUS_INDEX          8
+#define NGX_HTTP_V2_STATUS_200_INDEX      8
+#define NGX_HTTP_V2_STATUS_204_INDEX      9
+#define NGX_HTTP_V2_STATUS_206_INDEX      10
+#define NGX_HTTP_V2_STATUS_304_INDEX      11
+#define NGX_HTTP_V2_STATUS_400_INDEX      12
+#define NGX_HTTP_V2_STATUS_404_INDEX      13
+#define NGX_HTTP_V2_STATUS_500_INDEX      14
+
+#define NGX_HTTP_V2_CONTENT_LENGTH_INDEX  28
+#define NGX_HTTP_V2_CONTENT_TYPE_INDEX    31
+#define NGX_HTTP_V2_DATE_INDEX            33
+#define NGX_HTTP_V2_LAST_MODIFIED_INDEX   44
+#define NGX_HTTP_V2_LOCATION_INDEX        46
+#define NGX_HTTP_V2_SERVER_INDEX          54
+#define NGX_HTTP_V2_VARY_INDEX            59
+
+
+static u_char *ngx_http_v2_write_int(u_char *pos, ngx_uint_t prefix,
+    ngx_uint_t value);
+static void ngx_http_v2_write_headers_head(u_char *pos, size_t length,
+    ngx_uint_t sid, ngx_uint_t end_headers, ngx_uint_t end_stream);
+static void ngx_http_v2_write_continuation_head(u_char *pos, size_t length,
+    ngx_uint_t sid, ngx_uint_t end_headers);
+
+static ngx_chain_t *ngx_http_v2_send_chain(ngx_connection_t *fc,
+    ngx_chain_t *in, off_t limit);
+
+static ngx_chain_t *ngx_http_v2_filter_get_shadow(
+    ngx_http_v2_stream_t *stream, ngx_buf_t *buf, off_t offset, off_t size);
+static ngx_http_v2_out_frame_t *ngx_http_v2_filter_get_data_frame(
+    ngx_http_v2_stream_t *stream, size_t len, ngx_chain_t *first,
+    ngx_chain_t *last);
+
+static ngx_inline ngx_int_t ngx_http_v2_flow_control(
+    ngx_http_v2_connection_t *h2c, ngx_http_v2_stream_t *stream);
+static void ngx_http_v2_waiting_queue(ngx_http_v2_connection_t *h2c,
+    ngx_http_v2_stream_t *stream);
+
+static ngx_inline ngx_int_t ngx_http_v2_filter_send(
+    ngx_connection_t *fc, ngx_http_v2_stream_t *stream);
+
+static ngx_int_t ngx_http_v2_headers_frame_handler(
+    ngx_http_v2_connection_t *h2c, ngx_http_v2_out_frame_t *frame);
+static ngx_int_t ngx_http_v2_data_frame_handler(
+    ngx_http_v2_connection_t *h2c, ngx_http_v2_out_frame_t *frame);
+static ngx_inline void ngx_http_v2_handle_frame(
+    ngx_http_v2_stream_t *stream, ngx_http_v2_out_frame_t *frame);
+static ngx_inline void ngx_http_v2_handle_stream(
+    ngx_http_v2_connection_t *h2c, ngx_http_v2_stream_t *stream);
+
+static void ngx_http_v2_filter_cleanup(void *data);
+
+static ngx_int_t ngx_http_v2_filter_init(ngx_conf_t *cf);
+
+
+static ngx_http_module_t  ngx_http_v2_filter_module_ctx = {
+    NULL,                                  /* preconfiguration */
+    ngx_http_v2_filter_init,               /* postconfiguration */
+
+    NULL,                                  /* create main configuration */
+    NULL,                                  /* init main configuration */
+
+    NULL,                                  /* create server configuration */
+    NULL,                                  /* merge server configuration */
+
+    NULL,                                  /* create location configuration */
+    NULL                                   /* merge location configuration */
+};
+
+
+ngx_module_t  ngx_http_v2_filter_module = {
+    NGX_MODULE_V1,
+    &ngx_http_v2_filter_module_ctx,        /* module context */
+    NULL,                                  /* module directives */
+    NGX_HTTP_MODULE,                       /* module type */
+    NULL,                                  /* init master */
+    NULL,                                  /* init module */
+    NULL,                                  /* init process */
+    NULL,                                  /* init thread */
+    NULL,                                  /* exit thread */
+    NULL,                                  /* exit process */
+    NULL,                                  /* exit master */
+    NGX_MODULE_V1_PADDING
+};
+
+
+static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;
+
+
+static ngx_int_t
+ngx_http_v2_header_filter(ngx_http_request_t *r)
+{
+    u_char                     status, *p, *head;
+    size_t                     len, rest, frame_size;
+    ngx_buf_t                 *b;
+    ngx_str_t                  host, location;
+    ngx_uint_t                 i, port, continuation;
+    ngx_chain_t               *cl;
+    ngx_list_part_t           *part;
+    ngx_table_elt_t           *header;
+    ngx_connection_t          *fc;
+    ngx_http_cleanup_t        *cln;
+    ngx_http_v2_stream_t      *stream;
+    ngx_http_v2_out_frame_t   *frame;
+    ngx_http_core_loc_conf_t  *clcf;
+    ngx_http_core_srv_conf_t  *cscf;
+    struct sockaddr_in        *sin;
+#if (NGX_HAVE_INET6)
+    struct sockaddr_in6       *sin6;
+#endif
+    u_char                     addr[NGX_SOCKADDR_STRLEN];
+
+
+    if (!r->stream) {
+        return ngx_http_next_header_filter(r);
+    }
+
+    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+                   "http2 header filter");
+
+    if (r->header_sent) {
+        return NGX_OK;
+    }
+
+    r->header_sent = 1;
+
+    if (r != r->main) {
+        return NGX_OK;
+    }
+
+    if (r->method == NGX_HTTP_HEAD) {
+        r->header_only = 1;
+    }
+
+    switch (r->headers_out.status) {
+
+    case NGX_HTTP_OK:
+        status = ngx_http_v2_indexed(NGX_HTTP_V2_STATUS_200_INDEX);
+        break;
+
+    case NGX_HTTP_NO_CONTENT:
+        r->header_only = 1;
+
+        ngx_str_null(&r->headers_out.content_type);
+
+        r->headers_out.content_length = NULL;
+        r->headers_out.content_length_n = -1;
+
+        r->headers_out.last_modified_time = -1;
+        r->headers_out.last_modified = NULL;
+
+        status = ngx_http_v2_indexed(NGX_HTTP_V2_STATUS_204_INDEX);
+        break;
+
+    case NGX_HTTP_PARTIAL_CONTENT:
+        status = ngx_http_v2_indexed(NGX_HTTP_V2_STATUS_206_INDEX);
+        break;
+
+    case NGX_HTTP_NOT_MODIFIED:
+        r->header_only = 1;
+        status = ngx_http_v2_indexed(NGX_HTTP_V2_STATUS_304_INDEX);
+        break;
+
+    default:
+        r->headers_out.last_modified_time = -1;
+        r->headers_out.last_modified = NULL;
+
+        switch (r->headers_out.status) {
+
+        case NGX_HTTP_BAD_REQUEST:
+            status = ngx_http_v2_indexed(NGX_HTTP_V2_STATUS_400_INDEX);
+            break;
+
+        case NGX_HTTP_NOT_FOUND:
+            status = ngx_http_v2_indexed(NGX_HTTP_V2_STATUS_404_INDEX);
+            break;
+
+        case NGX_HTTP_INTERNAL_SERVER_ERROR:
+            status = ngx_http_v2_indexed(NGX_HTTP_V2_STATUS_500_INDEX);
+            break;
+
+        default:
+            status = 0;
+        }
+    }
+
+    len = status ? 1 : 1 + ngx_http_v2_literal_size("418");
+
+    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
+
+    if (r->headers_out.server == NULL) {
+        len += 1 + clcf->server_tokens ? ngx_http_v2_literal_size(NGINX_VER)
+                                       : ngx_http_v2_literal_size("nginx");
+    }
+
+    if (r->headers_out.date == NULL) {
+        len += 1 + ngx_http_v2_literal_size("Wed, 31 Dec 1986 18:00:00 GMT");
+    }
+
+    if (r->headers_out.content_type.len) {
+        len += NGX_HTTP_V2_INT_OCTETS + r->headers_out.content_type.len;
+
+        if (r->headers_out.content_type_len == r->headers_out.content_type.len
+            && r->headers_out.charset.len)
+        {
+            len += sizeof("; charset=") - 1 + r->headers_out.charset.len;
+        }
+    }
+
+    if (r->headers_out.content_length == NULL
+        && r->headers_out.content_length_n >= 0)
+    {
+        len += 1 + ngx_http_v2_integer_octets(NGX_OFF_T_LEN) + NGX_OFF_T_LEN;
+    }
+
+    if (r->headers_out.last_modified == NULL
+        && r->headers_out.last_modified_time != -1)
+    {
+        len += 1 + ngx_http_v2_literal_size("Wed, 31 Dec 1986 18:00:00 GMT");
+    }
+
+    fc = r->connection;
+
+    if (r->headers_out.location && r->headers_out.location->value.len) {
+
+        if (r->headers_out.location->value.data[0] == '/') {
+            if (clcf->server_name_in_redirect) {
+                cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);
+                host = cscf->server_name;
+
+            } else if (r->headers_in.server.len) {
+                host = r->headers_in.server;
+
+            } else {
+                host.len = NGX_SOCKADDR_STRLEN;
+                host.data = addr;
+
+                if (ngx_connection_local_sockaddr(fc, &host, 0) != NGX_OK) {
+                    return NGX_ERROR;
+                }
+            }
+
+            switch (fc->local_sockaddr->sa_family) {
+
+#if (NGX_HAVE_INET6)
+            case AF_INET6:
+                sin6 = (struct sockaddr_in6 *) fc->local_sockaddr;
+                port = ntohs(sin6->sin6_port);
+                break;
+#endif
+#if (NGX_HAVE_UNIX_DOMAIN)
+            case AF_UNIX:
+                port = 0;
+                break;
+#endif
+            default: /* AF_INET */
+                sin = (struct sockaddr_in *) fc->local_sockaddr;
+                port = ntohs(sin->sin_port);
+                break;
+            }
+
+            location.len = sizeof("https://") - 1 + host.len
+                           + r->headers_out.location->value.len;
+
+            if (clcf->port_in_redirect) {
+
+#if (NGX_HTTP_SSL)
+                if (fc->ssl)
+                    port = (port == 443) ? 0 : port;
+                else
+#endif
+                    port = (port == 80) ? 0 : port;
+
+            } else {
+                port = 0;
+            }
+
+            if (port) {
+                location.len += sizeof(":65535") - 1;
+            }
+
+            location.data = ngx_pnalloc(r->pool, location.len);
+            if (location.data == NULL) {
+                return NGX_ERROR;
+            }
+
+            p = ngx_cpymem(location.data, "http", sizeof("http") - 1);
+
+#if (NGX_HTTP_SSL)
+            if (fc->ssl) {
+                *p++ = 's';
+            }
+#endif
+
+            *p++ = ':'; *p++ = '/'; *p++ = '/';
+            p = ngx_cpymem(p, host.data, host.len);
+
+            if (port) {
+                p = ngx_sprintf(p, ":%ui", port);
+            }
+
+            p = ngx_cpymem(p, r->headers_out.location->value.data,
+                              r->headers_out.location->value.len);
+
+            /* update r->headers_out.location->value for possible logging */
+
+            r->headers_out.location->value.len = p - location.data;
+            r->headers_out.location->value.data = location.data;
+            ngx_str_set(&r->headers_out.location->key, "Location");
+        }
+
+        r->headers_out.location->hash = 0;
+
+        len += 1 + NGX_HTTP_V2_INT_OCTETS + r->headers_out.location->value.len;
+    }
+
+#if (NGX_HTTP_GZIP)
+    if (r->gzip_vary) {
+        if (clcf->gzip_vary) {
+            len += 1 + ngx_http_v2_literal_size("Accept-Encoding");
+
+        } else {
+            r->gzip_vary = 0;
+        }
+    }
+#endif
+
+    part = &r->headers_out.headers.part;
+    header = part->elts;
+
+    for (i = 0; /* void */; i++) {
+
+        if (i >= part->nelts) {
+            if (part->next == NULL) {
+                break;
+            }
+
+            part = part->next;
+            header = part->elts;
+            i = 0;
+        }
+
+        if (header[i].hash == 0) {
+            continue;
+        }
+
+        if (header[i].key.len > NGX_HTTP_V2_MAX_FIELD) {
+            ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,
+                          "too long response header name: \"%V\"",
+                          &header[i].key);
+            return NGX_ERROR;
+        }
+
+        if (header[i].value.len > NGX_HTTP_V2_MAX_FIELD) {
+            ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,
+                          "too long response header value: \"%V: %V\"",
+                          &header[i].key, &header[i].value);
+            return NGX_ERROR;
+        }
+
+        len += 1 + NGX_HTTP_V2_INT_OCTETS + header[i].key.len
+                 + NGX_HTTP_V2_INT_OCTETS + header[i].value.len;
+    }
+
+    stream = r->stream;
+    frame_size = stream->connection->frame_size;
+
+    len += NGX_HTTP_V2_FRAME_HEADER_SIZE
+           * ((len + frame_size - 1) / frame_size);
+
+    b = ngx_create_temp_buf(r->pool, len);
+    if (b == NULL) {
+        return NGX_ERROR;
+    }
+
+    b->last_buf = r->header_only;
+
+    b->last += NGX_HTTP_V2_FRAME_HEADER_SIZE;
+
+    if (status) {
+        *b->last++ = status;
+
+    } else {
+        *b->last++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_STATUS_INDEX);
+        *b->last++ = 3;
+        b->last = ngx_sprintf(b->last, "%03ui", r->headers_out.status);
+    }
+
+    if (r->headers_out.server == NULL) {
+        *b->last++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_SERVER_INDEX);
+
+        if (clcf->server_tokens) {
+            *b->last++ = sizeof(NGINX_VER) - 1;
+            b->last = ngx_cpymem(b->last, NGINX_VER, sizeof(NGINX_VER) - 1);
+
+        } else {
+            *b->last++ = sizeof("nginx") - 1;
+            b->last = ngx_cpymem(b->last, "nginx", sizeof("nginx") - 1);
+        }
+    }
+
+    if (r->headers_out.date == NULL) {
+        *b->last++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_DATE_INDEX);
+        *b->last++ = (u_char) ngx_cached_http_time.len;
+
+        b->last = ngx_cpymem(b->last, ngx_cached_http_time.data,
+                             ngx_cached_http_time.len);
+    }
+
+    if (r->headers_out.content_type.len) {
+        *b->last++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_CONTENT_TYPE_INDEX);
+
+        if (r->headers_out.content_type_len == r->headers_out.content_type.len
+            && r->headers_out.charset.len)
+        {
+            *b->last = 0;
+            b->last = ngx_http_v2_write_int(b->last, ngx_http_v2_prefix(7),
+                                            r->headers_out.content_type.len
+                                            + sizeof("; charset=") - 1
+                                            + r->headers_out.charset.len);
+
+            p = b->last;
+
+            b->last = ngx_cpymem(p, r->headers_out.content_type.data,
+                                 r->headers_out.content_type.len);
+
+            b->last = ngx_cpymem(b->last, "; charset=",
+                                 sizeof("; charset=") - 1);
+
+            b->last = ngx_cpymem(b->last, r->headers_out.charset.data,
+                                 r->headers_out.charset.len);
+
+            /* update r->headers_out.content_type for possible logging */
+
+            r->headers_out.content_type.len = b->last - p;
+            r->headers_out.content_type.data = p;
+
+        } else {
+            *b->last = 0;
+            b->last = ngx_http_v2_write_int(b->last, ngx_http_v2_prefix(7),
+                                            r->headers_out.content_type.len);
+            b->last = ngx_cpymem(b->last, r->headers_out.content_type.data,
+                                 r->headers_out.content_type.len);
+        }
+    }
+
+    if (r->headers_out.content_length == NULL
+        && r->headers_out.content_length_n >= 0)
+    {
+        *b->last++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_CONTENT_LENGTH_INDEX);
+
+        p = b->last;
+        b->last = ngx_sprintf(b->last + 1, "%O",
+                              r->headers_out.content_length_n);
+        *p = (u_char) (b->last - p - 1);
+    }
+
+    if (r->headers_out.last_modified == NULL
+        && r->headers_out.last_modified_time != -1)
+    {
+        *b->last++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_LAST_MODIFIED_INDEX);
+
+        p = b->last;
+        b->last = ngx_http_time(b->last + 1, r->headers_out.last_modified_time);
+        *p = (u_char) (b->last - p - 1);
+    }
+
+    if (r->headers_out.location && r->headers_out.location->value.len) {
+        *b->last++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_LOCATION_INDEX);
+
+        *b->last = 0;
+        b->last = ngx_http_v2_write_int(b->last, ngx_http_v2_prefix(7),
+                                        r->headers_out.location->value.len);
+        b->last = ngx_cpymem(b->last, r->headers_out.location->value.data,
+                                      r->headers_out.location->value.len);
+    }
+
+#if (NGX_HTTP_GZIP)
+    if (r->gzip_vary) {
+        *b->last++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_VARY_INDEX);
+        *b->last++ = sizeof("Accept-Encoding") - 1;
+        b->last = ngx_cpymem(b->last, "Accept-Encoding",
+                             sizeof("Accept-Encoding") - 1);
+    }
+#endif
+
+    continuation = 0;
+    head = b->pos;
+
+    len = b->last - head - NGX_HTTP_V2_FRAME_HEADER_SIZE;
+    rest = frame_size - len;
+
+    part = &r->headers_out.headers.part;
+    header = part->elts;
+
+    for (i = 0; /* void */; i++) {
+
+        if (i >= part->nelts) {
+            if (part->next == NULL) {
+                break;
+            }
+
+            part = part->next;
+            header = part->elts;
+            i = 0;
+        }
+
+        if (header[i].hash == 0) {
+            continue;
+        }
+
+        len = 1 + NGX_HTTP_V2_INT_OCTETS * 2
+              + header[i].key.len
+              + header[i].value.len;
+
+        if (len > rest) {
+            len = b->last - head - NGX_HTTP_V2_FRAME_HEADER_SIZE;
+
+            if (continuation) {
+                ngx_http_v2_write_continuation_head(head, len,
+                                                    stream->node->id, 0);
+            } else {
+                continuation = 1;
+                ngx_http_v2_write_headers_head(head, len, stream->node->id, 0,
+                                               r->header_only);
+            }
+
+            rest = frame_size;
+            head = b->last;
+
+            b->last += NGX_HTTP_V2_FRAME_HEADER_SIZE;
+        }
+
+        p = b->last;
+
+        *p++ = 0;
+
+        *p = 0;
+        p = ngx_http_v2_write_int(p, ngx_http_v2_prefix(7), header[i].key.len);
+        ngx_strlow(p, header[i].key.data, header[i].key.len);
+        p += header[i].key.len;
+
+        *p = 0;
+        p = ngx_http_v2_write_int(p, ngx_http_v2_prefix(7),
+                                  header[i].value.len);
+        p = ngx_cpymem(p, header[i].value.data, header[i].value.len);
+
+        rest -= p - b->last;
+        b->last = p;
+    }
+
+    len = b->last - head - NGX_HTTP_V2_FRAME_HEADER_SIZE;
+
+    if (continuation) {
+        ngx_http_v2_write_continuation_head(head, len, stream->node->id, 1);
+
+    } else {
+        ngx_http_v2_write_headers_head(head, len, stream->node->id, 1,
+                                       r->header_only);
+    }
+
+    cl = ngx_alloc_chain_link(r->pool);
+    if (cl == NULL) {
+        return NGX_ERROR;
+    }
+
+    cl->buf = b;
+    cl->next = NULL;
+
+    frame = ngx_palloc(r->pool, sizeof(ngx_http_v2_out_frame_t));
+    if (frame == NULL) {
+        return NGX_ERROR;
+    }
+
+    frame->first = cl;
+    frame->last = cl;
+    frame->handler = ngx_http_v2_headers_frame_handler;
+    frame->stream = stream;
+    frame->length = b->last - b->pos - NGX_HTTP_V2_FRAME_HEADER_SIZE;
+    frame->blocked = 1;
+    frame->fin = r->header_only;
+
+    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, stream->request->connection->log, 0,
+                   "http2:%ui create HEADERS frame %p: len:%uz",
+                   stream->node->id, frame, frame->length);
+
+    ngx_http_v2_queue_blocked_frame(stream->connection, frame);
+
+    cln = ngx_http_cleanup_add(r, 0);
+    if (cln == NULL) {
+        return NGX_ERROR;
+    }
+
+    cln->handler = ngx_http_v2_filter_cleanup;
+    cln->data = stream;
+
+    stream->queued = 1;
+
+    fc->send_chain = ngx_http_v2_send_chain;
+    fc->need_last_buf = 1;
+
+    return ngx_http_v2_filter_send(fc, stream);
+}
+
+
+static u_char *
+ngx_http_v2_write_int(u_char *pos, ngx_uint_t prefix, ngx_uint_t value)
+{
+    if (value < prefix) {
+        *pos++ |= value;
+        return pos;
+    }
+
+    *pos++ |= prefix;
+    value -= prefix;
+
+    while (value >= 128) {
+        *pos++ = value % 128 + 128;
+        value /= 128;
+    }
+
+    *pos++ = (u_char) value;
+
+    return pos;
+}
+
+
+static void
+ngx_http_v2_write_headers_head(u_char *pos, size_t length, ngx_uint_t sid,
+    ngx_uint_t end_headers, ngx_uint_t end_stream)
+{
+    u_char  flags;
+
+    pos = ngx_http_v2_write_len_and_type(pos, length,
+                                         NGX_HTTP_V2_HEADERS_FRAME);
+
+    flags = NGX_HTTP_V2_NO_FLAG;
+
+    if (end_headers) {
+        flags |= NGX_HTTP_V2_END_HEADERS_FLAG;
+    }
+
+    if (end_stream) {
+        flags |= NGX_HTTP_V2_END_STREAM_FLAG;
+    }
+
+    *pos++ = flags;
+
+    (void) ngx_http_v2_write_sid(pos, sid);
+}
+
+
+static void
+ngx_http_v2_write_continuation_head(u_char *pos, size_t length, ngx_uint_t sid,
+    ngx_uint_t end_headers)
+{
+    pos = ngx_http_v2_write_len_and_type(pos, length,
+                                         NGX_HTTP_V2_CONTINUATION_FRAME);
+
+    *pos++ = end_headers ? NGX_HTTP_V2_END_HEADERS_FLAG : NGX_HTTP_V2_NO_FLAG;
+
+    (void) ngx_http_v2_write_sid(pos, sid);
+}
+
+
+static ngx_chain_t *
+ngx_http_v2_send_chain(ngx_connection_t *fc, ngx_chain_t *in, off_t limit)
+{
+    off_t                      size, offset;
+    size_t                     rest, frame_size;
+    ngx_chain_t               *cl, *out, **ln;
+    ngx_http_request_t        *r;
+    ngx_http_v2_stream_t      *stream;
+    ngx_http_v2_loc_conf_t    *h2lcf;
+    ngx_http_v2_out_frame_t   *frame;
+    ngx_http_v2_connection_t  *h2c;
+
+    r = fc->data;
+    stream = r->stream;
+
+#if (NGX_SUPPRESS_WARN)
+    size = 0;
+#endif
+
+    while (in) {
+        size = ngx_buf_size(in->buf);
+
+        if (size || in->buf->last_buf) {
+            break;
+        }
+
+        in = in->next;
+    }
+
+    if (in == NULL) {
+
+        if (stream->queued) {
+            fc->write->delayed = 1;
+        } else {
+            fc->buffered &= ~NGX_HTTP_V2_BUFFERED;
+        }
+
+        return NULL;
+    }
+
+    h2c = stream->connection;
+
+    if (size && ngx_http_v2_flow_control(h2c, stream) == NGX_DECLINED) {
+        fc->write->delayed = 1;
+        return in;
+    }
+
+    if (in->buf->tag == (ngx_buf_tag_t) &ngx_http_v2_filter_get_shadow) {
+        cl = ngx_alloc_chain_link(r->pool);
+        if (cl == NULL) {
+            return NGX_CHAIN_ERROR;
+        }
+
+        cl->buf = in->buf;
+        in->buf = cl->buf->shadow;
+
+        offset = ngx_buf_in_memory(in->buf)
+                 ? (cl->buf->pos - in->buf->pos)
+                 : (cl->buf->file_pos - in->buf->file_pos);
+
+        cl->next = stream->free_bufs;
+        stream->free_bufs = cl;
+
+    } else {
+        offset = 0;
+    }
+
+    if (limit == 0 || limit > (off_t) h2c->send_window) {
+        limit = h2c->send_window;
+    }
+
+    if (limit > stream->send_window) {
+        limit = (stream->send_window > 0) ? stream->send_window : 0;
+    }
+
+    h2lcf = ngx_http_get_module_loc_conf(r, ngx_http_v2_module);
+
+    frame_size = (h2lcf->chunk_size < h2c->frame_size)
+                 ? h2lcf->chunk_size : h2c->frame_size;
+
+#if (NGX_SUPPRESS_WARN)
+    cl = NULL;
+#endif
+
+    for ( ;; ) {
+        if ((off_t) frame_size > limit) {
+            frame_size = (size_t) limit;
+        }
+
+        ln = &out;
+        rest = frame_size;
+
+        while ((off_t) rest >= size) {
+
+            if (offset) {
+                cl = ngx_http_v2_filter_get_shadow(stream, in->buf,
+                                                   offset, size);
+                if (cl == NULL) {
+                    return NGX_CHAIN_ERROR;
+                }
+
+                offset = 0;
+
+            } else {
+                cl = ngx_alloc_chain_link(r->pool);
+                if (cl == NULL) {
+                    return NGX_CHAIN_ERROR;
+                }
+
+                cl->buf = in->buf;
+            }
+
+            *ln = cl;
+            ln = &cl->next;
+
+            rest -= (size_t) size;
+            in = in->next;
+
+            if (in == NULL) {
+                frame_size -= rest;
+                rest = 0;
+                break;
+            }
+
+            size = ngx_buf_size(in->buf);
+        }
+
+        if (rest) {
+            cl = ngx_http_v2_filter_get_shadow(stream, in->buf, offset, rest);
+            if (cl == NULL) {
+                return NGX_CHAIN_ERROR;
+            }
+
+            cl->buf->flush = 0;
+            cl->buf->last_buf = 0;
+
+            *ln = cl;
+
+            offset += rest;
+            size -= rest;
+        }
+
+        frame = ngx_http_v2_filter_get_data_frame(stream, frame_size, out, cl);
+        if (frame == NULL) {
+            return NGX_CHAIN_ERROR;
+        }
+
+        ngx_http_v2_queue_frame(h2c, frame);
+
+        h2c->send_window -= frame_size;
+
+        stream->send_window -= frame_size;
+        stream->queued++;
+
+        if (in == NULL) {
+            break;
+        }
+
+        limit -= frame_size;
+
+        if (limit == 0) {
+            break;
+        }
+    }
+
+    if (offset) {
+        cl = ngx_http_v2_filter_get_shadow(stream, in->buf, offset, size);
+        if (cl == NULL) {
+            return NGX_CHAIN_ERROR;
+        }
+
+        in->buf = cl->buf;
+        ngx_free_chain(r->pool, cl);
+    }
+
+    if (ngx_http_v2_filter_send(fc, stream) == NGX_ERROR) {
+        return NGX_CHAIN_ERROR;
+    }
+
+    if (in && ngx_http_v2_flow_control(h2c, stream) == NGX_DECLINED) {
+        fc->write->delayed = 1;
+    }
+
+    return in;
+}
+
+
+static ngx_chain_t *
+ngx_http_v2_filter_get_shadow(ngx_http_v2_stream_t *stream, ngx_buf_t *buf,
+    off_t offset, off_t size)
+{
+    ngx_buf_t    *chunk;
+    ngx_chain_t  *cl;
+
+    cl = ngx_chain_get_free_buf(stream->request->pool, &stream->free_bufs);
+    if (cl == NULL) {
+        return NULL;
+    }
+
+    chunk = cl->buf;
+
+    ngx_memcpy(chunk, buf, sizeof(ngx_buf_t));
+
+    chunk->tag = (ngx_buf_tag_t) &ngx_http_v2_filter_get_shadow;
+    chunk->shadow = buf;
+
+    if (ngx_buf_in_memory(chunk)) {
+        chunk->pos += offset;
+        chunk->last = chunk->pos + size;
+    }
+
+    if (chunk->in_file) {
+        chunk->file_pos += offset;
+        chunk->file_last = chunk->file_pos + size;
+    }
+
+    return cl;
+}
+
+
+static ngx_http_v2_out_frame_t *
+ngx_http_v2_filter_get_data_frame(ngx_http_v2_stream_t *stream,
+    size_t len, ngx_chain_t *first, ngx_chain_t *last)
+{
+    u_char                      flags;
+    ngx_buf_t                  *buf;
+    ngx_chain_t                *cl;
+    ngx_http_v2_out_frame_t  *frame;
+
+
+    frame = stream->free_frames;
+
+    if (frame) {
+        stream->free_frames = frame->next;
+
+    } else {
+        frame = ngx_palloc(stream->request->pool,
+                           sizeof(ngx_http_v2_out_frame_t));
+        if (frame == NULL) {
+            return NULL;
+        }
+    }
+
+    flags = last->buf->last_buf ? NGX_HTTP_V2_END_STREAM_FLAG : 0;
+
+    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, stream->request->connection->log, 0,
+                   "http2:%ui create DATA frame %p: len:%uz flags:%ui",
+                   stream->node->id, frame, len, (ngx_uint_t) flags);
+
+    cl = ngx_chain_get_free_buf(stream->request->pool,
+                                &stream->free_data_headers);
+    if (cl == NULL) {
+        return NULL;
+    }
+
+    buf = cl->buf;
+
+    if (!buf->start) {
+        buf->start = ngx_palloc(stream->request->pool,
+                                NGX_HTTP_V2_FRAME_HEADER_SIZE);
+        if (buf->start == NULL) {
+            return NULL;
+        }
+
+        buf->end = buf->start + NGX_HTTP_V2_FRAME_HEADER_SIZE;
+        buf->last = buf->end;
+
+        buf->tag = (ngx_buf_tag_t) &ngx_http_v2_filter_get_data_frame;
+        buf->memory = 1;
+    }
+
+    buf->pos = buf->start;
+    buf->last = buf->pos;
+
+    buf->last = ngx_http_v2_write_len_and_type(buf->last, len,
+                                               NGX_HTTP_V2_DATA_FRAME);
+    *buf->last++ = flags;
+
+    buf->last = ngx_http_v2_write_sid(buf->last, stream->node->id);
+
+    cl->next = first;
+    first = cl;
+
+    last->buf->flush = 1;
+
+    frame->first = first;
+    frame->last = last;
+    frame->handler = ngx_http_v2_data_frame_handler;
+    frame->stream = stream;
+    frame->length = len;
+    frame->blocked = 0;
+    frame->fin = last->buf->last_buf;
+
+    return frame;
+}
+
+
+static ngx_inline ngx_int_t
+ngx_http_v2_filter_send(ngx_connection_t *fc, ngx_http_v2_stream_t *stream)
+{
+    stream->blocked = 1;
+
+    if (ngx_http_v2_send_output_queue(stream->connection) == NGX_ERROR) {
+        fc->error = 1;
+        return NGX_ERROR;
+    }
+
+    stream->blocked = 0;
+
+    if (stream->queued) {
+        fc->buffered |= NGX_HTTP_V2_BUFFERED;
+        fc->write->delayed = 1;
+        return NGX_AGAIN;
+    }
+
+    fc->buffered &= ~NGX_HTTP_V2_BUFFERED;
+
+    return NGX_OK;
+}
+
+
+static ngx_inline ngx_int_t
+ngx_http_v2_flow_control(ngx_http_v2_connection_t *h2c,
+    ngx_http_v2_stream_t *stream)
+{
+    if (stream->send_window <= 0) {
+        stream->exhausted = 1;
+        return NGX_DECLINED;
+    }
+
+    if (h2c->send_window == 0) {
+        ngx_http_v2_waiting_queue(h2c, stream);
+        return NGX_DECLINED;
+    }
+
+    return NGX_OK;
+}
+
+
+static void
+ngx_http_v2_waiting_queue(ngx_http_v2_connection_t *h2c,
+    ngx_http_v2_stream_t *stream)
+{
+    ngx_queue_t           *q;
+    ngx_http_v2_stream_t  *s;
+
+    if (stream->handled) {
+        return;
+    }
+
+    stream->handled = 1;
+
+    for (q = ngx_queue_last(&h2c->waiting);
+         q != ngx_queue_sentinel(&h2c->waiting);
+         q = ngx_queue_prev(q))
+    {
+        s = ngx_queue_data(q, ngx_http_v2_stream_t, queue);
+
+        if (s->node->rank < stream->node->rank
+            || (s->node->rank == stream->node->rank
+                && s->node->rel_weight >= stream->node->rel_weight))
+        {
+            break;
+        }
+    }
+
+    ngx_queue_insert_after(q, &stream->queue);
+}
+
+
+
+static ngx_int_t
+ngx_http_v2_headers_frame_handler(ngx_http_v2_connection_t *h2c,
+    ngx_http_v2_out_frame_t *frame)
+{
+    ngx_buf_t             *buf;
+    ngx_http_v2_stream_t  *stream;
+
+    buf = frame->first->buf;
+
+    if (buf->pos != buf->last) {
+        return NGX_AGAIN;
+    }
+
+    stream = frame->stream;
+
+    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                   "http2:%ui HEADERS frame %p was sent",
+                   stream->node->id, frame);
+
+    ngx_free_chain(stream->request->pool, frame->first);
+
+    ngx_http_v2_handle_frame(stream, frame);
+
+    ngx_http_v2_handle_stream(h2c, stream);
+
+    return NGX_OK;
+}
+
+
+static ngx_int_t
+ngx_http_v2_data_frame_handler(ngx_http_v2_connection_t *h2c,
+    ngx_http_v2_out_frame_t *frame)
+{
+    ngx_buf_t             *buf;
+    ngx_chain_t           *cl, *ln;
+    ngx_http_v2_stream_t  *stream;
+
+    stream = frame->stream;
+
+    cl = frame->first;
+
+    if (cl->buf->tag == (ngx_buf_tag_t) &ngx_http_v2_filter_get_data_frame) {
+
+        if (cl->buf->pos != cl->buf->last) {
+            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                           "http2:%ui DATA frame %p was sent partially",
+                           stream->node->id, frame);
+
+            return NGX_AGAIN;
+        }
+
+        ln = cl->next;
+
+        cl->next = stream->free_data_headers;
+        stream->free_data_headers = cl;
+
+        if (cl == frame->last) {
+            goto done;
+        }
+
+        cl = ln;
+    }
+
+    for ( ;; ) {
+        if (cl->buf->tag == (ngx_buf_tag_t) &ngx_http_v2_filter_get_shadow) {
+            buf = cl->buf->shadow;
+
+            if (ngx_buf_in_memory(buf)) {
+                buf->pos = cl->buf->pos;
+            }
+
+            if (buf->in_file) {
+                buf->file_pos = cl->buf->file_pos;
+            }
+        }
+
+        if (ngx_buf_size(cl->buf) != 0) {
+
+            if (cl != frame->first) {
+                frame->first = cl;
+                ngx_http_v2_handle_stream(h2c, stream);
+            }
+
+            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                           "http2:%ui DATA frame %p was sent partially",
+                           stream->node->id, frame);
+
+            return NGX_AGAIN;
+        }
+
+        ln = cl->next;
+
+        if (cl->buf->tag == (ngx_buf_tag_t) &ngx_http_v2_filter_get_shadow) {
+            cl->next = stream->free_bufs;
+            stream->free_bufs = cl;
+
+        } else {
+            ngx_free_chain(stream->request->pool, cl);
+        }
+
+        if (cl == frame->last) {
+            goto done;
+        }
+
+        cl = ln;
+    }
+
+done:
+
+    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                   "http2:%ui DATA frame %p was sent",
+                   stream->node->id, frame);
+
+    stream->request->header_size += NGX_HTTP_V2_FRAME_HEADER_SIZE;
+
+    ngx_http_v2_handle_frame(stream, frame);
+
+    ngx_http_v2_handle_stream(h2c, stream);
+
+    return NGX_OK;
+}
+
+
+static ngx_inline void
+ngx_http_v2_handle_frame(ngx_http_v2_stream_t *stream,
+    ngx_http_v2_out_frame_t *frame)
+{
+    ngx_http_request_t  *r;
+
+    r = stream->request;
+
+    r->connection->sent += NGX_HTTP_V2_FRAME_HEADER_SIZE + frame->length;
+
+    if (frame->fin) {
+        stream->out_closed = 1;
+    }
+
+    frame->next = stream->free_frames;
+    stream->free_frames = frame;
+
+    stream->queued--;
+}
+
+
+static ngx_inline void
+ngx_http_v2_handle_stream(ngx_http_v2_connection_t *h2c,
+    ngx_http_v2_stream_t *stream)
+{
+    ngx_event_t  *wev;
+
+    if (stream->handled || stream->blocked || stream->exhausted) {
+        return;
+    }
+
+    wev = stream->request->connection->write;
+
+    /*
+     * This timer can only be set if the stream was delayed because of rate
+     * limit.  In that case the event should be triggered by the timer.
+     */
+
+    if (!wev->timer_set) {
+        wev->delayed = 0;
+
+        stream->handled = 1;
+        ngx_queue_insert_tail(&h2c->posted, &stream->queue);
+    }
+}
+
+
+static void
+ngx_http_v2_filter_cleanup(void *data)
+{
+    ngx_http_v2_stream_t *stream = data;
+
+    size_t                     window;
+    ngx_http_v2_out_frame_t   *frame, **fn;
+    ngx_http_v2_connection_t  *h2c;
+
+    if (stream->handled) {
+        stream->handled = 0;
+        ngx_queue_remove(&stream->queue);
+    }
+
+    if (stream->queued == 0) {
+        return;
+    }
+
+    window = 0;
+    h2c = stream->connection;
+    fn = &h2c->last_out;
+
+    for ( ;; ) {
+        frame = *fn;
+
+        if (frame == NULL) {
+            break;
+        }
+
+        if (frame->stream == stream && !frame->blocked) {
+            *fn = frame->next;
+
+            window += frame->length;
+
+            if (--stream->queued == 0) {
+                break;
+            }
+
+            continue;
+        }
+
+        fn = &frame->next;
+    }
+
+    if (h2c->send_window == 0 && window && !ngx_queue_empty(&h2c->waiting)) {
+        ngx_queue_add(&h2c->posted, &h2c->waiting);
+        ngx_queue_init(&h2c->waiting);
+    }
+
+    h2c->send_window += window;
+}
+
+
+static ngx_int_t
+ngx_http_v2_filter_init(ngx_conf_t *cf)
+{
+    ngx_http_next_header_filter = ngx_http_top_header_filter;
+    ngx_http_top_header_filter = ngx_http_v2_header_filter;
+
+    return NGX_OK;
+}

  Added: vendor/nginx-1.9.5/src/http/v2/ngx_http_v2_huff_decode.c (+2714 -0) 100644
===================================================================
--- /dev/null
+++ vendor/nginx-1.9.5/src/http/v2/ngx_http_v2_huff_decode.c    2015-09-27 22:10:53 +0900 (49ca576)
@@ -0,0 +1,2714 @@
+
+/*
+ * Copyright (C) Nginx, Inc.
+ * Copyright (C) Valentin V. Bartenev
+ */
+
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+#include <ngx_http.h>
+
+
+typedef struct {
+    u_char  next;
+    u_char  emit;
+    u_char  sym;
+    u_char  ending;
+} ngx_http_v2_huff_decode_code_t;
+
+
+static ngx_inline ngx_int_t ngx_http_v2_huff_decode_bits(u_char *state,
+    u_char *ending, ngx_uint_t bits, u_char **dst);
+
+
+static ngx_http_v2_huff_decode_code_t  ngx_http_v2_huff_decode_codes[256][16] =
+{
+    /* 0 */
+    {
+        {0x04, 0x00, 0x00, 0x00}, {0x05, 0x00, 0x00, 0x00},
+        {0x07, 0x00, 0x00, 0x00}, {0x08, 0x00, 0x00, 0x00},
+        {0x0b, 0x00, 0x00, 0x00}, {0x0c, 0x00, 0x00, 0x00},
+        {0x10, 0x00, 0x00, 0x00}, {0x13, 0x00, 0x00, 0x00},
+        {0x19, 0x00, 0x00, 0x00}, {0x1c, 0x00, 0x00, 0x00},
+        {0x20, 0x00, 0x00, 0x00}, {0x23, 0x00, 0x00, 0x00},
+        {0x2a, 0x00, 0x00, 0x00}, {0x31, 0x00, 0x00, 0x00},
+        {0x39, 0x00, 0x00, 0x00}, {0x40, 0x00, 0x00, 0x01}
+    },
+    {
+        {0x00, 0x01, 0x30, 0x01}, {0x00, 0x01, 0x31, 0x01},
+        {0x00, 0x01, 0x32, 0x01}, {0x00, 0x01, 0x61, 0x01},
+        {0x00, 0x01, 0x63, 0x01}, {0x00, 0x01, 0x65, 0x01},
+        {0x00, 0x01, 0x69, 0x01}, {0x00, 0x01, 0x6f, 0x01},
+        {0x00, 0x01, 0x73, 0x01}, {0x00, 0x01, 0x74, 0x01},
+        {0x0d, 0x00, 0x00, 0x00}, {0x0e, 0x00, 0x00, 0x00},
+        {0x11, 0x00, 0x00, 0x00}, {0x12, 0x00, 0x00, 0x00},
+        {0x14, 0x00, 0x00, 0x00}, {0x15, 0x00, 0x00, 0x00}
+    },
+    {
+        {0x01, 0x01, 0x30, 0x00}, {0x16, 0x01, 0x30, 0x01},
+        {0x01, 0x01, 0x31, 0x00}, {0x16, 0x01, 0x31, 0x01},
+        {0x01, 0x01, 0x32, 0x00}, {0x16, 0x01, 0x32, 0x01},
+        {0x01, 0x01, 0x61, 0x00}, {0x16, 0x01, 0x61, 0x01},
+        {0x01, 0x01, 0x63, 0x00}, {0x16, 0x01, 0x63, 0x01},
+        {0x01, 0x01, 0x65, 0x00}, {0x16, 0x01, 0x65, 0x01},
+        {0x01, 0x01, 0x69, 0x00}, {0x16, 0x01, 0x69, 0x01},
+        {0x01, 0x01, 0x6f, 0x00}, {0x16, 0x01, 0x6f, 0x01}
+    },
+    {
+        {0x02, 0x01, 0x30, 0x00}, {0x09, 0x01, 0x30, 0x00},
+        {0x17, 0x01, 0x30, 0x00}, {0x28, 0x01, 0x30, 0x01},
+        {0x02, 0x01, 0x31, 0x00}, {0x09, 0x01, 0x31, 0x00},
+        {0x17, 0x01, 0x31, 0x00}, {0x28, 0x01, 0x31, 0x01},
+        {0x02, 0x01, 0x32, 0x00}, {0x09, 0x01, 0x32, 0x00},
+        {0x17, 0x01, 0x32, 0x00}, {0x28, 0x01, 0x32, 0x01},
+        {0x02, 0x01, 0x61, 0x00}, {0x09, 0x01, 0x61, 0x00},
+        {0x17, 0x01, 0x61, 0x00}, {0x28, 0x01, 0x61, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x30, 0x00}, {0x06, 0x01, 0x30, 0x00},
+        {0x0a, 0x01, 0x30, 0x00}, {0x0f, 0x01, 0x30, 0x00},
+        {0x18, 0x01, 0x30, 0x00}, {0x1f, 0x01, 0x30, 0x00},
+        {0x29, 0x01, 0x30, 0x00}, {0x38, 0x01, 0x30, 0x01},
+        {0x03, 0x01, 0x31, 0x00}, {0x06, 0x01, 0x31, 0x00},
+        {0x0a, 0x01, 0x31, 0x00}, {0x0f, 0x01, 0x31, 0x00},
+        {0x18, 0x01, 0x31, 0x00}, {0x1f, 0x01, 0x31, 0x00},
+        {0x29, 0x01, 0x31, 0x00}, {0x38, 0x01, 0x31, 0x01}
+    },
+    /* 5 */
+    {
+        {0x03, 0x01, 0x32, 0x00}, {0x06, 0x01, 0x32, 0x00},
+        {0x0a, 0x01, 0x32, 0x00}, {0x0f, 0x01, 0x32, 0x00},
+        {0x18, 0x01, 0x32, 0x00}, {0x1f, 0x01, 0x32, 0x00},
+        {0x29, 0x01, 0x32, 0x00}, {0x38, 0x01, 0x32, 0x01},
+        {0x03, 0x01, 0x61, 0x00}, {0x06, 0x01, 0x61, 0x00},
+        {0x0a, 0x01, 0x61, 0x00}, {0x0f, 0x01, 0x61, 0x00},
+        {0x18, 0x01, 0x61, 0x00}, {0x1f, 0x01, 0x61, 0x00},
+        {0x29, 0x01, 0x61, 0x00}, {0x38, 0x01, 0x61, 0x01}
+    },
+    {
+        {0x02, 0x01, 0x63, 0x00}, {0x09, 0x01, 0x63, 0x00},
+        {0x17, 0x01, 0x63, 0x00}, {0x28, 0x01, 0x63, 0x01},
+        {0x02, 0x01, 0x65, 0x00}, {0x09, 0x01, 0x65, 0x00},
+        {0x17, 0x01, 0x65, 0x00}, {0x28, 0x01, 0x65, 0x01},
+        {0x02, 0x01, 0x69, 0x00}, {0x09, 0x01, 0x69, 0x00},
+        {0x17, 0x01, 0x69, 0x00}, {0x28, 0x01, 0x69, 0x01},
+        {0x02, 0x01, 0x6f, 0x00}, {0x09, 0x01, 0x6f, 0x00},
+        {0x17, 0x01, 0x6f, 0x00}, {0x28, 0x01, 0x6f, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x63, 0x00}, {0x06, 0x01, 0x63, 0x00},
+        {0x0a, 0x01, 0x63, 0x00}, {0x0f, 0x01, 0x63, 0x00},
+        {0x18, 0x01, 0x63, 0x00}, {0x1f, 0x01, 0x63, 0x00},
+        {0x29, 0x01, 0x63, 0x00}, {0x38, 0x01, 0x63, 0x01},
+        {0x03, 0x01, 0x65, 0x00}, {0x06, 0x01, 0x65, 0x00},
+        {0x0a, 0x01, 0x65, 0x00}, {0x0f, 0x01, 0x65, 0x00},
+        {0x18, 0x01, 0x65, 0x00}, {0x1f, 0x01, 0x65, 0x00},
+        {0x29, 0x01, 0x65, 0x00}, {0x38, 0x01, 0x65, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x69, 0x00}, {0x06, 0x01, 0x69, 0x00},
+        {0x0a, 0x01, 0x69, 0x00}, {0x0f, 0x01, 0x69, 0x00},
+        {0x18, 0x01, 0x69, 0x00}, {0x1f, 0x01, 0x69, 0x00},
+        {0x29, 0x01, 0x69, 0x00}, {0x38, 0x01, 0x69, 0x01},
+        {0x03, 0x01, 0x6f, 0x00}, {0x06, 0x01, 0x6f, 0x00},
+        {0x0a, 0x01, 0x6f, 0x00}, {0x0f, 0x01, 0x6f, 0x00},
+        {0x18, 0x01, 0x6f, 0x00}, {0x1f, 0x01, 0x6f, 0x00},
+        {0x29, 0x01, 0x6f, 0x00}, {0x38, 0x01, 0x6f, 0x01}
+    },
+    {
+        {0x01, 0x01, 0x73, 0x00}, {0x16, 0x01, 0x73, 0x01},
+        {0x01, 0x01, 0x74, 0x00}, {0x16, 0x01, 0x74, 0x01},
+        {0x00, 0x01, 0x20, 0x01}, {0x00, 0x01, 0x25, 0x01},
+        {0x00, 0x01, 0x2d, 0x01}, {0x00, 0x01, 0x2e, 0x01},
+        {0x00, 0x01, 0x2f, 0x01}, {0x00, 0x01, 0x33, 0x01},
+        {0x00, 0x01, 0x34, 0x01}, {0x00, 0x01, 0x35, 0x01},
+        {0x00, 0x01, 0x36, 0x01}, {0x00, 0x01, 0x37, 0x01},
+        {0x00, 0x01, 0x38, 0x01}, {0x00, 0x01, 0x39, 0x01}
+    },
+    /* 10 */
+    {
+        {0x02, 0x01, 0x73, 0x00}, {0x09, 0x01, 0x73, 0x00},
+        {0x17, 0x01, 0x73, 0x00}, {0x28, 0x01, 0x73, 0x01},
+        {0x02, 0x01, 0x74, 0x00}, {0x09, 0x01, 0x74, 0x00},
+        {0x17, 0x01, 0x74, 0x00}, {0x28, 0x01, 0x74, 0x01},
+        {0x01, 0x01, 0x20, 0x00}, {0x16, 0x01, 0x20, 0x01},
+        {0x01, 0x01, 0x25, 0x00}, {0x16, 0x01, 0x25, 0x01},
+        {0x01, 0x01, 0x2d, 0x00}, {0x16, 0x01, 0x2d, 0x01},
+        {0x01, 0x01, 0x2e, 0x00}, {0x16, 0x01, 0x2e, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x73, 0x00}, {0x06, 0x01, 0x73, 0x00},
+        {0x0a, 0x01, 0x73, 0x00}, {0x0f, 0x01, 0x73, 0x00},
+        {0x18, 0x01, 0x73, 0x00}, {0x1f, 0x01, 0x73, 0x00},
+        {0x29, 0x01, 0x73, 0x00}, {0x38, 0x01, 0x73, 0x01},
+        {0x03, 0x01, 0x74, 0x00}, {0x06, 0x01, 0x74, 0x00},
+        {0x0a, 0x01, 0x74, 0x00}, {0x0f, 0x01, 0x74, 0x00},
+        {0x18, 0x01, 0x74, 0x00}, {0x1f, 0x01, 0x74, 0x00},
+        {0x29, 0x01, 0x74, 0x00}, {0x38, 0x01, 0x74, 0x01}
+    },
+    {
+        {0x02, 0x01, 0x20, 0x00}, {0x09, 0x01, 0x20, 0x00},
+        {0x17, 0x01, 0x20, 0x00}, {0x28, 0x01, 0x20, 0x01},
+        {0x02, 0x01, 0x25, 0x00}, {0x09, 0x01, 0x25, 0x00},
+        {0x17, 0x01, 0x25, 0x00}, {0x28, 0x01, 0x25, 0x01},
+        {0x02, 0x01, 0x2d, 0x00}, {0x09, 0x01, 0x2d, 0x00},
+        {0x17, 0x01, 0x2d, 0x00}, {0x28, 0x01, 0x2d, 0x01},
+        {0x02, 0x01, 0x2e, 0x00}, {0x09, 0x01, 0x2e, 0x00},
+        {0x17, 0x01, 0x2e, 0x00}, {0x28, 0x01, 0x2e, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x20, 0x00}, {0x06, 0x01, 0x20, 0x00},
+        {0x0a, 0x01, 0x20, 0x00}, {0x0f, 0x01, 0x20, 0x00},
+        {0x18, 0x01, 0x20, 0x00}, {0x1f, 0x01, 0x20, 0x00},
+        {0x29, 0x01, 0x20, 0x00}, {0x38, 0x01, 0x20, 0x01},
+        {0x03, 0x01, 0x25, 0x00}, {0x06, 0x01, 0x25, 0x00},
+        {0x0a, 0x01, 0x25, 0x00}, {0x0f, 0x01, 0x25, 0x00},
+        {0x18, 0x01, 0x25, 0x00}, {0x1f, 0x01, 0x25, 0x00},
+        {0x29, 0x01, 0x25, 0x00}, {0x38, 0x01, 0x25, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x2d, 0x00}, {0x06, 0x01, 0x2d, 0x00},
+        {0x0a, 0x01, 0x2d, 0x00}, {0x0f, 0x01, 0x2d, 0x00},
+        {0x18, 0x01, 0x2d, 0x00}, {0x1f, 0x01, 0x2d, 0x00},
+        {0x29, 0x01, 0x2d, 0x00}, {0x38, 0x01, 0x2d, 0x01},
+        {0x03, 0x01, 0x2e, 0x00}, {0x06, 0x01, 0x2e, 0x00},
+        {0x0a, 0x01, 0x2e, 0x00}, {0x0f, 0x01, 0x2e, 0x00},
+        {0x18, 0x01, 0x2e, 0x00}, {0x1f, 0x01, 0x2e, 0x00},
+        {0x29, 0x01, 0x2e, 0x00}, {0x38, 0x01, 0x2e, 0x01}
+    },
+    /* 15 */
+    {
+        {0x01, 0x01, 0x2f, 0x00}, {0x16, 0x01, 0x2f, 0x01},
+        {0x01, 0x01, 0x33, 0x00}, {0x16, 0x01, 0x33, 0x01},
+        {0x01, 0x01, 0x34, 0x00}, {0x16, 0x01, 0x34, 0x01},
+        {0x01, 0x01, 0x35, 0x00}, {0x16, 0x01, 0x35, 0x01},
+        {0x01, 0x01, 0x36, 0x00}, {0x16, 0x01, 0x36, 0x01},
+        {0x01, 0x01, 0x37, 0x00}, {0x16, 0x01, 0x37, 0x01},
+        {0x01, 0x01, 0x38, 0x00}, {0x16, 0x01, 0x38, 0x01},
+        {0x01, 0x01, 0x39, 0x00}, {0x16, 0x01, 0x39, 0x01}
+    },
+    {
+        {0x02, 0x01, 0x2f, 0x00}, {0x09, 0x01, 0x2f, 0x00},
+        {0x17, 0x01, 0x2f, 0x00}, {0x28, 0x01, 0x2f, 0x01},
+        {0x02, 0x01, 0x33, 0x00}, {0x09, 0x01, 0x33, 0x00},
+        {0x17, 0x01, 0x33, 0x00}, {0x28, 0x01, 0x33, 0x01},
+        {0x02, 0x01, 0x34, 0x00}, {0x09, 0x01, 0x34, 0x00},
+        {0x17, 0x01, 0x34, 0x00}, {0x28, 0x01, 0x34, 0x01},
+        {0x02, 0x01, 0x35, 0x00}, {0x09, 0x01, 0x35, 0x00},
+        {0x17, 0x01, 0x35, 0x00}, {0x28, 0x01, 0x35, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x2f, 0x00}, {0x06, 0x01, 0x2f, 0x00},
+        {0x0a, 0x01, 0x2f, 0x00}, {0x0f, 0x01, 0x2f, 0x00},
+        {0x18, 0x01, 0x2f, 0x00}, {0x1f, 0x01, 0x2f, 0x00},
+        {0x29, 0x01, 0x2f, 0x00}, {0x38, 0x01, 0x2f, 0x01},
+        {0x03, 0x01, 0x33, 0x00}, {0x06, 0x01, 0x33, 0x00},
+        {0x0a, 0x01, 0x33, 0x00}, {0x0f, 0x01, 0x33, 0x00},
+        {0x18, 0x01, 0x33, 0x00}, {0x1f, 0x01, 0x33, 0x00},
+        {0x29, 0x01, 0x33, 0x00}, {0x38, 0x01, 0x33, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x34, 0x00}, {0x06, 0x01, 0x34, 0x00},
+        {0x0a, 0x01, 0x34, 0x00}, {0x0f, 0x01, 0x34, 0x00},
+        {0x18, 0x01, 0x34, 0x00}, {0x1f, 0x01, 0x34, 0x00},
+        {0x29, 0x01, 0x34, 0x00}, {0x38, 0x01, 0x34, 0x01},
+        {0x03, 0x01, 0x35, 0x00}, {0x06, 0x01, 0x35, 0x00},
+        {0x0a, 0x01, 0x35, 0x00}, {0x0f, 0x01, 0x35, 0x00},
+        {0x18, 0x01, 0x35, 0x00}, {0x1f, 0x01, 0x35, 0x00},
+        {0x29, 0x01, 0x35, 0x00}, {0x38, 0x01, 0x35, 0x01}
+    },
+    {
+        {0x02, 0x01, 0x36, 0x00}, {0x09, 0x01, 0x36, 0x00},
+        {0x17, 0x01, 0x36, 0x00}, {0x28, 0x01, 0x36, 0x01},
+        {0x02, 0x01, 0x37, 0x00}, {0x09, 0x01, 0x37, 0x00},
+        {0x17, 0x01, 0x37, 0x00}, {0x28, 0x01, 0x37, 0x01},
+        {0x02, 0x01, 0x38, 0x00}, {0x09, 0x01, 0x38, 0x00},
+        {0x17, 0x01, 0x38, 0x00}, {0x28, 0x01, 0x38, 0x01},
+        {0x02, 0x01, 0x39, 0x00}, {0x09, 0x01, 0x39, 0x00},
+        {0x17, 0x01, 0x39, 0x00}, {0x28, 0x01, 0x39, 0x01}
+    },
+    /* 20 */
+    {
+        {0x03, 0x01, 0x36, 0x00}, {0x06, 0x01, 0x36, 0x00},
+        {0x0a, 0x01, 0x36, 0x00}, {0x0f, 0x01, 0x36, 0x00},
+        {0x18, 0x01, 0x36, 0x00}, {0x1f, 0x01, 0x36, 0x00},
+        {0x29, 0x01, 0x36, 0x00}, {0x38, 0x01, 0x36, 0x01},
+        {0x03, 0x01, 0x37, 0x00}, {0x06, 0x01, 0x37, 0x00},
+        {0x0a, 0x01, 0x37, 0x00}, {0x0f, 0x01, 0x37, 0x00},
+        {0x18, 0x01, 0x37, 0x00}, {0x1f, 0x01, 0x37, 0x00},
+        {0x29, 0x01, 0x37, 0x00}, {0x38, 0x01, 0x37, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x38, 0x00}, {0x06, 0x01, 0x38, 0x00},
+        {0x0a, 0x01, 0x38, 0x00}, {0x0f, 0x01, 0x38, 0x00},
+        {0x18, 0x01, 0x38, 0x00}, {0x1f, 0x01, 0x38, 0x00},
+        {0x29, 0x01, 0x38, 0x00}, {0x38, 0x01, 0x38, 0x01},
+        {0x03, 0x01, 0x39, 0x00}, {0x06, 0x01, 0x39, 0x00},
+        {0x0a, 0x01, 0x39, 0x00}, {0x0f, 0x01, 0x39, 0x00},
+        {0x18, 0x01, 0x39, 0x00}, {0x1f, 0x01, 0x39, 0x00},
+        {0x29, 0x01, 0x39, 0x00}, {0x38, 0x01, 0x39, 0x01}
+    },
+    {
+        {0x1a, 0x00, 0x00, 0x00}, {0x1b, 0x00, 0x00, 0x00},
+        {0x1d, 0x00, 0x00, 0x00}, {0x1e, 0x00, 0x00, 0x00},
+        {0x21, 0x00, 0x00, 0x00}, {0x22, 0x00, 0x00, 0x00},
+        {0x24, 0x00, 0x00, 0x00}, {0x25, 0x00, 0x00, 0x00},
+        {0x2b, 0x00, 0x00, 0x00}, {0x2e, 0x00, 0x00, 0x00},
+        {0x32, 0x00, 0x00, 0x00}, {0x35, 0x00, 0x00, 0x00},
+        {0x3a, 0x00, 0x00, 0x00}, {0x3d, 0x00, 0x00, 0x00},
+        {0x41, 0x00, 0x00, 0x00}, {0x44, 0x00, 0x00, 0x01}
+    },
+    {
+        {0x00, 0x01, 0x3d, 0x01}, {0x00, 0x01, 0x41, 0x01},
+        {0x00, 0x01, 0x5f, 0x01}, {0x00, 0x01, 0x62, 0x01},
+        {0x00, 0x01, 0x64, 0x01}, {0x00, 0x01, 0x66, 0x01},
+        {0x00, 0x01, 0x67, 0x01}, {0x00, 0x01, 0x68, 0x01},
+        {0x00, 0x01, 0x6c, 0x01}, {0x00, 0x01, 0x6d, 0x01},
+        {0x00, 0x01, 0x6e, 0x01}, {0x00, 0x01, 0x70, 0x01},
+        {0x00, 0x01, 0x72, 0x01}, {0x00, 0x01, 0x75, 0x01},
+        {0x26, 0x00, 0x00, 0x00}, {0x27, 0x00, 0x00, 0x00}
+    },
+    {
+        {0x01, 0x01, 0x3d, 0x00}, {0x16, 0x01, 0x3d, 0x01},
+        {0x01, 0x01, 0x41, 0x00}, {0x16, 0x01, 0x41, 0x01},
+        {0x01, 0x01, 0x5f, 0x00}, {0x16, 0x01, 0x5f, 0x01},
+        {0x01, 0x01, 0x62, 0x00}, {0x16, 0x01, 0x62, 0x01},
+        {0x01, 0x01, 0x64, 0x00}, {0x16, 0x01, 0x64, 0x01},
+        {0x01, 0x01, 0x66, 0x00}, {0x16, 0x01, 0x66, 0x01},
+        {0x01, 0x01, 0x67, 0x00}, {0x16, 0x01, 0x67, 0x01},
+        {0x01, 0x01, 0x68, 0x00}, {0x16, 0x01, 0x68, 0x01}
+    },
+    /* 25 */
+    {
+        {0x02, 0x01, 0x3d, 0x00}, {0x09, 0x01, 0x3d, 0x00},
+        {0x17, 0x01, 0x3d, 0x00}, {0x28, 0x01, 0x3d, 0x01},
+        {0x02, 0x01, 0x41, 0x00}, {0x09, 0x01, 0x41, 0x00},
+        {0x17, 0x01, 0x41, 0x00}, {0x28, 0x01, 0x41, 0x01},
+        {0x02, 0x01, 0x5f, 0x00}, {0x09, 0x01, 0x5f, 0x00},
+        {0x17, 0x01, 0x5f, 0x00}, {0x28, 0x01, 0x5f, 0x01},
+        {0x02, 0x01, 0x62, 0x00}, {0x09, 0x01, 0x62, 0x00},
+        {0x17, 0x01, 0x62, 0x00}, {0x28, 0x01, 0x62, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x3d, 0x00}, {0x06, 0x01, 0x3d, 0x00},
+        {0x0a, 0x01, 0x3d, 0x00}, {0x0f, 0x01, 0x3d, 0x00},
+        {0x18, 0x01, 0x3d, 0x00}, {0x1f, 0x01, 0x3d, 0x00},
+        {0x29, 0x01, 0x3d, 0x00}, {0x38, 0x01, 0x3d, 0x01},
+        {0x03, 0x01, 0x41, 0x00}, {0x06, 0x01, 0x41, 0x00},
+        {0x0a, 0x01, 0x41, 0x00}, {0x0f, 0x01, 0x41, 0x00},
+        {0x18, 0x01, 0x41, 0x00}, {0x1f, 0x01, 0x41, 0x00},
+        {0x29, 0x01, 0x41, 0x00}, {0x38, 0x01, 0x41, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x5f, 0x00}, {0x06, 0x01, 0x5f, 0x00},
+        {0x0a, 0x01, 0x5f, 0x00}, {0x0f, 0x01, 0x5f, 0x00},
+        {0x18, 0x01, 0x5f, 0x00}, {0x1f, 0x01, 0x5f, 0x00},
+        {0x29, 0x01, 0x5f, 0x00}, {0x38, 0x01, 0x5f, 0x01},
+        {0x03, 0x01, 0x62, 0x00}, {0x06, 0x01, 0x62, 0x00},
+        {0x0a, 0x01, 0x62, 0x00}, {0x0f, 0x01, 0x62, 0x00},
+        {0x18, 0x01, 0x62, 0x00}, {0x1f, 0x01, 0x62, 0x00},
+        {0x29, 0x01, 0x62, 0x00}, {0x38, 0x01, 0x62, 0x01}
+    },
+    {
+        {0x02, 0x01, 0x64, 0x00}, {0x09, 0x01, 0x64, 0x00},
+        {0x17, 0x01, 0x64, 0x00}, {0x28, 0x01, 0x64, 0x01},
+        {0x02, 0x01, 0x66, 0x00}, {0x09, 0x01, 0x66, 0x00},
+        {0x17, 0x01, 0x66, 0x00}, {0x28, 0x01, 0x66, 0x01},
+        {0x02, 0x01, 0x67, 0x00}, {0x09, 0x01, 0x67, 0x00},
+        {0x17, 0x01, 0x67, 0x00}, {0x28, 0x01, 0x67, 0x01},
+        {0x02, 0x01, 0x68, 0x00}, {0x09, 0x01, 0x68, 0x00},
+        {0x17, 0x01, 0x68, 0x00}, {0x28, 0x01, 0x68, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x64, 0x00}, {0x06, 0x01, 0x64, 0x00},
+        {0x0a, 0x01, 0x64, 0x00}, {0x0f, 0x01, 0x64, 0x00},
+        {0x18, 0x01, 0x64, 0x00}, {0x1f, 0x01, 0x64, 0x00},
+        {0x29, 0x01, 0x64, 0x00}, {0x38, 0x01, 0x64, 0x01},
+        {0x03, 0x01, 0x66, 0x00}, {0x06, 0x01, 0x66, 0x00},
+        {0x0a, 0x01, 0x66, 0x00}, {0x0f, 0x01, 0x66, 0x00},
+        {0x18, 0x01, 0x66, 0x00}, {0x1f, 0x01, 0x66, 0x00},
+        {0x29, 0x01, 0x66, 0x00}, {0x38, 0x01, 0x66, 0x01}
+    },
+    /* 30 */
+    {
+        {0x03, 0x01, 0x67, 0x00}, {0x06, 0x01, 0x67, 0x00},
+        {0x0a, 0x01, 0x67, 0x00}, {0x0f, 0x01, 0x67, 0x00},
+        {0x18, 0x01, 0x67, 0x00}, {0x1f, 0x01, 0x67, 0x00},
+        {0x29, 0x01, 0x67, 0x00}, {0x38, 0x01, 0x67, 0x01},
+        {0x03, 0x01, 0x68, 0x00}, {0x06, 0x01, 0x68, 0x00},
+        {0x0a, 0x01, 0x68, 0x00}, {0x0f, 0x01, 0x68, 0x00},
+        {0x18, 0x01, 0x68, 0x00}, {0x1f, 0x01, 0x68, 0x00},
+        {0x29, 0x01, 0x68, 0x00}, {0x38, 0x01, 0x68, 0x01}
+    },
+    {
+        {0x01, 0x01, 0x6c, 0x00}, {0x16, 0x01, 0x6c, 0x01},
+        {0x01, 0x01, 0x6d, 0x00}, {0x16, 0x01, 0x6d, 0x01},
+        {0x01, 0x01, 0x6e, 0x00}, {0x16, 0x01, 0x6e, 0x01},
+        {0x01, 0x01, 0x70, 0x00}, {0x16, 0x01, 0x70, 0x01},
+        {0x01, 0x01, 0x72, 0x00}, {0x16, 0x01, 0x72, 0x01},
+        {0x01, 0x01, 0x75, 0x00}, {0x16, 0x01, 0x75, 0x01},
+        {0x00, 0x01, 0x3a, 0x01}, {0x00, 0x01, 0x42, 0x01},
+        {0x00, 0x01, 0x43, 0x01}, {0x00, 0x01, 0x44, 0x01}
+    },
+    {
+        {0x02, 0x01, 0x6c, 0x00}, {0x09, 0x01, 0x6c, 0x00},
+        {0x17, 0x01, 0x6c, 0x00}, {0x28, 0x01, 0x6c, 0x01},
+        {0x02, 0x01, 0x6d, 0x00}, {0x09, 0x01, 0x6d, 0x00},
+        {0x17, 0x01, 0x6d, 0x00}, {0x28, 0x01, 0x6d, 0x01},
+        {0x02, 0x01, 0x6e, 0x00}, {0x09, 0x01, 0x6e, 0x00},
+        {0x17, 0x01, 0x6e, 0x00}, {0x28, 0x01, 0x6e, 0x01},
+        {0x02, 0x01, 0x70, 0x00}, {0x09, 0x01, 0x70, 0x00},
+        {0x17, 0x01, 0x70, 0x00}, {0x28, 0x01, 0x70, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x6c, 0x00}, {0x06, 0x01, 0x6c, 0x00},
+        {0x0a, 0x01, 0x6c, 0x00}, {0x0f, 0x01, 0x6c, 0x00},
+        {0x18, 0x01, 0x6c, 0x00}, {0x1f, 0x01, 0x6c, 0x00},
+        {0x29, 0x01, 0x6c, 0x00}, {0x38, 0x01, 0x6c, 0x01},
+        {0x03, 0x01, 0x6d, 0x00}, {0x06, 0x01, 0x6d, 0x00},
+        {0x0a, 0x01, 0x6d, 0x00}, {0x0f, 0x01, 0x6d, 0x00},
+        {0x18, 0x01, 0x6d, 0x00}, {0x1f, 0x01, 0x6d, 0x00},
+        {0x29, 0x01, 0x6d, 0x00}, {0x38, 0x01, 0x6d, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x6e, 0x00}, {0x06, 0x01, 0x6e, 0x00},
+        {0x0a, 0x01, 0x6e, 0x00}, {0x0f, 0x01, 0x6e, 0x00},
+        {0x18, 0x01, 0x6e, 0x00}, {0x1f, 0x01, 0x6e, 0x00},
+        {0x29, 0x01, 0x6e, 0x00}, {0x38, 0x01, 0x6e, 0x01},
+        {0x03, 0x01, 0x70, 0x00}, {0x06, 0x01, 0x70, 0x00},
+        {0x0a, 0x01, 0x70, 0x00}, {0x0f, 0x01, 0x70, 0x00},
+        {0x18, 0x01, 0x70, 0x00}, {0x1f, 0x01, 0x70, 0x00},
+        {0x29, 0x01, 0x70, 0x00}, {0x38, 0x01, 0x70, 0x01}
+    },
+    /* 35 */
+    {
+        {0x02, 0x01, 0x72, 0x00}, {0x09, 0x01, 0x72, 0x00},
+        {0x17, 0x01, 0x72, 0x00}, {0x28, 0x01, 0x72, 0x01},
+        {0x02, 0x01, 0x75, 0x00}, {0x09, 0x01, 0x75, 0x00},
+        {0x17, 0x01, 0x75, 0x00}, {0x28, 0x01, 0x75, 0x01},
+        {0x01, 0x01, 0x3a, 0x00}, {0x16, 0x01, 0x3a, 0x01},
+        {0x01, 0x01, 0x42, 0x00}, {0x16, 0x01, 0x42, 0x01},
+        {0x01, 0x01, 0x43, 0x00}, {0x16, 0x01, 0x43, 0x01},
+        {0x01, 0x01, 0x44, 0x00}, {0x16, 0x01, 0x44, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x72, 0x00}, {0x06, 0x01, 0x72, 0x00},
+        {0x0a, 0x01, 0x72, 0x00}, {0x0f, 0x01, 0x72, 0x00},
+        {0x18, 0x01, 0x72, 0x00}, {0x1f, 0x01, 0x72, 0x00},
+        {0x29, 0x01, 0x72, 0x00}, {0x38, 0x01, 0x72, 0x01},
+        {0x03, 0x01, 0x75, 0x00}, {0x06, 0x01, 0x75, 0x00},
+        {0x0a, 0x01, 0x75, 0x00}, {0x0f, 0x01, 0x75, 0x00},
+        {0x18, 0x01, 0x75, 0x00}, {0x1f, 0x01, 0x75, 0x00},
+        {0x29, 0x01, 0x75, 0x00}, {0x38, 0x01, 0x75, 0x01}
+    },
+    {
+        {0x02, 0x01, 0x3a, 0x00}, {0x09, 0x01, 0x3a, 0x00},
+        {0x17, 0x01, 0x3a, 0x00}, {0x28, 0x01, 0x3a, 0x01},
+        {0x02, 0x01, 0x42, 0x00}, {0x09, 0x01, 0x42, 0x00},
+        {0x17, 0x01, 0x42, 0x00}, {0x28, 0x01, 0x42, 0x01},
+        {0x02, 0x01, 0x43, 0x00}, {0x09, 0x01, 0x43, 0x00},
+        {0x17, 0x01, 0x43, 0x00}, {0x28, 0x01, 0x43, 0x01},
+        {0x02, 0x01, 0x44, 0x00}, {0x09, 0x01, 0x44, 0x00},
+        {0x17, 0x01, 0x44, 0x00}, {0x28, 0x01, 0x44, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x3a, 0x00}, {0x06, 0x01, 0x3a, 0x00},
+        {0x0a, 0x01, 0x3a, 0x00}, {0x0f, 0x01, 0x3a, 0x00},
+        {0x18, 0x01, 0x3a, 0x00}, {0x1f, 0x01, 0x3a, 0x00},
+        {0x29, 0x01, 0x3a, 0x00}, {0x38, 0x01, 0x3a, 0x01},
+        {0x03, 0x01, 0x42, 0x00}, {0x06, 0x01, 0x42, 0x00},
+        {0x0a, 0x01, 0x42, 0x00}, {0x0f, 0x01, 0x42, 0x00},
+        {0x18, 0x01, 0x42, 0x00}, {0x1f, 0x01, 0x42, 0x00},
+        {0x29, 0x01, 0x42, 0x00}, {0x38, 0x01, 0x42, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x43, 0x00}, {0x06, 0x01, 0x43, 0x00},
+        {0x0a, 0x01, 0x43, 0x00}, {0x0f, 0x01, 0x43, 0x00},
+        {0x18, 0x01, 0x43, 0x00}, {0x1f, 0x01, 0x43, 0x00},
+        {0x29, 0x01, 0x43, 0x00}, {0x38, 0x01, 0x43, 0x01},
+        {0x03, 0x01, 0x44, 0x00}, {0x06, 0x01, 0x44, 0x00},
+        {0x0a, 0x01, 0x44, 0x00}, {0x0f, 0x01, 0x44, 0x00},
+        {0x18, 0x01, 0x44, 0x00}, {0x1f, 0x01, 0x44, 0x00},
+        {0x29, 0x01, 0x44, 0x00}, {0x38, 0x01, 0x44, 0x01}
+    },
+    /* 40 */
+    {
+        {0x2c, 0x00, 0x00, 0x00}, {0x2d, 0x00, 0x00, 0x00},
+        {0x2f, 0x00, 0x00, 0x00}, {0x30, 0x00, 0x00, 0x00},
+        {0x33, 0x00, 0x00, 0x00}, {0x34, 0x00, 0x00, 0x00},
+        {0x36, 0x00, 0x00, 0x00}, {0x37, 0x00, 0x00, 0x00},
+        {0x3b, 0x00, 0x00, 0x00}, {0x3c, 0x00, 0x00, 0x00},
+        {0x3e, 0x00, 0x00, 0x00}, {0x3f, 0x00, 0x00, 0x00},
+        {0x42, 0x00, 0x00, 0x00}, {0x43, 0x00, 0x00, 0x00},
+        {0x45, 0x00, 0x00, 0x00}, {0x48, 0x00, 0x00, 0x01}
+    },
+    {
+        {0x00, 0x01, 0x45, 0x01}, {0x00, 0x01, 0x46, 0x01},
+        {0x00, 0x01, 0x47, 0x01}, {0x00, 0x01, 0x48, 0x01},
+        {0x00, 0x01, 0x49, 0x01}, {0x00, 0x01, 0x4a, 0x01},
+        {0x00, 0x01, 0x4b, 0x01}, {0x00, 0x01, 0x4c, 0x01},
+        {0x00, 0x01, 0x4d, 0x01}, {0x00, 0x01, 0x4e, 0x01},
+        {0x00, 0x01, 0x4f, 0x01}, {0x00, 0x01, 0x50, 0x01},
+        {0x00, 0x01, 0x51, 0x01}, {0x00, 0x01, 0x52, 0x01},
+        {0x00, 0x01, 0x53, 0x01}, {0x00, 0x01, 0x54, 0x01}
+    },
+    {
+        {0x01, 0x01, 0x45, 0x00}, {0x16, 0x01, 0x45, 0x01},
+        {0x01, 0x01, 0x46, 0x00}, {0x16, 0x01, 0x46, 0x01},
+        {0x01, 0x01, 0x47, 0x00}, {0x16, 0x01, 0x47, 0x01},
+        {0x01, 0x01, 0x48, 0x00}, {0x16, 0x01, 0x48, 0x01},
+        {0x01, 0x01, 0x49, 0x00}, {0x16, 0x01, 0x49, 0x01},
+        {0x01, 0x01, 0x4a, 0x00}, {0x16, 0x01, 0x4a, 0x01},
+        {0x01, 0x01, 0x4b, 0x00}, {0x16, 0x01, 0x4b, 0x01},
+        {0x01, 0x01, 0x4c, 0x00}, {0x16, 0x01, 0x4c, 0x01}
+    },
+    {
+        {0x02, 0x01, 0x45, 0x00}, {0x09, 0x01, 0x45, 0x00},
+        {0x17, 0x01, 0x45, 0x00}, {0x28, 0x01, 0x45, 0x01},
+        {0x02, 0x01, 0x46, 0x00}, {0x09, 0x01, 0x46, 0x00},
+        {0x17, 0x01, 0x46, 0x00}, {0x28, 0x01, 0x46, 0x01},
+        {0x02, 0x01, 0x47, 0x00}, {0x09, 0x01, 0x47, 0x00},
+        {0x17, 0x01, 0x47, 0x00}, {0x28, 0x01, 0x47, 0x01},
+        {0x02, 0x01, 0x48, 0x00}, {0x09, 0x01, 0x48, 0x00},
+        {0x17, 0x01, 0x48, 0x00}, {0x28, 0x01, 0x48, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x45, 0x00}, {0x06, 0x01, 0x45, 0x00},
+        {0x0a, 0x01, 0x45, 0x00}, {0x0f, 0x01, 0x45, 0x00},
+        {0x18, 0x01, 0x45, 0x00}, {0x1f, 0x01, 0x45, 0x00},
+        {0x29, 0x01, 0x45, 0x00}, {0x38, 0x01, 0x45, 0x01},
+        {0x03, 0x01, 0x46, 0x00}, {0x06, 0x01, 0x46, 0x00},
+        {0x0a, 0x01, 0x46, 0x00}, {0x0f, 0x01, 0x46, 0x00},
+        {0x18, 0x01, 0x46, 0x00}, {0x1f, 0x01, 0x46, 0x00},
+        {0x29, 0x01, 0x46, 0x00}, {0x38, 0x01, 0x46, 0x01}
+    },
+    /* 45 */
+    {
+        {0x03, 0x01, 0x47, 0x00}, {0x06, 0x01, 0x47, 0x00},
+        {0x0a, 0x01, 0x47, 0x00}, {0x0f, 0x01, 0x47, 0x00},
+        {0x18, 0x01, 0x47, 0x00}, {0x1f, 0x01, 0x47, 0x00},
+        {0x29, 0x01, 0x47, 0x00}, {0x38, 0x01, 0x47, 0x01},
+        {0x03, 0x01, 0x48, 0x00}, {0x06, 0x01, 0x48, 0x00},
+        {0x0a, 0x01, 0x48, 0x00}, {0x0f, 0x01, 0x48, 0x00},
+        {0x18, 0x01, 0x48, 0x00}, {0x1f, 0x01, 0x48, 0x00},
+        {0x29, 0x01, 0x48, 0x00}, {0x38, 0x01, 0x48, 0x01}
+    },
+    {
+        {0x02, 0x01, 0x49, 0x00}, {0x09, 0x01, 0x49, 0x00},
+        {0x17, 0x01, 0x49, 0x00}, {0x28, 0x01, 0x49, 0x01},
+        {0x02, 0x01, 0x4a, 0x00}, {0x09, 0x01, 0x4a, 0x00},
+        {0x17, 0x01, 0x4a, 0x00}, {0x28, 0x01, 0x4a, 0x01},
+        {0x02, 0x01, 0x4b, 0x00}, {0x09, 0x01, 0x4b, 0x00},
+        {0x17, 0x01, 0x4b, 0x00}, {0x28, 0x01, 0x4b, 0x01},
+        {0x02, 0x01, 0x4c, 0x00}, {0x09, 0x01, 0x4c, 0x00},
+        {0x17, 0x01, 0x4c, 0x00}, {0x28, 0x01, 0x4c, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x49, 0x00}, {0x06, 0x01, 0x49, 0x00},
+        {0x0a, 0x01, 0x49, 0x00}, {0x0f, 0x01, 0x49, 0x00},
+        {0x18, 0x01, 0x49, 0x00}, {0x1f, 0x01, 0x49, 0x00},
+        {0x29, 0x01, 0x49, 0x00}, {0x38, 0x01, 0x49, 0x01},
+        {0x03, 0x01, 0x4a, 0x00}, {0x06, 0x01, 0x4a, 0x00},
+        {0x0a, 0x01, 0x4a, 0x00}, {0x0f, 0x01, 0x4a, 0x00},
+        {0x18, 0x01, 0x4a, 0x00}, {0x1f, 0x01, 0x4a, 0x00},
+        {0x29, 0x01, 0x4a, 0x00}, {0x38, 0x01, 0x4a, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x4b, 0x00}, {0x06, 0x01, 0x4b, 0x00},
+        {0x0a, 0x01, 0x4b, 0x00}, {0x0f, 0x01, 0x4b, 0x00},
+        {0x18, 0x01, 0x4b, 0x00}, {0x1f, 0x01, 0x4b, 0x00},
+        {0x29, 0x01, 0x4b, 0x00}, {0x38, 0x01, 0x4b, 0x01},
+        {0x03, 0x01, 0x4c, 0x00}, {0x06, 0x01, 0x4c, 0x00},
+        {0x0a, 0x01, 0x4c, 0x00}, {0x0f, 0x01, 0x4c, 0x00},
+        {0x18, 0x01, 0x4c, 0x00}, {0x1f, 0x01, 0x4c, 0x00},
+        {0x29, 0x01, 0x4c, 0x00}, {0x38, 0x01, 0x4c, 0x01}
+    },
+    {
+        {0x01, 0x01, 0x4d, 0x00}, {0x16, 0x01, 0x4d, 0x01},
+        {0x01, 0x01, 0x4e, 0x00}, {0x16, 0x01, 0x4e, 0x01},
+        {0x01, 0x01, 0x4f, 0x00}, {0x16, 0x01, 0x4f, 0x01},
+        {0x01, 0x01, 0x50, 0x00}, {0x16, 0x01, 0x50, 0x01},
+        {0x01, 0x01, 0x51, 0x00}, {0x16, 0x01, 0x51, 0x01},
+        {0x01, 0x01, 0x52, 0x00}, {0x16, 0x01, 0x52, 0x01},
+        {0x01, 0x01, 0x53, 0x00}, {0x16, 0x01, 0x53, 0x01},
+        {0x01, 0x01, 0x54, 0x00}, {0x16, 0x01, 0x54, 0x01}
+    },
+    /* 50 */
+    {
+        {0x02, 0x01, 0x4d, 0x00}, {0x09, 0x01, 0x4d, 0x00},
+        {0x17, 0x01, 0x4d, 0x00}, {0x28, 0x01, 0x4d, 0x01},
+        {0x02, 0x01, 0x4e, 0x00}, {0x09, 0x01, 0x4e, 0x00},
+        {0x17, 0x01, 0x4e, 0x00}, {0x28, 0x01, 0x4e, 0x01},
+        {0x02, 0x01, 0x4f, 0x00}, {0x09, 0x01, 0x4f, 0x00},
+        {0x17, 0x01, 0x4f, 0x00}, {0x28, 0x01, 0x4f, 0x01},
+        {0x02, 0x01, 0x50, 0x00}, {0x09, 0x01, 0x50, 0x00},
+        {0x17, 0x01, 0x50, 0x00}, {0x28, 0x01, 0x50, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x4d, 0x00}, {0x06, 0x01, 0x4d, 0x00},
+        {0x0a, 0x01, 0x4d, 0x00}, {0x0f, 0x01, 0x4d, 0x00},
+        {0x18, 0x01, 0x4d, 0x00}, {0x1f, 0x01, 0x4d, 0x00},
+        {0x29, 0x01, 0x4d, 0x00}, {0x38, 0x01, 0x4d, 0x01},
+        {0x03, 0x01, 0x4e, 0x00}, {0x06, 0x01, 0x4e, 0x00},
+        {0x0a, 0x01, 0x4e, 0x00}, {0x0f, 0x01, 0x4e, 0x00},
+        {0x18, 0x01, 0x4e, 0x00}, {0x1f, 0x01, 0x4e, 0x00},
+        {0x29, 0x01, 0x4e, 0x00}, {0x38, 0x01, 0x4e, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x4f, 0x00}, {0x06, 0x01, 0x4f, 0x00},
+        {0x0a, 0x01, 0x4f, 0x00}, {0x0f, 0x01, 0x4f, 0x00},
+        {0x18, 0x01, 0x4f, 0x00}, {0x1f, 0x01, 0x4f, 0x00},
+        {0x29, 0x01, 0x4f, 0x00}, {0x38, 0x01, 0x4f, 0x01},
+        {0x03, 0x01, 0x50, 0x00}, {0x06, 0x01, 0x50, 0x00},
+        {0x0a, 0x01, 0x50, 0x00}, {0x0f, 0x01, 0x50, 0x00},
+        {0x18, 0x01, 0x50, 0x00}, {0x1f, 0x01, 0x50, 0x00},
+        {0x29, 0x01, 0x50, 0x00}, {0x38, 0x01, 0x50, 0x01}
+    },
+    {
+        {0x02, 0x01, 0x51, 0x00}, {0x09, 0x01, 0x51, 0x00},
+        {0x17, 0x01, 0x51, 0x00}, {0x28, 0x01, 0x51, 0x01},
+        {0x02, 0x01, 0x52, 0x00}, {0x09, 0x01, 0x52, 0x00},
+        {0x17, 0x01, 0x52, 0x00}, {0x28, 0x01, 0x52, 0x01},
+        {0x02, 0x01, 0x53, 0x00}, {0x09, 0x01, 0x53, 0x00},
+        {0x17, 0x01, 0x53, 0x00}, {0x28, 0x01, 0x53, 0x01},
+        {0x02, 0x01, 0x54, 0x00}, {0x09, 0x01, 0x54, 0x00},
+        {0x17, 0x01, 0x54, 0x00}, {0x28, 0x01, 0x54, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x51, 0x00}, {0x06, 0x01, 0x51, 0x00},
+        {0x0a, 0x01, 0x51, 0x00}, {0x0f, 0x01, 0x51, 0x00},
+        {0x18, 0x01, 0x51, 0x00}, {0x1f, 0x01, 0x51, 0x00},
+        {0x29, 0x01, 0x51, 0x00}, {0x38, 0x01, 0x51, 0x01},
+        {0x03, 0x01, 0x52, 0x00}, {0x06, 0x01, 0x52, 0x00},
+        {0x0a, 0x01, 0x52, 0x00}, {0x0f, 0x01, 0x52, 0x00},
+        {0x18, 0x01, 0x52, 0x00}, {0x1f, 0x01, 0x52, 0x00},
+        {0x29, 0x01, 0x52, 0x00}, {0x38, 0x01, 0x52, 0x01}
+    },
+    /* 55 */
+    {
+        {0x03, 0x01, 0x53, 0x00}, {0x06, 0x01, 0x53, 0x00},
+        {0x0a, 0x01, 0x53, 0x00}, {0x0f, 0x01, 0x53, 0x00},
+        {0x18, 0x01, 0x53, 0x00}, {0x1f, 0x01, 0x53, 0x00},
+        {0x29, 0x01, 0x53, 0x00}, {0x38, 0x01, 0x53, 0x01},
+        {0x03, 0x01, 0x54, 0x00}, {0x06, 0x01, 0x54, 0x00},
+        {0x0a, 0x01, 0x54, 0x00}, {0x0f, 0x01, 0x54, 0x00},
+        {0x18, 0x01, 0x54, 0x00}, {0x1f, 0x01, 0x54, 0x00},
+        {0x29, 0x01, 0x54, 0x00}, {0x38, 0x01, 0x54, 0x01}
+    },
+    {
+        {0x00, 0x01, 0x55, 0x01}, {0x00, 0x01, 0x56, 0x01},
+        {0x00, 0x01, 0x57, 0x01}, {0x00, 0x01, 0x59, 0x01},
+        {0x00, 0x01, 0x6a, 0x01}, {0x00, 0x01, 0x6b, 0x01},
+        {0x00, 0x01, 0x71, 0x01}, {0x00, 0x01, 0x76, 0x01},
+        {0x00, 0x01, 0x77, 0x01}, {0x00, 0x01, 0x78, 0x01},
+        {0x00, 0x01, 0x79, 0x01}, {0x00, 0x01, 0x7a, 0x01},
+        {0x46, 0x00, 0x00, 0x00}, {0x47, 0x00, 0x00, 0x00},
+        {0x49, 0x00, 0x00, 0x00}, {0x4a, 0x00, 0x00, 0x01}
+    },
+    {
+        {0x01, 0x01, 0x55, 0x00}, {0x16, 0x01, 0x55, 0x01},
+        {0x01, 0x01, 0x56, 0x00}, {0x16, 0x01, 0x56, 0x01},
+        {0x01, 0x01, 0x57, 0x00}, {0x16, 0x01, 0x57, 0x01},
+        {0x01, 0x01, 0x59, 0x00}, {0x16, 0x01, 0x59, 0x01},
+        {0x01, 0x01, 0x6a, 0x00}, {0x16, 0x01, 0x6a, 0x01},
+        {0x01, 0x01, 0x6b, 0x00}, {0x16, 0x01, 0x6b, 0x01},
+        {0x01, 0x01, 0x71, 0x00}, {0x16, 0x01, 0x71, 0x01},
+        {0x01, 0x01, 0x76, 0x00}, {0x16, 0x01, 0x76, 0x01}
+    },
+    {
+        {0x02, 0x01, 0x55, 0x00}, {0x09, 0x01, 0x55, 0x00},
+        {0x17, 0x01, 0x55, 0x00}, {0x28, 0x01, 0x55, 0x01},
+        {0x02, 0x01, 0x56, 0x00}, {0x09, 0x01, 0x56, 0x00},
+        {0x17, 0x01, 0x56, 0x00}, {0x28, 0x01, 0x56, 0x01},
+        {0x02, 0x01, 0x57, 0x00}, {0x09, 0x01, 0x57, 0x00},
+        {0x17, 0x01, 0x57, 0x00}, {0x28, 0x01, 0x57, 0x01},
+        {0x02, 0x01, 0x59, 0x00}, {0x09, 0x01, 0x59, 0x00},
+        {0x17, 0x01, 0x59, 0x00}, {0x28, 0x01, 0x59, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x55, 0x00}, {0x06, 0x01, 0x55, 0x00},
+        {0x0a, 0x01, 0x55, 0x00}, {0x0f, 0x01, 0x55, 0x00},
+        {0x18, 0x01, 0x55, 0x00}, {0x1f, 0x01, 0x55, 0x00},
+        {0x29, 0x01, 0x55, 0x00}, {0x38, 0x01, 0x55, 0x01},
+        {0x03, 0x01, 0x56, 0x00}, {0x06, 0x01, 0x56, 0x00},
+        {0x0a, 0x01, 0x56, 0x00}, {0x0f, 0x01, 0x56, 0x00},
+        {0x18, 0x01, 0x56, 0x00}, {0x1f, 0x01, 0x56, 0x00},
+        {0x29, 0x01, 0x56, 0x00}, {0x38, 0x01, 0x56, 0x01}
+    },
+    /* 60 */
+    {
+        {0x03, 0x01, 0x57, 0x00}, {0x06, 0x01, 0x57, 0x00},
+        {0x0a, 0x01, 0x57, 0x00}, {0x0f, 0x01, 0x57, 0x00},
+        {0x18, 0x01, 0x57, 0x00}, {0x1f, 0x01, 0x57, 0x00},
+        {0x29, 0x01, 0x57, 0x00}, {0x38, 0x01, 0x57, 0x01},
+        {0x03, 0x01, 0x59, 0x00}, {0x06, 0x01, 0x59, 0x00},
+        {0x0a, 0x01, 0x59, 0x00}, {0x0f, 0x01, 0x59, 0x00},
+        {0x18, 0x01, 0x59, 0x00}, {0x1f, 0x01, 0x59, 0x00},
+        {0x29, 0x01, 0x59, 0x00}, {0x38, 0x01, 0x59, 0x01}
+    },
+    {
+        {0x02, 0x01, 0x6a, 0x00}, {0x09, 0x01, 0x6a, 0x00},
+        {0x17, 0x01, 0x6a, 0x00}, {0x28, 0x01, 0x6a, 0x01},
+        {0x02, 0x01, 0x6b, 0x00}, {0x09, 0x01, 0x6b, 0x00},
+        {0x17, 0x01, 0x6b, 0x00}, {0x28, 0x01, 0x6b, 0x01},
+        {0x02, 0x01, 0x71, 0x00}, {0x09, 0x01, 0x71, 0x00},
+        {0x17, 0x01, 0x71, 0x00}, {0x28, 0x01, 0x71, 0x01},
+        {0x02, 0x01, 0x76, 0x00}, {0x09, 0x01, 0x76, 0x00},
+        {0x17, 0x01, 0x76, 0x00}, {0x28, 0x01, 0x76, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x6a, 0x00}, {0x06, 0x01, 0x6a, 0x00},
+        {0x0a, 0x01, 0x6a, 0x00}, {0x0f, 0x01, 0x6a, 0x00},
+        {0x18, 0x01, 0x6a, 0x00}, {0x1f, 0x01, 0x6a, 0x00},
+        {0x29, 0x01, 0x6a, 0x00}, {0x38, 0x01, 0x6a, 0x01},
+        {0x03, 0x01, 0x6b, 0x00}, {0x06, 0x01, 0x6b, 0x00},
+        {0x0a, 0x01, 0x6b, 0x00}, {0x0f, 0x01, 0x6b, 0x00},
+        {0x18, 0x01, 0x6b, 0x00}, {0x1f, 0x01, 0x6b, 0x00},
+        {0x29, 0x01, 0x6b, 0x00}, {0x38, 0x01, 0x6b, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x71, 0x00}, {0x06, 0x01, 0x71, 0x00},
+        {0x0a, 0x01, 0x71, 0x00}, {0x0f, 0x01, 0x71, 0x00},
+        {0x18, 0x01, 0x71, 0x00}, {0x1f, 0x01, 0x71, 0x00},
+        {0x29, 0x01, 0x71, 0x00}, {0x38, 0x01, 0x71, 0x01},
+        {0x03, 0x01, 0x76, 0x00}, {0x06, 0x01, 0x76, 0x00},
+        {0x0a, 0x01, 0x76, 0x00}, {0x0f, 0x01, 0x76, 0x00},
+        {0x18, 0x01, 0x76, 0x00}, {0x1f, 0x01, 0x76, 0x00},
+        {0x29, 0x01, 0x76, 0x00}, {0x38, 0x01, 0x76, 0x01}
+    },
+    {
+        {0x01, 0x01, 0x77, 0x00}, {0x16, 0x01, 0x77, 0x01},
+        {0x01, 0x01, 0x78, 0x00}, {0x16, 0x01, 0x78, 0x01},
+        {0x01, 0x01, 0x79, 0x00}, {0x16, 0x01, 0x79, 0x01},
+        {0x01, 0x01, 0x7a, 0x00}, {0x16, 0x01, 0x7a, 0x01},
+        {0x00, 0x01, 0x26, 0x01}, {0x00, 0x01, 0x2a, 0x01},
+        {0x00, 0x01, 0x2c, 0x01}, {0x00, 0x01, 0x3b, 0x01},
+        {0x00, 0x01, 0x58, 0x01}, {0x00, 0x01, 0x5a, 0x01},
+        {0x4b, 0x00, 0x00, 0x00}, {0x4e, 0x00, 0x00, 0x01}
+    },
+    /* 65 */
+    {
+        {0x02, 0x01, 0x77, 0x00}, {0x09, 0x01, 0x77, 0x00},
+        {0x17, 0x01, 0x77, 0x00}, {0x28, 0x01, 0x77, 0x01},
+        {0x02, 0x01, 0x78, 0x00}, {0x09, 0x01, 0x78, 0x00},
+        {0x17, 0x01, 0x78, 0x00}, {0x28, 0x01, 0x78, 0x01},
+        {0x02, 0x01, 0x79, 0x00}, {0x09, 0x01, 0x79, 0x00},
+        {0x17, 0x01, 0x79, 0x00}, {0x28, 0x01, 0x79, 0x01},
+        {0x02, 0x01, 0x7a, 0x00}, {0x09, 0x01, 0x7a, 0x00},
+        {0x17, 0x01, 0x7a, 0x00}, {0x28, 0x01, 0x7a, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x77, 0x00}, {0x06, 0x01, 0x77, 0x00},
+        {0x0a, 0x01, 0x77, 0x00}, {0x0f, 0x01, 0x77, 0x00},
+        {0x18, 0x01, 0x77, 0x00}, {0x1f, 0x01, 0x77, 0x00},
+        {0x29, 0x01, 0x77, 0x00}, {0x38, 0x01, 0x77, 0x01},
+        {0x03, 0x01, 0x78, 0x00}, {0x06, 0x01, 0x78, 0x00},
+        {0x0a, 0x01, 0x78, 0x00}, {0x0f, 0x01, 0x78, 0x00},
+        {0x18, 0x01, 0x78, 0x00}, {0x1f, 0x01, 0x78, 0x00},
+        {0x29, 0x01, 0x78, 0x00}, {0x38, 0x01, 0x78, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x79, 0x00}, {0x06, 0x01, 0x79, 0x00},
+        {0x0a, 0x01, 0x79, 0x00}, {0x0f, 0x01, 0x79, 0x00},
+        {0x18, 0x01, 0x79, 0x00}, {0x1f, 0x01, 0x79, 0x00},
+        {0x29, 0x01, 0x79, 0x00}, {0x38, 0x01, 0x79, 0x01},
+        {0x03, 0x01, 0x7a, 0x00}, {0x06, 0x01, 0x7a, 0x00},
+        {0x0a, 0x01, 0x7a, 0x00}, {0x0f, 0x01, 0x7a, 0x00},
+        {0x18, 0x01, 0x7a, 0x00}, {0x1f, 0x01, 0x7a, 0x00},
+        {0x29, 0x01, 0x7a, 0x00}, {0x38, 0x01, 0x7a, 0x01}
+    },
+    {
+        {0x01, 0x01, 0x26, 0x00}, {0x16, 0x01, 0x26, 0x01},
+        {0x01, 0x01, 0x2a, 0x00}, {0x16, 0x01, 0x2a, 0x01},
+        {0x01, 0x01, 0x2c, 0x00}, {0x16, 0x01, 0x2c, 0x01},
+        {0x01, 0x01, 0x3b, 0x00}, {0x16, 0x01, 0x3b, 0x01},
+        {0x01, 0x01, 0x58, 0x00}, {0x16, 0x01, 0x58, 0x01},
+        {0x01, 0x01, 0x5a, 0x00}, {0x16, 0x01, 0x5a, 0x01},
+        {0x4c, 0x00, 0x00, 0x00}, {0x4d, 0x00, 0x00, 0x00},
+        {0x4f, 0x00, 0x00, 0x00}, {0x51, 0x00, 0x00, 0x01}
+    },
+    {
+        {0x02, 0x01, 0x26, 0x00}, {0x09, 0x01, 0x26, 0x00},
+        {0x17, 0x01, 0x26, 0x00}, {0x28, 0x01, 0x26, 0x01},
+        {0x02, 0x01, 0x2a, 0x00}, {0x09, 0x01, 0x2a, 0x00},
+        {0x17, 0x01, 0x2a, 0x00}, {0x28, 0x01, 0x2a, 0x01},
+        {0x02, 0x01, 0x2c, 0x00}, {0x09, 0x01, 0x2c, 0x00},
+        {0x17, 0x01, 0x2c, 0x00}, {0x28, 0x01, 0x2c, 0x01},
+        {0x02, 0x01, 0x3b, 0x00}, {0x09, 0x01, 0x3b, 0x00},
+        {0x17, 0x01, 0x3b, 0x00}, {0x28, 0x01, 0x3b, 0x01}
+    },
+    /* 70 */
+    {
+        {0x03, 0x01, 0x26, 0x00}, {0x06, 0x01, 0x26, 0x00},
+        {0x0a, 0x01, 0x26, 0x00}, {0x0f, 0x01, 0x26, 0x00},
+        {0x18, 0x01, 0x26, 0x00}, {0x1f, 0x01, 0x26, 0x00},
+        {0x29, 0x01, 0x26, 0x00}, {0x38, 0x01, 0x26, 0x01},
+        {0x03, 0x01, 0x2a, 0x00}, {0x06, 0x01, 0x2a, 0x00},
+        {0x0a, 0x01, 0x2a, 0x00}, {0x0f, 0x01, 0x2a, 0x00},
+        {0x18, 0x01, 0x2a, 0x00}, {0x1f, 0x01, 0x2a, 0x00},
+        {0x29, 0x01, 0x2a, 0x00}, {0x38, 0x01, 0x2a, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x2c, 0x00}, {0x06, 0x01, 0x2c, 0x00},
+        {0x0a, 0x01, 0x2c, 0x00}, {0x0f, 0x01, 0x2c, 0x00},
+        {0x18, 0x01, 0x2c, 0x00}, {0x1f, 0x01, 0x2c, 0x00},
+        {0x29, 0x01, 0x2c, 0x00}, {0x38, 0x01, 0x2c, 0x01},
+        {0x03, 0x01, 0x3b, 0x00}, {0x06, 0x01, 0x3b, 0x00},
+        {0x0a, 0x01, 0x3b, 0x00}, {0x0f, 0x01, 0x3b, 0x00},
+        {0x18, 0x01, 0x3b, 0x00}, {0x1f, 0x01, 0x3b, 0x00},
+        {0x29, 0x01, 0x3b, 0x00}, {0x38, 0x01, 0x3b, 0x01}
+    },
+    {
+        {0x02, 0x01, 0x58, 0x00}, {0x09, 0x01, 0x58, 0x00},
+        {0x17, 0x01, 0x58, 0x00}, {0x28, 0x01, 0x58, 0x01},
+        {0x02, 0x01, 0x5a, 0x00}, {0x09, 0x01, 0x5a, 0x00},
+        {0x17, 0x01, 0x5a, 0x00}, {0x28, 0x01, 0x5a, 0x01},
+        {0x00, 0x01, 0x21, 0x01}, {0x00, 0x01, 0x22, 0x01},
+        {0x00, 0x01, 0x28, 0x01}, {0x00, 0x01, 0x29, 0x01},
+        {0x00, 0x01, 0x3f, 0x01}, {0x50, 0x00, 0x00, 0x00},
+        {0x52, 0x00, 0x00, 0x00}, {0x54, 0x00, 0x00, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x58, 0x00}, {0x06, 0x01, 0x58, 0x00},
+        {0x0a, 0x01, 0x58, 0x00}, {0x0f, 0x01, 0x58, 0x00},
+        {0x18, 0x01, 0x58, 0x00}, {0x1f, 0x01, 0x58, 0x00},
+        {0x29, 0x01, 0x58, 0x00}, {0x38, 0x01, 0x58, 0x01},
+        {0x03, 0x01, 0x5a, 0x00}, {0x06, 0x01, 0x5a, 0x00},
+        {0x0a, 0x01, 0x5a, 0x00}, {0x0f, 0x01, 0x5a, 0x00},
+        {0x18, 0x01, 0x5a, 0x00}, {0x1f, 0x01, 0x5a, 0x00},
+        {0x29, 0x01, 0x5a, 0x00}, {0x38, 0x01, 0x5a, 0x01}
+    },
+    {
+        {0x01, 0x01, 0x21, 0x00}, {0x16, 0x01, 0x21, 0x01},
+        {0x01, 0x01, 0x22, 0x00}, {0x16, 0x01, 0x22, 0x01},
+        {0x01, 0x01, 0x28, 0x00}, {0x16, 0x01, 0x28, 0x01},
+        {0x01, 0x01, 0x29, 0x00}, {0x16, 0x01, 0x29, 0x01},
+        {0x01, 0x01, 0x3f, 0x00}, {0x16, 0x01, 0x3f, 0x01},
+        {0x00, 0x01, 0x27, 0x01}, {0x00, 0x01, 0x2b, 0x01},
+        {0x00, 0x01, 0x7c, 0x01}, {0x53, 0x00, 0x00, 0x00},
+        {0x55, 0x00, 0x00, 0x00}, {0x58, 0x00, 0x00, 0x01}
+    },
+    /* 75 */
+    {
+        {0x02, 0x01, 0x21, 0x00}, {0x09, 0x01, 0x21, 0x00},
+        {0x17, 0x01, 0x21, 0x00}, {0x28, 0x01, 0x21, 0x01},
+        {0x02, 0x01, 0x22, 0x00}, {0x09, 0x01, 0x22, 0x00},
+        {0x17, 0x01, 0x22, 0x00}, {0x28, 0x01, 0x22, 0x01},
+        {0x02, 0x01, 0x28, 0x00}, {0x09, 0x01, 0x28, 0x00},
+        {0x17, 0x01, 0x28, 0x00}, {0x28, 0x01, 0x28, 0x01},
+        {0x02, 0x01, 0x29, 0x00}, {0x09, 0x01, 0x29, 0x00},
+        {0x17, 0x01, 0x29, 0x00}, {0x28, 0x01, 0x29, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x21, 0x00}, {0x06, 0x01, 0x21, 0x00},
+        {0x0a, 0x01, 0x21, 0x00}, {0x0f, 0x01, 0x21, 0x00},
+        {0x18, 0x01, 0x21, 0x00}, {0x1f, 0x01, 0x21, 0x00},
+        {0x29, 0x01, 0x21, 0x00}, {0x38, 0x01, 0x21, 0x01},
+        {0x03, 0x01, 0x22, 0x00}, {0x06, 0x01, 0x22, 0x00},
+        {0x0a, 0x01, 0x22, 0x00}, {0x0f, 0x01, 0x22, 0x00},
+        {0x18, 0x01, 0x22, 0x00}, {0x1f, 0x01, 0x22, 0x00},
+        {0x29, 0x01, 0x22, 0x00}, {0x38, 0x01, 0x22, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x28, 0x00}, {0x06, 0x01, 0x28, 0x00},
+        {0x0a, 0x01, 0x28, 0x00}, {0x0f, 0x01, 0x28, 0x00},
+        {0x18, 0x01, 0x28, 0x00}, {0x1f, 0x01, 0x28, 0x00},
+        {0x29, 0x01, 0x28, 0x00}, {0x38, 0x01, 0x28, 0x01},
+        {0x03, 0x01, 0x29, 0x00}, {0x06, 0x01, 0x29, 0x00},
+        {0x0a, 0x01, 0x29, 0x00}, {0x0f, 0x01, 0x29, 0x00},
+        {0x18, 0x01, 0x29, 0x00}, {0x1f, 0x01, 0x29, 0x00},
+        {0x29, 0x01, 0x29, 0x00}, {0x38, 0x01, 0x29, 0x01}
+    },
+    {
+        {0x02, 0x01, 0x3f, 0x00}, {0x09, 0x01, 0x3f, 0x00},
+        {0x17, 0x01, 0x3f, 0x00}, {0x28, 0x01, 0x3f, 0x01},
+        {0x01, 0x01, 0x27, 0x00}, {0x16, 0x01, 0x27, 0x01},
+        {0x01, 0x01, 0x2b, 0x00}, {0x16, 0x01, 0x2b, 0x01},
+        {0x01, 0x01, 0x7c, 0x00}, {0x16, 0x01, 0x7c, 0x01},
+        {0x00, 0x01, 0x23, 0x01}, {0x00, 0x01, 0x3e, 0x01},
+        {0x56, 0x00, 0x00, 0x00}, {0x57, 0x00, 0x00, 0x00},
+        {0x59, 0x00, 0x00, 0x00}, {0x5a, 0x00, 0x00, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x3f, 0x00}, {0x06, 0x01, 0x3f, 0x00},
+        {0x0a, 0x01, 0x3f, 0x00}, {0x0f, 0x01, 0x3f, 0x00},
+        {0x18, 0x01, 0x3f, 0x00}, {0x1f, 0x01, 0x3f, 0x00},
+        {0x29, 0x01, 0x3f, 0x00}, {0x38, 0x01, 0x3f, 0x01},
+        {0x02, 0x01, 0x27, 0x00}, {0x09, 0x01, 0x27, 0x00},
+        {0x17, 0x01, 0x27, 0x00}, {0x28, 0x01, 0x27, 0x01},
+        {0x02, 0x01, 0x2b, 0x00}, {0x09, 0x01, 0x2b, 0x00},
+        {0x17, 0x01, 0x2b, 0x00}, {0x28, 0x01, 0x2b, 0x01}
+    },
+    /* 80 */
+    {
+        {0x03, 0x01, 0x27, 0x00}, {0x06, 0x01, 0x27, 0x00},
+        {0x0a, 0x01, 0x27, 0x00}, {0x0f, 0x01, 0x27, 0x00},
+        {0x18, 0x01, 0x27, 0x00}, {0x1f, 0x01, 0x27, 0x00},
+        {0x29, 0x01, 0x27, 0x00}, {0x38, 0x01, 0x27, 0x01},
+        {0x03, 0x01, 0x2b, 0x00}, {0x06, 0x01, 0x2b, 0x00},
+        {0x0a, 0x01, 0x2b, 0x00}, {0x0f, 0x01, 0x2b, 0x00},
+        {0x18, 0x01, 0x2b, 0x00}, {0x1f, 0x01, 0x2b, 0x00},
+        {0x29, 0x01, 0x2b, 0x00}, {0x38, 0x01, 0x2b, 0x01}
+    },
+    {
+        {0x02, 0x01, 0x7c, 0x00}, {0x09, 0x01, 0x7c, 0x00},
+        {0x17, 0x01, 0x7c, 0x00}, {0x28, 0x01, 0x7c, 0x01},
+        {0x01, 0x01, 0x23, 0x00}, {0x16, 0x01, 0x23, 0x01},
+        {0x01, 0x01, 0x3e, 0x00}, {0x16, 0x01, 0x3e, 0x01},
+        {0x00, 0x01, 0x00, 0x01}, {0x00, 0x01, 0x24, 0x01},
+        {0x00, 0x01, 0x40, 0x01}, {0x00, 0x01, 0x5b, 0x01},
+        {0x00, 0x01, 0x5d, 0x01}, {0x00, 0x01, 0x7e, 0x01},
+        {0x5b, 0x00, 0x00, 0x00}, {0x5c, 0x00, 0x00, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x7c, 0x00}, {0x06, 0x01, 0x7c, 0x00},
+        {0x0a, 0x01, 0x7c, 0x00}, {0x0f, 0x01, 0x7c, 0x00},
+        {0x18, 0x01, 0x7c, 0x00}, {0x1f, 0x01, 0x7c, 0x00},
+        {0x29, 0x01, 0x7c, 0x00}, {0x38, 0x01, 0x7c, 0x01},
+        {0x02, 0x01, 0x23, 0x00}, {0x09, 0x01, 0x23, 0x00},
+        {0x17, 0x01, 0x23, 0x00}, {0x28, 0x01, 0x23, 0x01},
+        {0x02, 0x01, 0x3e, 0x00}, {0x09, 0x01, 0x3e, 0x00},
+        {0x17, 0x01, 0x3e, 0x00}, {0x28, 0x01, 0x3e, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x23, 0x00}, {0x06, 0x01, 0x23, 0x00},
+        {0x0a, 0x01, 0x23, 0x00}, {0x0f, 0x01, 0x23, 0x00},
+        {0x18, 0x01, 0x23, 0x00}, {0x1f, 0x01, 0x23, 0x00},
+        {0x29, 0x01, 0x23, 0x00}, {0x38, 0x01, 0x23, 0x01},
+        {0x03, 0x01, 0x3e, 0x00}, {0x06, 0x01, 0x3e, 0x00},
+        {0x0a, 0x01, 0x3e, 0x00}, {0x0f, 0x01, 0x3e, 0x00},
+        {0x18, 0x01, 0x3e, 0x00}, {0x1f, 0x01, 0x3e, 0x00},
+        {0x29, 0x01, 0x3e, 0x00}, {0x38, 0x01, 0x3e, 0x01}
+    },
+    {
+        {0x01, 0x01, 0x00, 0x00}, {0x16, 0x01, 0x00, 0x01},
+        {0x01, 0x01, 0x24, 0x00}, {0x16, 0x01, 0x24, 0x01},
+        {0x01, 0x01, 0x40, 0x00}, {0x16, 0x01, 0x40, 0x01},
+        {0x01, 0x01, 0x5b, 0x00}, {0x16, 0x01, 0x5b, 0x01},
+        {0x01, 0x01, 0x5d, 0x00}, {0x16, 0x01, 0x5d, 0x01},
+        {0x01, 0x01, 0x7e, 0x00}, {0x16, 0x01, 0x7e, 0x01},
+        {0x00, 0x01, 0x5e, 0x01}, {0x00, 0x01, 0x7d, 0x01},
+        {0x5d, 0x00, 0x00, 0x00}, {0x5e, 0x00, 0x00, 0x01}
+    },
+    /* 85 */
+    {
+        {0x02, 0x01, 0x00, 0x00}, {0x09, 0x01, 0x00, 0x00},
+        {0x17, 0x01, 0x00, 0x00}, {0x28, 0x01, 0x00, 0x01},
+        {0x02, 0x01, 0x24, 0x00}, {0x09, 0x01, 0x24, 0x00},
+        {0x17, 0x01, 0x24, 0x00}, {0x28, 0x01, 0x24, 0x01},
+        {0x02, 0x01, 0x40, 0x00}, {0x09, 0x01, 0x40, 0x00},
+        {0x17, 0x01, 0x40, 0x00}, {0x28, 0x01, 0x40, 0x01},
+        {0x02, 0x01, 0x5b, 0x00}, {0x09, 0x01, 0x5b, 0x00},
+        {0x17, 0x01, 0x5b, 0x00}, {0x28, 0x01, 0x5b, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x00, 0x00}, {0x06, 0x01, 0x00, 0x00},
+        {0x0a, 0x01, 0x00, 0x00}, {0x0f, 0x01, 0x00, 0x00},
+        {0x18, 0x01, 0x00, 0x00}, {0x1f, 0x01, 0x00, 0x00},
+        {0x29, 0x01, 0x00, 0x00}, {0x38, 0x01, 0x00, 0x01},
+        {0x03, 0x01, 0x24, 0x00}, {0x06, 0x01, 0x24, 0x00},
+        {0x0a, 0x01, 0x24, 0x00}, {0x0f, 0x01, 0x24, 0x00},
+        {0x18, 0x01, 0x24, 0x00}, {0x1f, 0x01, 0x24, 0x00},
+        {0x29, 0x01, 0x24, 0x00}, {0x38, 0x01, 0x24, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x40, 0x00}, {0x06, 0x01, 0x40, 0x00},
+        {0x0a, 0x01, 0x40, 0x00}, {0x0f, 0x01, 0x40, 0x00},
+        {0x18, 0x01, 0x40, 0x00}, {0x1f, 0x01, 0x40, 0x00},
+        {0x29, 0x01, 0x40, 0x00}, {0x38, 0x01, 0x40, 0x01},
+        {0x03, 0x01, 0x5b, 0x00}, {0x06, 0x01, 0x5b, 0x00},
+        {0x0a, 0x01, 0x5b, 0x00}, {0x0f, 0x01, 0x5b, 0x00},
+        {0x18, 0x01, 0x5b, 0x00}, {0x1f, 0x01, 0x5b, 0x00},
+        {0x29, 0x01, 0x5b, 0x00}, {0x38, 0x01, 0x5b, 0x01}
+    },
+    {
+        {0x02, 0x01, 0x5d, 0x00}, {0x09, 0x01, 0x5d, 0x00},
+        {0x17, 0x01, 0x5d, 0x00}, {0x28, 0x01, 0x5d, 0x01},
+        {0x02, 0x01, 0x7e, 0x00}, {0x09, 0x01, 0x7e, 0x00},
+        {0x17, 0x01, 0x7e, 0x00}, {0x28, 0x01, 0x7e, 0x01},
+        {0x01, 0x01, 0x5e, 0x00}, {0x16, 0x01, 0x5e, 0x01},
+        {0x01, 0x01, 0x7d, 0x00}, {0x16, 0x01, 0x7d, 0x01},
+        {0x00, 0x01, 0x3c, 0x01}, {0x00, 0x01, 0x60, 0x01},
+        {0x00, 0x01, 0x7b, 0x01}, {0x5f, 0x00, 0x00, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x5d, 0x00}, {0x06, 0x01, 0x5d, 0x00},
+        {0x0a, 0x01, 0x5d, 0x00}, {0x0f, 0x01, 0x5d, 0x00},
+        {0x18, 0x01, 0x5d, 0x00}, {0x1f, 0x01, 0x5d, 0x00},
+        {0x29, 0x01, 0x5d, 0x00}, {0x38, 0x01, 0x5d, 0x01},
+        {0x03, 0x01, 0x7e, 0x00}, {0x06, 0x01, 0x7e, 0x00},
+        {0x0a, 0x01, 0x7e, 0x00}, {0x0f, 0x01, 0x7e, 0x00},
+        {0x18, 0x01, 0x7e, 0x00}, {0x1f, 0x01, 0x7e, 0x00},
+        {0x29, 0x01, 0x7e, 0x00}, {0x38, 0x01, 0x7e, 0x01}
+    },
+    /* 90 */
+    {
+        {0x02, 0x01, 0x5e, 0x00}, {0x09, 0x01, 0x5e, 0x00},
+        {0x17, 0x01, 0x5e, 0x00}, {0x28, 0x01, 0x5e, 0x01},
+        {0x02, 0x01, 0x7d, 0x00}, {0x09, 0x01, 0x7d, 0x00},
+        {0x17, 0x01, 0x7d, 0x00}, {0x28, 0x01, 0x7d, 0x01},
+        {0x01, 0x01, 0x3c, 0x00}, {0x16, 0x01, 0x3c, 0x01},
+        {0x01, 0x01, 0x60, 0x00}, {0x16, 0x01, 0x60, 0x01},
+        {0x01, 0x01, 0x7b, 0x00}, {0x16, 0x01, 0x7b, 0x01},
+        {0x60, 0x00, 0x00, 0x00}, {0x6e, 0x00, 0x00, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x5e, 0x00}, {0x06, 0x01, 0x5e, 0x00},
+        {0x0a, 0x01, 0x5e, 0x00}, {0x0f, 0x01, 0x5e, 0x00},
+        {0x18, 0x01, 0x5e, 0x00}, {0x1f, 0x01, 0x5e, 0x00},
+        {0x29, 0x01, 0x5e, 0x00}, {0x38, 0x01, 0x5e, 0x01},
+        {0x03, 0x01, 0x7d, 0x00}, {0x06, 0x01, 0x7d, 0x00},
+        {0x0a, 0x01, 0x7d, 0x00}, {0x0f, 0x01, 0x7d, 0x00},
+        {0x18, 0x01, 0x7d, 0x00}, {0x1f, 0x01, 0x7d, 0x00},
+        {0x29, 0x01, 0x7d, 0x00}, {0x38, 0x01, 0x7d, 0x01}
+    },
+    {
+        {0x02, 0x01, 0x3c, 0x00}, {0x09, 0x01, 0x3c, 0x00},
+        {0x17, 0x01, 0x3c, 0x00}, {0x28, 0x01, 0x3c, 0x01},
+        {0x02, 0x01, 0x60, 0x00}, {0x09, 0x01, 0x60, 0x00},
+        {0x17, 0x01, 0x60, 0x00}, {0x28, 0x01, 0x60, 0x01},
+        {0x02, 0x01, 0x7b, 0x00}, {0x09, 0x01, 0x7b, 0x00},
+        {0x17, 0x01, 0x7b, 0x00}, {0x28, 0x01, 0x7b, 0x01},
+        {0x61, 0x00, 0x00, 0x00}, {0x65, 0x00, 0x00, 0x00},
+        {0x6f, 0x00, 0x00, 0x00}, {0x85, 0x00, 0x00, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x3c, 0x00}, {0x06, 0x01, 0x3c, 0x00},
+        {0x0a, 0x01, 0x3c, 0x00}, {0x0f, 0x01, 0x3c, 0x00},
+        {0x18, 0x01, 0x3c, 0x00}, {0x1f, 0x01, 0x3c, 0x00},
+        {0x29, 0x01, 0x3c, 0x00}, {0x38, 0x01, 0x3c, 0x01},
+        {0x03, 0x01, 0x60, 0x00}, {0x06, 0x01, 0x60, 0x00},
+        {0x0a, 0x01, 0x60, 0x00}, {0x0f, 0x01, 0x60, 0x00},
+        {0x18, 0x01, 0x60, 0x00}, {0x1f, 0x01, 0x60, 0x00},
+        {0x29, 0x01, 0x60, 0x00}, {0x38, 0x01, 0x60, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x7b, 0x00}, {0x06, 0x01, 0x7b, 0x00},
+        {0x0a, 0x01, 0x7b, 0x00}, {0x0f, 0x01, 0x7b, 0x00},
+        {0x18, 0x01, 0x7b, 0x00}, {0x1f, 0x01, 0x7b, 0x00},
+        {0x29, 0x01, 0x7b, 0x00}, {0x38, 0x01, 0x7b, 0x01},
+        {0x62, 0x00, 0x00, 0x00}, {0x63, 0x00, 0x00, 0x00},
+        {0x66, 0x00, 0x00, 0x00}, {0x69, 0x00, 0x00, 0x00},
+        {0x70, 0x00, 0x00, 0x00}, {0x77, 0x00, 0x00, 0x00},
+        {0x86, 0x00, 0x00, 0x00}, {0x99, 0x00, 0x00, 0x01}
+    },
+    /* 95 */
+    {
+        {0x00, 0x01, 0x5c, 0x01}, {0x00, 0x01, 0xc3, 0x01},
+        {0x00, 0x01, 0xd0, 0x01}, {0x64, 0x00, 0x00, 0x00},
+        {0x67, 0x00, 0x00, 0x00}, {0x68, 0x00, 0x00, 0x00},
+        {0x6a, 0x00, 0x00, 0x00}, {0x6b, 0x00, 0x00, 0x00},
+        {0x71, 0x00, 0x00, 0x00}, {0x74, 0x00, 0x00, 0x00},
+        {0x78, 0x00, 0x00, 0x00}, {0x7e, 0x00, 0x00, 0x00},
+        {0x87, 0x00, 0x00, 0x00}, {0x8e, 0x00, 0x00, 0x00},
+        {0x9a, 0x00, 0x00, 0x00}, {0xa9, 0x00, 0x00, 0x01}
+    },
+    {
+        {0x01, 0x01, 0x5c, 0x00}, {0x16, 0x01, 0x5c, 0x01},
+        {0x01, 0x01, 0xc3, 0x00}, {0x16, 0x01, 0xc3, 0x01},
+        {0x01, 0x01, 0xd0, 0x00}, {0x16, 0x01, 0xd0, 0x01},
+        {0x00, 0x01, 0x80, 0x01}, {0x00, 0x01, 0x82, 0x01},
+        {0x00, 0x01, 0x83, 0x01}, {0x00, 0x01, 0xa2, 0x01},
+        {0x00, 0x01, 0xb8, 0x01}, {0x00, 0x01, 0xc2, 0x01},
+        {0x00, 0x01, 0xe0, 0x01}, {0x00, 0x01, 0xe2, 0x01},
+        {0x6c, 0x00, 0x00, 0x00}, {0x6d, 0x00, 0x00, 0x00}
+    },
+    {
+        {0x02, 0x01, 0x5c, 0x00}, {0x09, 0x01, 0x5c, 0x00},
+        {0x17, 0x01, 0x5c, 0x00}, {0x28, 0x01, 0x5c, 0x01},
+        {0x02, 0x01, 0xc3, 0x00}, {0x09, 0x01, 0xc3, 0x00},
+        {0x17, 0x01, 0xc3, 0x00}, {0x28, 0x01, 0xc3, 0x01},
+        {0x02, 0x01, 0xd0, 0x00}, {0x09, 0x01, 0xd0, 0x00},
+        {0x17, 0x01, 0xd0, 0x00}, {0x28, 0x01, 0xd0, 0x01},
+        {0x01, 0x01, 0x80, 0x00}, {0x16, 0x01, 0x80, 0x01},
+        {0x01, 0x01, 0x82, 0x00}, {0x16, 0x01, 0x82, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x5c, 0x00}, {0x06, 0x01, 0x5c, 0x00},
+        {0x0a, 0x01, 0x5c, 0x00}, {0x0f, 0x01, 0x5c, 0x00},
+        {0x18, 0x01, 0x5c, 0x00}, {0x1f, 0x01, 0x5c, 0x00},
+        {0x29, 0x01, 0x5c, 0x00}, {0x38, 0x01, 0x5c, 0x01},
+        {0x03, 0x01, 0xc3, 0x00}, {0x06, 0x01, 0xc3, 0x00},
+        {0x0a, 0x01, 0xc3, 0x00}, {0x0f, 0x01, 0xc3, 0x00},
+        {0x18, 0x01, 0xc3, 0x00}, {0x1f, 0x01, 0xc3, 0x00},
+        {0x29, 0x01, 0xc3, 0x00}, {0x38, 0x01, 0xc3, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xd0, 0x00}, {0x06, 0x01, 0xd0, 0x00},
+        {0x0a, 0x01, 0xd0, 0x00}, {0x0f, 0x01, 0xd0, 0x00},
+        {0x18, 0x01, 0xd0, 0x00}, {0x1f, 0x01, 0xd0, 0x00},
+        {0x29, 0x01, 0xd0, 0x00}, {0x38, 0x01, 0xd0, 0x01},
+        {0x02, 0x01, 0x80, 0x00}, {0x09, 0x01, 0x80, 0x00},
+        {0x17, 0x01, 0x80, 0x00}, {0x28, 0x01, 0x80, 0x01},
+        {0x02, 0x01, 0x82, 0x00}, {0x09, 0x01, 0x82, 0x00},
+        {0x17, 0x01, 0x82, 0x00}, {0x28, 0x01, 0x82, 0x01}
+    },
+    /* 100 */
+    {
+        {0x03, 0x01, 0x80, 0x00}, {0x06, 0x01, 0x80, 0x00},
+        {0x0a, 0x01, 0x80, 0x00}, {0x0f, 0x01, 0x80, 0x00},
+        {0x18, 0x01, 0x80, 0x00}, {0x1f, 0x01, 0x80, 0x00},
+        {0x29, 0x01, 0x80, 0x00}, {0x38, 0x01, 0x80, 0x01},
+        {0x03, 0x01, 0x82, 0x00}, {0x06, 0x01, 0x82, 0x00},
+        {0x0a, 0x01, 0x82, 0x00}, {0x0f, 0x01, 0x82, 0x00},
+        {0x18, 0x01, 0x82, 0x00}, {0x1f, 0x01, 0x82, 0x00},
+        {0x29, 0x01, 0x82, 0x00}, {0x38, 0x01, 0x82, 0x01}
+    },
+    {
+        {0x01, 0x01, 0x83, 0x00}, {0x16, 0x01, 0x83, 0x01},
+        {0x01, 0x01, 0xa2, 0x00}, {0x16, 0x01, 0xa2, 0x01},
+        {0x01, 0x01, 0xb8, 0x00}, {0x16, 0x01, 0xb8, 0x01},
+        {0x01, 0x01, 0xc2, 0x00}, {0x16, 0x01, 0xc2, 0x01},
+        {0x01, 0x01, 0xe0, 0x00}, {0x16, 0x01, 0xe0, 0x01},
+        {0x01, 0x01, 0xe2, 0x00}, {0x16, 0x01, 0xe2, 0x01},
+        {0x00, 0x01, 0x99, 0x01}, {0x00, 0x01, 0xa1, 0x01},
+        {0x00, 0x01, 0xa7, 0x01}, {0x00, 0x01, 0xac, 0x01}
+    },
+    {
+        {0x02, 0x01, 0x83, 0x00}, {0x09, 0x01, 0x83, 0x00},
+        {0x17, 0x01, 0x83, 0x00}, {0x28, 0x01, 0x83, 0x01},
+        {0x02, 0x01, 0xa2, 0x00}, {0x09, 0x01, 0xa2, 0x00},
+        {0x17, 0x01, 0xa2, 0x00}, {0x28, 0x01, 0xa2, 0x01},
+        {0x02, 0x01, 0xb8, 0x00}, {0x09, 0x01, 0xb8, 0x00},
+        {0x17, 0x01, 0xb8, 0x00}, {0x28, 0x01, 0xb8, 0x01},
+        {0x02, 0x01, 0xc2, 0x00}, {0x09, 0x01, 0xc2, 0x00},
+        {0x17, 0x01, 0xc2, 0x00}, {0x28, 0x01, 0xc2, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x83, 0x00}, {0x06, 0x01, 0x83, 0x00},
+        {0x0a, 0x01, 0x83, 0x00}, {0x0f, 0x01, 0x83, 0x00},
+        {0x18, 0x01, 0x83, 0x00}, {0x1f, 0x01, 0x83, 0x00},
+        {0x29, 0x01, 0x83, 0x00}, {0x38, 0x01, 0x83, 0x01},
+        {0x03, 0x01, 0xa2, 0x00}, {0x06, 0x01, 0xa2, 0x00},
+        {0x0a, 0x01, 0xa2, 0x00}, {0x0f, 0x01, 0xa2, 0x00},
+        {0x18, 0x01, 0xa2, 0x00}, {0x1f, 0x01, 0xa2, 0x00},
+        {0x29, 0x01, 0xa2, 0x00}, {0x38, 0x01, 0xa2, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xb8, 0x00}, {0x06, 0x01, 0xb8, 0x00},
+        {0x0a, 0x01, 0xb8, 0x00}, {0x0f, 0x01, 0xb8, 0x00},
+        {0x18, 0x01, 0xb8, 0x00}, {0x1f, 0x01, 0xb8, 0x00},
+        {0x29, 0x01, 0xb8, 0x00}, {0x38, 0x01, 0xb8, 0x01},
+        {0x03, 0x01, 0xc2, 0x00}, {0x06, 0x01, 0xc2, 0x00},
+        {0x0a, 0x01, 0xc2, 0x00}, {0x0f, 0x01, 0xc2, 0x00},
+        {0x18, 0x01, 0xc2, 0x00}, {0x1f, 0x01, 0xc2, 0x00},
+        {0x29, 0x01, 0xc2, 0x00}, {0x38, 0x01, 0xc2, 0x01}
+    },
+    /* 105 */
+    {
+        {0x02, 0x01, 0xe0, 0x00}, {0x09, 0x01, 0xe0, 0x00},
+        {0x17, 0x01, 0xe0, 0x00}, {0x28, 0x01, 0xe0, 0x01},
+        {0x02, 0x01, 0xe2, 0x00}, {0x09, 0x01, 0xe2, 0x00},
+        {0x17, 0x01, 0xe2, 0x00}, {0x28, 0x01, 0xe2, 0x01},
+        {0x01, 0x01, 0x99, 0x00}, {0x16, 0x01, 0x99, 0x01},
+        {0x01, 0x01, 0xa1, 0x00}, {0x16, 0x01, 0xa1, 0x01},
+        {0x01, 0x01, 0xa7, 0x00}, {0x16, 0x01, 0xa7, 0x01},
+        {0x01, 0x01, 0xac, 0x00}, {0x16, 0x01, 0xac, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xe0, 0x00}, {0x06, 0x01, 0xe0, 0x00},
+        {0x0a, 0x01, 0xe0, 0x00}, {0x0f, 0x01, 0xe0, 0x00},
+        {0x18, 0x01, 0xe0, 0x00}, {0x1f, 0x01, 0xe0, 0x00},
+        {0x29, 0x01, 0xe0, 0x00}, {0x38, 0x01, 0xe0, 0x01},
+        {0x03, 0x01, 0xe2, 0x00}, {0x06, 0x01, 0xe2, 0x00},
+        {0x0a, 0x01, 0xe2, 0x00}, {0x0f, 0x01, 0xe2, 0x00},
+        {0x18, 0x01, 0xe2, 0x00}, {0x1f, 0x01, 0xe2, 0x00},
+        {0x29, 0x01, 0xe2, 0x00}, {0x38, 0x01, 0xe2, 0x01}
+    },
+    {
+        {0x02, 0x01, 0x99, 0x00}, {0x09, 0x01, 0x99, 0x00},
+        {0x17, 0x01, 0x99, 0x00}, {0x28, 0x01, 0x99, 0x01},
+        {0x02, 0x01, 0xa1, 0x00}, {0x09, 0x01, 0xa1, 0x00},
+        {0x17, 0x01, 0xa1, 0x00}, {0x28, 0x01, 0xa1, 0x01},
+        {0x02, 0x01, 0xa7, 0x00}, {0x09, 0x01, 0xa7, 0x00},
+        {0x17, 0x01, 0xa7, 0x00}, {0x28, 0x01, 0xa7, 0x01},
+        {0x02, 0x01, 0xac, 0x00}, {0x09, 0x01, 0xac, 0x00},
+        {0x17, 0x01, 0xac, 0x00}, {0x28, 0x01, 0xac, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x99, 0x00}, {0x06, 0x01, 0x99, 0x00},
+        {0x0a, 0x01, 0x99, 0x00}, {0x0f, 0x01, 0x99, 0x00},
+        {0x18, 0x01, 0x99, 0x00}, {0x1f, 0x01, 0x99, 0x00},
+        {0x29, 0x01, 0x99, 0x00}, {0x38, 0x01, 0x99, 0x01},
+        {0x03, 0x01, 0xa1, 0x00}, {0x06, 0x01, 0xa1, 0x00},
+        {0x0a, 0x01, 0xa1, 0x00}, {0x0f, 0x01, 0xa1, 0x00},
+        {0x18, 0x01, 0xa1, 0x00}, {0x1f, 0x01, 0xa1, 0x00},
+        {0x29, 0x01, 0xa1, 0x00}, {0x38, 0x01, 0xa1, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xa7, 0x00}, {0x06, 0x01, 0xa7, 0x00},
+        {0x0a, 0x01, 0xa7, 0x00}, {0x0f, 0x01, 0xa7, 0x00},
+        {0x18, 0x01, 0xa7, 0x00}, {0x1f, 0x01, 0xa7, 0x00},
+        {0x29, 0x01, 0xa7, 0x00}, {0x38, 0x01, 0xa7, 0x01},
+        {0x03, 0x01, 0xac, 0x00}, {0x06, 0x01, 0xac, 0x00},
+        {0x0a, 0x01, 0xac, 0x00}, {0x0f, 0x01, 0xac, 0x00},
+        {0x18, 0x01, 0xac, 0x00}, {0x1f, 0x01, 0xac, 0x00},
+        {0x29, 0x01, 0xac, 0x00}, {0x38, 0x01, 0xac, 0x01}
+    },
+    /* 110 */
+    {
+        {0x72, 0x00, 0x00, 0x00}, {0x73, 0x00, 0x00, 0x00},
+        {0x75, 0x00, 0x00, 0x00}, {0x76, 0x00, 0x00, 0x00},
+        {0x79, 0x00, 0x00, 0x00}, {0x7b, 0x00, 0x00, 0x00},
+        {0x7f, 0x00, 0x00, 0x00}, {0x82, 0x00, 0x00, 0x00},
+        {0x88, 0x00, 0x00, 0x00}, {0x8b, 0x00, 0x00, 0x00},
+        {0x8f, 0x00, 0x00, 0x00}, {0x92, 0x00, 0x00, 0x00},
+        {0x9b, 0x00, 0x00, 0x00}, {0xa2, 0x00, 0x00, 0x00},
+        {0xaa, 0x00, 0x00, 0x00}, {0xb4, 0x00, 0x00, 0x01}
+    },
+    {
+        {0x00, 0x01, 0xb0, 0x01}, {0x00, 0x01, 0xb1, 0x01},
+        {0x00, 0x01, 0xb3, 0x01}, {0x00, 0x01, 0xd1, 0x01},
+        {0x00, 0x01, 0xd8, 0x01}, {0x00, 0x01, 0xd9, 0x01},
+        {0x00, 0x01, 0xe3, 0x01}, {0x00, 0x01, 0xe5, 0x01},
+        {0x00, 0x01, 0xe6, 0x01}, {0x7a, 0x00, 0x00, 0x00},
+        {0x7c, 0x00, 0x00, 0x00}, {0x7d, 0x00, 0x00, 0x00},
+        {0x80, 0x00, 0x00, 0x00}, {0x81, 0x00, 0x00, 0x00},
+        {0x83, 0x00, 0x00, 0x00}, {0x84, 0x00, 0x00, 0x00}
+    },
+    {
+        {0x01, 0x01, 0xb0, 0x00}, {0x16, 0x01, 0xb0, 0x01},
+        {0x01, 0x01, 0xb1, 0x00}, {0x16, 0x01, 0xb1, 0x01},
+        {0x01, 0x01, 0xb3, 0x00}, {0x16, 0x01, 0xb3, 0x01},
+        {0x01, 0x01, 0xd1, 0x00}, {0x16, 0x01, 0xd1, 0x01},
+        {0x01, 0x01, 0xd8, 0x00}, {0x16, 0x01, 0xd8, 0x01},
+        {0x01, 0x01, 0xd9, 0x00}, {0x16, 0x01, 0xd9, 0x01},
+        {0x01, 0x01, 0xe3, 0x00}, {0x16, 0x01, 0xe3, 0x01},
+        {0x01, 0x01, 0xe5, 0x00}, {0x16, 0x01, 0xe5, 0x01}
+    },
+    {
+        {0x02, 0x01, 0xb0, 0x00}, {0x09, 0x01, 0xb0, 0x00},
+        {0x17, 0x01, 0xb0, 0x00}, {0x28, 0x01, 0xb0, 0x01},
+        {0x02, 0x01, 0xb1, 0x00}, {0x09, 0x01, 0xb1, 0x00},
+        {0x17, 0x01, 0xb1, 0x00}, {0x28, 0x01, 0xb1, 0x01},
+        {0x02, 0x01, 0xb3, 0x00}, {0x09, 0x01, 0xb3, 0x00},
+        {0x17, 0x01, 0xb3, 0x00}, {0x28, 0x01, 0xb3, 0x01},
+        {0x02, 0x01, 0xd1, 0x00}, {0x09, 0x01, 0xd1, 0x00},
+        {0x17, 0x01, 0xd1, 0x00}, {0x28, 0x01, 0xd1, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xb0, 0x00}, {0x06, 0x01, 0xb0, 0x00},
+        {0x0a, 0x01, 0xb0, 0x00}, {0x0f, 0x01, 0xb0, 0x00},
+        {0x18, 0x01, 0xb0, 0x00}, {0x1f, 0x01, 0xb0, 0x00},
+        {0x29, 0x01, 0xb0, 0x00}, {0x38, 0x01, 0xb0, 0x01},
+        {0x03, 0x01, 0xb1, 0x00}, {0x06, 0x01, 0xb1, 0x00},
+        {0x0a, 0x01, 0xb1, 0x00}, {0x0f, 0x01, 0xb1, 0x00},
+        {0x18, 0x01, 0xb1, 0x00}, {0x1f, 0x01, 0xb1, 0x00},
+        {0x29, 0x01, 0xb1, 0x00}, {0x38, 0x01, 0xb1, 0x01}
+    },
+    /* 115 */
+    {
+        {0x03, 0x01, 0xb3, 0x00}, {0x06, 0x01, 0xb3, 0x00},
+        {0x0a, 0x01, 0xb3, 0x00}, {0x0f, 0x01, 0xb3, 0x00},
+        {0x18, 0x01, 0xb3, 0x00}, {0x1f, 0x01, 0xb3, 0x00},
+        {0x29, 0x01, 0xb3, 0x00}, {0x38, 0x01, 0xb3, 0x01},
+        {0x03, 0x01, 0xd1, 0x00}, {0x06, 0x01, 0xd1, 0x00},
+        {0x0a, 0x01, 0xd1, 0x00}, {0x0f, 0x01, 0xd1, 0x00},
+        {0x18, 0x01, 0xd1, 0x00}, {0x1f, 0x01, 0xd1, 0x00},
+        {0x29, 0x01, 0xd1, 0x00}, {0x38, 0x01, 0xd1, 0x01}
+    },
+    {
+        {0x02, 0x01, 0xd8, 0x00}, {0x09, 0x01, 0xd8, 0x00},
+        {0x17, 0x01, 0xd8, 0x00}, {0x28, 0x01, 0xd8, 0x01},
+        {0x02, 0x01, 0xd9, 0x00}, {0x09, 0x01, 0xd9, 0x00},
+        {0x17, 0x01, 0xd9, 0x00}, {0x28, 0x01, 0xd9, 0x01},
+        {0x02, 0x01, 0xe3, 0x00}, {0x09, 0x01, 0xe3, 0x00},
+        {0x17, 0x01, 0xe3, 0x00}, {0x28, 0x01, 0xe3, 0x01},
+        {0x02, 0x01, 0xe5, 0x00}, {0x09, 0x01, 0xe5, 0x00},
+        {0x17, 0x01, 0xe5, 0x00}, {0x28, 0x01, 0xe5, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xd8, 0x00}, {0x06, 0x01, 0xd8, 0x00},
+        {0x0a, 0x01, 0xd8, 0x00}, {0x0f, 0x01, 0xd8, 0x00},
+        {0x18, 0x01, 0xd8, 0x00}, {0x1f, 0x01, 0xd8, 0x00},
+        {0x29, 0x01, 0xd8, 0x00}, {0x38, 0x01, 0xd8, 0x01},
+        {0x03, 0x01, 0xd9, 0x00}, {0x06, 0x01, 0xd9, 0x00},
+        {0x0a, 0x01, 0xd9, 0x00}, {0x0f, 0x01, 0xd9, 0x00},
+        {0x18, 0x01, 0xd9, 0x00}, {0x1f, 0x01, 0xd9, 0x00},
+        {0x29, 0x01, 0xd9, 0x00}, {0x38, 0x01, 0xd9, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xe3, 0x00}, {0x06, 0x01, 0xe3, 0x00},
+        {0x0a, 0x01, 0xe3, 0x00}, {0x0f, 0x01, 0xe3, 0x00},
+        {0x18, 0x01, 0xe3, 0x00}, {0x1f, 0x01, 0xe3, 0x00},
+        {0x29, 0x01, 0xe3, 0x00}, {0x38, 0x01, 0xe3, 0x01},
+        {0x03, 0x01, 0xe5, 0x00}, {0x06, 0x01, 0xe5, 0x00},
+        {0x0a, 0x01, 0xe5, 0x00}, {0x0f, 0x01, 0xe5, 0x00},
+        {0x18, 0x01, 0xe5, 0x00}, {0x1f, 0x01, 0xe5, 0x00},
+        {0x29, 0x01, 0xe5, 0x00}, {0x38, 0x01, 0xe5, 0x01}
+    },
+    {
+        {0x01, 0x01, 0xe6, 0x00}, {0x16, 0x01, 0xe6, 0x01},
+        {0x00, 0x01, 0x81, 0x01}, {0x00, 0x01, 0x84, 0x01},
+        {0x00, 0x01, 0x85, 0x01}, {0x00, 0x01, 0x86, 0x01},
+        {0x00, 0x01, 0x88, 0x01}, {0x00, 0x01, 0x92, 0x01},
+        {0x00, 0x01, 0x9a, 0x01}, {0x00, 0x01, 0x9c, 0x01},
+        {0x00, 0x01, 0xa0, 0x01}, {0x00, 0x01, 0xa3, 0x01},
+        {0x00, 0x01, 0xa4, 0x01}, {0x00, 0x01, 0xa9, 0x01},
+        {0x00, 0x01, 0xaa, 0x01}, {0x00, 0x01, 0xad, 0x01}
+    },
+    /* 120 */
+    {
+        {0x02, 0x01, 0xe6, 0x00}, {0x09, 0x01, 0xe6, 0x00},
+        {0x17, 0x01, 0xe6, 0x00}, {0x28, 0x01, 0xe6, 0x01},
+        {0x01, 0x01, 0x81, 0x00}, {0x16, 0x01, 0x81, 0x01},
+        {0x01, 0x01, 0x84, 0x00}, {0x16, 0x01, 0x84, 0x01},
+        {0x01, 0x01, 0x85, 0x00}, {0x16, 0x01, 0x85, 0x01},
+        {0x01, 0x01, 0x86, 0x00}, {0x16, 0x01, 0x86, 0x01},
+        {0x01, 0x01, 0x88, 0x00}, {0x16, 0x01, 0x88, 0x01},
+        {0x01, 0x01, 0x92, 0x00}, {0x16, 0x01, 0x92, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xe6, 0x00}, {0x06, 0x01, 0xe6, 0x00},
+        {0x0a, 0x01, 0xe6, 0x00}, {0x0f, 0x01, 0xe6, 0x00},
+        {0x18, 0x01, 0xe6, 0x00}, {0x1f, 0x01, 0xe6, 0x00},
+        {0x29, 0x01, 0xe6, 0x00}, {0x38, 0x01, 0xe6, 0x01},
+        {0x02, 0x01, 0x81, 0x00}, {0x09, 0x01, 0x81, 0x00},
+        {0x17, 0x01, 0x81, 0x00}, {0x28, 0x01, 0x81, 0x01},
+        {0x02, 0x01, 0x84, 0x00}, {0x09, 0x01, 0x84, 0x00},
+        {0x17, 0x01, 0x84, 0x00}, {0x28, 0x01, 0x84, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x81, 0x00}, {0x06, 0x01, 0x81, 0x00},
+        {0x0a, 0x01, 0x81, 0x00}, {0x0f, 0x01, 0x81, 0x00},
+        {0x18, 0x01, 0x81, 0x00}, {0x1f, 0x01, 0x81, 0x00},
+        {0x29, 0x01, 0x81, 0x00}, {0x38, 0x01, 0x81, 0x01},
+        {0x03, 0x01, 0x84, 0x00}, {0x06, 0x01, 0x84, 0x00},
+        {0x0a, 0x01, 0x84, 0x00}, {0x0f, 0x01, 0x84, 0x00},
+        {0x18, 0x01, 0x84, 0x00}, {0x1f, 0x01, 0x84, 0x00},
+        {0x29, 0x01, 0x84, 0x00}, {0x38, 0x01, 0x84, 0x01}
+    },
+    {
+        {0x02, 0x01, 0x85, 0x00}, {0x09, 0x01, 0x85, 0x00},
+        {0x17, 0x01, 0x85, 0x00}, {0x28, 0x01, 0x85, 0x01},
+        {0x02, 0x01, 0x86, 0x00}, {0x09, 0x01, 0x86, 0x00},
+        {0x17, 0x01, 0x86, 0x00}, {0x28, 0x01, 0x86, 0x01},
+        {0x02, 0x01, 0x88, 0x00}, {0x09, 0x01, 0x88, 0x00},
+        {0x17, 0x01, 0x88, 0x00}, {0x28, 0x01, 0x88, 0x01},
+        {0x02, 0x01, 0x92, 0x00}, {0x09, 0x01, 0x92, 0x00},
+        {0x17, 0x01, 0x92, 0x00}, {0x28, 0x01, 0x92, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x85, 0x00}, {0x06, 0x01, 0x85, 0x00},
+        {0x0a, 0x01, 0x85, 0x00}, {0x0f, 0x01, 0x85, 0x00},
+        {0x18, 0x01, 0x85, 0x00}, {0x1f, 0x01, 0x85, 0x00},
+        {0x29, 0x01, 0x85, 0x00}, {0x38, 0x01, 0x85, 0x01},
+        {0x03, 0x01, 0x86, 0x00}, {0x06, 0x01, 0x86, 0x00},
+        {0x0a, 0x01, 0x86, 0x00}, {0x0f, 0x01, 0x86, 0x00},
+        {0x18, 0x01, 0x86, 0x00}, {0x1f, 0x01, 0x86, 0x00},
+        {0x29, 0x01, 0x86, 0x00}, {0x38, 0x01, 0x86, 0x01}
+    },
+    /* 125 */
+    {
+        {0x03, 0x01, 0x88, 0x00}, {0x06, 0x01, 0x88, 0x00},
+        {0x0a, 0x01, 0x88, 0x00}, {0x0f, 0x01, 0x88, 0x00},
+        {0x18, 0x01, 0x88, 0x00}, {0x1f, 0x01, 0x88, 0x00},
+        {0x29, 0x01, 0x88, 0x00}, {0x38, 0x01, 0x88, 0x01},
+        {0x03, 0x01, 0x92, 0x00}, {0x06, 0x01, 0x92, 0x00},
+        {0x0a, 0x01, 0x92, 0x00}, {0x0f, 0x01, 0x92, 0x00},
+        {0x18, 0x01, 0x92, 0x00}, {0x1f, 0x01, 0x92, 0x00},
+        {0x29, 0x01, 0x92, 0x00}, {0x38, 0x01, 0x92, 0x01}
+    },
+    {
+        {0x01, 0x01, 0x9a, 0x00}, {0x16, 0x01, 0x9a, 0x01},
+        {0x01, 0x01, 0x9c, 0x00}, {0x16, 0x01, 0x9c, 0x01},
+        {0x01, 0x01, 0xa0, 0x00}, {0x16, 0x01, 0xa0, 0x01},
+        {0x01, 0x01, 0xa3, 0x00}, {0x16, 0x01, 0xa3, 0x01},
+        {0x01, 0x01, 0xa4, 0x00}, {0x16, 0x01, 0xa4, 0x01},
+        {0x01, 0x01, 0xa9, 0x00}, {0x16, 0x01, 0xa9, 0x01},
+        {0x01, 0x01, 0xaa, 0x00}, {0x16, 0x01, 0xaa, 0x01},
+        {0x01, 0x01, 0xad, 0x00}, {0x16, 0x01, 0xad, 0x01}
+    },
+    {
+        {0x02, 0x01, 0x9a, 0x00}, {0x09, 0x01, 0x9a, 0x00},
+        {0x17, 0x01, 0x9a, 0x00}, {0x28, 0x01, 0x9a, 0x01},
+        {0x02, 0x01, 0x9c, 0x00}, {0x09, 0x01, 0x9c, 0x00},
+        {0x17, 0x01, 0x9c, 0x00}, {0x28, 0x01, 0x9c, 0x01},
+        {0x02, 0x01, 0xa0, 0x00}, {0x09, 0x01, 0xa0, 0x00},
+        {0x17, 0x01, 0xa0, 0x00}, {0x28, 0x01, 0xa0, 0x01},
+        {0x02, 0x01, 0xa3, 0x00}, {0x09, 0x01, 0xa3, 0x00},
+        {0x17, 0x01, 0xa3, 0x00}, {0x28, 0x01, 0xa3, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x9a, 0x00}, {0x06, 0x01, 0x9a, 0x00},
+        {0x0a, 0x01, 0x9a, 0x00}, {0x0f, 0x01, 0x9a, 0x00},
+        {0x18, 0x01, 0x9a, 0x00}, {0x1f, 0x01, 0x9a, 0x00},
+        {0x29, 0x01, 0x9a, 0x00}, {0x38, 0x01, 0x9a, 0x01},
+        {0x03, 0x01, 0x9c, 0x00}, {0x06, 0x01, 0x9c, 0x00},
+        {0x0a, 0x01, 0x9c, 0x00}, {0x0f, 0x01, 0x9c, 0x00},
+        {0x18, 0x01, 0x9c, 0x00}, {0x1f, 0x01, 0x9c, 0x00},
+        {0x29, 0x01, 0x9c, 0x00}, {0x38, 0x01, 0x9c, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xa0, 0x00}, {0x06, 0x01, 0xa0, 0x00},
+        {0x0a, 0x01, 0xa0, 0x00}, {0x0f, 0x01, 0xa0, 0x00},
+        {0x18, 0x01, 0xa0, 0x00}, {0x1f, 0x01, 0xa0, 0x00},
+        {0x29, 0x01, 0xa0, 0x00}, {0x38, 0x01, 0xa0, 0x01},
+        {0x03, 0x01, 0xa3, 0x00}, {0x06, 0x01, 0xa3, 0x00},
+        {0x0a, 0x01, 0xa3, 0x00}, {0x0f, 0x01, 0xa3, 0x00},
+        {0x18, 0x01, 0xa3, 0x00}, {0x1f, 0x01, 0xa3, 0x00},
+        {0x29, 0x01, 0xa3, 0x00}, {0x38, 0x01, 0xa3, 0x01}
+    },
+    /* 130 */
+    {
+        {0x02, 0x01, 0xa4, 0x00}, {0x09, 0x01, 0xa4, 0x00},
+        {0x17, 0x01, 0xa4, 0x00}, {0x28, 0x01, 0xa4, 0x01},
+        {0x02, 0x01, 0xa9, 0x00}, {0x09, 0x01, 0xa9, 0x00},
+        {0x17, 0x01, 0xa9, 0x00}, {0x28, 0x01, 0xa9, 0x01},
+        {0x02, 0x01, 0xaa, 0x00}, {0x09, 0x01, 0xaa, 0x00},
+        {0x17, 0x01, 0xaa, 0x00}, {0x28, 0x01, 0xaa, 0x01},
+        {0x02, 0x01, 0xad, 0x00}, {0x09, 0x01, 0xad, 0x00},
+        {0x17, 0x01, 0xad, 0x00}, {0x28, 0x01, 0xad, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xa4, 0x00}, {0x06, 0x01, 0xa4, 0x00},
+        {0x0a, 0x01, 0xa4, 0x00}, {0x0f, 0x01, 0xa4, 0x00},
+        {0x18, 0x01, 0xa4, 0x00}, {0x1f, 0x01, 0xa4, 0x00},
+        {0x29, 0x01, 0xa4, 0x00}, {0x38, 0x01, 0xa4, 0x01},
+        {0x03, 0x01, 0xa9, 0x00}, {0x06, 0x01, 0xa9, 0x00},
+        {0x0a, 0x01, 0xa9, 0x00}, {0x0f, 0x01, 0xa9, 0x00},
+        {0x18, 0x01, 0xa9, 0x00}, {0x1f, 0x01, 0xa9, 0x00},
+        {0x29, 0x01, 0xa9, 0x00}, {0x38, 0x01, 0xa9, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xaa, 0x00}, {0x06, 0x01, 0xaa, 0x00},
+        {0x0a, 0x01, 0xaa, 0x00}, {0x0f, 0x01, 0xaa, 0x00},
+        {0x18, 0x01, 0xaa, 0x00}, {0x1f, 0x01, 0xaa, 0x00},
+        {0x29, 0x01, 0xaa, 0x00}, {0x38, 0x01, 0xaa, 0x01},
+        {0x03, 0x01, 0xad, 0x00}, {0x06, 0x01, 0xad, 0x00},
+        {0x0a, 0x01, 0xad, 0x00}, {0x0f, 0x01, 0xad, 0x00},
+        {0x18, 0x01, 0xad, 0x00}, {0x1f, 0x01, 0xad, 0x00},
+        {0x29, 0x01, 0xad, 0x00}, {0x38, 0x01, 0xad, 0x01}
+    },
+    {
+        {0x89, 0x00, 0x00, 0x00}, {0x8a, 0x00, 0x00, 0x00},
+        {0x8c, 0x00, 0x00, 0x00}, {0x8d, 0x00, 0x00, 0x00},
+        {0x90, 0x00, 0x00, 0x00}, {0x91, 0x00, 0x00, 0x00},
+        {0x93, 0x00, 0x00, 0x00}, {0x96, 0x00, 0x00, 0x00},
+        {0x9c, 0x00, 0x00, 0x00}, {0x9f, 0x00, 0x00, 0x00},
+        {0xa3, 0x00, 0x00, 0x00}, {0xa6, 0x00, 0x00, 0x00},
+        {0xab, 0x00, 0x00, 0x00}, {0xae, 0x00, 0x00, 0x00},
+        {0xb5, 0x00, 0x00, 0x00}, {0xbe, 0x00, 0x00, 0x01}
+    },
+    {
+        {0x00, 0x01, 0xb2, 0x01}, {0x00, 0x01, 0xb5, 0x01},
+        {0x00, 0x01, 0xb9, 0x01}, {0x00, 0x01, 0xba, 0x01},
+        {0x00, 0x01, 0xbb, 0x01}, {0x00, 0x01, 0xbd, 0x01},
+        {0x00, 0x01, 0xbe, 0x01}, {0x00, 0x01, 0xc4, 0x01},
+        {0x00, 0x01, 0xc6, 0x01}, {0x00, 0x01, 0xe4, 0x01},
+        {0x00, 0x01, 0xe8, 0x01}, {0x00, 0x01, 0xe9, 0x01},
+        {0x94, 0x00, 0x00, 0x00}, {0x95, 0x00, 0x00, 0x00},
+        {0x97, 0x00, 0x00, 0x00}, {0x98, 0x00, 0x00, 0x00}
+    },
+    /* 135 */
+    {
+        {0x01, 0x01, 0xb2, 0x00}, {0x16, 0x01, 0xb2, 0x01},
+        {0x01, 0x01, 0xb5, 0x00}, {0x16, 0x01, 0xb5, 0x01},
+        {0x01, 0x01, 0xb9, 0x00}, {0x16, 0x01, 0xb9, 0x01},
+        {0x01, 0x01, 0xba, 0x00}, {0x16, 0x01, 0xba, 0x01},
+        {0x01, 0x01, 0xbb, 0x00}, {0x16, 0x01, 0xbb, 0x01},
+        {0x01, 0x01, 0xbd, 0x00}, {0x16, 0x01, 0xbd, 0x01},
+        {0x01, 0x01, 0xbe, 0x00}, {0x16, 0x01, 0xbe, 0x01},
+        {0x01, 0x01, 0xc4, 0x00}, {0x16, 0x01, 0xc4, 0x01}
+    },
+    {
+        {0x02, 0x01, 0xb2, 0x00}, {0x09, 0x01, 0xb2, 0x00},
+        {0x17, 0x01, 0xb2, 0x00}, {0x28, 0x01, 0xb2, 0x01},
+        {0x02, 0x01, 0xb5, 0x00}, {0x09, 0x01, 0xb5, 0x00},
+        {0x17, 0x01, 0xb5, 0x00}, {0x28, 0x01, 0xb5, 0x01},
+        {0x02, 0x01, 0xb9, 0x00}, {0x09, 0x01, 0xb9, 0x00},
+        {0x17, 0x01, 0xb9, 0x00}, {0x28, 0x01, 0xb9, 0x01},
+        {0x02, 0x01, 0xba, 0x00}, {0x09, 0x01, 0xba, 0x00},
+        {0x17, 0x01, 0xba, 0x00}, {0x28, 0x01, 0xba, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xb2, 0x00}, {0x06, 0x01, 0xb2, 0x00},
+        {0x0a, 0x01, 0xb2, 0x00}, {0x0f, 0x01, 0xb2, 0x00},
+        {0x18, 0x01, 0xb2, 0x00}, {0x1f, 0x01, 0xb2, 0x00},
+        {0x29, 0x01, 0xb2, 0x00}, {0x38, 0x01, 0xb2, 0x01},
+        {0x03, 0x01, 0xb5, 0x00}, {0x06, 0x01, 0xb5, 0x00},
+        {0x0a, 0x01, 0xb5, 0x00}, {0x0f, 0x01, 0xb5, 0x00},
+        {0x18, 0x01, 0xb5, 0x00}, {0x1f, 0x01, 0xb5, 0x00},
+        {0x29, 0x01, 0xb5, 0x00}, {0x38, 0x01, 0xb5, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xb9, 0x00}, {0x06, 0x01, 0xb9, 0x00},
+        {0x0a, 0x01, 0xb9, 0x00}, {0x0f, 0x01, 0xb9, 0x00},
+        {0x18, 0x01, 0xb9, 0x00}, {0x1f, 0x01, 0xb9, 0x00},
+        {0x29, 0x01, 0xb9, 0x00}, {0x38, 0x01, 0xb9, 0x01},
+        {0x03, 0x01, 0xba, 0x00}, {0x06, 0x01, 0xba, 0x00},
+        {0x0a, 0x01, 0xba, 0x00}, {0x0f, 0x01, 0xba, 0x00},
+        {0x18, 0x01, 0xba, 0x00}, {0x1f, 0x01, 0xba, 0x00},
+        {0x29, 0x01, 0xba, 0x00}, {0x38, 0x01, 0xba, 0x01}
+    },
+    {
+        {0x02, 0x01, 0xbb, 0x00}, {0x09, 0x01, 0xbb, 0x00},
+        {0x17, 0x01, 0xbb, 0x00}, {0x28, 0x01, 0xbb, 0x01},
+        {0x02, 0x01, 0xbd, 0x00}, {0x09, 0x01, 0xbd, 0x00},
+        {0x17, 0x01, 0xbd, 0x00}, {0x28, 0x01, 0xbd, 0x01},
+        {0x02, 0x01, 0xbe, 0x00}, {0x09, 0x01, 0xbe, 0x00},
+        {0x17, 0x01, 0xbe, 0x00}, {0x28, 0x01, 0xbe, 0x01},
+        {0x02, 0x01, 0xc4, 0x00}, {0x09, 0x01, 0xc4, 0x00},
+        {0x17, 0x01, 0xc4, 0x00}, {0x28, 0x01, 0xc4, 0x01}
+    },
+    /* 140 */
+    {
+        {0x03, 0x01, 0xbb, 0x00}, {0x06, 0x01, 0xbb, 0x00},
+        {0x0a, 0x01, 0xbb, 0x00}, {0x0f, 0x01, 0xbb, 0x00},
+        {0x18, 0x01, 0xbb, 0x00}, {0x1f, 0x01, 0xbb, 0x00},
+        {0x29, 0x01, 0xbb, 0x00}, {0x38, 0x01, 0xbb, 0x01},
+        {0x03, 0x01, 0xbd, 0x00}, {0x06, 0x01, 0xbd, 0x00},
+        {0x0a, 0x01, 0xbd, 0x00}, {0x0f, 0x01, 0xbd, 0x00},
+        {0x18, 0x01, 0xbd, 0x00}, {0x1f, 0x01, 0xbd, 0x00},
+        {0x29, 0x01, 0xbd, 0x00}, {0x38, 0x01, 0xbd, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xbe, 0x00}, {0x06, 0x01, 0xbe, 0x00},
+        {0x0a, 0x01, 0xbe, 0x00}, {0x0f, 0x01, 0xbe, 0x00},
+        {0x18, 0x01, 0xbe, 0x00}, {0x1f, 0x01, 0xbe, 0x00},
+        {0x29, 0x01, 0xbe, 0x00}, {0x38, 0x01, 0xbe, 0x01},
+        {0x03, 0x01, 0xc4, 0x00}, {0x06, 0x01, 0xc4, 0x00},
+        {0x0a, 0x01, 0xc4, 0x00}, {0x0f, 0x01, 0xc4, 0x00},
+        {0x18, 0x01, 0xc4, 0x00}, {0x1f, 0x01, 0xc4, 0x00},
+        {0x29, 0x01, 0xc4, 0x00}, {0x38, 0x01, 0xc4, 0x01}
+    },
+    {
+        {0x01, 0x01, 0xc6, 0x00}, {0x16, 0x01, 0xc6, 0x01},
+        {0x01, 0x01, 0xe4, 0x00}, {0x16, 0x01, 0xe4, 0x01},
+        {0x01, 0x01, 0xe8, 0x00}, {0x16, 0x01, 0xe8, 0x01},
+        {0x01, 0x01, 0xe9, 0x00}, {0x16, 0x01, 0xe9, 0x01},
+        {0x00, 0x01, 0x01, 0x01}, {0x00, 0x01, 0x87, 0x01},
+        {0x00, 0x01, 0x89, 0x01}, {0x00, 0x01, 0x8a, 0x01},
+        {0x00, 0x01, 0x8b, 0x01}, {0x00, 0x01, 0x8c, 0x01},
+        {0x00, 0x01, 0x8d, 0x01}, {0x00, 0x01, 0x8f, 0x01}
+    },
+    {
+        {0x02, 0x01, 0xc6, 0x00}, {0x09, 0x01, 0xc6, 0x00},
+        {0x17, 0x01, 0xc6, 0x00}, {0x28, 0x01, 0xc6, 0x01},
+        {0x02, 0x01, 0xe4, 0x00}, {0x09, 0x01, 0xe4, 0x00},
+        {0x17, 0x01, 0xe4, 0x00}, {0x28, 0x01, 0xe4, 0x01},
+        {0x02, 0x01, 0xe8, 0x00}, {0x09, 0x01, 0xe8, 0x00},
+        {0x17, 0x01, 0xe8, 0x00}, {0x28, 0x01, 0xe8, 0x01},
+        {0x02, 0x01, 0xe9, 0x00}, {0x09, 0x01, 0xe9, 0x00},
+        {0x17, 0x01, 0xe9, 0x00}, {0x28, 0x01, 0xe9, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xc6, 0x00}, {0x06, 0x01, 0xc6, 0x00},
+        {0x0a, 0x01, 0xc6, 0x00}, {0x0f, 0x01, 0xc6, 0x00},
+        {0x18, 0x01, 0xc6, 0x00}, {0x1f, 0x01, 0xc6, 0x00},
+        {0x29, 0x01, 0xc6, 0x00}, {0x38, 0x01, 0xc6, 0x01},
+        {0x03, 0x01, 0xe4, 0x00}, {0x06, 0x01, 0xe4, 0x00},
+        {0x0a, 0x01, 0xe4, 0x00}, {0x0f, 0x01, 0xe4, 0x00},
+        {0x18, 0x01, 0xe4, 0x00}, {0x1f, 0x01, 0xe4, 0x00},
+        {0x29, 0x01, 0xe4, 0x00}, {0x38, 0x01, 0xe4, 0x01}
+    },
+    /* 145 */
+    {
+        {0x03, 0x01, 0xe8, 0x00}, {0x06, 0x01, 0xe8, 0x00},
+        {0x0a, 0x01, 0xe8, 0x00}, {0x0f, 0x01, 0xe8, 0x00},
+        {0x18, 0x01, 0xe8, 0x00}, {0x1f, 0x01, 0xe8, 0x00},
+        {0x29, 0x01, 0xe8, 0x00}, {0x38, 0x01, 0xe8, 0x01},
+        {0x03, 0x01, 0xe9, 0x00}, {0x06, 0x01, 0xe9, 0x00},
+        {0x0a, 0x01, 0xe9, 0x00}, {0x0f, 0x01, 0xe9, 0x00},
+        {0x18, 0x01, 0xe9, 0x00}, {0x1f, 0x01, 0xe9, 0x00},
+        {0x29, 0x01, 0xe9, 0x00}, {0x38, 0x01, 0xe9, 0x01}
+    },
+    {
+        {0x01, 0x01, 0x01, 0x00}, {0x16, 0x01, 0x01, 0x01},
+        {0x01, 0x01, 0x87, 0x00}, {0x16, 0x01, 0x87, 0x01},
+        {0x01, 0x01, 0x89, 0x00}, {0x16, 0x01, 0x89, 0x01},
+        {0x01, 0x01, 0x8a, 0x00}, {0x16, 0x01, 0x8a, 0x01},
+        {0x01, 0x01, 0x8b, 0x00}, {0x16, 0x01, 0x8b, 0x01},
+        {0x01, 0x01, 0x8c, 0x00}, {0x16, 0x01, 0x8c, 0x01},
+        {0x01, 0x01, 0x8d, 0x00}, {0x16, 0x01, 0x8d, 0x01},
+        {0x01, 0x01, 0x8f, 0x00}, {0x16, 0x01, 0x8f, 0x01}
+    },
+    {
+        {0x02, 0x01, 0x01, 0x00}, {0x09, 0x01, 0x01, 0x00},
+        {0x17, 0x01, 0x01, 0x00}, {0x28, 0x01, 0x01, 0x01},
+        {0x02, 0x01, 0x87, 0x00}, {0x09, 0x01, 0x87, 0x00},
+        {0x17, 0x01, 0x87, 0x00}, {0x28, 0x01, 0x87, 0x01},
+        {0x02, 0x01, 0x89, 0x00}, {0x09, 0x01, 0x89, 0x00},
+        {0x17, 0x01, 0x89, 0x00}, {0x28, 0x01, 0x89, 0x01},
+        {0x02, 0x01, 0x8a, 0x00}, {0x09, 0x01, 0x8a, 0x00},
+        {0x17, 0x01, 0x8a, 0x00}, {0x28, 0x01, 0x8a, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x01, 0x00}, {0x06, 0x01, 0x01, 0x00},
+        {0x0a, 0x01, 0x01, 0x00}, {0x0f, 0x01, 0x01, 0x00},
+        {0x18, 0x01, 0x01, 0x00}, {0x1f, 0x01, 0x01, 0x00},
+        {0x29, 0x01, 0x01, 0x00}, {0x38, 0x01, 0x01, 0x01},
+        {0x03, 0x01, 0x87, 0x00}, {0x06, 0x01, 0x87, 0x00},
+        {0x0a, 0x01, 0x87, 0x00}, {0x0f, 0x01, 0x87, 0x00},
+        {0x18, 0x01, 0x87, 0x00}, {0x1f, 0x01, 0x87, 0x00},
+        {0x29, 0x01, 0x87, 0x00}, {0x38, 0x01, 0x87, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x89, 0x00}, {0x06, 0x01, 0x89, 0x00},
+        {0x0a, 0x01, 0x89, 0x00}, {0x0f, 0x01, 0x89, 0x00},
+        {0x18, 0x01, 0x89, 0x00}, {0x1f, 0x01, 0x89, 0x00},
+        {0x29, 0x01, 0x89, 0x00}, {0x38, 0x01, 0x89, 0x01},
+        {0x03, 0x01, 0x8a, 0x00}, {0x06, 0x01, 0x8a, 0x00},
+        {0x0a, 0x01, 0x8a, 0x00}, {0x0f, 0x01, 0x8a, 0x00},
+        {0x18, 0x01, 0x8a, 0x00}, {0x1f, 0x01, 0x8a, 0x00},
+        {0x29, 0x01, 0x8a, 0x00}, {0x38, 0x01, 0x8a, 0x01}
+    },
+    /* 150 */
+    {
+        {0x02, 0x01, 0x8b, 0x00}, {0x09, 0x01, 0x8b, 0x00},
+        {0x17, 0x01, 0x8b, 0x00}, {0x28, 0x01, 0x8b, 0x01},
+        {0x02, 0x01, 0x8c, 0x00}, {0x09, 0x01, 0x8c, 0x00},
+        {0x17, 0x01, 0x8c, 0x00}, {0x28, 0x01, 0x8c, 0x01},
+        {0x02, 0x01, 0x8d, 0x00}, {0x09, 0x01, 0x8d, 0x00},
+        {0x17, 0x01, 0x8d, 0x00}, {0x28, 0x01, 0x8d, 0x01},
+        {0x02, 0x01, 0x8f, 0x00}, {0x09, 0x01, 0x8f, 0x00},
+        {0x17, 0x01, 0x8f, 0x00}, {0x28, 0x01, 0x8f, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x8b, 0x00}, {0x06, 0x01, 0x8b, 0x00},
+        {0x0a, 0x01, 0x8b, 0x00}, {0x0f, 0x01, 0x8b, 0x00},
+        {0x18, 0x01, 0x8b, 0x00}, {0x1f, 0x01, 0x8b, 0x00},
+        {0x29, 0x01, 0x8b, 0x00}, {0x38, 0x01, 0x8b, 0x01},
+        {0x03, 0x01, 0x8c, 0x00}, {0x06, 0x01, 0x8c, 0x00},
+        {0x0a, 0x01, 0x8c, 0x00}, {0x0f, 0x01, 0x8c, 0x00},
+        {0x18, 0x01, 0x8c, 0x00}, {0x1f, 0x01, 0x8c, 0x00},
+        {0x29, 0x01, 0x8c, 0x00}, {0x38, 0x01, 0x8c, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x8d, 0x00}, {0x06, 0x01, 0x8d, 0x00},
+        {0x0a, 0x01, 0x8d, 0x00}, {0x0f, 0x01, 0x8d, 0x00},
+        {0x18, 0x01, 0x8d, 0x00}, {0x1f, 0x01, 0x8d, 0x00},
+        {0x29, 0x01, 0x8d, 0x00}, {0x38, 0x01, 0x8d, 0x01},
+        {0x03, 0x01, 0x8f, 0x00}, {0x06, 0x01, 0x8f, 0x00},
+        {0x0a, 0x01, 0x8f, 0x00}, {0x0f, 0x01, 0x8f, 0x00},
+        {0x18, 0x01, 0x8f, 0x00}, {0x1f, 0x01, 0x8f, 0x00},
+        {0x29, 0x01, 0x8f, 0x00}, {0x38, 0x01, 0x8f, 0x01}
+    },
+    {
+        {0x9d, 0x00, 0x00, 0x00}, {0x9e, 0x00, 0x00, 0x00},
+        {0xa0, 0x00, 0x00, 0x00}, {0xa1, 0x00, 0x00, 0x00},
+        {0xa4, 0x00, 0x00, 0x00}, {0xa5, 0x00, 0x00, 0x00},
+        {0xa7, 0x00, 0x00, 0x00}, {0xa8, 0x00, 0x00, 0x00},
+        {0xac, 0x00, 0x00, 0x00}, {0xad, 0x00, 0x00, 0x00},
+        {0xaf, 0x00, 0x00, 0x00}, {0xb1, 0x00, 0x00, 0x00},
+        {0xb6, 0x00, 0x00, 0x00}, {0xb9, 0x00, 0x00, 0x00},
+        {0xbf, 0x00, 0x00, 0x00}, {0xcf, 0x00, 0x00, 0x01}
+    },
+    {
+        {0x00, 0x01, 0x93, 0x01}, {0x00, 0x01, 0x95, 0x01},
+        {0x00, 0x01, 0x96, 0x01}, {0x00, 0x01, 0x97, 0x01},
+        {0x00, 0x01, 0x98, 0x01}, {0x00, 0x01, 0x9b, 0x01},
+        {0x00, 0x01, 0x9d, 0x01}, {0x00, 0x01, 0x9e, 0x01},
+        {0x00, 0x01, 0xa5, 0x01}, {0x00, 0x01, 0xa6, 0x01},
+        {0x00, 0x01, 0xa8, 0x01}, {0x00, 0x01, 0xae, 0x01},
+        {0x00, 0x01, 0xaf, 0x01}, {0x00, 0x01, 0xb4, 0x01},
+        {0x00, 0x01, 0xb6, 0x01}, {0x00, 0x01, 0xb7, 0x01}
+    },
+    /* 155 */
+    {
+        {0x01, 0x01, 0x93, 0x00}, {0x16, 0x01, 0x93, 0x01},
+        {0x01, 0x01, 0x95, 0x00}, {0x16, 0x01, 0x95, 0x01},
+        {0x01, 0x01, 0x96, 0x00}, {0x16, 0x01, 0x96, 0x01},
+        {0x01, 0x01, 0x97, 0x00}, {0x16, 0x01, 0x97, 0x01},
+        {0x01, 0x01, 0x98, 0x00}, {0x16, 0x01, 0x98, 0x01},
+        {0x01, 0x01, 0x9b, 0x00}, {0x16, 0x01, 0x9b, 0x01},
+        {0x01, 0x01, 0x9d, 0x00}, {0x16, 0x01, 0x9d, 0x01},
+        {0x01, 0x01, 0x9e, 0x00}, {0x16, 0x01, 0x9e, 0x01}
+    },
+    {
+        {0x02, 0x01, 0x93, 0x00}, {0x09, 0x01, 0x93, 0x00},
+        {0x17, 0x01, 0x93, 0x00}, {0x28, 0x01, 0x93, 0x01},
+        {0x02, 0x01, 0x95, 0x00}, {0x09, 0x01, 0x95, 0x00},
+        {0x17, 0x01, 0x95, 0x00}, {0x28, 0x01, 0x95, 0x01},
+        {0x02, 0x01, 0x96, 0x00}, {0x09, 0x01, 0x96, 0x00},
+        {0x17, 0x01, 0x96, 0x00}, {0x28, 0x01, 0x96, 0x01},
+        {0x02, 0x01, 0x97, 0x00}, {0x09, 0x01, 0x97, 0x00},
+        {0x17, 0x01, 0x97, 0x00}, {0x28, 0x01, 0x97, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x93, 0x00}, {0x06, 0x01, 0x93, 0x00},
+        {0x0a, 0x01, 0x93, 0x00}, {0x0f, 0x01, 0x93, 0x00},
+        {0x18, 0x01, 0x93, 0x00}, {0x1f, 0x01, 0x93, 0x00},
+        {0x29, 0x01, 0x93, 0x00}, {0x38, 0x01, 0x93, 0x01},
+        {0x03, 0x01, 0x95, 0x00}, {0x06, 0x01, 0x95, 0x00},
+        {0x0a, 0x01, 0x95, 0x00}, {0x0f, 0x01, 0x95, 0x00},
+        {0x18, 0x01, 0x95, 0x00}, {0x1f, 0x01, 0x95, 0x00},
+        {0x29, 0x01, 0x95, 0x00}, {0x38, 0x01, 0x95, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x96, 0x00}, {0x06, 0x01, 0x96, 0x00},
+        {0x0a, 0x01, 0x96, 0x00}, {0x0f, 0x01, 0x96, 0x00},
+        {0x18, 0x01, 0x96, 0x00}, {0x1f, 0x01, 0x96, 0x00},
+        {0x29, 0x01, 0x96, 0x00}, {0x38, 0x01, 0x96, 0x01},
+        {0x03, 0x01, 0x97, 0x00}, {0x06, 0x01, 0x97, 0x00},
+        {0x0a, 0x01, 0x97, 0x00}, {0x0f, 0x01, 0x97, 0x00},
+        {0x18, 0x01, 0x97, 0x00}, {0x1f, 0x01, 0x97, 0x00},
+        {0x29, 0x01, 0x97, 0x00}, {0x38, 0x01, 0x97, 0x01}
+    },
+    {
+        {0x02, 0x01, 0x98, 0x00}, {0x09, 0x01, 0x98, 0x00},
+        {0x17, 0x01, 0x98, 0x00}, {0x28, 0x01, 0x98, 0x01},
+        {0x02, 0x01, 0x9b, 0x00}, {0x09, 0x01, 0x9b, 0x00},
+        {0x17, 0x01, 0x9b, 0x00}, {0x28, 0x01, 0x9b, 0x01},
+        {0x02, 0x01, 0x9d, 0x00}, {0x09, 0x01, 0x9d, 0x00},
+        {0x17, 0x01, 0x9d, 0x00}, {0x28, 0x01, 0x9d, 0x01},
+        {0x02, 0x01, 0x9e, 0x00}, {0x09, 0x01, 0x9e, 0x00},
+        {0x17, 0x01, 0x9e, 0x00}, {0x28, 0x01, 0x9e, 0x01}
+    },
+    /* 160 */
+    {
+        {0x03, 0x01, 0x98, 0x00}, {0x06, 0x01, 0x98, 0x00},
+        {0x0a, 0x01, 0x98, 0x00}, {0x0f, 0x01, 0x98, 0x00},
+        {0x18, 0x01, 0x98, 0x00}, {0x1f, 0x01, 0x98, 0x00},
+        {0x29, 0x01, 0x98, 0x00}, {0x38, 0x01, 0x98, 0x01},
+        {0x03, 0x01, 0x9b, 0x00}, {0x06, 0x01, 0x9b, 0x00},
+        {0x0a, 0x01, 0x9b, 0x00}, {0x0f, 0x01, 0x9b, 0x00},
+        {0x18, 0x01, 0x9b, 0x00}, {0x1f, 0x01, 0x9b, 0x00},
+        {0x29, 0x01, 0x9b, 0x00}, {0x38, 0x01, 0x9b, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x9d, 0x00}, {0x06, 0x01, 0x9d, 0x00},
+        {0x0a, 0x01, 0x9d, 0x00}, {0x0f, 0x01, 0x9d, 0x00},
+        {0x18, 0x01, 0x9d, 0x00}, {0x1f, 0x01, 0x9d, 0x00},
+        {0x29, 0x01, 0x9d, 0x00}, {0x38, 0x01, 0x9d, 0x01},
+        {0x03, 0x01, 0x9e, 0x00}, {0x06, 0x01, 0x9e, 0x00},
+        {0x0a, 0x01, 0x9e, 0x00}, {0x0f, 0x01, 0x9e, 0x00},
+        {0x18, 0x01, 0x9e, 0x00}, {0x1f, 0x01, 0x9e, 0x00},
+        {0x29, 0x01, 0x9e, 0x00}, {0x38, 0x01, 0x9e, 0x01}
+    },
+    {
+        {0x01, 0x01, 0xa5, 0x00}, {0x16, 0x01, 0xa5, 0x01},
+        {0x01, 0x01, 0xa6, 0x00}, {0x16, 0x01, 0xa6, 0x01},
+        {0x01, 0x01, 0xa8, 0x00}, {0x16, 0x01, 0xa8, 0x01},
+        {0x01, 0x01, 0xae, 0x00}, {0x16, 0x01, 0xae, 0x01},
+        {0x01, 0x01, 0xaf, 0x00}, {0x16, 0x01, 0xaf, 0x01},
+        {0x01, 0x01, 0xb4, 0x00}, {0x16, 0x01, 0xb4, 0x01},
+        {0x01, 0x01, 0xb6, 0x00}, {0x16, 0x01, 0xb6, 0x01},
+        {0x01, 0x01, 0xb7, 0x00}, {0x16, 0x01, 0xb7, 0x01}
+    },
+    {
+        {0x02, 0x01, 0xa5, 0x00}, {0x09, 0x01, 0xa5, 0x00},
+        {0x17, 0x01, 0xa5, 0x00}, {0x28, 0x01, 0xa5, 0x01},
+        {0x02, 0x01, 0xa6, 0x00}, {0x09, 0x01, 0xa6, 0x00},
+        {0x17, 0x01, 0xa6, 0x00}, {0x28, 0x01, 0xa6, 0x01},
+        {0x02, 0x01, 0xa8, 0x00}, {0x09, 0x01, 0xa8, 0x00},
+        {0x17, 0x01, 0xa8, 0x00}, {0x28, 0x01, 0xa8, 0x01},
+        {0x02, 0x01, 0xae, 0x00}, {0x09, 0x01, 0xae, 0x00},
+        {0x17, 0x01, 0xae, 0x00}, {0x28, 0x01, 0xae, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xa5, 0x00}, {0x06, 0x01, 0xa5, 0x00},
+        {0x0a, 0x01, 0xa5, 0x00}, {0x0f, 0x01, 0xa5, 0x00},
+        {0x18, 0x01, 0xa5, 0x00}, {0x1f, 0x01, 0xa5, 0x00},
+        {0x29, 0x01, 0xa5, 0x00}, {0x38, 0x01, 0xa5, 0x01},
+        {0x03, 0x01, 0xa6, 0x00}, {0x06, 0x01, 0xa6, 0x00},
+        {0x0a, 0x01, 0xa6, 0x00}, {0x0f, 0x01, 0xa6, 0x00},
+        {0x18, 0x01, 0xa6, 0x00}, {0x1f, 0x01, 0xa6, 0x00},
+        {0x29, 0x01, 0xa6, 0x00}, {0x38, 0x01, 0xa6, 0x01}
+    },
+    /* 165 */
+    {
+        {0x03, 0x01, 0xa8, 0x00}, {0x06, 0x01, 0xa8, 0x00},
+        {0x0a, 0x01, 0xa8, 0x00}, {0x0f, 0x01, 0xa8, 0x00},
+        {0x18, 0x01, 0xa8, 0x00}, {0x1f, 0x01, 0xa8, 0x00},
+        {0x29, 0x01, 0xa8, 0x00}, {0x38, 0x01, 0xa8, 0x01},
+        {0x03, 0x01, 0xae, 0x00}, {0x06, 0x01, 0xae, 0x00},
+        {0x0a, 0x01, 0xae, 0x00}, {0x0f, 0x01, 0xae, 0x00},
+        {0x18, 0x01, 0xae, 0x00}, {0x1f, 0x01, 0xae, 0x00},
+        {0x29, 0x01, 0xae, 0x00}, {0x38, 0x01, 0xae, 0x01}
+    },
+    {
+        {0x02, 0x01, 0xaf, 0x00}, {0x09, 0x01, 0xaf, 0x00},
+        {0x17, 0x01, 0xaf, 0x00}, {0x28, 0x01, 0xaf, 0x01},
+        {0x02, 0x01, 0xb4, 0x00}, {0x09, 0x01, 0xb4, 0x00},
+        {0x17, 0x01, 0xb4, 0x00}, {0x28, 0x01, 0xb4, 0x01},
+        {0x02, 0x01, 0xb6, 0x00}, {0x09, 0x01, 0xb6, 0x00},
+        {0x17, 0x01, 0xb6, 0x00}, {0x28, 0x01, 0xb6, 0x01},
+        {0x02, 0x01, 0xb7, 0x00}, {0x09, 0x01, 0xb7, 0x00},
+        {0x17, 0x01, 0xb7, 0x00}, {0x28, 0x01, 0xb7, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xaf, 0x00}, {0x06, 0x01, 0xaf, 0x00},
+        {0x0a, 0x01, 0xaf, 0x00}, {0x0f, 0x01, 0xaf, 0x00},
+        {0x18, 0x01, 0xaf, 0x00}, {0x1f, 0x01, 0xaf, 0x00},
+        {0x29, 0x01, 0xaf, 0x00}, {0x38, 0x01, 0xaf, 0x01},
+        {0x03, 0x01, 0xb4, 0x00}, {0x06, 0x01, 0xb4, 0x00},
+        {0x0a, 0x01, 0xb4, 0x00}, {0x0f, 0x01, 0xb4, 0x00},
+        {0x18, 0x01, 0xb4, 0x00}, {0x1f, 0x01, 0xb4, 0x00},
+        {0x29, 0x01, 0xb4, 0x00}, {0x38, 0x01, 0xb4, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xb6, 0x00}, {0x06, 0x01, 0xb6, 0x00},
+        {0x0a, 0x01, 0xb6, 0x00}, {0x0f, 0x01, 0xb6, 0x00},
+        {0x18, 0x01, 0xb6, 0x00}, {0x1f, 0x01, 0xb6, 0x00},
+        {0x29, 0x01, 0xb6, 0x00}, {0x38, 0x01, 0xb6, 0x01},
+        {0x03, 0x01, 0xb7, 0x00}, {0x06, 0x01, 0xb7, 0x00},
+        {0x0a, 0x01, 0xb7, 0x00}, {0x0f, 0x01, 0xb7, 0x00},
+        {0x18, 0x01, 0xb7, 0x00}, {0x1f, 0x01, 0xb7, 0x00},
+        {0x29, 0x01, 0xb7, 0x00}, {0x38, 0x01, 0xb7, 0x01}
+    },
+    {
+        {0x00, 0x01, 0xbc, 0x01}, {0x00, 0x01, 0xbf, 0x01},
+        {0x00, 0x01, 0xc5, 0x01}, {0x00, 0x01, 0xe7, 0x01},
+        {0x00, 0x01, 0xef, 0x01}, {0xb0, 0x00, 0x00, 0x00},
+        {0xb2, 0x00, 0x00, 0x00}, {0xb3, 0x00, 0x00, 0x00},
+        {0xb7, 0x00, 0x00, 0x00}, {0xb8, 0x00, 0x00, 0x00},
+        {0xba, 0x00, 0x00, 0x00}, {0xbb, 0x00, 0x00, 0x00},
+        {0xc0, 0x00, 0x00, 0x00}, {0xc7, 0x00, 0x00, 0x00},
+        {0xd0, 0x00, 0x00, 0x00}, {0xdf, 0x00, 0x00, 0x01}
+    },
+    /* 170 */
+    {
+        {0x01, 0x01, 0xbc, 0x00}, {0x16, 0x01, 0xbc, 0x01},
+        {0x01, 0x01, 0xbf, 0x00}, {0x16, 0x01, 0xbf, 0x01},
+        {0x01, 0x01, 0xc5, 0x00}, {0x16, 0x01, 0xc5, 0x01},
+        {0x01, 0x01, 0xe7, 0x00}, {0x16, 0x01, 0xe7, 0x01},
+        {0x01, 0x01, 0xef, 0x00}, {0x16, 0x01, 0xef, 0x01},
+        {0x00, 0x01, 0x09, 0x01}, {0x00, 0x01, 0x8e, 0x01},
+        {0x00, 0x01, 0x90, 0x01}, {0x00, 0x01, 0x91, 0x01},
+        {0x00, 0x01, 0x94, 0x01}, {0x00, 0x01, 0x9f, 0x01}
+    },
+    {
+        {0x02, 0x01, 0xbc, 0x00}, {0x09, 0x01, 0xbc, 0x00},
+        {0x17, 0x01, 0xbc, 0x00}, {0x28, 0x01, 0xbc, 0x01},
+        {0x02, 0x01, 0xbf, 0x00}, {0x09, 0x01, 0xbf, 0x00},
+        {0x17, 0x01, 0xbf, 0x00}, {0x28, 0x01, 0xbf, 0x01},
+        {0x02, 0x01, 0xc5, 0x00}, {0x09, 0x01, 0xc5, 0x00},
+        {0x17, 0x01, 0xc5, 0x00}, {0x28, 0x01, 0xc5, 0x01},
+        {0x02, 0x01, 0xe7, 0x00}, {0x09, 0x01, 0xe7, 0x00},
+        {0x17, 0x01, 0xe7, 0x00}, {0x28, 0x01, 0xe7, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xbc, 0x00}, {0x06, 0x01, 0xbc, 0x00},
+        {0x0a, 0x01, 0xbc, 0x00}, {0x0f, 0x01, 0xbc, 0x00},
+        {0x18, 0x01, 0xbc, 0x00}, {0x1f, 0x01, 0xbc, 0x00},
+        {0x29, 0x01, 0xbc, 0x00}, {0x38, 0x01, 0xbc, 0x01},
+        {0x03, 0x01, 0xbf, 0x00}, {0x06, 0x01, 0xbf, 0x00},
+        {0x0a, 0x01, 0xbf, 0x00}, {0x0f, 0x01, 0xbf, 0x00},
+        {0x18, 0x01, 0xbf, 0x00}, {0x1f, 0x01, 0xbf, 0x00},
+        {0x29, 0x01, 0xbf, 0x00}, {0x38, 0x01, 0xbf, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xc5, 0x00}, {0x06, 0x01, 0xc5, 0x00},
+        {0x0a, 0x01, 0xc5, 0x00}, {0x0f, 0x01, 0xc5, 0x00},
+        {0x18, 0x01, 0xc5, 0x00}, {0x1f, 0x01, 0xc5, 0x00},
+        {0x29, 0x01, 0xc5, 0x00}, {0x38, 0x01, 0xc5, 0x01},
+        {0x03, 0x01, 0xe7, 0x00}, {0x06, 0x01, 0xe7, 0x00},
+        {0x0a, 0x01, 0xe7, 0x00}, {0x0f, 0x01, 0xe7, 0x00},
+        {0x18, 0x01, 0xe7, 0x00}, {0x1f, 0x01, 0xe7, 0x00},
+        {0x29, 0x01, 0xe7, 0x00}, {0x38, 0x01, 0xe7, 0x01}
+    },
+    {
+        {0x02, 0x01, 0xef, 0x00}, {0x09, 0x01, 0xef, 0x00},
+        {0x17, 0x01, 0xef, 0x00}, {0x28, 0x01, 0xef, 0x01},
+        {0x01, 0x01, 0x09, 0x00}, {0x16, 0x01, 0x09, 0x01},
+        {0x01, 0x01, 0x8e, 0x00}, {0x16, 0x01, 0x8e, 0x01},
+        {0x01, 0x01, 0x90, 0x00}, {0x16, 0x01, 0x90, 0x01},
+        {0x01, 0x01, 0x91, 0x00}, {0x16, 0x01, 0x91, 0x01},
+        {0x01, 0x01, 0x94, 0x00}, {0x16, 0x01, 0x94, 0x01},
+        {0x01, 0x01, 0x9f, 0x00}, {0x16, 0x01, 0x9f, 0x01}
+    },
+    /* 175 */
+    {
+        {0x03, 0x01, 0xef, 0x00}, {0x06, 0x01, 0xef, 0x00},
+        {0x0a, 0x01, 0xef, 0x00}, {0x0f, 0x01, 0xef, 0x00},
+        {0x18, 0x01, 0xef, 0x00}, {0x1f, 0x01, 0xef, 0x00},
+        {0x29, 0x01, 0xef, 0x00}, {0x38, 0x01, 0xef, 0x01},
+        {0x02, 0x01, 0x09, 0x00}, {0x09, 0x01, 0x09, 0x00},
+        {0x17, 0x01, 0x09, 0x00}, {0x28, 0x01, 0x09, 0x01},
+        {0x02, 0x01, 0x8e, 0x00}, {0x09, 0x01, 0x8e, 0x00},
+        {0x17, 0x01, 0x8e, 0x00}, {0x28, 0x01, 0x8e, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x09, 0x00}, {0x06, 0x01, 0x09, 0x00},
+        {0x0a, 0x01, 0x09, 0x00}, {0x0f, 0x01, 0x09, 0x00},
+        {0x18, 0x01, 0x09, 0x00}, {0x1f, 0x01, 0x09, 0x00},
+        {0x29, 0x01, 0x09, 0x00}, {0x38, 0x01, 0x09, 0x01},
+        {0x03, 0x01, 0x8e, 0x00}, {0x06, 0x01, 0x8e, 0x00},
+        {0x0a, 0x01, 0x8e, 0x00}, {0x0f, 0x01, 0x8e, 0x00},
+        {0x18, 0x01, 0x8e, 0x00}, {0x1f, 0x01, 0x8e, 0x00},
+        {0x29, 0x01, 0x8e, 0x00}, {0x38, 0x01, 0x8e, 0x01}
+    },
+    {
+        {0x02, 0x01, 0x90, 0x00}, {0x09, 0x01, 0x90, 0x00},
+        {0x17, 0x01, 0x90, 0x00}, {0x28, 0x01, 0x90, 0x01},
+        {0x02, 0x01, 0x91, 0x00}, {0x09, 0x01, 0x91, 0x00},
+        {0x17, 0x01, 0x91, 0x00}, {0x28, 0x01, 0x91, 0x01},
+        {0x02, 0x01, 0x94, 0x00}, {0x09, 0x01, 0x94, 0x00},
+        {0x17, 0x01, 0x94, 0x00}, {0x28, 0x01, 0x94, 0x01},
+        {0x02, 0x01, 0x9f, 0x00}, {0x09, 0x01, 0x9f, 0x00},
+        {0x17, 0x01, 0x9f, 0x00}, {0x28, 0x01, 0x9f, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x90, 0x00}, {0x06, 0x01, 0x90, 0x00},
+        {0x0a, 0x01, 0x90, 0x00}, {0x0f, 0x01, 0x90, 0x00},
+        {0x18, 0x01, 0x90, 0x00}, {0x1f, 0x01, 0x90, 0x00},
+        {0x29, 0x01, 0x90, 0x00}, {0x38, 0x01, 0x90, 0x01},
+        {0x03, 0x01, 0x91, 0x00}, {0x06, 0x01, 0x91, 0x00},
+        {0x0a, 0x01, 0x91, 0x00}, {0x0f, 0x01, 0x91, 0x00},
+        {0x18, 0x01, 0x91, 0x00}, {0x1f, 0x01, 0x91, 0x00},
+        {0x29, 0x01, 0x91, 0x00}, {0x38, 0x01, 0x91, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x94, 0x00}, {0x06, 0x01, 0x94, 0x00},
+        {0x0a, 0x01, 0x94, 0x00}, {0x0f, 0x01, 0x94, 0x00},
+        {0x18, 0x01, 0x94, 0x00}, {0x1f, 0x01, 0x94, 0x00},
+        {0x29, 0x01, 0x94, 0x00}, {0x38, 0x01, 0x94, 0x01},
+        {0x03, 0x01, 0x9f, 0x00}, {0x06, 0x01, 0x9f, 0x00},
+        {0x0a, 0x01, 0x9f, 0x00}, {0x0f, 0x01, 0x9f, 0x00},
+        {0x18, 0x01, 0x9f, 0x00}, {0x1f, 0x01, 0x9f, 0x00},
+        {0x29, 0x01, 0x9f, 0x00}, {0x38, 0x01, 0x9f, 0x01}
+    },
+    /* 180 */
+    {
+        {0x00, 0x01, 0xab, 0x01}, {0x00, 0x01, 0xce, 0x01},
+        {0x00, 0x01, 0xd7, 0x01}, {0x00, 0x01, 0xe1, 0x01},
+        {0x00, 0x01, 0xec, 0x01}, {0x00, 0x01, 0xed, 0x01},
+        {0xbc, 0x00, 0x00, 0x00}, {0xbd, 0x00, 0x00, 0x00},
+        {0xc1, 0x00, 0x00, 0x00}, {0xc4, 0x00, 0x00, 0x00},
+        {0xc8, 0x00, 0x00, 0x00}, {0xcb, 0x00, 0x00, 0x00},
+        {0xd1, 0x00, 0x00, 0x00}, {0xd8, 0x00, 0x00, 0x00},
+        {0xe0, 0x00, 0x00, 0x00}, {0xee, 0x00, 0x00, 0x01}
+    },
+    {
+        {0x01, 0x01, 0xab, 0x00}, {0x16, 0x01, 0xab, 0x01},
+        {0x01, 0x01, 0xce, 0x00}, {0x16, 0x01, 0xce, 0x01},
+        {0x01, 0x01, 0xd7, 0x00}, {0x16, 0x01, 0xd7, 0x01},
+        {0x01, 0x01, 0xe1, 0x00}, {0x16, 0x01, 0xe1, 0x01},
+        {0x01, 0x01, 0xec, 0x00}, {0x16, 0x01, 0xec, 0x01},
+        {0x01, 0x01, 0xed, 0x00}, {0x16, 0x01, 0xed, 0x01},
+        {0x00, 0x01, 0xc7, 0x01}, {0x00, 0x01, 0xcf, 0x01},
+        {0x00, 0x01, 0xea, 0x01}, {0x00, 0x01, 0xeb, 0x01}
+    },
+    {
+        {0x02, 0x01, 0xab, 0x00}, {0x09, 0x01, 0xab, 0x00},
+        {0x17, 0x01, 0xab, 0x00}, {0x28, 0x01, 0xab, 0x01},
+        {0x02, 0x01, 0xce, 0x00}, {0x09, 0x01, 0xce, 0x00},
+        {0x17, 0x01, 0xce, 0x00}, {0x28, 0x01, 0xce, 0x01},
+        {0x02, 0x01, 0xd7, 0x00}, {0x09, 0x01, 0xd7, 0x00},
+        {0x17, 0x01, 0xd7, 0x00}, {0x28, 0x01, 0xd7, 0x01},
+        {0x02, 0x01, 0xe1, 0x00}, {0x09, 0x01, 0xe1, 0x00},
+        {0x17, 0x01, 0xe1, 0x00}, {0x28, 0x01, 0xe1, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xab, 0x00}, {0x06, 0x01, 0xab, 0x00},
+        {0x0a, 0x01, 0xab, 0x00}, {0x0f, 0x01, 0xab, 0x00},
+        {0x18, 0x01, 0xab, 0x00}, {0x1f, 0x01, 0xab, 0x00},
+        {0x29, 0x01, 0xab, 0x00}, {0x38, 0x01, 0xab, 0x01},
+        {0x03, 0x01, 0xce, 0x00}, {0x06, 0x01, 0xce, 0x00},
+        {0x0a, 0x01, 0xce, 0x00}, {0x0f, 0x01, 0xce, 0x00},
+        {0x18, 0x01, 0xce, 0x00}, {0x1f, 0x01, 0xce, 0x00},
+        {0x29, 0x01, 0xce, 0x00}, {0x38, 0x01, 0xce, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xd7, 0x00}, {0x06, 0x01, 0xd7, 0x00},
+        {0x0a, 0x01, 0xd7, 0x00}, {0x0f, 0x01, 0xd7, 0x00},
+        {0x18, 0x01, 0xd7, 0x00}, {0x1f, 0x01, 0xd7, 0x00},
+        {0x29, 0x01, 0xd7, 0x00}, {0x38, 0x01, 0xd7, 0x01},
+        {0x03, 0x01, 0xe1, 0x00}, {0x06, 0x01, 0xe1, 0x00},
+        {0x0a, 0x01, 0xe1, 0x00}, {0x0f, 0x01, 0xe1, 0x00},
+        {0x18, 0x01, 0xe1, 0x00}, {0x1f, 0x01, 0xe1, 0x00},
+        {0x29, 0x01, 0xe1, 0x00}, {0x38, 0x01, 0xe1, 0x01}
+    },
+    /* 185 */
+    {
+        {0x02, 0x01, 0xec, 0x00}, {0x09, 0x01, 0xec, 0x00},
+        {0x17, 0x01, 0xec, 0x00}, {0x28, 0x01, 0xec, 0x01},
+        {0x02, 0x01, 0xed, 0x00}, {0x09, 0x01, 0xed, 0x00},
+        {0x17, 0x01, 0xed, 0x00}, {0x28, 0x01, 0xed, 0x01},
+        {0x01, 0x01, 0xc7, 0x00}, {0x16, 0x01, 0xc7, 0x01},
+        {0x01, 0x01, 0xcf, 0x00}, {0x16, 0x01, 0xcf, 0x01},
+        {0x01, 0x01, 0xea, 0x00}, {0x16, 0x01, 0xea, 0x01},
+        {0x01, 0x01, 0xeb, 0x00}, {0x16, 0x01, 0xeb, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xec, 0x00}, {0x06, 0x01, 0xec, 0x00},
+        {0x0a, 0x01, 0xec, 0x00}, {0x0f, 0x01, 0xec, 0x00},
+        {0x18, 0x01, 0xec, 0x00}, {0x1f, 0x01, 0xec, 0x00},
+        {0x29, 0x01, 0xec, 0x00}, {0x38, 0x01, 0xec, 0x01},
+        {0x03, 0x01, 0xed, 0x00}, {0x06, 0x01, 0xed, 0x00},
+        {0x0a, 0x01, 0xed, 0x00}, {0x0f, 0x01, 0xed, 0x00},
+        {0x18, 0x01, 0xed, 0x00}, {0x1f, 0x01, 0xed, 0x00},
+        {0x29, 0x01, 0xed, 0x00}, {0x38, 0x01, 0xed, 0x01}
+    },
+    {
+        {0x02, 0x01, 0xc7, 0x00}, {0x09, 0x01, 0xc7, 0x00},
+        {0x17, 0x01, 0xc7, 0x00}, {0x28, 0x01, 0xc7, 0x01},
+        {0x02, 0x01, 0xcf, 0x00}, {0x09, 0x01, 0xcf, 0x00},
+        {0x17, 0x01, 0xcf, 0x00}, {0x28, 0x01, 0xcf, 0x01},
+        {0x02, 0x01, 0xea, 0x00}, {0x09, 0x01, 0xea, 0x00},
+        {0x17, 0x01, 0xea, 0x00}, {0x28, 0x01, 0xea, 0x01},
+        {0x02, 0x01, 0xeb, 0x00}, {0x09, 0x01, 0xeb, 0x00},
+        {0x17, 0x01, 0xeb, 0x00}, {0x28, 0x01, 0xeb, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xc7, 0x00}, {0x06, 0x01, 0xc7, 0x00},
+        {0x0a, 0x01, 0xc7, 0x00}, {0x0f, 0x01, 0xc7, 0x00},
+        {0x18, 0x01, 0xc7, 0x00}, {0x1f, 0x01, 0xc7, 0x00},
+        {0x29, 0x01, 0xc7, 0x00}, {0x38, 0x01, 0xc7, 0x01},
+        {0x03, 0x01, 0xcf, 0x00}, {0x06, 0x01, 0xcf, 0x00},
+        {0x0a, 0x01, 0xcf, 0x00}, {0x0f, 0x01, 0xcf, 0x00},
+        {0x18, 0x01, 0xcf, 0x00}, {0x1f, 0x01, 0xcf, 0x00},
+        {0x29, 0x01, 0xcf, 0x00}, {0x38, 0x01, 0xcf, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xea, 0x00}, {0x06, 0x01, 0xea, 0x00},
+        {0x0a, 0x01, 0xea, 0x00}, {0x0f, 0x01, 0xea, 0x00},
+        {0x18, 0x01, 0xea, 0x00}, {0x1f, 0x01, 0xea, 0x00},
+        {0x29, 0x01, 0xea, 0x00}, {0x38, 0x01, 0xea, 0x01},
+        {0x03, 0x01, 0xeb, 0x00}, {0x06, 0x01, 0xeb, 0x00},
+        {0x0a, 0x01, 0xeb, 0x00}, {0x0f, 0x01, 0xeb, 0x00},
+        {0x18, 0x01, 0xeb, 0x00}, {0x1f, 0x01, 0xeb, 0x00},
+        {0x29, 0x01, 0xeb, 0x00}, {0x38, 0x01, 0xeb, 0x01}
+    },
+    /* 190 */
+    {
+        {0xc2, 0x00, 0x00, 0x00}, {0xc3, 0x00, 0x00, 0x00},
+        {0xc5, 0x00, 0x00, 0x00}, {0xc6, 0x00, 0x00, 0x00},
+        {0xc9, 0x00, 0x00, 0x00}, {0xca, 0x00, 0x00, 0x00},
+        {0xcc, 0x00, 0x00, 0x00}, {0xcd, 0x00, 0x00, 0x00},
+        {0xd2, 0x00, 0x00, 0x00}, {0xd5, 0x00, 0x00, 0x00},
+        {0xd9, 0x00, 0x00, 0x00}, {0xdc, 0x00, 0x00, 0x00},
+        {0xe1, 0x00, 0x00, 0x00}, {0xe7, 0x00, 0x00, 0x00},
+        {0xef, 0x00, 0x00, 0x00}, {0xf6, 0x00, 0x00, 0x01}
+    },
+    {
+        {0x00, 0x01, 0xc0, 0x01}, {0x00, 0x01, 0xc1, 0x01},
+        {0x00, 0x01, 0xc8, 0x01}, {0x00, 0x01, 0xc9, 0x01},
+        {0x00, 0x01, 0xca, 0x01}, {0x00, 0x01, 0xcd, 0x01},
+        {0x00, 0x01, 0xd2, 0x01}, {0x00, 0x01, 0xd5, 0x01},
+        {0x00, 0x01, 0xda, 0x01}, {0x00, 0x01, 0xdb, 0x01},
+        {0x00, 0x01, 0xee, 0x01}, {0x00, 0x01, 0xf0, 0x01},
+        {0x00, 0x01, 0xf2, 0x01}, {0x00, 0x01, 0xf3, 0x01},
+        {0x00, 0x01, 0xff, 0x01}, {0xce, 0x00, 0x00, 0x00}
+    },
+    {
+        {0x01, 0x01, 0xc0, 0x00}, {0x16, 0x01, 0xc0, 0x01},
+        {0x01, 0x01, 0xc1, 0x00}, {0x16, 0x01, 0xc1, 0x01},
+        {0x01, 0x01, 0xc8, 0x00}, {0x16, 0x01, 0xc8, 0x01},
+        {0x01, 0x01, 0xc9, 0x00}, {0x16, 0x01, 0xc9, 0x01},
+        {0x01, 0x01, 0xca, 0x00}, {0x16, 0x01, 0xca, 0x01},
+        {0x01, 0x01, 0xcd, 0x00}, {0x16, 0x01, 0xcd, 0x01},
+        {0x01, 0x01, 0xd2, 0x00}, {0x16, 0x01, 0xd2, 0x01},
+        {0x01, 0x01, 0xd5, 0x00}, {0x16, 0x01, 0xd5, 0x01}
+    },
+    {
+        {0x02, 0x01, 0xc0, 0x00}, {0x09, 0x01, 0xc0, 0x00},
+        {0x17, 0x01, 0xc0, 0x00}, {0x28, 0x01, 0xc0, 0x01},
+        {0x02, 0x01, 0xc1, 0x00}, {0x09, 0x01, 0xc1, 0x00},
+        {0x17, 0x01, 0xc1, 0x00}, {0x28, 0x01, 0xc1, 0x01},
+        {0x02, 0x01, 0xc8, 0x00}, {0x09, 0x01, 0xc8, 0x00},
+        {0x17, 0x01, 0xc8, 0x00}, {0x28, 0x01, 0xc8, 0x01},
+        {0x02, 0x01, 0xc9, 0x00}, {0x09, 0x01, 0xc9, 0x00},
+        {0x17, 0x01, 0xc9, 0x00}, {0x28, 0x01, 0xc9, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xc0, 0x00}, {0x06, 0x01, 0xc0, 0x00},
+        {0x0a, 0x01, 0xc0, 0x00}, {0x0f, 0x01, 0xc0, 0x00},
+        {0x18, 0x01, 0xc0, 0x00}, {0x1f, 0x01, 0xc0, 0x00},
+        {0x29, 0x01, 0xc0, 0x00}, {0x38, 0x01, 0xc0, 0x01},
+        {0x03, 0x01, 0xc1, 0x00}, {0x06, 0x01, 0xc1, 0x00},
+        {0x0a, 0x01, 0xc1, 0x00}, {0x0f, 0x01, 0xc1, 0x00},
+        {0x18, 0x01, 0xc1, 0x00}, {0x1f, 0x01, 0xc1, 0x00},
+        {0x29, 0x01, 0xc1, 0x00}, {0x38, 0x01, 0xc1, 0x01}
+    },
+    /* 195 */
+    {
+        {0x03, 0x01, 0xc8, 0x00}, {0x06, 0x01, 0xc8, 0x00},
+        {0x0a, 0x01, 0xc8, 0x00}, {0x0f, 0x01, 0xc8, 0x00},
+        {0x18, 0x01, 0xc8, 0x00}, {0x1f, 0x01, 0xc8, 0x00},
+        {0x29, 0x01, 0xc8, 0x00}, {0x38, 0x01, 0xc8, 0x01},
+        {0x03, 0x01, 0xc9, 0x00}, {0x06, 0x01, 0xc9, 0x00},
+        {0x0a, 0x01, 0xc9, 0x00}, {0x0f, 0x01, 0xc9, 0x00},
+        {0x18, 0x01, 0xc9, 0x00}, {0x1f, 0x01, 0xc9, 0x00},
+        {0x29, 0x01, 0xc9, 0x00}, {0x38, 0x01, 0xc9, 0x01}
+    },
+    {
+        {0x02, 0x01, 0xca, 0x00}, {0x09, 0x01, 0xca, 0x00},
+        {0x17, 0x01, 0xca, 0x00}, {0x28, 0x01, 0xca, 0x01},
+        {0x02, 0x01, 0xcd, 0x00}, {0x09, 0x01, 0xcd, 0x00},
+        {0x17, 0x01, 0xcd, 0x00}, {0x28, 0x01, 0xcd, 0x01},
+        {0x02, 0x01, 0xd2, 0x00}, {0x09, 0x01, 0xd2, 0x00},
+        {0x17, 0x01, 0xd2, 0x00}, {0x28, 0x01, 0xd2, 0x01},
+        {0x02, 0x01, 0xd5, 0x00}, {0x09, 0x01, 0xd5, 0x00},
+        {0x17, 0x01, 0xd5, 0x00}, {0x28, 0x01, 0xd5, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xca, 0x00}, {0x06, 0x01, 0xca, 0x00},
+        {0x0a, 0x01, 0xca, 0x00}, {0x0f, 0x01, 0xca, 0x00},
+        {0x18, 0x01, 0xca, 0x00}, {0x1f, 0x01, 0xca, 0x00},
+        {0x29, 0x01, 0xca, 0x00}, {0x38, 0x01, 0xca, 0x01},
+        {0x03, 0x01, 0xcd, 0x00}, {0x06, 0x01, 0xcd, 0x00},
+        {0x0a, 0x01, 0xcd, 0x00}, {0x0f, 0x01, 0xcd, 0x00},
+        {0x18, 0x01, 0xcd, 0x00}, {0x1f, 0x01, 0xcd, 0x00},
+        {0x29, 0x01, 0xcd, 0x00}, {0x38, 0x01, 0xcd, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xd2, 0x00}, {0x06, 0x01, 0xd2, 0x00},
+        {0x0a, 0x01, 0xd2, 0x00}, {0x0f, 0x01, 0xd2, 0x00},
+        {0x18, 0x01, 0xd2, 0x00}, {0x1f, 0x01, 0xd2, 0x00},
+        {0x29, 0x01, 0xd2, 0x00}, {0x38, 0x01, 0xd2, 0x01},
+        {0x03, 0x01, 0xd5, 0x00}, {0x06, 0x01, 0xd5, 0x00},
+        {0x0a, 0x01, 0xd5, 0x00}, {0x0f, 0x01, 0xd5, 0x00},
+        {0x18, 0x01, 0xd5, 0x00}, {0x1f, 0x01, 0xd5, 0x00},
+        {0x29, 0x01, 0xd5, 0x00}, {0x38, 0x01, 0xd5, 0x01}
+    },
+    {
+        {0x01, 0x01, 0xda, 0x00}, {0x16, 0x01, 0xda, 0x01},
+        {0x01, 0x01, 0xdb, 0x00}, {0x16, 0x01, 0xdb, 0x01},
+        {0x01, 0x01, 0xee, 0x00}, {0x16, 0x01, 0xee, 0x01},
+        {0x01, 0x01, 0xf0, 0x00}, {0x16, 0x01, 0xf0, 0x01},
+        {0x01, 0x01, 0xf2, 0x00}, {0x16, 0x01, 0xf2, 0x01},
+        {0x01, 0x01, 0xf3, 0x00}, {0x16, 0x01, 0xf3, 0x01},
+        {0x01, 0x01, 0xff, 0x00}, {0x16, 0x01, 0xff, 0x01},
+        {0x00, 0x01, 0xcb, 0x01}, {0x00, 0x01, 0xcc, 0x01}
+    },
+    /* 200 */
+    {
+        {0x02, 0x01, 0xda, 0x00}, {0x09, 0x01, 0xda, 0x00},
+        {0x17, 0x01, 0xda, 0x00}, {0x28, 0x01, 0xda, 0x01},
+        {0x02, 0x01, 0xdb, 0x00}, {0x09, 0x01, 0xdb, 0x00},
+        {0x17, 0x01, 0xdb, 0x00}, {0x28, 0x01, 0xdb, 0x01},
+        {0x02, 0x01, 0xee, 0x00}, {0x09, 0x01, 0xee, 0x00},
+        {0x17, 0x01, 0xee, 0x00}, {0x28, 0x01, 0xee, 0x01},
+        {0x02, 0x01, 0xf0, 0x00}, {0x09, 0x01, 0xf0, 0x00},
+        {0x17, 0x01, 0xf0, 0x00}, {0x28, 0x01, 0xf0, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xda, 0x00}, {0x06, 0x01, 0xda, 0x00},
+        {0x0a, 0x01, 0xda, 0x00}, {0x0f, 0x01, 0xda, 0x00},
+        {0x18, 0x01, 0xda, 0x00}, {0x1f, 0x01, 0xda, 0x00},
+        {0x29, 0x01, 0xda, 0x00}, {0x38, 0x01, 0xda, 0x01},
+        {0x03, 0x01, 0xdb, 0x00}, {0x06, 0x01, 0xdb, 0x00},
+        {0x0a, 0x01, 0xdb, 0x00}, {0x0f, 0x01, 0xdb, 0x00},
+        {0x18, 0x01, 0xdb, 0x00}, {0x1f, 0x01, 0xdb, 0x00},
+        {0x29, 0x01, 0xdb, 0x00}, {0x38, 0x01, 0xdb, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xee, 0x00}, {0x06, 0x01, 0xee, 0x00},
+        {0x0a, 0x01, 0xee, 0x00}, {0x0f, 0x01, 0xee, 0x00},
+        {0x18, 0x01, 0xee, 0x00}, {0x1f, 0x01, 0xee, 0x00},
+        {0x29, 0x01, 0xee, 0x00}, {0x38, 0x01, 0xee, 0x01},
+        {0x03, 0x01, 0xf0, 0x00}, {0x06, 0x01, 0xf0, 0x00},
+        {0x0a, 0x01, 0xf0, 0x00}, {0x0f, 0x01, 0xf0, 0x00},
+        {0x18, 0x01, 0xf0, 0x00}, {0x1f, 0x01, 0xf0, 0x00},
+        {0x29, 0x01, 0xf0, 0x00}, {0x38, 0x01, 0xf0, 0x01}
+    },
+    {
+        {0x02, 0x01, 0xf2, 0x00}, {0x09, 0x01, 0xf2, 0x00},
+        {0x17, 0x01, 0xf2, 0x00}, {0x28, 0x01, 0xf2, 0x01},
+        {0x02, 0x01, 0xf3, 0x00}, {0x09, 0x01, 0xf3, 0x00},
+        {0x17, 0x01, 0xf3, 0x00}, {0x28, 0x01, 0xf3, 0x01},
+        {0x02, 0x01, 0xff, 0x00}, {0x09, 0x01, 0xff, 0x00},
+        {0x17, 0x01, 0xff, 0x00}, {0x28, 0x01, 0xff, 0x01},
+        {0x01, 0x01, 0xcb, 0x00}, {0x16, 0x01, 0xcb, 0x01},
+        {0x01, 0x01, 0xcc, 0x00}, {0x16, 0x01, 0xcc, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xf2, 0x00}, {0x06, 0x01, 0xf2, 0x00},
+        {0x0a, 0x01, 0xf2, 0x00}, {0x0f, 0x01, 0xf2, 0x00},
+        {0x18, 0x01, 0xf2, 0x00}, {0x1f, 0x01, 0xf2, 0x00},
+        {0x29, 0x01, 0xf2, 0x00}, {0x38, 0x01, 0xf2, 0x01},
+        {0x03, 0x01, 0xf3, 0x00}, {0x06, 0x01, 0xf3, 0x00},
+        {0x0a, 0x01, 0xf3, 0x00}, {0x0f, 0x01, 0xf3, 0x00},
+        {0x18, 0x01, 0xf3, 0x00}, {0x1f, 0x01, 0xf3, 0x00},
+        {0x29, 0x01, 0xf3, 0x00}, {0x38, 0x01, 0xf3, 0x01}
+    },
+    /* 205 */
+    {
+        {0x03, 0x01, 0xff, 0x00}, {0x06, 0x01, 0xff, 0x00},
+        {0x0a, 0x01, 0xff, 0x00}, {0x0f, 0x01, 0xff, 0x00},
+        {0x18, 0x01, 0xff, 0x00}, {0x1f, 0x01, 0xff, 0x00},
+        {0x29, 0x01, 0xff, 0x00}, {0x38, 0x01, 0xff, 0x01},
+        {0x02, 0x01, 0xcb, 0x00}, {0x09, 0x01, 0xcb, 0x00},
+        {0x17, 0x01, 0xcb, 0x00}, {0x28, 0x01, 0xcb, 0x01},
+        {0x02, 0x01, 0xcc, 0x00}, {0x09, 0x01, 0xcc, 0x00},
+        {0x17, 0x01, 0xcc, 0x00}, {0x28, 0x01, 0xcc, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xcb, 0x00}, {0x06, 0x01, 0xcb, 0x00},
+        {0x0a, 0x01, 0xcb, 0x00}, {0x0f, 0x01, 0xcb, 0x00},
+        {0x18, 0x01, 0xcb, 0x00}, {0x1f, 0x01, 0xcb, 0x00},
+        {0x29, 0x01, 0xcb, 0x00}, {0x38, 0x01, 0xcb, 0x01},
+        {0x03, 0x01, 0xcc, 0x00}, {0x06, 0x01, 0xcc, 0x00},
+        {0x0a, 0x01, 0xcc, 0x00}, {0x0f, 0x01, 0xcc, 0x00},
+        {0x18, 0x01, 0xcc, 0x00}, {0x1f, 0x01, 0xcc, 0x00},
+        {0x29, 0x01, 0xcc, 0x00}, {0x38, 0x01, 0xcc, 0x01}
+    },
+    {
+        {0xd3, 0x00, 0x00, 0x00}, {0xd4, 0x00, 0x00, 0x00},
+        {0xd6, 0x00, 0x00, 0x00}, {0xd7, 0x00, 0x00, 0x00},
+        {0xda, 0x00, 0x00, 0x00}, {0xdb, 0x00, 0x00, 0x00},
+        {0xdd, 0x00, 0x00, 0x00}, {0xde, 0x00, 0x00, 0x00},
+        {0xe2, 0x00, 0x00, 0x00}, {0xe4, 0x00, 0x00, 0x00},
+        {0xe8, 0x00, 0x00, 0x00}, {0xeb, 0x00, 0x00, 0x00},
+        {0xf0, 0x00, 0x00, 0x00}, {0xf3, 0x00, 0x00, 0x00},
+        {0xf7, 0x00, 0x00, 0x00}, {0xfa, 0x00, 0x00, 0x01}
+    },
+    {
+        {0x00, 0x01, 0xd3, 0x01}, {0x00, 0x01, 0xd4, 0x01},
+        {0x00, 0x01, 0xd6, 0x01}, {0x00, 0x01, 0xdd, 0x01},
+        {0x00, 0x01, 0xde, 0x01}, {0x00, 0x01, 0xdf, 0x01},
+        {0x00, 0x01, 0xf1, 0x01}, {0x00, 0x01, 0xf4, 0x01},
+        {0x00, 0x01, 0xf5, 0x01}, {0x00, 0x01, 0xf6, 0x01},
+        {0x00, 0x01, 0xf7, 0x01}, {0x00, 0x01, 0xf8, 0x01},
+        {0x00, 0x01, 0xfa, 0x01}, {0x00, 0x01, 0xfb, 0x01},
+        {0x00, 0x01, 0xfc, 0x01}, {0x00, 0x01, 0xfd, 0x01}
+    },
+    {
+        {0x01, 0x01, 0xd3, 0x00}, {0x16, 0x01, 0xd3, 0x01},
+        {0x01, 0x01, 0xd4, 0x00}, {0x16, 0x01, 0xd4, 0x01},
+        {0x01, 0x01, 0xd6, 0x00}, {0x16, 0x01, 0xd6, 0x01},
+        {0x01, 0x01, 0xdd, 0x00}, {0x16, 0x01, 0xdd, 0x01},
+        {0x01, 0x01, 0xde, 0x00}, {0x16, 0x01, 0xde, 0x01},
+        {0x01, 0x01, 0xdf, 0x00}, {0x16, 0x01, 0xdf, 0x01},
+        {0x01, 0x01, 0xf1, 0x00}, {0x16, 0x01, 0xf1, 0x01},
+        {0x01, 0x01, 0xf4, 0x00}, {0x16, 0x01, 0xf4, 0x01}
+    },
+    /* 210 */
+    {
+        {0x02, 0x01, 0xd3, 0x00}, {0x09, 0x01, 0xd3, 0x00},
+        {0x17, 0x01, 0xd3, 0x00}, {0x28, 0x01, 0xd3, 0x01},
+        {0x02, 0x01, 0xd4, 0x00}, {0x09, 0x01, 0xd4, 0x00},
+        {0x17, 0x01, 0xd4, 0x00}, {0x28, 0x01, 0xd4, 0x01},
+        {0x02, 0x01, 0xd6, 0x00}, {0x09, 0x01, 0xd6, 0x00},
+        {0x17, 0x01, 0xd6, 0x00}, {0x28, 0x01, 0xd6, 0x01},
+        {0x02, 0x01, 0xdd, 0x00}, {0x09, 0x01, 0xdd, 0x00},
+        {0x17, 0x01, 0xdd, 0x00}, {0x28, 0x01, 0xdd, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xd3, 0x00}, {0x06, 0x01, 0xd3, 0x00},
+        {0x0a, 0x01, 0xd3, 0x00}, {0x0f, 0x01, 0xd3, 0x00},
+        {0x18, 0x01, 0xd3, 0x00}, {0x1f, 0x01, 0xd3, 0x00},
+        {0x29, 0x01, 0xd3, 0x00}, {0x38, 0x01, 0xd3, 0x01},
+        {0x03, 0x01, 0xd4, 0x00}, {0x06, 0x01, 0xd4, 0x00},
+        {0x0a, 0x01, 0xd4, 0x00}, {0x0f, 0x01, 0xd4, 0x00},
+        {0x18, 0x01, 0xd4, 0x00}, {0x1f, 0x01, 0xd4, 0x00},
+        {0x29, 0x01, 0xd4, 0x00}, {0x38, 0x01, 0xd4, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xd6, 0x00}, {0x06, 0x01, 0xd6, 0x00},
+        {0x0a, 0x01, 0xd6, 0x00}, {0x0f, 0x01, 0xd6, 0x00},
+        {0x18, 0x01, 0xd6, 0x00}, {0x1f, 0x01, 0xd6, 0x00},
+        {0x29, 0x01, 0xd6, 0x00}, {0x38, 0x01, 0xd6, 0x01},
+        {0x03, 0x01, 0xdd, 0x00}, {0x06, 0x01, 0xdd, 0x00},
+        {0x0a, 0x01, 0xdd, 0x00}, {0x0f, 0x01, 0xdd, 0x00},
+        {0x18, 0x01, 0xdd, 0x00}, {0x1f, 0x01, 0xdd, 0x00},
+        {0x29, 0x01, 0xdd, 0x00}, {0x38, 0x01, 0xdd, 0x01}
+    },
+    {
+        {0x02, 0x01, 0xde, 0x00}, {0x09, 0x01, 0xde, 0x00},
+        {0x17, 0x01, 0xde, 0x00}, {0x28, 0x01, 0xde, 0x01},
+        {0x02, 0x01, 0xdf, 0x00}, {0x09, 0x01, 0xdf, 0x00},
+        {0x17, 0x01, 0xdf, 0x00}, {0x28, 0x01, 0xdf, 0x01},
+        {0x02, 0x01, 0xf1, 0x00}, {0x09, 0x01, 0xf1, 0x00},
+        {0x17, 0x01, 0xf1, 0x00}, {0x28, 0x01, 0xf1, 0x01},
+        {0x02, 0x01, 0xf4, 0x00}, {0x09, 0x01, 0xf4, 0x00},
+        {0x17, 0x01, 0xf4, 0x00}, {0x28, 0x01, 0xf4, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xde, 0x00}, {0x06, 0x01, 0xde, 0x00},
+        {0x0a, 0x01, 0xde, 0x00}, {0x0f, 0x01, 0xde, 0x00},
+        {0x18, 0x01, 0xde, 0x00}, {0x1f, 0x01, 0xde, 0x00},
+        {0x29, 0x01, 0xde, 0x00}, {0x38, 0x01, 0xde, 0x01},
+        {0x03, 0x01, 0xdf, 0x00}, {0x06, 0x01, 0xdf, 0x00},
+        {0x0a, 0x01, 0xdf, 0x00}, {0x0f, 0x01, 0xdf, 0x00},
+        {0x18, 0x01, 0xdf, 0x00}, {0x1f, 0x01, 0xdf, 0x00},
+        {0x29, 0x01, 0xdf, 0x00}, {0x38, 0x01, 0xdf, 0x01}
+    },
+    /* 215 */
+    {
+        {0x03, 0x01, 0xf1, 0x00}, {0x06, 0x01, 0xf1, 0x00},
+        {0x0a, 0x01, 0xf1, 0x00}, {0x0f, 0x01, 0xf1, 0x00},
+        {0x18, 0x01, 0xf1, 0x00}, {0x1f, 0x01, 0xf1, 0x00},
+        {0x29, 0x01, 0xf1, 0x00}, {0x38, 0x01, 0xf1, 0x01},
+        {0x03, 0x01, 0xf4, 0x00}, {0x06, 0x01, 0xf4, 0x00},
+        {0x0a, 0x01, 0xf4, 0x00}, {0x0f, 0x01, 0xf4, 0x00},
+        {0x18, 0x01, 0xf4, 0x00}, {0x1f, 0x01, 0xf4, 0x00},
+        {0x29, 0x01, 0xf4, 0x00}, {0x38, 0x01, 0xf4, 0x01}
+    },
+    {
+        {0x01, 0x01, 0xf5, 0x00}, {0x16, 0x01, 0xf5, 0x01},
+        {0x01, 0x01, 0xf6, 0x00}, {0x16, 0x01, 0xf6, 0x01},
+        {0x01, 0x01, 0xf7, 0x00}, {0x16, 0x01, 0xf7, 0x01},
+        {0x01, 0x01, 0xf8, 0x00}, {0x16, 0x01, 0xf8, 0x01},
+        {0x01, 0x01, 0xfa, 0x00}, {0x16, 0x01, 0xfa, 0x01},
+        {0x01, 0x01, 0xfb, 0x00}, {0x16, 0x01, 0xfb, 0x01},
+        {0x01, 0x01, 0xfc, 0x00}, {0x16, 0x01, 0xfc, 0x01},
+        {0x01, 0x01, 0xfd, 0x00}, {0x16, 0x01, 0xfd, 0x01}
+    },
+    {
+        {0x02, 0x01, 0xf5, 0x00}, {0x09, 0x01, 0xf5, 0x00},
+        {0x17, 0x01, 0xf5, 0x00}, {0x28, 0x01, 0xf5, 0x01},
+        {0x02, 0x01, 0xf6, 0x00}, {0x09, 0x01, 0xf6, 0x00},
+        {0x17, 0x01, 0xf6, 0x00}, {0x28, 0x01, 0xf6, 0x01},
+        {0x02, 0x01, 0xf7, 0x00}, {0x09, 0x01, 0xf7, 0x00},
+        {0x17, 0x01, 0xf7, 0x00}, {0x28, 0x01, 0xf7, 0x01},
+        {0x02, 0x01, 0xf8, 0x00}, {0x09, 0x01, 0xf8, 0x00},
+        {0x17, 0x01, 0xf8, 0x00}, {0x28, 0x01, 0xf8, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xf5, 0x00}, {0x06, 0x01, 0xf5, 0x00},
+        {0x0a, 0x01, 0xf5, 0x00}, {0x0f, 0x01, 0xf5, 0x00},
+        {0x18, 0x01, 0xf5, 0x00}, {0x1f, 0x01, 0xf5, 0x00},
+        {0x29, 0x01, 0xf5, 0x00}, {0x38, 0x01, 0xf5, 0x01},
+        {0x03, 0x01, 0xf6, 0x00}, {0x06, 0x01, 0xf6, 0x00},
+        {0x0a, 0x01, 0xf6, 0x00}, {0x0f, 0x01, 0xf6, 0x00},
+        {0x18, 0x01, 0xf6, 0x00}, {0x1f, 0x01, 0xf6, 0x00},
+        {0x29, 0x01, 0xf6, 0x00}, {0x38, 0x01, 0xf6, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xf7, 0x00}, {0x06, 0x01, 0xf7, 0x00},
+        {0x0a, 0x01, 0xf7, 0x00}, {0x0f, 0x01, 0xf7, 0x00},
+        {0x18, 0x01, 0xf7, 0x00}, {0x1f, 0x01, 0xf7, 0x00},
+        {0x29, 0x01, 0xf7, 0x00}, {0x38, 0x01, 0xf7, 0x01},
+        {0x03, 0x01, 0xf8, 0x00}, {0x06, 0x01, 0xf8, 0x00},
+        {0x0a, 0x01, 0xf8, 0x00}, {0x0f, 0x01, 0xf8, 0x00},
+        {0x18, 0x01, 0xf8, 0x00}, {0x1f, 0x01, 0xf8, 0x00},
+        {0x29, 0x01, 0xf8, 0x00}, {0x38, 0x01, 0xf8, 0x01}
+    },
+    /* 220 */
+    {
+        {0x02, 0x01, 0xfa, 0x00}, {0x09, 0x01, 0xfa, 0x00},
+        {0x17, 0x01, 0xfa, 0x00}, {0x28, 0x01, 0xfa, 0x01},
+        {0x02, 0x01, 0xfb, 0x00}, {0x09, 0x01, 0xfb, 0x00},
+        {0x17, 0x01, 0xfb, 0x00}, {0x28, 0x01, 0xfb, 0x01},
+        {0x02, 0x01, 0xfc, 0x00}, {0x09, 0x01, 0xfc, 0x00},
+        {0x17, 0x01, 0xfc, 0x00}, {0x28, 0x01, 0xfc, 0x01},
+        {0x02, 0x01, 0xfd, 0x00}, {0x09, 0x01, 0xfd, 0x00},
+        {0x17, 0x01, 0xfd, 0x00}, {0x28, 0x01, 0xfd, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xfa, 0x00}, {0x06, 0x01, 0xfa, 0x00},
+        {0x0a, 0x01, 0xfa, 0x00}, {0x0f, 0x01, 0xfa, 0x00},
+        {0x18, 0x01, 0xfa, 0x00}, {0x1f, 0x01, 0xfa, 0x00},
+        {0x29, 0x01, 0xfa, 0x00}, {0x38, 0x01, 0xfa, 0x01},
+        {0x03, 0x01, 0xfb, 0x00}, {0x06, 0x01, 0xfb, 0x00},
+        {0x0a, 0x01, 0xfb, 0x00}, {0x0f, 0x01, 0xfb, 0x00},
+        {0x18, 0x01, 0xfb, 0x00}, {0x1f, 0x01, 0xfb, 0x00},
+        {0x29, 0x01, 0xfb, 0x00}, {0x38, 0x01, 0xfb, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xfc, 0x00}, {0x06, 0x01, 0xfc, 0x00},
+        {0x0a, 0x01, 0xfc, 0x00}, {0x0f, 0x01, 0xfc, 0x00},
+        {0x18, 0x01, 0xfc, 0x00}, {0x1f, 0x01, 0xfc, 0x00},
+        {0x29, 0x01, 0xfc, 0x00}, {0x38, 0x01, 0xfc, 0x01},
+        {0x03, 0x01, 0xfd, 0x00}, {0x06, 0x01, 0xfd, 0x00},
+        {0x0a, 0x01, 0xfd, 0x00}, {0x0f, 0x01, 0xfd, 0x00},
+        {0x18, 0x01, 0xfd, 0x00}, {0x1f, 0x01, 0xfd, 0x00},
+        {0x29, 0x01, 0xfd, 0x00}, {0x38, 0x01, 0xfd, 0x01}
+    },
+    {
+        {0x00, 0x01, 0xfe, 0x01}, {0xe3, 0x00, 0x00, 0x00},
+        {0xe5, 0x00, 0x00, 0x00}, {0xe6, 0x00, 0x00, 0x00},
+        {0xe9, 0x00, 0x00, 0x00}, {0xea, 0x00, 0x00, 0x00},
+        {0xec, 0x00, 0x00, 0x00}, {0xed, 0x00, 0x00, 0x00},
+        {0xf1, 0x00, 0x00, 0x00}, {0xf2, 0x00, 0x00, 0x00},
+        {0xf4, 0x00, 0x00, 0x00}, {0xf5, 0x00, 0x00, 0x00},
+        {0xf8, 0x00, 0x00, 0x00}, {0xf9, 0x00, 0x00, 0x00},
+        {0xfb, 0x00, 0x00, 0x00}, {0xfc, 0x00, 0x00, 0x01}
+    },
+    {
+        {0x01, 0x01, 0xfe, 0x00}, {0x16, 0x01, 0xfe, 0x01},
+        {0x00, 0x01, 0x02, 0x01}, {0x00, 0x01, 0x03, 0x01},
+        {0x00, 0x01, 0x04, 0x01}, {0x00, 0x01, 0x05, 0x01},
+        {0x00, 0x01, 0x06, 0x01}, {0x00, 0x01, 0x07, 0x01},
+        {0x00, 0x01, 0x08, 0x01}, {0x00, 0x01, 0x0b, 0x01},
+        {0x00, 0x01, 0x0c, 0x01}, {0x00, 0x01, 0x0e, 0x01},
+        {0x00, 0x01, 0x0f, 0x01}, {0x00, 0x01, 0x10, 0x01},
+        {0x00, 0x01, 0x11, 0x01}, {0x00, 0x01, 0x12, 0x01}
+    },
+    /* 225 */
+    {
+        {0x02, 0x01, 0xfe, 0x00}, {0x09, 0x01, 0xfe, 0x00},
+        {0x17, 0x01, 0xfe, 0x00}, {0x28, 0x01, 0xfe, 0x01},
+        {0x01, 0x01, 0x02, 0x00}, {0x16, 0x01, 0x02, 0x01},
+        {0x01, 0x01, 0x03, 0x00}, {0x16, 0x01, 0x03, 0x01},
+        {0x01, 0x01, 0x04, 0x00}, {0x16, 0x01, 0x04, 0x01},
+        {0x01, 0x01, 0x05, 0x00}, {0x16, 0x01, 0x05, 0x01},
+        {0x01, 0x01, 0x06, 0x00}, {0x16, 0x01, 0x06, 0x01},
+        {0x01, 0x01, 0x07, 0x00}, {0x16, 0x01, 0x07, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xfe, 0x00}, {0x06, 0x01, 0xfe, 0x00},
+        {0x0a, 0x01, 0xfe, 0x00}, {0x0f, 0x01, 0xfe, 0x00},
+        {0x18, 0x01, 0xfe, 0x00}, {0x1f, 0x01, 0xfe, 0x00},
+        {0x29, 0x01, 0xfe, 0x00}, {0x38, 0x01, 0xfe, 0x01},
+        {0x02, 0x01, 0x02, 0x00}, {0x09, 0x01, 0x02, 0x00},
+        {0x17, 0x01, 0x02, 0x00}, {0x28, 0x01, 0x02, 0x01},
+        {0x02, 0x01, 0x03, 0x00}, {0x09, 0x01, 0x03, 0x00},
+        {0x17, 0x01, 0x03, 0x00}, {0x28, 0x01, 0x03, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x02, 0x00}, {0x06, 0x01, 0x02, 0x00},
+        {0x0a, 0x01, 0x02, 0x00}, {0x0f, 0x01, 0x02, 0x00},
+        {0x18, 0x01, 0x02, 0x00}, {0x1f, 0x01, 0x02, 0x00},
+        {0x29, 0x01, 0x02, 0x00}, {0x38, 0x01, 0x02, 0x01},
+        {0x03, 0x01, 0x03, 0x00}, {0x06, 0x01, 0x03, 0x00},
+        {0x0a, 0x01, 0x03, 0x00}, {0x0f, 0x01, 0x03, 0x00},
+        {0x18, 0x01, 0x03, 0x00}, {0x1f, 0x01, 0x03, 0x00},
+        {0x29, 0x01, 0x03, 0x00}, {0x38, 0x01, 0x03, 0x01}
+    },
+    {
+        {0x02, 0x01, 0x04, 0x00}, {0x09, 0x01, 0x04, 0x00},
+        {0x17, 0x01, 0x04, 0x00}, {0x28, 0x01, 0x04, 0x01},
+        {0x02, 0x01, 0x05, 0x00}, {0x09, 0x01, 0x05, 0x00},
+        {0x17, 0x01, 0x05, 0x00}, {0x28, 0x01, 0x05, 0x01},
+        {0x02, 0x01, 0x06, 0x00}, {0x09, 0x01, 0x06, 0x00},
+        {0x17, 0x01, 0x06, 0x00}, {0x28, 0x01, 0x06, 0x01},
+        {0x02, 0x01, 0x07, 0x00}, {0x09, 0x01, 0x07, 0x00},
+        {0x17, 0x01, 0x07, 0x00}, {0x28, 0x01, 0x07, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x04, 0x00}, {0x06, 0x01, 0x04, 0x00},
+        {0x0a, 0x01, 0x04, 0x00}, {0x0f, 0x01, 0x04, 0x00},
+        {0x18, 0x01, 0x04, 0x00}, {0x1f, 0x01, 0x04, 0x00},
+        {0x29, 0x01, 0x04, 0x00}, {0x38, 0x01, 0x04, 0x01},
+        {0x03, 0x01, 0x05, 0x00}, {0x06, 0x01, 0x05, 0x00},
+        {0x0a, 0x01, 0x05, 0x00}, {0x0f, 0x01, 0x05, 0x00},
+        {0x18, 0x01, 0x05, 0x00}, {0x1f, 0x01, 0x05, 0x00},
+        {0x29, 0x01, 0x05, 0x00}, {0x38, 0x01, 0x05, 0x01}
+    },
+    /* 230 */
+    {
+        {0x03, 0x01, 0x06, 0x00}, {0x06, 0x01, 0x06, 0x00},
+        {0x0a, 0x01, 0x06, 0x00}, {0x0f, 0x01, 0x06, 0x00},
+        {0x18, 0x01, 0x06, 0x00}, {0x1f, 0x01, 0x06, 0x00},
+        {0x29, 0x01, 0x06, 0x00}, {0x38, 0x01, 0x06, 0x01},
+        {0x03, 0x01, 0x07, 0x00}, {0x06, 0x01, 0x07, 0x00},
+        {0x0a, 0x01, 0x07, 0x00}, {0x0f, 0x01, 0x07, 0x00},
+        {0x18, 0x01, 0x07, 0x00}, {0x1f, 0x01, 0x07, 0x00},
+        {0x29, 0x01, 0x07, 0x00}, {0x38, 0x01, 0x07, 0x01}
+    },
+    {
+        {0x01, 0x01, 0x08, 0x00}, {0x16, 0x01, 0x08, 0x01},
+        {0x01, 0x01, 0x0b, 0x00}, {0x16, 0x01, 0x0b, 0x01},
+        {0x01, 0x01, 0x0c, 0x00}, {0x16, 0x01, 0x0c, 0x01},
+        {0x01, 0x01, 0x0e, 0x00}, {0x16, 0x01, 0x0e, 0x01},
+        {0x01, 0x01, 0x0f, 0x00}, {0x16, 0x01, 0x0f, 0x01},
+        {0x01, 0x01, 0x10, 0x00}, {0x16, 0x01, 0x10, 0x01},
+        {0x01, 0x01, 0x11, 0x00}, {0x16, 0x01, 0x11, 0x01},
+        {0x01, 0x01, 0x12, 0x00}, {0x16, 0x01, 0x12, 0x01}
+    },
+    {
+        {0x02, 0x01, 0x08, 0x00}, {0x09, 0x01, 0x08, 0x00},
+        {0x17, 0x01, 0x08, 0x00}, {0x28, 0x01, 0x08, 0x01},
+        {0x02, 0x01, 0x0b, 0x00}, {0x09, 0x01, 0x0b, 0x00},
+        {0x17, 0x01, 0x0b, 0x00}, {0x28, 0x01, 0x0b, 0x01},
+        {0x02, 0x01, 0x0c, 0x00}, {0x09, 0x01, 0x0c, 0x00},
+        {0x17, 0x01, 0x0c, 0x00}, {0x28, 0x01, 0x0c, 0x01},
+        {0x02, 0x01, 0x0e, 0x00}, {0x09, 0x01, 0x0e, 0x00},
+        {0x17, 0x01, 0x0e, 0x00}, {0x28, 0x01, 0x0e, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x08, 0x00}, {0x06, 0x01, 0x08, 0x00},
+        {0x0a, 0x01, 0x08, 0x00}, {0x0f, 0x01, 0x08, 0x00},
+        {0x18, 0x01, 0x08, 0x00}, {0x1f, 0x01, 0x08, 0x00},
+        {0x29, 0x01, 0x08, 0x00}, {0x38, 0x01, 0x08, 0x01},
+        {0x03, 0x01, 0x0b, 0x00}, {0x06, 0x01, 0x0b, 0x00},
+        {0x0a, 0x01, 0x0b, 0x00}, {0x0f, 0x01, 0x0b, 0x00},
+        {0x18, 0x01, 0x0b, 0x00}, {0x1f, 0x01, 0x0b, 0x00},
+        {0x29, 0x01, 0x0b, 0x00}, {0x38, 0x01, 0x0b, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x0c, 0x00}, {0x06, 0x01, 0x0c, 0x00},
+        {0x0a, 0x01, 0x0c, 0x00}, {0x0f, 0x01, 0x0c, 0x00},
+        {0x18, 0x01, 0x0c, 0x00}, {0x1f, 0x01, 0x0c, 0x00},
+        {0x29, 0x01, 0x0c, 0x00}, {0x38, 0x01, 0x0c, 0x01},
+        {0x03, 0x01, 0x0e, 0x00}, {0x06, 0x01, 0x0e, 0x00},
+        {0x0a, 0x01, 0x0e, 0x00}, {0x0f, 0x01, 0x0e, 0x00},
+        {0x18, 0x01, 0x0e, 0x00}, {0x1f, 0x01, 0x0e, 0x00},
+        {0x29, 0x01, 0x0e, 0x00}, {0x38, 0x01, 0x0e, 0x01}
+    },
+    /* 235 */
+    {
+        {0x02, 0x01, 0x0f, 0x00}, {0x09, 0x01, 0x0f, 0x00},
+        {0x17, 0x01, 0x0f, 0x00}, {0x28, 0x01, 0x0f, 0x01},
+        {0x02, 0x01, 0x10, 0x00}, {0x09, 0x01, 0x10, 0x00},
+        {0x17, 0x01, 0x10, 0x00}, {0x28, 0x01, 0x10, 0x01},
+        {0x02, 0x01, 0x11, 0x00}, {0x09, 0x01, 0x11, 0x00},
+        {0x17, 0x01, 0x11, 0x00}, {0x28, 0x01, 0x11, 0x01},
+        {0x02, 0x01, 0x12, 0x00}, {0x09, 0x01, 0x12, 0x00},
+        {0x17, 0x01, 0x12, 0x00}, {0x28, 0x01, 0x12, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x0f, 0x00}, {0x06, 0x01, 0x0f, 0x00},
+        {0x0a, 0x01, 0x0f, 0x00}, {0x0f, 0x01, 0x0f, 0x00},
+        {0x18, 0x01, 0x0f, 0x00}, {0x1f, 0x01, 0x0f, 0x00},
+        {0x29, 0x01, 0x0f, 0x00}, {0x38, 0x01, 0x0f, 0x01},
+        {0x03, 0x01, 0x10, 0x00}, {0x06, 0x01, 0x10, 0x00},
+        {0x0a, 0x01, 0x10, 0x00}, {0x0f, 0x01, 0x10, 0x00},
+        {0x18, 0x01, 0x10, 0x00}, {0x1f, 0x01, 0x10, 0x00},
+        {0x29, 0x01, 0x10, 0x00}, {0x38, 0x01, 0x10, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x11, 0x00}, {0x06, 0x01, 0x11, 0x00},
+        {0x0a, 0x01, 0x11, 0x00}, {0x0f, 0x01, 0x11, 0x00},
+        {0x18, 0x01, 0x11, 0x00}, {0x1f, 0x01, 0x11, 0x00},
+        {0x29, 0x01, 0x11, 0x00}, {0x38, 0x01, 0x11, 0x01},
+        {0x03, 0x01, 0x12, 0x00}, {0x06, 0x01, 0x12, 0x00},
+        {0x0a, 0x01, 0x12, 0x00}, {0x0f, 0x01, 0x12, 0x00},
+        {0x18, 0x01, 0x12, 0x00}, {0x1f, 0x01, 0x12, 0x00},
+        {0x29, 0x01, 0x12, 0x00}, {0x38, 0x01, 0x12, 0x01}
+    },
+    {
+        {0x00, 0x01, 0x13, 0x01}, {0x00, 0x01, 0x14, 0x01},
+        {0x00, 0x01, 0x15, 0x01}, {0x00, 0x01, 0x17, 0x01},
+        {0x00, 0x01, 0x18, 0x01}, {0x00, 0x01, 0x19, 0x01},
+        {0x00, 0x01, 0x1a, 0x01}, {0x00, 0x01, 0x1b, 0x01},
+        {0x00, 0x01, 0x1c, 0x01}, {0x00, 0x01, 0x1d, 0x01},
+        {0x00, 0x01, 0x1e, 0x01}, {0x00, 0x01, 0x1f, 0x01},
+        {0x00, 0x01, 0x7f, 0x01}, {0x00, 0x01, 0xdc, 0x01},
+        {0x00, 0x01, 0xf9, 0x01}, {0xfd, 0x00, 0x00, 0x01}
+    },
+    {
+        {0x01, 0x01, 0x13, 0x00}, {0x16, 0x01, 0x13, 0x01},
+        {0x01, 0x01, 0x14, 0x00}, {0x16, 0x01, 0x14, 0x01},
+        {0x01, 0x01, 0x15, 0x00}, {0x16, 0x01, 0x15, 0x01},
+        {0x01, 0x01, 0x17, 0x00}, {0x16, 0x01, 0x17, 0x01},
+        {0x01, 0x01, 0x18, 0x00}, {0x16, 0x01, 0x18, 0x01},
+        {0x01, 0x01, 0x19, 0x00}, {0x16, 0x01, 0x19, 0x01},
+        {0x01, 0x01, 0x1a, 0x00}, {0x16, 0x01, 0x1a, 0x01},
+        {0x01, 0x01, 0x1b, 0x00}, {0x16, 0x01, 0x1b, 0x01}
+    },
+    /* 240 */
+    {
+        {0x02, 0x01, 0x13, 0x00}, {0x09, 0x01, 0x13, 0x00},
+        {0x17, 0x01, 0x13, 0x00}, {0x28, 0x01, 0x13, 0x01},
+        {0x02, 0x01, 0x14, 0x00}, {0x09, 0x01, 0x14, 0x00},
+        {0x17, 0x01, 0x14, 0x00}, {0x28, 0x01, 0x14, 0x01},
+        {0x02, 0x01, 0x15, 0x00}, {0x09, 0x01, 0x15, 0x00},
+        {0x17, 0x01, 0x15, 0x00}, {0x28, 0x01, 0x15, 0x01},
+        {0x02, 0x01, 0x17, 0x00}, {0x09, 0x01, 0x17, 0x00},
+        {0x17, 0x01, 0x17, 0x00}, {0x28, 0x01, 0x17, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x13, 0x00}, {0x06, 0x01, 0x13, 0x00},
+        {0x0a, 0x01, 0x13, 0x00}, {0x0f, 0x01, 0x13, 0x00},
+        {0x18, 0x01, 0x13, 0x00}, {0x1f, 0x01, 0x13, 0x00},
+        {0x29, 0x01, 0x13, 0x00}, {0x38, 0x01, 0x13, 0x01},
+        {0x03, 0x01, 0x14, 0x00}, {0x06, 0x01, 0x14, 0x00},
+        {0x0a, 0x01, 0x14, 0x00}, {0x0f, 0x01, 0x14, 0x00},
+        {0x18, 0x01, 0x14, 0x00}, {0x1f, 0x01, 0x14, 0x00},
+        {0x29, 0x01, 0x14, 0x00}, {0x38, 0x01, 0x14, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x15, 0x00}, {0x06, 0x01, 0x15, 0x00},
+        {0x0a, 0x01, 0x15, 0x00}, {0x0f, 0x01, 0x15, 0x00},
+        {0x18, 0x01, 0x15, 0x00}, {0x1f, 0x01, 0x15, 0x00},
+        {0x29, 0x01, 0x15, 0x00}, {0x38, 0x01, 0x15, 0x01},
+        {0x03, 0x01, 0x17, 0x00}, {0x06, 0x01, 0x17, 0x00},
+        {0x0a, 0x01, 0x17, 0x00}, {0x0f, 0x01, 0x17, 0x00},
+        {0x18, 0x01, 0x17, 0x00}, {0x1f, 0x01, 0x17, 0x00},
+        {0x29, 0x01, 0x17, 0x00}, {0x38, 0x01, 0x17, 0x01}
+    },
+    {
+        {0x02, 0x01, 0x18, 0x00}, {0x09, 0x01, 0x18, 0x00},
+        {0x17, 0x01, 0x18, 0x00}, {0x28, 0x01, 0x18, 0x01},
+        {0x02, 0x01, 0x19, 0x00}, {0x09, 0x01, 0x19, 0x00},
+        {0x17, 0x01, 0x19, 0x00}, {0x28, 0x01, 0x19, 0x01},
+        {0x02, 0x01, 0x1a, 0x00}, {0x09, 0x01, 0x1a, 0x00},
+        {0x17, 0x01, 0x1a, 0x00}, {0x28, 0x01, 0x1a, 0x01},
+        {0x02, 0x01, 0x1b, 0x00}, {0x09, 0x01, 0x1b, 0x00},
+        {0x17, 0x01, 0x1b, 0x00}, {0x28, 0x01, 0x1b, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x18, 0x00}, {0x06, 0x01, 0x18, 0x00},
+        {0x0a, 0x01, 0x18, 0x00}, {0x0f, 0x01, 0x18, 0x00},
+        {0x18, 0x01, 0x18, 0x00}, {0x1f, 0x01, 0x18, 0x00},
+        {0x29, 0x01, 0x18, 0x00}, {0x38, 0x01, 0x18, 0x01},
+        {0x03, 0x01, 0x19, 0x00}, {0x06, 0x01, 0x19, 0x00},
+        {0x0a, 0x01, 0x19, 0x00}, {0x0f, 0x01, 0x19, 0x00},
+        {0x18, 0x01, 0x19, 0x00}, {0x1f, 0x01, 0x19, 0x00},
+        {0x29, 0x01, 0x19, 0x00}, {0x38, 0x01, 0x19, 0x01}
+    },
+    /* 245 */
+    {
+        {0x03, 0x01, 0x1a, 0x00}, {0x06, 0x01, 0x1a, 0x00},
+        {0x0a, 0x01, 0x1a, 0x00}, {0x0f, 0x01, 0x1a, 0x00},
+        {0x18, 0x01, 0x1a, 0x00}, {0x1f, 0x01, 0x1a, 0x00},
+        {0x29, 0x01, 0x1a, 0x00}, {0x38, 0x01, 0x1a, 0x01},
+        {0x03, 0x01, 0x1b, 0x00}, {0x06, 0x01, 0x1b, 0x00},
+        {0x0a, 0x01, 0x1b, 0x00}, {0x0f, 0x01, 0x1b, 0x00},
+        {0x18, 0x01, 0x1b, 0x00}, {0x1f, 0x01, 0x1b, 0x00},
+        {0x29, 0x01, 0x1b, 0x00}, {0x38, 0x01, 0x1b, 0x01}
+    },
+    {
+        {0x01, 0x01, 0x1c, 0x00}, {0x16, 0x01, 0x1c, 0x01},
+        {0x01, 0x01, 0x1d, 0x00}, {0x16, 0x01, 0x1d, 0x01},
+        {0x01, 0x01, 0x1e, 0x00}, {0x16, 0x01, 0x1e, 0x01},
+        {0x01, 0x01, 0x1f, 0x00}, {0x16, 0x01, 0x1f, 0x01},
+        {0x01, 0x01, 0x7f, 0x00}, {0x16, 0x01, 0x7f, 0x01},
+        {0x01, 0x01, 0xdc, 0x00}, {0x16, 0x01, 0xdc, 0x01},
+        {0x01, 0x01, 0xf9, 0x00}, {0x16, 0x01, 0xf9, 0x01},
+        {0xfe, 0x00, 0x00, 0x00}, {0xff, 0x00, 0x00, 0x01}
+    },
+    {
+        {0x02, 0x01, 0x1c, 0x00}, {0x09, 0x01, 0x1c, 0x00},
+        {0x17, 0x01, 0x1c, 0x00}, {0x28, 0x01, 0x1c, 0x01},
+        {0x02, 0x01, 0x1d, 0x00}, {0x09, 0x01, 0x1d, 0x00},
+        {0x17, 0x01, 0x1d, 0x00}, {0x28, 0x01, 0x1d, 0x01},
+        {0x02, 0x01, 0x1e, 0x00}, {0x09, 0x01, 0x1e, 0x00},
+        {0x17, 0x01, 0x1e, 0x00}, {0x28, 0x01, 0x1e, 0x01},
+        {0x02, 0x01, 0x1f, 0x00}, {0x09, 0x01, 0x1f, 0x00},
+        {0x17, 0x01, 0x1f, 0x00}, {0x28, 0x01, 0x1f, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x1c, 0x00}, {0x06, 0x01, 0x1c, 0x00},
+        {0x0a, 0x01, 0x1c, 0x00}, {0x0f, 0x01, 0x1c, 0x00},
+        {0x18, 0x01, 0x1c, 0x00}, {0x1f, 0x01, 0x1c, 0x00},
+        {0x29, 0x01, 0x1c, 0x00}, {0x38, 0x01, 0x1c, 0x01},
+        {0x03, 0x01, 0x1d, 0x00}, {0x06, 0x01, 0x1d, 0x00},
+        {0x0a, 0x01, 0x1d, 0x00}, {0x0f, 0x01, 0x1d, 0x00},
+        {0x18, 0x01, 0x1d, 0x00}, {0x1f, 0x01, 0x1d, 0x00},
+        {0x29, 0x01, 0x1d, 0x00}, {0x38, 0x01, 0x1d, 0x01}
+    },
+    {
+        {0x03, 0x01, 0x1e, 0x00}, {0x06, 0x01, 0x1e, 0x00},
+        {0x0a, 0x01, 0x1e, 0x00}, {0x0f, 0x01, 0x1e, 0x00},
+        {0x18, 0x01, 0x1e, 0x00}, {0x1f, 0x01, 0x1e, 0x00},
+        {0x29, 0x01, 0x1e, 0x00}, {0x38, 0x01, 0x1e, 0x01},
+        {0x03, 0x01, 0x1f, 0x00}, {0x06, 0x01, 0x1f, 0x00},
+        {0x0a, 0x01, 0x1f, 0x00}, {0x0f, 0x01, 0x1f, 0x00},
+        {0x18, 0x01, 0x1f, 0x00}, {0x1f, 0x01, 0x1f, 0x00},
+        {0x29, 0x01, 0x1f, 0x00}, {0x38, 0x01, 0x1f, 0x01}
+    },
+    /* 250 */
+    {
+        {0x02, 0x01, 0x7f, 0x00}, {0x09, 0x01, 0x7f, 0x00},
+        {0x17, 0x01, 0x7f, 0x00}, {0x28, 0x01, 0x7f, 0x01},
+        {0x02, 0x01, 0xdc, 0x00}, {0x09, 0x01, 0xdc, 0x00},
+        {0x17, 0x01, 0xdc, 0x00}, {0x28, 0x01, 0xdc, 0x01},
+        {0x02, 0x01, 0xf9, 0x00}, {0x09, 0x01, 0xf9, 0x00},
+        {0x17, 0x01, 0xf9, 0x00}, {0x28, 0x01, 0xf9, 0x01},
+        {0x00, 0x01, 0x0a, 0x01}, {0x00, 0x01, 0x0d, 0x01},
+        {0x00, 0x01, 0x16, 0x01}, {0xfa, 0x00, 0x00, 0x00}
+    },
+    {
+        {0x03, 0x01, 0x7f, 0x00}, {0x06, 0x01, 0x7f, 0x00},
+        {0x0a, 0x01, 0x7f, 0x00}, {0x0f, 0x01, 0x7f, 0x00},
+        {0x18, 0x01, 0x7f, 0x00}, {0x1f, 0x01, 0x7f, 0x00},
+        {0x29, 0x01, 0x7f, 0x00}, {0x38, 0x01, 0x7f, 0x01},
+        {0x03, 0x01, 0xdc, 0x00}, {0x06, 0x01, 0xdc, 0x00},
+        {0x0a, 0x01, 0xdc, 0x00}, {0x0f, 0x01, 0xdc, 0x00},
+        {0x18, 0x01, 0xdc, 0x00}, {0x1f, 0x01, 0xdc, 0x00},
+        {0x29, 0x01, 0xdc, 0x00}, {0x38, 0x01, 0xdc, 0x01}
+    },
+    {
+        {0x03, 0x01, 0xf9, 0x00}, {0x06, 0x01, 0xf9, 0x00},
+        {0x0a, 0x01, 0xf9, 0x00}, {0x0f, 0x01, 0xf9, 0x00},
+        {0x18, 0x01, 0xf9, 0x00}, {0x1f, 0x01, 0xf9, 0x00},
+        {0x29, 0x01, 0xf9, 0x00}, {0x38, 0x01, 0xf9, 0x01},
+        {0x01, 0x01, 0x0a, 0x00}, {0x16, 0x01, 0x0a, 0x01},
+        {0x01, 0x01, 0x0d, 0x00}, {0x16, 0x01, 0x0d, 0x01},
+        {0x01, 0x01, 0x16, 0x00}, {0x16, 0x01, 0x16, 0x01},
+        {0xfc, 0x00, 0x00, 0x00}, {0xfc, 0x00, 0x00, 0x00}
+    },
+    {
+        {0x02, 0x01, 0x0a, 0x00}, {0x09, 0x01, 0x0a, 0x00},
+        {0x17, 0x01, 0x0a, 0x00}, {0x28, 0x01, 0x0a, 0x01},
+        {0x02, 0x01, 0x0d, 0x00}, {0x09, 0x01, 0x0d, 0x00},
+        {0x17, 0x01, 0x0d, 0x00}, {0x28, 0x01, 0x0d, 0x01},
+        {0x02, 0x01, 0x16, 0x00}, {0x09, 0x01, 0x16, 0x00},
+        {0x17, 0x01, 0x16, 0x00}, {0x28, 0x01, 0x16, 0x01},
+        {0xfd, 0x00, 0x00, 0x00}, {0xfd, 0x00, 0x00, 0x00},
+        {0xfd, 0x00, 0x00, 0x00}, {0xfd, 0x00, 0x00, 0x00}
+    },
+    {
+        {0x03, 0x01, 0x0a, 0x00}, {0x06, 0x01, 0x0a, 0x00},
+        {0x0a, 0x01, 0x0a, 0x00}, {0x0f, 0x01, 0x0a, 0x00},
+        {0x18, 0x01, 0x0a, 0x00}, {0x1f, 0x01, 0x0a, 0x00},
+        {0x29, 0x01, 0x0a, 0x00}, {0x38, 0x01, 0x0a, 0x01},
+        {0x03, 0x01, 0x0d, 0x00}, {0x06, 0x01, 0x0d, 0x00},
+        {0x0a, 0x01, 0x0d, 0x00}, {0x0f, 0x01, 0x0d, 0x00},
+        {0x18, 0x01, 0x0d, 0x00}, {0x1f, 0x01, 0x0d, 0x00},
+        {0x29, 0x01, 0x0d, 0x00}, {0x38, 0x01, 0x0d, 0x01}
+    },
+    /* 255 */
+    {
+        {0x03, 0x01, 0x16, 0x00}, {0x06, 0x01, 0x16, 0x00},
+        {0x0a, 0x01, 0x16, 0x00}, {0x0f, 0x01, 0x16, 0x00},
+        {0x18, 0x01, 0x16, 0x00}, {0x1f, 0x01, 0x16, 0x00},
+        {0x29, 0x01, 0x16, 0x00}, {0x38, 0x01, 0x16, 0x01},
+        {0xff, 0x00, 0x00, 0x00}, {0xff, 0x00, 0x00, 0x00},
+        {0xff, 0x00, 0x00, 0x00}, {0xff, 0x00, 0x00, 0x00},
+        {0xff, 0x00, 0x00, 0x00}, {0xff, 0x00, 0x00, 0x00},
+        {0xff, 0x00, 0x00, 0x00}, {0xff, 0x00, 0x00, 0x00}
+    }
+};
+
+
+ngx_int_t
+ngx_http_v2_huff_decode(u_char *state, u_char *src, size_t len, u_char **dst,
+    ngx_uint_t last, ngx_log_t *log)
+{
+    u_char  *end, ch, ending;
+
+    ch = 0;
+    ending = 1;
+
+    end = src + len;
+
+    while (src != end) {
+        ch = *src++;
+
+        if (ngx_http_v2_huff_decode_bits(state, &ending, ch >> 4, dst)
+            != NGX_OK)
+        {
+            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, log, 0,
+                           "http2 huffman decoding error at state %d: "
+                           "bad code 0x%Xd", *state, ch >> 4);
+
+            return NGX_ERROR;
+        }
+
+        if (ngx_http_v2_huff_decode_bits(state, &ending, ch & 0xf, dst)
+            != NGX_OK)
+        {
+            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, log, 0,
+                           "http2 huffman decoding error at state %d: "
+                           "bad code 0x%Xd", *state, ch & 0xf);
+
+            return NGX_ERROR;
+        }
+    }
+
+    if (last) {
+        if (!ending) {
+            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0,
+                           "http2 huffman decoding error: "
+                           "incomplete code 0x%Xd", ch);
+
+            return NGX_ERROR;
+        }
+
+        *state = 0;
+    }
+
+    return NGX_OK;
+}
+
+
+
+static ngx_inline ngx_int_t
+ngx_http_v2_huff_decode_bits(u_char *state, u_char *ending, ngx_uint_t bits,
+    u_char **dst)
+{
+    ngx_http_v2_huff_decode_code_t  code;
+
+    code = ngx_http_v2_huff_decode_codes[*state][bits];
+
+    if (code.next == *state) {
+        return NGX_ERROR;
+    }
+
+    if (code.emit) {
+        *(*dst)++ = code.sym;
+    }
+
+    *ending = code.ending;
+    *state = code.next;
+
+    return NGX_OK;
+}

  Added: vendor/nginx-1.9.5/src/http/v2/ngx_http_v2_huff_encode.c (+10 -0) 100644
===================================================================
--- /dev/null
+++ vendor/nginx-1.9.5/src/http/v2/ngx_http_v2_huff_encode.c    2015-09-27 22:10:53 +0900 (6c412cf)
@@ -0,0 +1,10 @@
+
+/*
+ * Copyright (C) Nginx, Inc.
+ * Copyright (C) Valentin V. Bartenev
+ */
+
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+#include <ngx_http.h>

  Added: vendor/nginx-1.9.5/src/http/v2/ngx_http_v2_module.c (+469 -0) 100644
===================================================================
--- /dev/null
+++ vendor/nginx-1.9.5/src/http/v2/ngx_http_v2_module.c    2015-09-27 22:10:53 +0900 (d99ac30)
@@ -0,0 +1,469 @@
+
+/*
+ * Copyright (C) Nginx, Inc.
+ * Copyright (C) Valentin V. Bartenev
+ */
+
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+#include <ngx_http.h>
+#include <ngx_http_v2_module.h>
+
+
+static ngx_int_t ngx_http_v2_add_variables(ngx_conf_t *cf);
+
+static ngx_int_t ngx_http_v2_variable(ngx_http_request_t *r,
+    ngx_http_variable_value_t *v, uintptr_t data);
+
+static ngx_int_t ngx_http_v2_module_init(ngx_cycle_t *cycle);
+
+static void *ngx_http_v2_create_main_conf(ngx_conf_t *cf);
+static char *ngx_http_v2_init_main_conf(ngx_conf_t *cf, void *conf);
+static void *ngx_http_v2_create_srv_conf(ngx_conf_t *cf);
+static char *ngx_http_v2_merge_srv_conf(ngx_conf_t *cf, void *parent,
+    void *child);
+static void *ngx_http_v2_create_loc_conf(ngx_conf_t *cf);
+static char *ngx_http_v2_merge_loc_conf(ngx_conf_t *cf, void *parent,
+    void *child);
+
+static char *ngx_http_v2_recv_buffer_size(ngx_conf_t *cf, void *post,
+    void *data);
+static char *ngx_http_v2_pool_size(ngx_conf_t *cf, void *post, void *data);
+static char *ngx_http_v2_streams_index_mask(ngx_conf_t *cf, void *post,
+    void *data);
+static char *ngx_http_v2_chunk_size(ngx_conf_t *cf, void *post, void *data);
+static char *ngx_http_v2_spdy_deprecated(ngx_conf_t *cf, ngx_command_t *cmd,
+    void *conf);
+
+
+static ngx_conf_post_t  ngx_http_v2_recv_buffer_size_post =
+    { ngx_http_v2_recv_buffer_size };
+static ngx_conf_post_t  ngx_http_v2_pool_size_post =
+    { ngx_http_v2_pool_size };
+static ngx_conf_post_t  ngx_http_v2_streams_index_mask_post =
+    { ngx_http_v2_streams_index_mask };
+static ngx_conf_post_t  ngx_http_v2_chunk_size_post =
+    { ngx_http_v2_chunk_size };
+
+
+static ngx_command_t  ngx_http_v2_commands[] = {
+
+    { ngx_string("http2_recv_buffer_size"),
+      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,
+      ngx_conf_set_size_slot,
+      NGX_HTTP_MAIN_CONF_OFFSET,
+      offsetof(ngx_http_v2_main_conf_t, recv_buffer_size),
+      &ngx_http_v2_recv_buffer_size_post },
+
+    { ngx_string("http2_pool_size"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
+      ngx_conf_set_size_slot,
+      NGX_HTTP_SRV_CONF_OFFSET,
+      offsetof(ngx_http_v2_srv_conf_t, pool_size),
+      &ngx_http_v2_pool_size_post },
+
+    { ngx_string("http2_max_concurrent_streams"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
+      ngx_conf_set_num_slot,
+      NGX_HTTP_SRV_CONF_OFFSET,
+      offsetof(ngx_http_v2_srv_conf_t, concurrent_streams),
+      NULL },
+
+    { ngx_string("http2_max_field_size"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
+      ngx_conf_set_size_slot,
+      NGX_HTTP_SRV_CONF_OFFSET,
+      offsetof(ngx_http_v2_srv_conf_t, max_field_size),
+      NULL },
+
+    { ngx_string("http2_max_header_size"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
+      ngx_conf_set_size_slot,
+      NGX_HTTP_SRV_CONF_OFFSET,
+      offsetof(ngx_http_v2_srv_conf_t, max_header_size),
+      NULL },
+
+    { ngx_string("http2_streams_index_size"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
+      ngx_conf_set_num_slot,
+      NGX_HTTP_SRV_CONF_OFFSET,
+      offsetof(ngx_http_v2_srv_conf_t, streams_index_mask),
+      &ngx_http_v2_streams_index_mask_post },
+
+    { ngx_string("http2_recv_timeout"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
+      ngx_conf_set_msec_slot,
+      NGX_HTTP_SRV_CONF_OFFSET,
+      offsetof(ngx_http_v2_srv_conf_t, recv_timeout),
+      NULL },
+
+    { ngx_string("http2_idle_timeout"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
+      ngx_conf_set_msec_slot,
+      NGX_HTTP_SRV_CONF_OFFSET,
+      offsetof(ngx_http_v2_srv_conf_t, idle_timeout),
+      NULL },
+
+    { ngx_string("http2_chunk_size"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
+      ngx_conf_set_size_slot,
+      NGX_HTTP_LOC_CONF_OFFSET,
+      offsetof(ngx_http_v2_loc_conf_t, chunk_size),
+      &ngx_http_v2_chunk_size_post },
+
+    { ngx_string("spdy_recv_buffer_size"),
+      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,
+      ngx_http_v2_spdy_deprecated,
+      NGX_HTTP_MAIN_CONF_OFFSET,
+      0,
+      NULL },
+
+    { ngx_string("spdy_pool_size"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
+      ngx_http_v2_spdy_deprecated,
+      NGX_HTTP_SRV_CONF_OFFSET,
+      0,
+      NULL },
+
+    { ngx_string("spdy_max_concurrent_streams"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
+      ngx_http_v2_spdy_deprecated,
+      NGX_HTTP_SRV_CONF_OFFSET,
+      0,
+      NULL },
+
+    { ngx_string("spdy_streams_index_size"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
+      ngx_http_v2_spdy_deprecated,
+      NGX_HTTP_SRV_CONF_OFFSET,
+      0,
+      NULL },
+
+    { ngx_string("spdy_recv_timeout"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
+      ngx_http_v2_spdy_deprecated,
+      NGX_HTTP_SRV_CONF_OFFSET,
+      0,
+      NULL },
+
+    { ngx_string("spdy_keepalive_timeout"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
+      ngx_http_v2_spdy_deprecated,
+      NGX_HTTP_SRV_CONF_OFFSET,
+      0,
+      NULL },
+
+    { ngx_string("spdy_headers_comp"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
+      ngx_http_v2_spdy_deprecated,
+      NGX_HTTP_SRV_CONF_OFFSET,
+      0,
+      NULL },
+
+    { ngx_string("spdy_chunk_size"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
+      ngx_http_v2_spdy_deprecated,
+      NGX_HTTP_LOC_CONF_OFFSET,
+      0,
+      NULL },
+
+      ngx_null_command
+};
+
+
+static ngx_http_module_t  ngx_http_v2_module_ctx = {
+    ngx_http_v2_add_variables,             /* preconfiguration */
+    NULL,                                  /* postconfiguration */
+
+    ngx_http_v2_create_main_conf,          /* create main configuration */
+    ngx_http_v2_init_main_conf,            /* init main configuration */
+
+    ngx_http_v2_create_srv_conf,           /* create server configuration */
+    ngx_http_v2_merge_srv_conf,            /* merge server configuration */
+
+    ngx_http_v2_create_loc_conf,           /* create location configuration */
+    ngx_http_v2_merge_loc_conf             /* merge location configuration */
+};
+
+
+ngx_module_t  ngx_http_v2_module = {
+    NGX_MODULE_V1,
+    &ngx_http_v2_module_ctx,               /* module context */
+    ngx_http_v2_commands,                  /* module directives */
+    NGX_HTTP_MODULE,                       /* module type */
+    NULL,                                  /* init master */
+    ngx_http_v2_module_init,               /* init module */
+    NULL,                                  /* init process */
+    NULL,                                  /* init thread */
+    NULL,                                  /* exit thread */
+    NULL,                                  /* exit process */
+    NULL,                                  /* exit master */
+    NGX_MODULE_V1_PADDING
+};
+
+
+static ngx_http_variable_t  ngx_http_v2_vars[] = {
+
+    { ngx_string("http2"), NULL,
+      ngx_http_v2_variable, 0, 0, 0 },
+
+    { ngx_null_string, NULL, NULL, 0, 0, 0 }
+};
+
+
+static ngx_int_t
+ngx_http_v2_add_variables(ngx_conf_t *cf)
+{
+   ngx_http_variable_t  *var, *v;
+
+    for (v = ngx_http_v2_vars; v->name.len; v++) {
+        var = ngx_http_add_variable(cf, &v->name, v->flags);
+        if (var == NULL) {
+            return NGX_ERROR;
+        }
+
+        var->get_handler = v->get_handler;
+        var->data = v->data;
+    }
+
+    return NGX_OK;
+}
+
+
+static ngx_int_t
+ngx_http_v2_variable(ngx_http_request_t *r,
+    ngx_http_variable_value_t *v, uintptr_t data)
+{
+
+    if (r->stream) {
+#if (NGX_HTTP_SSL)
+
+        if (r->connection->ssl) {
+            v->len = sizeof("h2") - 1;
+            v->valid = 1;
+            v->no_cacheable = 0;
+            v->not_found = 0;
+            v->data = (u_char *) "h2";
+
+            return NGX_OK;
+        }
+
+#endif
+        v->len = sizeof("h2c") - 1;
+        v->valid = 1;
+        v->no_cacheable = 0;
+        v->not_found = 0;
+        v->data = (u_char *) "h2c";
+
+        return NGX_OK;
+    }
+
+    *v = ngx_http_variable_null_value;
+
+    return NGX_OK;
+}
+
+
+static ngx_int_t
+ngx_http_v2_module_init(ngx_cycle_t *cycle)
+{
+    return NGX_OK;
+}
+
+
+static void *
+ngx_http_v2_create_main_conf(ngx_conf_t *cf)
+{
+    ngx_http_v2_main_conf_t  *h2mcf;
+
+    h2mcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_v2_main_conf_t));
+    if (h2mcf == NULL) {
+        return NULL;
+    }
+
+    h2mcf->recv_buffer_size = NGX_CONF_UNSET_SIZE;
+
+    return h2mcf;
+}
+
+
+static char *
+ngx_http_v2_init_main_conf(ngx_conf_t *cf, void *conf)
+{
+    ngx_http_v2_main_conf_t *h2mcf = conf;
+
+    ngx_conf_init_size_value(h2mcf->recv_buffer_size, 256 * 1024);
+
+    return NGX_CONF_OK;
+}
+
+
+static void *
+ngx_http_v2_create_srv_conf(ngx_conf_t *cf)
+{
+    ngx_http_v2_srv_conf_t  *h2scf;
+
+    h2scf = ngx_pcalloc(cf->pool, sizeof(ngx_http_v2_srv_conf_t));
+    if (h2scf == NULL) {
+        return NULL;
+    }
+
+    h2scf->pool_size = NGX_CONF_UNSET_SIZE;
+
+    h2scf->concurrent_streams = NGX_CONF_UNSET_UINT;
+
+    h2scf->max_field_size = NGX_CONF_UNSET_SIZE;
+    h2scf->max_header_size = NGX_CONF_UNSET_SIZE;
+
+    h2scf->streams_index_mask = NGX_CONF_UNSET_UINT;
+
+    h2scf->recv_timeout = NGX_CONF_UNSET_MSEC;
+    h2scf->idle_timeout = NGX_CONF_UNSET_MSEC;
+
+    return h2scf;
+}
+
+
+static char *
+ngx_http_v2_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)
+{
+    ngx_http_v2_srv_conf_t *prev = parent;
+    ngx_http_v2_srv_conf_t *conf = child;
+
+    ngx_conf_merge_size_value(conf->pool_size, prev->pool_size, 4096);
+
+    ngx_conf_merge_uint_value(conf->concurrent_streams,
+                              prev->concurrent_streams, 128);
+
+    ngx_conf_merge_size_value(conf->max_field_size, prev->max_field_size,
+                              4096);
+    ngx_conf_merge_size_value(conf->max_header_size, prev->max_header_size,
+                              16384);
+
+    ngx_conf_merge_uint_value(conf->streams_index_mask,
+                              prev->streams_index_mask, 32 - 1);
+
+    ngx_conf_merge_msec_value(conf->recv_timeout,
+                              prev->recv_timeout, 30000);
+    ngx_conf_merge_msec_value(conf->idle_timeout,
+                              prev->idle_timeout, 180000);
+
+    return NGX_CONF_OK;
+}
+
+
+static void *
+ngx_http_v2_create_loc_conf(ngx_conf_t *cf)
+{
+    ngx_http_v2_loc_conf_t  *h2lcf;
+
+    h2lcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_v2_loc_conf_t));
+    if (h2lcf == NULL) {
+        return NULL;
+    }
+
+    h2lcf->chunk_size = NGX_CONF_UNSET_SIZE;
+
+    return h2lcf;
+}
+
+
+static char *
+ngx_http_v2_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
+{
+    ngx_http_v2_loc_conf_t *prev = parent;
+    ngx_http_v2_loc_conf_t *conf = child;
+
+    ngx_conf_merge_size_value(conf->chunk_size, prev->chunk_size, 8 * 1024);
+
+    return NGX_CONF_OK;
+}
+
+
+static char *
+ngx_http_v2_recv_buffer_size(ngx_conf_t *cf, void *post, void *data)
+{
+    size_t *sp = data;
+
+    if (*sp <= 2 * NGX_HTTP_V2_STATE_BUFFER_SIZE) {
+        return "value is too small";
+    }
+
+    return NGX_CONF_OK;
+}
+
+
+static char *
+ngx_http_v2_pool_size(ngx_conf_t *cf, void *post, void *data)
+{
+    size_t *sp = data;
+
+    if (*sp < NGX_MIN_POOL_SIZE) {
+        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
+                           "the pool size must be no less than %uz",
+                           NGX_MIN_POOL_SIZE);
+
+        return NGX_CONF_ERROR;
+    }
+
+    if (*sp % NGX_POOL_ALIGNMENT) {
+        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
+                           "the pool size must be a multiple of %uz",
+                           NGX_POOL_ALIGNMENT);
+
+        return NGX_CONF_ERROR;
+    }
+
+    return NGX_CONF_OK;
+}
+
+
+static char *
+ngx_http_v2_streams_index_mask(ngx_conf_t *cf, void *post, void *data)
+{
+    ngx_uint_t *np = data;
+
+    ngx_uint_t  mask;
+
+    mask = *np - 1;
+
+    if (*np == 0 || (*np & mask)) {
+        return "must be a power of two";
+    }
+
+    *np = mask;
+
+    return NGX_CONF_OK;
+}
+
+
+static char *
+ngx_http_v2_chunk_size(ngx_conf_t *cf, void *post, void *data)
+{
+    size_t *sp = data;
+
+    if (*sp == 0) {
+        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
+                           "the http2 chunk size cannot be zero");
+
+        return NGX_CONF_ERROR;
+    }
+
+    if (*sp > NGX_HTTP_V2_MAX_FRAME_SIZE) {
+        *sp = NGX_HTTP_V2_MAX_FRAME_SIZE;
+    }
+
+    return NGX_CONF_OK;
+}
+
+
+static char *
+ngx_http_v2_spdy_deprecated(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
+{
+    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
+                       "invalid directive \"%V\": ngx_http_spdy_module "
+                       "was superseded by ngx_http_v2_module", &cmd->name);
+
+    return NGX_CONF_OK;
+}

  Renamed: vendor/nginx-1.9.5/src/http/v2/ngx_http_v2_module.h (+10 -9) 58%
===================================================================
--- vendor/nginx-1.8.0/src/http/ngx_http_spdy_module.h    2015-09-27 18:09:01 +0900 (5242322)
+++ vendor/nginx-1.9.5/src/http/v2/ngx_http_v2_module.h    2015-09-27 22:10:53 +0900 (95cc7d8)
@@ -5,8 +5,8 @@
  */
 
 
-#ifndef _NGX_HTTP_SPDY_MODULE_H_INCLUDED_
-#define _NGX_HTTP_SPDY_MODULE_H_INCLUDED_
+#ifndef _NGX_HTTP_V2_MODULE_H_INCLUDED_
+#define _NGX_HTTP_V2_MODULE_H_INCLUDED_
 
 
 #include <ngx_config.h>
@@ -17,25 +17,26 @@
 typedef struct {
     size_t                          recv_buffer_size;
     u_char                         *recv_buffer;
-} ngx_http_spdy_main_conf_t;
+} ngx_http_v2_main_conf_t;
 
 
 typedef struct {
     size_t                          pool_size;
     ngx_uint_t                      concurrent_streams;
+    size_t                          max_field_size;
+    size_t                          max_header_size;
     ngx_uint_t                      streams_index_mask;
     ngx_msec_t                      recv_timeout;
-    ngx_msec_t                      keepalive_timeout;
-    ngx_int_t                       headers_comp;
-} ngx_http_spdy_srv_conf_t;
+    ngx_msec_t                      idle_timeout;
+} ngx_http_v2_srv_conf_t;
 
 
 typedef struct {
     size_t                          chunk_size;
-} ngx_http_spdy_loc_conf_t;
+} ngx_http_v2_loc_conf_t;
 
 
-extern ngx_module_t  ngx_http_spdy_module;
+extern ngx_module_t  ngx_http_v2_module;
 
 
-#endif /* _NGX_HTTP_SPDY_MODULE_H_INCLUDED_ */
+#endif /* _NGX_HTTP_V2_MODULE_H_INCLUDED_ */

  Added: vendor/nginx-1.9.5/src/http/v2/ngx_http_v2_table.c (+349 -0) 100644
===================================================================
--- /dev/null
+++ vendor/nginx-1.9.5/src/http/v2/ngx_http_v2_table.c    2015-09-27 22:10:53 +0900 (a73748a)
@@ -0,0 +1,349 @@
+
+/*
+ * Copyright (C) Nginx, Inc.
+ * Copyright (C) Valentin V. Bartenev
+ */
+
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+#include <ngx_http.h>
+
+
+#define NGX_HTTP_V2_TABLE_SIZE  4096
+
+
+static ngx_int_t ngx_http_v2_table_account(ngx_http_v2_connection_t *h2c,
+    size_t size);
+
+
+static ngx_http_v2_header_t  ngx_http_v2_static_table[] = {
+    { ngx_string(":authority"), ngx_string("") },
+    { ngx_string(":method"), ngx_string("GET") },
+    { ngx_string(":method"), ngx_string("POST") },
+    { ngx_string(":path"), ngx_string("/") },
+    { ngx_string(":path"), ngx_string("/index.html") },
+    { ngx_string(":scheme"), ngx_string("http") },
+    { ngx_string(":scheme"), ngx_string("https") },
+    { ngx_string(":status"), ngx_string("200") },
+    { ngx_string(":status"), ngx_string("204") },
+    { ngx_string(":status"), ngx_string("206") },
+    { ngx_string(":status"), ngx_string("304") },
+    { ngx_string(":status"), ngx_string("400") },
+    { ngx_string(":status"), ngx_string("404") },
+    { ngx_string(":status"), ngx_string("500") },
+    { ngx_string("accept-charset"), ngx_string("") },
+    { ngx_string("accept-encoding"), ngx_string("gzip, deflate") },
+    { ngx_string("accept-language"), ngx_string("") },
+    { ngx_string("accept-ranges"), ngx_string("") },
+    { ngx_string("accept"), ngx_string("") },
+    { ngx_string("access-control-allow-origin"), ngx_string("") },
+    { ngx_string("age"), ngx_string("") },
+    { ngx_string("allow"), ngx_string("") },
+    { ngx_string("authorization"), ngx_string("") },
+    { ngx_string("cache-control"), ngx_string("") },
+    { ngx_string("content-disposition"), ngx_string("") },
+    { ngx_string("content-encoding"), ngx_string("") },
+    { ngx_string("content-language"), ngx_string("") },
+    { ngx_string("content-length"), ngx_string("") },
+    { ngx_string("content-location"), ngx_string("") },
+    { ngx_string("content-range"), ngx_string("") },
+    { ngx_string("content-type"), ngx_string("") },
+    { ngx_string("cookie"), ngx_string("") },
+    { ngx_string("date"), ngx_string("") },
+    { ngx_string("etag"), ngx_string("") },
+    { ngx_string("expect"), ngx_string("") },
+    { ngx_string("expires"), ngx_string("") },
+    { ngx_string("from"), ngx_string("") },
+    { ngx_string("host"), ngx_string("") },
+    { ngx_string("if-match"), ngx_string("") },
+    { ngx_string("if-modified-since"), ngx_string("") },
+    { ngx_string("if-none-match"), ngx_string("") },
+    { ngx_string("if-range"), ngx_string("") },
+    { ngx_string("if-unmodified-since"), ngx_string("") },
+    { ngx_string("last-modified"), ngx_string("") },
+    { ngx_string("link"), ngx_string("") },
+    { ngx_string("location"), ngx_string("") },
+    { ngx_string("max-forwards"), ngx_string("") },
+    { ngx_string("proxy-authenticate"), ngx_string("") },
+    { ngx_string("proxy-authorization"), ngx_string("") },
+    { ngx_string("range"), ngx_string("") },
+    { ngx_string("referer"), ngx_string("") },
+    { ngx_string("refresh"), ngx_string("") },
+    { ngx_string("retry-after"), ngx_string("") },
+    { ngx_string("server"), ngx_string("") },
+    { ngx_string("set-cookie"), ngx_string("") },
+    { ngx_string("strict-transport-security"), ngx_string("") },
+    { ngx_string("transfer-encoding"), ngx_string("") },
+    { ngx_string("user-agent"), ngx_string("") },
+    { ngx_string("vary"), ngx_string("") },
+    { ngx_string("via"), ngx_string("") },
+    { ngx_string("www-authenticate"), ngx_string("") },
+};
+
+#define NGX_HTTP_V2_STATIC_TABLE_ENTRIES                                      \
+    (sizeof(ngx_http_v2_static_table)                                         \
+     / sizeof(ngx_http_v2_header_t))
+
+
+ngx_int_t
+ngx_http_v2_get_indexed_header(ngx_http_v2_connection_t *h2c, ngx_uint_t index,
+    ngx_uint_t name_only)
+{
+    u_char                *p;
+    size_t                 rest;
+    ngx_http_v2_header_t  *entry;
+
+    if (index == 0) {
+        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                      "client sent invalid hpack table index 0");
+        return NGX_ERROR;
+    }
+
+    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                   "http2 get indexed %s: %ui",
+                   name_only ? "header" : "header name", index);
+
+    index--;
+
+    if (index < NGX_HTTP_V2_STATIC_TABLE_ENTRIES) {
+        h2c->state.header = ngx_http_v2_static_table[index];
+        return NGX_OK;
+    }
+
+    index -= NGX_HTTP_V2_STATIC_TABLE_ENTRIES;
+
+    if (index < h2c->hpack.added - h2c->hpack.deleted) {
+        index = (h2c->hpack.added - index - 1) % h2c->hpack.allocated;
+        entry = h2c->hpack.entries[index];
+
+        p = ngx_pnalloc(h2c->state.pool, entry->name.len + 1);
+        if (p == NULL) {
+            return NGX_ERROR;
+        }
+
+        h2c->state.header.name.len = entry->name.len;
+        h2c->state.header.name.data = p;
+
+        rest = h2c->hpack.storage + NGX_HTTP_V2_TABLE_SIZE - entry->name.data;
+
+        if (entry->name.len > rest) {
+            p = ngx_cpymem(p, entry->name.data, rest);
+            p = ngx_cpymem(p, h2c->hpack.storage, entry->name.len - rest);
+
+        } else {
+            p = ngx_cpymem(p, entry->name.data, entry->name.len);
+        }
+
+        *p = '\0';
+
+        if (name_only) {
+            return NGX_OK;
+        }
+
+        p = ngx_pnalloc(h2c->state.pool, entry->value.len + 1);
+        if (p == NULL) {
+            return NGX_ERROR;
+        }
+
+        h2c->state.header.value.len = entry->value.len;
+        h2c->state.header.value.data = p;
+
+        rest = h2c->hpack.storage + NGX_HTTP_V2_TABLE_SIZE - entry->value.data;
+
+        if (entry->value.len > rest) {
+            p = ngx_cpymem(p, entry->value.data, rest);
+            p = ngx_cpymem(p, h2c->hpack.storage, entry->value.len - rest);
+
+        } else {
+            p = ngx_cpymem(p, entry->value.data, entry->value.len);
+        }
+
+        *p = '\0';
+
+        return NGX_OK;
+    }
+
+    ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                  "client sent out of bound hpack table index: %ui", index);
+
+    return NGX_ERROR;
+}
+
+
+ngx_int_t
+ngx_http_v2_add_header(ngx_http_v2_connection_t *h2c,
+    ngx_http_v2_header_t *header)
+{
+    size_t                 avail;
+    ngx_uint_t             index;
+    ngx_http_v2_header_t  *entry, **entries;
+
+    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                   "http2 add header to hpack table: \"%V: %V\"",
+                   &header->name, &header->value);
+
+    if (h2c->hpack.entries == NULL) {
+        h2c->hpack.allocated = 64;
+        h2c->hpack.size = NGX_HTTP_V2_TABLE_SIZE;
+        h2c->hpack.free = NGX_HTTP_V2_TABLE_SIZE;
+
+        h2c->hpack.entries = ngx_palloc(h2c->connection->pool,
+                                        sizeof(ngx_http_v2_header_t *)
+                                        * h2c->hpack.allocated);
+        if (h2c->hpack.entries == NULL) {
+            return NGX_ERROR;
+        }
+
+        h2c->hpack.storage = ngx_palloc(h2c->connection->pool,
+                                        h2c->hpack.free);
+        if (h2c->hpack.storage == NULL) {
+            return NGX_ERROR;
+        }
+
+        h2c->hpack.pos = h2c->hpack.storage;
+    }
+
+    if (ngx_http_v2_table_account(h2c, header->name.len + header->value.len)
+        != NGX_OK)
+    {
+        return NGX_OK;
+    }
+
+    if (h2c->hpack.reused == h2c->hpack.deleted) {
+        entry = ngx_palloc(h2c->connection->pool, sizeof(ngx_http_v2_header_t));
+        if (entry == NULL) {
+            return NGX_ERROR;
+        }
+
+    } else {
+        entry = h2c->hpack.entries[h2c->hpack.reused++ % h2c->hpack.allocated];
+    }
+
+    avail = h2c->hpack.storage + NGX_HTTP_V2_TABLE_SIZE - h2c->hpack.pos;
+
+    entry->name.len = header->name.len;
+    entry->name.data = h2c->hpack.pos;
+
+    if (avail >= header->name.len) {
+        h2c->hpack.pos = ngx_cpymem(h2c->hpack.pos, header->name.data,
+                                    header->name.len);
+    } else {
+        ngx_memcpy(h2c->hpack.pos, header->name.data, avail);
+        h2c->hpack.pos = ngx_cpymem(h2c->hpack.storage,
+                                    header->name.data + avail,
+                                    header->name.len - avail);
+        avail = NGX_HTTP_V2_TABLE_SIZE;
+    }
+
+    avail -= header->name.len;
+
+    entry->value.len = header->value.len;
+    entry->value.data = h2c->hpack.pos;
+
+    if (avail >= header->value.len) {
+        h2c->hpack.pos = ngx_cpymem(h2c->hpack.pos, header->value.data,
+                                    header->value.len);
+    } else {
+        ngx_memcpy(h2c->hpack.pos, header->value.data, avail);
+        h2c->hpack.pos = ngx_cpymem(h2c->hpack.storage,
+                                    header->value.data + avail,
+                                    header->value.len - avail);
+    }
+
+    if (h2c->hpack.allocated == h2c->hpack.added - h2c->hpack.deleted) {
+
+        entries = ngx_palloc(h2c->connection->pool,
+                             sizeof(ngx_http_v2_header_t *)
+                             * (h2c->hpack.allocated + 64));
+        if (entries == NULL) {
+            return NGX_ERROR;
+        }
+
+        index = h2c->hpack.deleted % h2c->hpack.allocated;
+
+        ngx_memcpy(entries, &h2c->hpack.entries[index],
+                   (h2c->hpack.allocated - index)
+                   * sizeof(ngx_http_v2_header_t *));
+
+        ngx_memcpy(&entries[h2c->hpack.allocated - index], h2c->hpack.entries,
+                   index * sizeof(ngx_http_v2_header_t *));
+
+        (void) ngx_pfree(h2c->connection->pool, h2c->hpack.entries);
+
+        h2c->hpack.entries = entries;
+
+        h2c->hpack.added = h2c->hpack.allocated;
+        h2c->hpack.deleted = 0;
+        h2c->hpack.reused = 0;
+        h2c->hpack.allocated += 64;
+    }
+
+    h2c->hpack.entries[h2c->hpack.added++ % h2c->hpack.allocated] = entry;
+
+    return NGX_OK;
+}
+
+
+static ngx_int_t
+ngx_http_v2_table_account(ngx_http_v2_connection_t *h2c, size_t size)
+{
+    ngx_http_v2_header_t  *entry;
+
+    size += 32;
+
+    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                   "http2 hpack table account: %uz free:%uz",
+                   size, h2c->hpack.free);
+
+    if (size <= h2c->hpack.free) {
+        h2c->hpack.free -= size;
+        return NGX_OK;
+    }
+
+    if (size > h2c->hpack.size) {
+        h2c->hpack.deleted = h2c->hpack.added;
+        h2c->hpack.free = h2c->hpack.size;
+        return NGX_DECLINED;
+    }
+
+    do {
+        entry = h2c->hpack.entries[h2c->hpack.deleted++ % h2c->hpack.allocated];
+        h2c->hpack.free += 32 + entry->name.len + entry->value.len;
+    } while (size > h2c->hpack.free);
+
+    h2c->hpack.free -= size;
+
+    return NGX_OK;
+}
+
+
+ngx_int_t
+ngx_http_v2_table_size(ngx_http_v2_connection_t *h2c, size_t size)
+{
+    ssize_t                needed;
+    ngx_http_v2_header_t  *entry;
+
+    if (size > NGX_HTTP_V2_TABLE_SIZE) {
+        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+                      "client sent invalid table size update: %uz", size);
+
+        return NGX_ERROR;
+    }
+
+    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                   "http2 new hpack table size: %uz was:%uz",
+                   size, h2c->hpack.size);
+
+    needed = h2c->hpack.size - size;
+
+    while (needed > (ssize_t) h2c->hpack.free) {
+        entry = h2c->hpack.entries[h2c->hpack.deleted++ % h2c->hpack.allocated];
+        h2c->hpack.free += 32 + entry->name.len + entry->value.len;
+    }
+
+    h2c->hpack.size = size;
+    h2c->hpack.free -= needed;
+
+    return NGX_OK;
+}

  Renamed: vendor/nginx-1.9.5/src/mail/ngx_mail.c (+40 -66) 82%
===================================================================
--- vendor/nginx-1.8.0/src/mail/ngx_mail.c    2015-09-27 18:09:01 +0900 (bf1b858)
+++ vendor/nginx-1.9.5/src/mail/ngx_mail.c    2015-09-27 22:10:53 +0900 (962ae8b)
@@ -36,13 +36,6 @@ static ngx_command_t  ngx_mail_commands[] = {
       0,
       NULL },
 
-    { ngx_string("imap"),
-      NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,
-      ngx_mail_block,
-      0,
-      0,
-      NULL },
-
       ngx_null_command
 };
 
@@ -83,10 +76,8 @@ ngx_mail_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
     ngx_mail_core_srv_conf_t   **cscfp;
     ngx_mail_core_main_conf_t   *cmcf;
 
-    if (cmd->name.data[0] == 'i') {
-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
-                           "the \"imap\" directive is deprecated, "
-                           "use the \"mail\" directive instead");
+    if (*(ngx_mail_conf_ctx_t **) conf) {
+        return "is duplicate";
     }
 
     /* the main mail context */
@@ -251,13 +242,13 @@ ngx_mail_add_ports(ngx_conf_t *cf, ngx_array_t *ports,
     struct sockaddr_in6   *sin6;
 #endif
 
-    sa = (struct sockaddr *) &listen->sockaddr;
+    sa = &listen->u.sockaddr;
 
     switch (sa->sa_family) {
 
 #if (NGX_HAVE_INET6)
     case AF_INET6:
-        sin6 = (struct sockaddr_in6 *) sa;
+        sin6 = &listen->u.sockaddr_in6;
         p = sin6->sin6_port;
         break;
 #endif
@@ -269,7 +260,7 @@ ngx_mail_add_ports(ngx_conf_t *cf, ngx_array_t *ports,
 #endif
 
     default: /* AF_INET */
-        sin = (struct sockaddr_in *) sa;
+        sin = &listen->u.sockaddr_in;
         p = sin->sin_port;
         break;
     }
@@ -309,23 +300,7 @@ found:
         return NGX_ERROR;
     }
 
-    addr->sockaddr = (struct sockaddr *) &listen->sockaddr;
-    addr->socklen = listen->socklen;
-    addr->ctx = listen->ctx;
-    addr->bind = listen->bind;
-    addr->wildcard = listen->wildcard;
-    addr->so_keepalive = listen->so_keepalive;
-#if (NGX_HAVE_KEEPALIVE_TUNABLE)
-    addr->tcp_keepidle = listen->tcp_keepidle;
-    addr->tcp_keepintvl = listen->tcp_keepintvl;
-    addr->tcp_keepcnt = listen->tcp_keepcnt;
-#endif
-#if (NGX_MAIL_SSL)
-    addr->ssl = listen->ssl;
-#endif
-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
-    addr->ipv6only = listen->ipv6only;
-#endif
+    addr->opt = *listen;
 
     return NGX_OK;
 }
@@ -334,11 +309,12 @@ found:
 static char *
 ngx_mail_optimize_servers(ngx_conf_t *cf, ngx_array_t *ports)
 {
-    ngx_uint_t             i, p, last, bind_wildcard;
-    ngx_listening_t       *ls;
-    ngx_mail_port_t       *mport;
-    ngx_mail_conf_port_t  *port;
-    ngx_mail_conf_addr_t  *addr;
+    ngx_uint_t                 i, p, last, bind_wildcard;
+    ngx_listening_t           *ls;
+    ngx_mail_port_t           *mport;
+    ngx_mail_conf_port_t      *port;
+    ngx_mail_conf_addr_t      *addr;
+    ngx_mail_core_srv_conf_t  *cscf;
 
     port = ports->elts;
     for (p = 0; p < ports->nelts; p++) {
@@ -354,8 +330,8 @@ ngx_mail_optimize_servers(ngx_conf_t *cf, ngx_array_t *ports)
          * to the "*:port" only and ignore the other bindings
          */
 
-        if (addr[last - 1].wildcard) {
-            addr[last - 1].bind = 1;
+        if (addr[last - 1].opt.wildcard) {
+            addr[last - 1].opt.bind = 1;
             bind_wildcard = 1;
 
         } else {
@@ -366,12 +342,13 @@ ngx_mail_optimize_servers(ngx_conf_t *cf, ngx_array_t *ports)
 
         while (i < last) {
 
-            if (bind_wildcard && !addr[i].bind) {
+            if (bind_wildcard && !addr[i].opt.bind) {
                 i++;
                 continue;
             }
 
-            ls = ngx_create_listening(cf, addr[i].sockaddr, addr[i].socklen);
+            ls = ngx_create_listening(cf, &addr[i].opt.u.sockaddr,
+                                      addr[i].opt.socklen);
             if (ls == NULL) {
                 return NGX_CONF_ERROR;
             }
@@ -380,20 +357,23 @@ ngx_mail_optimize_servers(ngx_conf_t *cf, ngx_array_t *ports)
             ls->handler = ngx_mail_init_connection;
             ls->pool_size = 256;
 
-            /* TODO: error_log directive */
-            ls->logp = &cf->cycle->new_log;
+            cscf = addr->opt.ctx->srv_conf[ngx_mail_core_module.ctx_index];
+
+            ls->logp = cscf->error_log;
             ls->log.data = &ls->addr_text;
             ls->log.handler = ngx_accept_log_error;
 
-            ls->keepalive = addr[i].so_keepalive;
+            ls->backlog = addr[i].opt.backlog;
+
+            ls->keepalive = addr[i].opt.so_keepalive;
 #if (NGX_HAVE_KEEPALIVE_TUNABLE)
-            ls->keepidle = addr[i].tcp_keepidle;
-            ls->keepintvl = addr[i].tcp_keepintvl;
-            ls->keepcnt = addr[i].tcp_keepcnt;
+            ls->keepidle = addr[i].opt.tcp_keepidle;
+            ls->keepintvl = addr[i].opt.tcp_keepintvl;
+            ls->keepcnt = addr[i].opt.tcp_keepcnt;
 #endif
 
 #if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
-            ls->ipv6only = addr[i].ipv6only;
+            ls->ipv6only = addr[i].opt.ipv6only;
 #endif
 
             mport = ngx_palloc(cf->pool, sizeof(ngx_mail_port_t));
@@ -403,13 +383,7 @@ ngx_mail_optimize_servers(ngx_conf_t *cf, ngx_array_t *ports)
 
             ls->servers = mport;
 
-            if (i == last - 1) {
-                mport->naddrs = last;
-
-            } else {
-                mport->naddrs = 1;
-                i = 0;
-            }
+            mport->naddrs = i + 1;
 
             switch (ls->sockaddr->sa_family) {
 #if (NGX_HAVE_INET6)
@@ -456,15 +430,15 @@ ngx_mail_add_addrs(ngx_conf_t *cf, ngx_mail_port_t *mport,
 
     for (i = 0; i < mport->naddrs; i++) {
 
-        sin = (struct sockaddr_in *) addr[i].sockaddr;
+        sin = &addr[i].opt.u.sockaddr_in;
         addrs[i].addr = sin->sin_addr.s_addr;
 
-        addrs[i].conf.ctx = addr[i].ctx;
+        addrs[i].conf.ctx = addr[i].opt.ctx;
 #if (NGX_MAIL_SSL)
-        addrs[i].conf.ssl = addr[i].ssl;
+        addrs[i].conf.ssl = addr[i].opt.ssl;
 #endif
 
-        len = ngx_sock_ntop(addr[i].sockaddr, addr[i].socklen, buf,
+        len = ngx_sock_ntop(&addr[i].opt.u.sockaddr, addr[i].opt.socklen, buf,
                             NGX_SOCKADDR_STRLEN, 1);
 
         p = ngx_pnalloc(cf->pool, len);
@@ -505,15 +479,15 @@ ngx_mail_add_addrs6(ngx_conf_t *cf, ngx_mail_port_t *mport,
 
     for (i = 0; i < mport->naddrs; i++) {
 
-        sin6 = (struct sockaddr_in6 *) addr[i].sockaddr;
+        sin6 = &addr[i].opt.u.sockaddr_in6;
         addrs6[i].addr6 = sin6->sin6_addr;
 
-        addrs6[i].conf.ctx = addr[i].ctx;
+        addrs6[i].conf.ctx = addr[i].opt.ctx;
 #if (NGX_MAIL_SSL)
-        addrs6[i].conf.ssl = addr[i].ssl;
+        addrs6[i].conf.ssl = addr[i].opt.ssl;
 #endif
 
-        len = ngx_sock_ntop(addr[i].sockaddr, addr[i].socklen, buf,
+        len = ngx_sock_ntop(&addr[i].opt.u.sockaddr, addr[i].opt.socklen, buf,
                             NGX_SOCKADDR_STRLEN, 1);
 
         p = ngx_pnalloc(cf->pool, len);
@@ -541,22 +515,22 @@ ngx_mail_cmp_conf_addrs(const void *one, const void *two)
     first = (ngx_mail_conf_addr_t *) one;
     second = (ngx_mail_conf_addr_t *) two;
 
-    if (first->wildcard) {
+    if (first->opt.wildcard) {
         /* a wildcard must be the last resort, shift it to the end */
         return 1;
     }
 
-    if (second->wildcard) {
+    if (second->opt.wildcard) {
         /* a wildcard must be the last resort, shift it to the end */
         return -1;
     }
 
-    if (first->bind && !second->bind) {
+    if (first->opt.bind && !second->opt.bind) {
         /* shift explicit bind()ed addresses to the start */
         return -1;
     }
 
-    if (!first->bind && second->bind) {
+    if (!first->opt.bind && second->opt.bind) {
         /* shift explicit bind()ed addresses to the start */
         return 1;
     }

  Renamed: vendor/nginx-1.9.5/src/mail/ngx_mail.h (+15 -22) 94%
===================================================================
--- vendor/nginx-1.8.0/src/mail/ngx_mail.h    2015-09-27 18:09:01 +0900 (0226139)
+++ vendor/nginx-1.9.5/src/mail/ngx_mail.h    2015-09-27 22:10:53 +0900 (07d0cb6)
@@ -27,7 +27,18 @@ typedef struct {
 
 
 typedef struct {
-    u_char                  sockaddr[NGX_SOCKADDRLEN];
+    union {
+        struct sockaddr     sockaddr;
+        struct sockaddr_in  sockaddr_in;
+#if (NGX_HAVE_INET6)
+        struct sockaddr_in6 sockaddr_in6;
+#endif
+#if (NGX_HAVE_UNIX_DOMAIN)
+        struct sockaddr_un  sockaddr_un;
+#endif
+        u_char              sockaddr_data[NGX_SOCKADDRLEN];
+    } u;
+
     socklen_t               socklen;
 
     /* server ctx */
@@ -47,6 +58,7 @@ typedef struct {
     int                     tcp_keepintvl;
     int                     tcp_keepcnt;
 #endif
+    int                     backlog;
 } ngx_mail_listen_t;
 
 
@@ -89,25 +101,7 @@ typedef struct {
 
 
 typedef struct {
-    struct sockaddr        *sockaddr;
-    socklen_t               socklen;
-
-    ngx_mail_conf_ctx_t    *ctx;
-
-    unsigned                bind:1;
-    unsigned                wildcard:1;
-#if (NGX_MAIL_SSL)
-    unsigned                ssl:1;
-#endif
-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
-    unsigned                ipv6only:1;
-#endif
-    unsigned                so_keepalive:2;
-#if (NGX_HAVE_KEEPALIVE_TUNABLE)
-    int                     tcp_keepidle;
-    int                     tcp_keepintvl;
-    int                     tcp_keepcnt;
-#endif
+    ngx_mail_listen_t       opt;
 } ngx_mail_conf_addr_t;
 
 
@@ -131,14 +125,13 @@ typedef struct {
     ngx_msec_t              timeout;
     ngx_msec_t              resolver_timeout;
 
-    ngx_flag_t              so_keepalive;
-
     ngx_str_t               server_name;
 
     u_char                 *file_name;
     ngx_int_t               line;
 
     ngx_resolver_t         *resolver;
+    ngx_log_t              *error_log;
 
     /* server ctx */
     ngx_mail_conf_ctx_t    *ctx;

  Renamed: vendor/nginx-1.9.5/src/mail/ngx_mail_auth_http_module.c (+0 -0) 100%
===================================================================

  Copied: vendor/nginx-1.9.5/src/mail/ngx_mail_core_module.c (+50 -24) 91%
===================================================================
--- vendor/nginx-1.8.0/src/mail/ngx_mail_core_module.c    2015-09-27 18:09:01 +0900 (05a47f5)
+++ vendor/nginx-1.9.5/src/mail/ngx_mail_core_module.c    2015-09-27 22:10:53 +0900 (c219296)
@@ -21,16 +21,12 @@ static char *ngx_mail_core_listen(ngx_conf_t *cf, ngx_command_t *cmd,
     void *conf);
 static char *ngx_mail_core_protocol(ngx_conf_t *cf, ngx_command_t *cmd,
     void *conf);
+static char *ngx_mail_core_error_log(ngx_conf_t *cf, ngx_command_t *cmd,
+    void *conf);
 static char *ngx_mail_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd,
     void *conf);
 
 
-static ngx_conf_deprecated_t  ngx_conf_deprecated_so_keepalive = {
-    ngx_conf_deprecated, "so_keepalive",
-    "so_keepalive\" parameter of the \"listen"
-};
-
-
 static ngx_command_t  ngx_mail_core_commands[] = {
 
     { ngx_string("server"),
@@ -54,13 +50,6 @@ static ngx_command_t  ngx_mail_core_commands[] = {
       0,
       NULL },
 
-    { ngx_string("so_keepalive"),
-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG,
-      ngx_conf_set_flag_slot,
-      NGX_MAIL_SRV_CONF_OFFSET,
-      offsetof(ngx_mail_core_srv_conf_t, so_keepalive),
-      &ngx_conf_deprecated_so_keepalive },
-
     { ngx_string("timeout"),
       NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,
       ngx_conf_set_msec_slot,
@@ -75,6 +64,13 @@ static ngx_command_t  ngx_mail_core_commands[] = {
       offsetof(ngx_mail_core_srv_conf_t, server_name),
       NULL },
 
+    { ngx_string("error_log"),
+      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,
+      ngx_mail_core_error_log,
+      NGX_MAIL_SRV_CONF_OFFSET,
+      0,
+      NULL },
+
     { ngx_string("resolver"),
       NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,
       ngx_mail_core_resolver,
@@ -161,11 +157,11 @@ ngx_mail_core_create_srv_conf(ngx_conf_t *cf)
      * set by ngx_pcalloc():
      *
      *     cscf->protocol = NULL;
+     *     cscf->error_log = NULL;
      */
 
     cscf->timeout = NGX_CONF_UNSET_MSEC;
     cscf->resolver_timeout = NGX_CONF_UNSET_MSEC;
-    cscf->so_keepalive = NGX_CONF_UNSET;
 
     cscf->resolver = NGX_CONF_UNSET_PTR;
 
@@ -186,8 +182,6 @@ ngx_mail_core_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)
     ngx_conf_merge_msec_value(conf->resolver_timeout, prev->resolver_timeout,
                               30000);
 
-    ngx_conf_merge_value(conf->so_keepalive, prev->so_keepalive, 0);
-
 
     ngx_conf_merge_str_value(conf->server_name, prev->server_name, "");
 
@@ -202,6 +196,14 @@ ngx_mail_core_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)
         return NGX_CONF_ERROR;
     }
 
+    if (conf->error_log == NULL) {
+        if (prev->error_log) {
+            conf->error_log = prev->error_log;
+        } else {
+            conf->error_log = &cf->cycle->new_log;
+        }
+    }
+
     ngx_conf_merge_ptr_value(conf->resolver, prev->resolver, NULL);
 
     return NGX_CONF_OK;
@@ -323,7 +325,7 @@ ngx_mail_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
 
     for (i = 0; i < cmcf->listen.nelts; i++) {
 
-        sa = (struct sockaddr *) ls[i].sockaddr;
+        sa = &ls[i].u.sockaddr;
 
         if (sa->sa_family != u.family) {
             continue;
@@ -335,7 +337,7 @@ ngx_mail_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
         case AF_INET6:
             off = offsetof(struct sockaddr_in6, sin6_addr);
             len = 16;
-            sin6 = (struct sockaddr_in6 *) sa;
+            sin6 = &ls[i].u.sockaddr_in6;
             port = ntohs(sin6->sin6_port);
             break;
 #endif
@@ -351,12 +353,14 @@ ngx_mail_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
         default: /* AF_INET */
             off = offsetof(struct sockaddr_in, sin_addr);
             len = 4;
-            sin = (struct sockaddr_in *) sa;
+            sin = &ls[i].u.sockaddr_in;
             port = ntohs(sin->sin_port);
             break;
         }
 
-        if (ngx_memcmp(ls[i].sockaddr + off, u.sockaddr + off, len) != 0) {
+        if (ngx_memcmp(ls[i].u.sockaddr_data + off, u.sockaddr + off, len)
+            != 0)
+        {
             continue;
         }
 
@@ -376,9 +380,10 @@ ngx_mail_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
 
     ngx_memzero(ls, sizeof(ngx_mail_listen_t));
 
-    ngx_memcpy(ls->sockaddr, u.sockaddr, u.socklen);
+    ngx_memcpy(&ls->u.sockaddr, u.sockaddr, u.socklen);
 
     ls->socklen = u.socklen;
+    ls->backlog = NGX_LISTEN_BACKLOG;
     ls->wildcard = u.wildcard;
     ls->ctx = cf->ctx;
 
@@ -414,12 +419,24 @@ ngx_mail_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
             continue;
         }
 
+        if (ngx_strncmp(value[i].data, "backlog=", 8) == 0) {
+            ls->backlog = ngx_atoi(value[i].data + 8, value[i].len - 8);
+            ls->bind = 1;
+
+            if (ls->backlog == NGX_ERROR || ls->backlog == 0) {
+                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
+                                   "invalid backlog \"%V\"", &value[i]);
+                return NGX_CONF_ERROR;
+            }
+
+            continue;
+        }
+
         if (ngx_strncmp(value[i].data, "ipv6only=o", 10) == 0) {
 #if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
-            struct sockaddr  *sa;
-            u_char            buf[NGX_SOCKADDR_STRLEN];
+            u_char  buf[NGX_SOCKADDR_STRLEN];
 
-            sa = (struct sockaddr *) ls->sockaddr;
+            sa = &ls->u.sockaddr;
 
             if (sa->sa_family == AF_INET6) {
 
@@ -601,6 +618,15 @@ ngx_mail_core_protocol(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
 
 
 static char *
+ngx_mail_core_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
+{
+    ngx_mail_core_srv_conf_t  *cscf = conf;
+
+    return ngx_log_set_log(cf, &cscf->error_log);
+}
+
+
+static char *
 ngx_mail_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
 {
     ngx_mail_core_srv_conf_t  *cscf = conf;

  Renamed: vendor/nginx-1.9.5/src/mail/ngx_mail_handler.c (+17 -12) 96%
===================================================================
--- vendor/nginx-1.8.0/src/mail/ngx_mail_handler.c    2015-09-27 18:09:01 +0900 (870b5ee)
+++ vendor/nginx-1.9.5/src/mail/ngx_mail_handler.c    2015-09-27 22:10:53 +0900 (901bb8f)
@@ -24,19 +24,20 @@ static ngx_int_t ngx_mail_verify_cert(ngx_mail_session_t *s,
 void
 ngx_mail_init_connection(ngx_connection_t *c)
 {
-    size_t                 len;
-    ngx_uint_t             i;
-    ngx_mail_port_t       *port;
-    struct sockaddr       *sa;
-    struct sockaddr_in    *sin;
-    ngx_mail_log_ctx_t    *ctx;
-    ngx_mail_in_addr_t    *addr;
-    ngx_mail_session_t    *s;
-    ngx_mail_addr_conf_t  *addr_conf;
-    u_char                 text[NGX_SOCKADDR_STRLEN];
+    size_t                     len;
+    ngx_uint_t                 i;
+    ngx_mail_port_t           *port;
+    struct sockaddr           *sa;
+    struct sockaddr_in        *sin;
+    ngx_mail_log_ctx_t        *ctx;
+    ngx_mail_in_addr_t        *addr;
+    ngx_mail_session_t        *s;
+    ngx_mail_addr_conf_t      *addr_conf;
+    ngx_mail_core_srv_conf_t  *cscf;
+    u_char                     text[NGX_SOCKADDR_STRLEN];
 #if (NGX_HAVE_INET6)
-    struct sockaddr_in6   *sin6;
-    ngx_mail_in6_addr_t   *addr6;
+    struct sockaddr_in6       *sin6;
+    ngx_mail_in6_addr_t       *addr6;
 #endif
 
 
@@ -133,6 +134,10 @@ ngx_mail_init_connection(ngx_connection_t *c)
     c->data = s;
     s->connection = c;
 
+    cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);
+
+    ngx_set_connection_log(c, cscf->error_log);
+
     len = ngx_sock_ntop(c->sockaddr, c->socklen, text, NGX_SOCKADDR_STRLEN, 1);
 
     ngx_log_error(NGX_LOG_INFO, c->log, 0, "*%uA client %*s connected to %V",

  Renamed: vendor/nginx-1.9.5/src/mail/ngx_mail_imap_handler.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/mail/ngx_mail_imap_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/mail/ngx_mail_imap_module.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/mail/ngx_mail_parse.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/mail/ngx_mail_pop3_handler.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/mail/ngx_mail_pop3_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/mail/ngx_mail_pop3_module.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/mail/ngx_mail_proxy_module.c (+0 -13) 98%
===================================================================
--- vendor/nginx-1.8.0/src/mail/ngx_mail_proxy_module.c    2015-09-27 18:09:01 +0900 (41cbcf6)
+++ vendor/nginx-1.9.5/src/mail/ngx_mail_proxy_module.c    2015-09-27 22:10:53 +0900 (3802c3e)
@@ -111,7 +111,6 @@ static u_char  smtp_auth_ok[] = "235 2.0.0 OK" CRLF;
 void
 ngx_mail_proxy_init(ngx_mail_session_t *s, ngx_addr_t *peer)
 {
-    int                        keepalive;
     ngx_int_t                  rc;
     ngx_mail_proxy_ctx_t      *p;
     ngx_mail_proxy_conf_t     *pcf;
@@ -121,18 +120,6 @@ ngx_mail_proxy_init(ngx_mail_session_t *s, ngx_addr_t *peer)
 
     cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);
 
-    if (cscf->so_keepalive) {
-        keepalive = 1;
-
-        if (setsockopt(s->connection->fd, SOL_SOCKET, SO_KEEPALIVE,
-                       (const void *) &keepalive, sizeof(int))
-                == -1)
-        {
-            ngx_log_error(NGX_LOG_ALERT, s->connection->log, ngx_socket_errno,
-                          "setsockopt(SO_KEEPALIVE) failed");
-        }
-    }
-
     p = ngx_pcalloc(s->connection->pool, sizeof(ngx_mail_proxy_ctx_t));
     if (p == NULL) {
         ngx_mail_session_internal_server_error(s);

  Renamed: vendor/nginx-1.9.5/src/mail/ngx_mail_smtp_handler.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/mail/ngx_mail_smtp_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/mail/ngx_mail_smtp_module.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/mail/ngx_mail_ssl_module.c (+1 -1) 99%
===================================================================
--- vendor/nginx-1.8.0/src/mail/ngx_mail_ssl_module.c    2015-09-27 18:09:01 +0900 (e1efb61)
+++ vendor/nginx-1.9.5/src/mail/ngx_mail_ssl_module.c    2015-09-27 22:10:53 +0900 (1075410)
@@ -284,7 +284,7 @@ ngx_mail_ssl_merge_conf(ngx_conf_t *cf, void *parent, void *child)
                          prev->prefer_server_ciphers, 0);
 
     ngx_conf_merge_bitmask_value(conf->protocols, prev->protocols,
-                         (NGX_CONF_BITMASK_SET|NGX_SSL_SSLv3|NGX_SSL_TLSv1
+                         (NGX_CONF_BITMASK_SET|NGX_SSL_TLSv1
                           |NGX_SSL_TLSv1_1|NGX_SSL_TLSv1_2));
 
     ngx_conf_merge_uint_value(conf->verify, prev->verify, 0);

  Copied: vendor/nginx-1.9.5/src/mail/ngx_mail_ssl_module.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/misc/ngx_cpp_test_module.cpp (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/misc/ngx_google_perftools_module.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/mysql/config (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/mysql/ngx_http_mysql_test.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/mysql/ngx_mysql.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/mysql/ngx_mysql.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_alloc.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_alloc.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_atomic.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_channel.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_channel.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_daemon.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_darwin.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_darwin_config.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_darwin_init.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_darwin_sendfile_chain.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_errno.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_errno.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_file_aio_read.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_files.c (+12 -1) 97%
===================================================================
--- vendor/nginx-1.8.0/src/os/unix/ngx_files.c    2015-09-27 18:09:01 +0900 (2a3ed2f)
+++ vendor/nginx-1.9.5/src/os/unix/ngx_files.c    2015-09-27 22:10:53 +0900 (417b598)
@@ -264,6 +264,7 @@ ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, off_t offset,
     u_char        *prev;
     size_t         size;
     ssize_t        total, n;
+    ngx_err_t      err;
     ngx_array_t    vec;
     struct iovec  *iov, iovs[NGX_IOVS];
 
@@ -335,10 +336,20 @@ ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, off_t offset,
             file->sys_offset = offset;
         }
 
+eintr:
+
         n = writev(file->fd, vec.elts, vec.nelts);
 
         if (n == -1) {
-            ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno,
+            err = ngx_errno;
+
+            if (err == NGX_EINTR) {
+                ngx_log_debug0(NGX_LOG_DEBUG_CORE, file->log, err,
+                               "writev() was interrupted");
+                goto eintr;
+            }
+
+            ngx_log_error(NGX_LOG_CRIT, file->log, err,
                           "writev() \"%s\" failed", file->name.data);
             return NGX_ERROR;
         }

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_files.h (+1 -0) 99%
===================================================================
--- vendor/nginx-1.8.0/src/os/unix/ngx_files.h    2015-09-27 18:09:01 +0900 (b6990bc)
+++ vendor/nginx-1.9.5/src/os/unix/ngx_files.h    2015-09-27 22:10:53 +0900 (6081b00)
@@ -368,6 +368,7 @@ size_t ngx_fs_bsize(u_char *name);
 #endif
 
 
+#define ngx_stdout               STDOUT_FILENO
 #define ngx_stderr               STDERR_FILENO
 #define ngx_set_stderr(fd)       dup2(fd, STDERR_FILENO)
 #define ngx_set_stderr_n         "dup2(STDERR_FILENO)"

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_freebsd.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_freebsd_config.h (+1 -1) 98%
===================================================================
--- vendor/nginx-1.8.0/src/os/unix/ngx_freebsd_config.h    2015-09-27 18:09:01 +0900 (8f06051)
+++ vendor/nginx-1.9.5/src/os/unix/ngx_freebsd_config.h    2015-09-27 22:10:53 +0900 (9a25788)
@@ -86,7 +86,7 @@
 #endif
 
 
-#if (NGX_HAVE_FILE_AIO || NGX_HAVE_AIO)
+#if (NGX_HAVE_FILE_AIO)
 #include <aio.h>
 typedef struct aiocb  ngx_aiocb_t;
 #endif

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_freebsd_init.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_freebsd_sendfile_chain.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_gcc_atomic_amd64.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_gcc_atomic_ppc.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_gcc_atomic_sparc64.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_gcc_atomic_x86.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_linux.h (+0 -2) 88%
===================================================================
--- vendor/nginx-1.8.0/src/os/unix/ngx_linux.h    2015-09-27 18:09:01 +0900 (1b8bdac)
+++ vendor/nginx-1.9.5/src/os/unix/ngx_linux.h    2015-09-27 22:10:53 +0900 (13d654e)
@@ -12,7 +12,5 @@
 ngx_chain_t *ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in,
     off_t limit);
 
-extern int ngx_linux_rtsig_max;
-
 
 #endif /* _NGX_LINUX_H_INCLUDED_ */

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_linux_aio_read.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_linux_config.h (+0 -6) 96%
===================================================================
--- vendor/nginx-1.8.0/src/os/unix/ngx_linux_config.h    2015-09-27 18:09:01 +0900 (0c0b168)
+++ vendor/nginx-1.9.5/src/os/unix/ngx_linux_config.h    2015-09-27 22:10:53 +0900 (162a992)
@@ -82,12 +82,6 @@ extern ssize_t sendfile(int s, int fd, int32_t *offset, size_t size);
 #endif
 
 
-#if (NGX_HAVE_RTSIG)
-#include <poll.h>
-#include <sys/sysctl.h>
-#endif
-
-
 #if (NGX_HAVE_EPOLL)
 #include <sys/epoll.h>
 #endif

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_linux_init.c (+0 -33) 60%
===================================================================
--- vendor/nginx-1.8.0/src/os/unix/ngx_linux_init.c    2015-09-27 18:09:01 +0900 (b910380)
+++ vendor/nginx-1.9.5/src/os/unix/ngx_linux_init.c    2015-09-27 22:10:53 +0900 (b306cda)
@@ -12,8 +12,6 @@
 u_char  ngx_linux_kern_ostype[50];
 u_char  ngx_linux_kern_osrelease[50];
 
-int     ngx_linux_rtsig_max;
-
 
 static ngx_os_io_t ngx_linux_io = {
     ngx_unix_recv,
@@ -46,32 +44,6 @@ ngx_os_specific_init(ngx_log_t *log)
     (void) ngx_cpystrn(ngx_linux_kern_osrelease, (u_char *) u.release,
                        sizeof(ngx_linux_kern_osrelease));
 
-#if (NGX_HAVE_RTSIG)
-    {
-    int        name[2];
-    size_t     len;
-    ngx_err_t  err;
-
-    name[0] = CTL_KERN;
-    name[1] = KERN_RTSIGMAX;
-    len = sizeof(ngx_linux_rtsig_max);
-
-    if (sysctl(name, 2, &ngx_linux_rtsig_max, &len, NULL, 0) == -1) {
-        err = ngx_errno;
-
-        if (err != NGX_ENOTDIR && err != NGX_ENOSYS) {
-            ngx_log_error(NGX_LOG_ALERT, log, err,
-                          "sysctl(KERN_RTSIGMAX) failed");
-
-            return NGX_ERROR;
-        }
-
-        ngx_linux_rtsig_max = 0;
-    }
-
-    }
-#endif
-
     ngx_os_io = ngx_linux_io;
 
     return NGX_OK;
@@ -83,9 +55,4 @@ ngx_os_specific_status(ngx_log_t *log)
 {
     ngx_log_error(NGX_LOG_NOTICE, log, 0, "OS: %s %s",
                   ngx_linux_kern_ostype, ngx_linux_kern_osrelease);
-
-#if (NGX_HAVE_RTSIG)
-    ngx_log_error(NGX_LOG_NOTICE, log, 0, "sysctl(KERN_RTSIGMAX): %d",
-                  ngx_linux_rtsig_max);
-#endif
 }

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_linux_sendfile_chain.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_os.h (+0 -8) 87%
===================================================================
--- vendor/nginx-1.8.0/src/os/unix/ngx_os.h    2015-09-27 18:09:01 +0900 (09f7917)
+++ vendor/nginx-1.9.5/src/os/unix/ngx_os.h    2015-09-27 22:10:53 +0900 (d8bcb01)
@@ -48,14 +48,6 @@ ssize_t ngx_unix_send(ngx_connection_t *c, u_char *buf, size_t size);
 ngx_chain_t *ngx_writev_chain(ngx_connection_t *c, ngx_chain_t *in,
     off_t limit);
 
-#if (NGX_HAVE_AIO)
-ssize_t ngx_aio_read(ngx_connection_t *c, u_char *buf, size_t size);
-ssize_t ngx_aio_read_chain(ngx_connection_t *c, ngx_chain_t *cl, off_t limit);
-ssize_t ngx_aio_write(ngx_connection_t *c, u_char *buf, size_t size);
-ngx_chain_t *ngx_aio_write_chain(ngx_connection_t *c, ngx_chain_t *in,
-    off_t limit);
-#endif
-
 
 #if (IOV_MAX > 64)
 #define NGX_IOVS_PREALLOCATE  64

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_posix_config.h (+8 -0) 95%
===================================================================
--- vendor/nginx-1.8.0/src/os/unix/ngx_posix_config.h    2015-09-27 18:09:01 +0900 (d725659)
+++ vendor/nginx-1.9.5/src/os/unix/ngx_posix_config.h    2015-09-27 22:10:53 +0900 (443c4b0)
@@ -21,6 +21,14 @@
 #endif
 
 
+#if (NGX_GNU_HURD)
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE             /* accept4() */
+#endif
+#define _FILE_OFFSET_BITS       64
+#endif
+
+
 #ifdef __CYGWIN__
 #define timezonevar             /* timezone is variable */
 #define NGX_BROKEN_SCM_RIGHTS   1

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_posix_init.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_process.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_process.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_process_cycle.c (+4 -30) 97%
===================================================================
--- vendor/nginx-1.8.0/src/os/unix/ngx_process_cycle.c    2015-09-27 18:09:01 +0900 (1d5e700)
+++ vendor/nginx-1.9.5/src/os/unix/ngx_process_cycle.c    2015-09-27 22:10:53 +0900 (5da0911)
@@ -29,6 +29,7 @@ static void ngx_cache_loader_process_handler(ngx_event_t *ev);
 
 
 ngx_uint_t    ngx_process;
+ngx_uint_t    ngx_worker;
 ngx_pid_t     ngx_pid;
 
 sig_atomic_t  ngx_reap;
@@ -727,10 +728,8 @@ ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)
 {
     ngx_int_t worker = (intptr_t) data;
 
-    ngx_uint_t         i;
-    ngx_connection_t  *c;
-
     ngx_process = NGX_PROCESS_WORKER;
+    ngx_worker = worker;
 
     ngx_worker_process_init(cycle, worker);
 
@@ -739,19 +738,6 @@ ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)
     for ( ;; ) {
 
         if (ngx_exiting) {
-
-            c = cycle->connections;
-
-            for (i = 0; i < cycle->connection_n; i++) {
-
-                /* THREAD: lock */
-
-                if (c[i].fd != -1 && c[i].idle) {
-                    c[i].close = 1;
-                    c[i].read->handler(c[i].read);
-                }
-            }
-
             ngx_event_cancel_timers();
 
             if (ngx_event_timer_rbtree.root == ngx_event_timer_rbtree.sentinel)
@@ -779,8 +765,9 @@ ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)
             ngx_setproctitle("worker process is shutting down");
 
             if (!ngx_exiting) {
-                ngx_close_listening_sockets(cycle);
                 ngx_exiting = 1;
+                ngx_close_listening_sockets(cycle);
+                ngx_close_idle_connections(cycle);
             }
         }
 
@@ -840,19 +827,6 @@ ngx_worker_process_init(ngx_cycle_t *cycle, ngx_int_t worker)
         }
     }
 
-#ifdef RLIMIT_SIGPENDING
-    if (ccf->rlimit_sigpending != NGX_CONF_UNSET) {
-        rlmt.rlim_cur = (rlim_t) ccf->rlimit_sigpending;
-        rlmt.rlim_max = (rlim_t) ccf->rlimit_sigpending;
-
-        if (setrlimit(RLIMIT_SIGPENDING, &rlmt) == -1) {
-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
-                          "setrlimit(RLIMIT_SIGPENDING, %i) failed",
-                          ccf->rlimit_sigpending);
-        }
-    }
-#endif
-
     if (geteuid() == 0) {
         if (setgid(ccf->group) == -1) {
             ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_process_cycle.h (+1 -0) 97%
===================================================================
--- vendor/nginx-1.8.0/src/os/unix/ngx_process_cycle.h    2015-09-27 18:09:01 +0900 (d44c377)
+++ vendor/nginx-1.9.5/src/os/unix/ngx_process_cycle.h    2015-09-27 22:10:53 +0900 (69495d5)
@@ -39,6 +39,7 @@ void ngx_single_process_cycle(ngx_cycle_t *cycle);
 
 
 extern ngx_uint_t      ngx_process;
+extern ngx_uint_t      ngx_worker;
 extern ngx_pid_t       ngx_pid;
 extern ngx_pid_t       ngx_new_binary;
 extern ngx_uint_t      ngx_inherited;

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_readv_chain.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_recv.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_send.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_setaffinity.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_setaffinity.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_setproctitle.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_setproctitle.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_shmem.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_shmem.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_socket.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_socket.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_solaris.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_solaris_config.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_solaris_init.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_solaris_sendfilev_chain.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_sunpro_amd64.il (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_sunpro_atomic_sparc64.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_sunpro_sparc64.il (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_sunpro_x86.il (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_thread.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_thread_cond.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_thread_id.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_thread_mutex.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_time.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_time.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_udp_recv.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_user.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_user.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/unix/ngx_writev_chain.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/win32/nginx.ico (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/win32/nginx.rc (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/win32/nginx_icon16.xpm (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/win32/nginx_icon32.xpm (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/win32/nginx_icon48.xpm (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/win32/ngx_alloc.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/win32/ngx_alloc.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/win32/ngx_atomic.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/win32/ngx_errno.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/win32/ngx_errno.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/win32/ngx_event_log.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/win32/ngx_files.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/win32/ngx_files.h (+1 -0) 99%
===================================================================
--- vendor/nginx-1.8.0/src/os/win32/ngx_files.h    2015-09-27 18:09:01 +0900 (aafb5d0)
+++ vendor/nginx-1.9.5/src/os/win32/ngx_files.h    2015-09-27 22:10:53 +0900 (895daea)
@@ -264,6 +264,7 @@ ngx_int_t ngx_directio_off(ngx_fd_t fd);
 size_t ngx_fs_bsize(u_char *name);
 
 
+#define ngx_stdout               GetStdHandle(STD_OUTPUT_HANDLE)
 #define ngx_stderr               GetStdHandle(STD_ERROR_HANDLE)
 #define ngx_set_stderr(fd)       SetStdHandle(STD_ERROR_HANDLE, fd)
 #define ngx_set_stderr_n         "SetStdHandle(STD_ERROR_HANDLE)"

  Renamed: vendor/nginx-1.9.5/src/os/win32/ngx_os.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/win32/ngx_process.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/win32/ngx_process.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/win32/ngx_process_cycle.c (+5 -49) 96%
===================================================================
--- vendor/nginx-1.8.0/src/os/win32/ngx_process_cycle.c    2015-09-27 18:09:01 +0900 (7bfb281)
+++ vendor/nginx-1.9.5/src/os/win32/ngx_process_cycle.c    2015-09-27 22:10:53 +0900 (06ff8b5)
@@ -11,7 +11,6 @@
 #include <nginx.h>
 
 
-static void ngx_process_init(ngx_cycle_t *cycle);
 static void ngx_console_init(ngx_cycle_t *cycle);
 static int __stdcall ngx_console_handler(u_long type);
 static ngx_int_t ngx_create_signal_events(ngx_cycle_t *cycle);
@@ -30,8 +29,8 @@ static ngx_thread_value_t __stdcall ngx_cache_loader_thread(void *data);
 
 
 ngx_uint_t     ngx_process;
+ngx_uint_t     ngx_worker;
 ngx_pid_t      ngx_pid;
-ngx_uint_t     ngx_threaded;
 
 ngx_uint_t     ngx_inherited;
 ngx_pid_t      ngx_new_binary;
@@ -70,8 +69,6 @@ ngx_master_process_cycle(ngx_cycle_t *cycle)
     ngx_uint_t  live;
     HANDLE      events[MAXIMUM_WAIT_OBJECTS];
 
-    ngx_process_init(cycle);
-
     ngx_sprintf((u_char *) ngx_master_process_event_name,
                 "ngx_master_%s%Z", ngx_unique);
 
@@ -252,31 +249,6 @@ ngx_master_process_cycle(ngx_cycle_t *cycle)
 
 
 static void
-ngx_process_init(ngx_cycle_t *cycle)
-{
-    ngx_err_t         err;
-    ngx_core_conf_t  *ccf;
-
-    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
-
-    if (ngx_init_threads(ngx_threads_n, ccf->thread_stack_size, cycle)
-        != NGX_OK)
-    {
-        /* fatal */
-        exit(2);
-    }
-
-    err = ngx_thread_key_create(&ngx_core_tls_key);
-    if (err != 0) {
-        ngx_log_error(NGX_LOG_ALERT, cycle->log, err,
-                      ngx_thread_key_create_n " failed");
-        /* fatal */
-        exit(2);
-    }
-}
-
-
-static void
 ngx_console_init(ngx_cycle_t *cycle)
 {
     ngx_core_conf_t  *ccf;
@@ -789,10 +761,8 @@ failed:
 static ngx_thread_value_t __stdcall
 ngx_worker_thread(void *data)
 {
-    ngx_int_t          n;
-    ngx_uint_t         i;
-    ngx_cycle_t       *cycle;
-    ngx_connection_t  *c;
+    ngx_int_t     n;
+    ngx_cycle_t  *cycle;
 
     cycle = (ngx_cycle_t *) ngx_cycle;
 
@@ -808,19 +778,6 @@ ngx_worker_thread(void *data)
     while (!ngx_quit) {
 
         if (ngx_exiting) {
-
-            c = cycle->connections;
-
-            for (i = 0; i < cycle->connection_n; i++) {
-
-                /* THREAD: lock */
-
-                if (c[i].fd != (ngx_socket_t) -1 && c[i].idle) {
-                    c[i].close = 1;
-                    c[i].read->handler(c[i].read);
-                }
-            }
-
             ngx_event_cancel_timers();
 
             if (ngx_event_timer_rbtree.root
@@ -842,8 +799,9 @@ ngx_worker_thread(void *data)
             ngx_quit = 0;
 
             if (!ngx_exiting) {
-                ngx_close_listening_sockets(cycle);
                 ngx_exiting = 1;
+                ngx_close_listening_sockets(cycle);
+                ngx_close_idle_connections(cycle);
             }
         }
 
@@ -1026,8 +984,6 @@ ngx_single_process_cycle(ngx_cycle_t *cycle)
 {
     ngx_tid_t  tid;
 
-    ngx_process_init(cycle);
-
     ngx_console_init(cycle);
 
     if (ngx_create_signal_events(cycle) != NGX_OK) {

  Renamed: vendor/nginx-1.9.5/src/os/win32/ngx_process_cycle.h (+1 -1) 96%
===================================================================
--- vendor/nginx-1.8.0/src/os/win32/ngx_process_cycle.h    2015-09-27 18:09:01 +0900 (a5c649d)
+++ vendor/nginx-1.9.5/src/os/win32/ngx_process_cycle.h    2015-09-27 22:10:53 +0900 (95d2743)
@@ -25,8 +25,8 @@ void ngx_close_handle(HANDLE h);
 
 
 extern ngx_uint_t      ngx_process;
+extern ngx_uint_t      ngx_worker;
 extern ngx_pid_t       ngx_pid;
-extern ngx_uint_t      ngx_threaded;
 extern ngx_uint_t      ngx_exiting;
 
 extern sig_atomic_t    ngx_quit;

  Renamed: vendor/nginx-1.9.5/src/os/win32/ngx_service.c (+0 -0) 100%
===================================================================

  Added: vendor/nginx-1.9.5/src/os/win32/ngx_shmem.c (+161 -0) 100644
===================================================================
--- /dev/null
+++ vendor/nginx-1.9.5/src/os/win32/ngx_shmem.c    2015-09-27 22:10:53 +0900 (c3ed699)
@@ -0,0 +1,161 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) Nginx, Inc.
+ */
+
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+
+
+/*
+ * Base addresses selected by system for shared memory mappings are likely
+ * to be different on Windows Vista and later versions due to address space
+ * layout randomization.  This is however incompatible with storing absolute
+ * addresses within the shared memory.
+ *
+ * To make it possible to store absolute addresses we create mappings
+ * at the same address in all processes by starting mappings at predefined
+ * addresses.  The addresses were selected somewhat randomly in order to
+ * minimize the probability that some other library doing something similar
+ * conflicts with us.  The addresses are from the following typically free
+ * blocks:
+ *
+ * - 0x10000000 .. 0x70000000 (about 1.5 GB in total) on 32-bit platforms
+ * - 0x000000007fff0000 .. 0x000007f68e8b0000 (about 8 TB) on 64-bit platforms
+ *
+ * Additionally, we allow to change the mapping address once it was detected
+ * to be different from one originally used.  This is needed to support
+ * reconfiguration.
+ */
+
+
+#ifdef _WIN64
+#define NGX_SHMEM_BASE  0x0000047047e00000
+#else
+#define NGX_SHMEM_BASE  0x2efe0000
+#endif
+
+
+ngx_uint_t  ngx_allocation_granularity;
+
+
+ngx_int_t
+ngx_shm_alloc(ngx_shm_t *shm)
+{
+    u_char         *name;
+    uint64_t        size;
+    static u_char  *base = (u_char *) NGX_SHMEM_BASE;
+
+    name = ngx_alloc(shm->name.len + 2 + NGX_INT32_LEN, shm->log);
+    if (name == NULL) {
+        return NGX_ERROR;
+    }
+
+    (void) ngx_sprintf(name, "%V_%s%Z", &shm->name, ngx_unique);
+
+    ngx_set_errno(0);
+
+    size = shm->size;
+
+    shm->handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,
+                                    (u_long) (size >> 32),
+                                    (u_long) (size & 0xffffffff),
+                                    (char *) name);
+
+    if (shm->handle == NULL) {
+        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
+                      "CreateFileMapping(%uz, %s) failed",
+                      shm->size, name);
+        ngx_free(name);
+
+        return NGX_ERROR;
+    }
+
+    ngx_free(name);
+
+    if (ngx_errno == ERROR_ALREADY_EXISTS) {
+        shm->exists = 1;
+    }
+
+    shm->addr = MapViewOfFileEx(shm->handle, FILE_MAP_WRITE, 0, 0, 0, base);
+
+    if (shm->addr != NULL) {
+        base += ngx_align(size, ngx_allocation_granularity);
+        return NGX_OK;
+    }
+
+    ngx_log_debug3(NGX_LOG_DEBUG_CORE, shm->log, ngx_errno,
+                   "MapViewOfFileEx(%uz, %p) of file mapping \"%V\" failed, "
+                   "retry without a base address",
+                   shm->size, base, &shm->name);
+
+    /*
+     * Order of shared memory zones may be different in the master process
+     * and worker processes after reconfiguration.  As a result, the above
+     * may fail due to a conflict with a previously created mapping remapped
+     * to a different address.  Additionally, there may be a conflict with
+     * some other uses of the memory.  In this case we retry without a base
+     * address to let the system assign the address itself.
+     */
+
+    shm->addr = MapViewOfFile(shm->handle, FILE_MAP_WRITE, 0, 0, 0);
+
+    if (shm->addr != NULL) {
+        return NGX_OK;
+    }
+
+    ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
+                  "MapViewOfFile(%uz) of file mapping \"%V\" failed",
+                  shm->size, &shm->name);
+
+    if (CloseHandle(shm->handle) == 0) {
+        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
+                      "CloseHandle() of file mapping \"%V\" failed",
+                      &shm->name);
+    }
+
+    return NGX_ERROR;
+}
+
+
+ngx_int_t
+ngx_shm_remap(ngx_shm_t *shm, u_char *addr)
+{
+    if (UnmapViewOfFile(shm->addr) == 0) {
+        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
+                      "UnmapViewOfFile(%p) of file mapping \"%V\" failed",
+                      shm->addr, &shm->name);
+        return NGX_ERROR;
+    }
+
+    shm->addr = MapViewOfFileEx(shm->handle, FILE_MAP_WRITE, 0, 0, 0, addr);
+
+    if (shm->addr != NULL) {
+        return NGX_OK;
+    }
+
+    ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
+                  "MapViewOfFileEx(%uz, %p) of file mapping \"%V\" failed",
+                  shm->size, addr, &shm->name);
+
+    return NGX_ERROR;
+}
+
+
+void
+ngx_shm_free(ngx_shm_t *shm)
+{
+    if (UnmapViewOfFile(shm->addr) == 0) {
+        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
+                      "UnmapViewOfFile(%p) of file mapping \"%V\" failed",
+                      shm->addr, &shm->name);
+    }
+
+    if (CloseHandle(shm->handle) == 0) {
+        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
+                      "CloseHandle() of file mapping \"%V\" failed",
+                      &shm->name);
+    }
+}

  Renamed: vendor/nginx-1.9.5/src/os/win32/ngx_shmem.h (+3 -0) 82%
===================================================================
--- vendor/nginx-1.8.0/src/os/win32/ngx_shmem.h    2015-09-27 18:09:01 +0900 (1163d75)
+++ vendor/nginx-1.9.5/src/os/win32/ngx_shmem.h    2015-09-27 22:10:53 +0900 (ee47429)
@@ -24,7 +24,10 @@ typedef struct {
 
 
 ngx_int_t ngx_shm_alloc(ngx_shm_t *shm);
+ngx_int_t ngx_shm_remap(ngx_shm_t *shm, u_char *addr);
 void ngx_shm_free(ngx_shm_t *shm);
 
+extern ngx_uint_t  ngx_allocation_granularity;
+
 
 #endif /* _NGX_SHMEM_H_INCLUDED_ */

  Renamed: vendor/nginx-1.9.5/src/os/win32/ngx_socket.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/win32/ngx_socket.h (+2 -2) 97%
===================================================================
--- vendor/nginx-1.8.0/src/os/win32/ngx_socket.h    2015-09-27 18:09:01 +0900 (f728da2)
+++ vendor/nginx-1.9.5/src/os/win32/ngx_socket.h    2015-09-27 22:10:53 +0900 (a9e26c2)
@@ -21,9 +21,9 @@ typedef int     socklen_t;
 
 
 #define ngx_socket(af, type, proto)                                          \
-    WSASocket(af, type, proto, NULL, 0, WSA_FLAG_OVERLAPPED)
+    WSASocketW(af, type, proto, NULL, 0, WSA_FLAG_OVERLAPPED)
 
-#define ngx_socket_n        "WSASocket()"
+#define ngx_socket_n        "WSASocketW()"
 
 int ngx_nonblocking(ngx_socket_t s);
 int ngx_blocking(ngx_socket_t s);

  Renamed: vendor/nginx-1.9.5/src/os/win32/ngx_stat.c (+0 -0) 100%
===================================================================

  Added: vendor/nginx-1.9.5/src/os/win32/ngx_thread.c (+30 -0) 100644
===================================================================
--- /dev/null
+++ vendor/nginx-1.9.5/src/os/win32/ngx_thread.c    2015-09-27 22:10:53 +0900 (a13de2d)
@@ -0,0 +1,30 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) Nginx, Inc.
+ */
+
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+
+
+ngx_err_t
+ngx_create_thread(ngx_tid_t *tid,
+    ngx_thread_value_t (__stdcall *func)(void *arg), void *arg, ngx_log_t *log)
+{
+    u_long     id;
+    ngx_err_t  err;
+
+    *tid = CreateThread(NULL, 0, func, arg, 0, &id);
+
+    if (*tid != NULL) {
+        ngx_log_error(NGX_LOG_NOTICE, log, 0,
+                      "create thread " NGX_TID_T_FMT, id);
+        return 0;
+    }
+
+    err = ngx_errno;
+    ngx_log_error(NGX_LOG_ALERT, log, err, "CreateThread() failed");
+    return err;
+}

  Renamed: vendor/nginx-1.9.5/src/os/win32/ngx_thread.h (+0 -11) 56%
===================================================================
--- vendor/nginx-1.8.0/src/os/win32/ngx_thread.h    2015-09-27 18:09:01 +0900 (e1d0a7e)
+++ vendor/nginx-1.9.5/src/os/win32/ngx_thread.h    2015-09-27 22:10:53 +0900 (4012276)
@@ -14,25 +14,14 @@
 
 
 typedef HANDLE  ngx_tid_t;
-typedef DWORD   ngx_tls_key_t;
 typedef DWORD   ngx_thread_value_t;
 
 
 ngx_err_t ngx_create_thread(ngx_tid_t *tid,
     ngx_thread_value_t (__stdcall *func)(void *arg), void *arg, ngx_log_t *log);
-ngx_int_t ngx_init_threads(int n, size_t size, ngx_cycle_t *cycle);
-
-ngx_err_t ngx_thread_key_create(ngx_tls_key_t *key);
-#define ngx_thread_key_create_n     "TlsAlloc()"
-ngx_err_t ngx_thread_set_tls(ngx_tls_key_t *key, void *data);
-#define ngx_thread_set_tls_n         "TlsSetValue()"
-#define ngx_thread_get_tls           TlsGetValue
 
 #define ngx_log_tid                 GetCurrentThreadId()
 #define NGX_TID_T_FMT               "%ud"
 
 
-extern ngx_int_t  ngx_threads_n;
-
-
 #endif /* _NGX_THREAD_H_INCLUDED_ */

  Renamed: vendor/nginx-1.9.5/src/os/win32/ngx_time.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/win32/ngx_time.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/win32/ngx_udp_wsarecv.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/win32/ngx_user.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/win32/ngx_user.h (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/win32/ngx_win32_config.h (+5 -2) 98%
===================================================================
--- vendor/nginx-1.8.0/src/os/win32/ngx_win32_config.h    2015-09-27 18:09:01 +0900 (f4b2eea)
+++ vendor/nginx-1.9.5/src/os/win32/ngx_win32_config.h    2015-09-27 22:10:53 +0900 (f5b5950)
@@ -21,6 +21,11 @@
 #define _CRT_SECURE_NO_WARNINGS
 #define _CRT_SECURE_NO_DEPRECATE
 
+/* enable gethostbyname() in msvc2015 */
+#if !(NGX_HAVE_INET6)
+#define _WINSOCK_DEPRECATED_NO_WARNINGS
+#endif
+
 /*
  * we need to include <windows.h> explicitly before <winsock2.h> because
  * the warning 4201 is enabled in <windows.h>
@@ -218,8 +223,6 @@ typedef int                 sig_atomic_t;
 #define NGX_HAVE_LITTLE_ENDIAN  1
 #define NGX_HAVE_NONALIGNED     1
 
-#define NGX_OLD_THREADS         1
-
 
 #define NGX_WIN_NT        200000
 

  Renamed: vendor/nginx-1.9.5/src/os/win32/ngx_win32_init.c (+1 -0) 99%
===================================================================
--- vendor/nginx-1.8.0/src/os/win32/ngx_win32_init.c    2015-09-27 18:09:01 +0900 (6fa1a57)
+++ vendor/nginx-1.9.5/src/os/win32/ngx_win32_init.c    2015-09-27 22:10:53 +0900 (9e77a78)
@@ -118,6 +118,7 @@ ngx_os_init(ngx_log_t *log)
 
     GetSystemInfo(&si);
     ngx_pagesize = si.dwPageSize;
+    ngx_allocation_granularity = si.dwAllocationGranularity;
     ngx_ncpu = si.dwNumberOfProcessors;
     ngx_cacheline_size = NGX_CPU_CACHE_LINE;
 

  Renamed: vendor/nginx-1.9.5/src/os/win32/ngx_wsarecv.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/win32/ngx_wsarecv_chain.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/win32/ngx_wsasend.c (+0 -0) 100%
===================================================================

  Renamed: vendor/nginx-1.9.5/src/os/win32/ngx_wsasend_chain.c (+0 -0) 100%
===================================================================

  Added: vendor/nginx-1.9.5/src/stream/ngx_stream.c (+564 -0) 100644
===================================================================
--- /dev/null
+++ vendor/nginx-1.9.5/src/stream/ngx_stream.c    2015-09-27 22:10:53 +0900 (f0aa532)
@@ -0,0 +1,564 @@
+
+/*
+ * Copyright (C) Roman Arutyunyan
+ * Copyright (C) Nginx, Inc.
+ */
+
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+#include <ngx_event.h>
+#include <ngx_stream.h>
+
+
+static char *ngx_stream_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
+static ngx_int_t ngx_stream_add_ports(ngx_conf_t *cf, ngx_array_t *ports,
+    ngx_stream_listen_t *listen);
+static char *ngx_stream_optimize_servers(ngx_conf_t *cf, ngx_array_t *ports);
+static ngx_int_t ngx_stream_add_addrs(ngx_conf_t *cf, ngx_stream_port_t *stport,
+    ngx_stream_conf_addr_t *addr);
+#if (NGX_HAVE_INET6)
+static ngx_int_t ngx_stream_add_addrs6(ngx_conf_t *cf,
+    ngx_stream_port_t *stport, ngx_stream_conf_addr_t *addr);
+#endif
+static ngx_int_t ngx_stream_cmp_conf_addrs(const void *one, const void *two);
+
+
+ngx_uint_t  ngx_stream_max_module;
+
+
+static ngx_command_t  ngx_stream_commands[] = {
+
+    { ngx_string("stream"),
+      NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,
+      ngx_stream_block,
+      0,
+      0,
+      NULL },
+
+      ngx_null_command
+};
+
+
+static ngx_core_module_t  ngx_stream_module_ctx = {
+    ngx_string("stream"),
+    NULL,
+    NULL
+};
+
+
+ngx_module_t  ngx_stream_module = {
+    NGX_MODULE_V1,
+    &ngx_stream_module_ctx,                /* module context */
+    ngx_stream_commands,                   /* module directives */
+    NGX_CORE_MODULE,                       /* module type */
+    NULL,                                  /* init master */
+    NULL,                                  /* init module */
+    NULL,                                  /* init process */
+    NULL,                                  /* init thread */
+    NULL,                                  /* exit thread */
+    NULL,                                  /* exit process */
+    NULL,                                  /* exit master */
+    NGX_MODULE_V1_PADDING
+};
+
+
+static char *
+ngx_stream_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
+{
+    char                          *rv;
+    ngx_uint_t                     i, m, mi, s;
+    ngx_conf_t                     pcf;
+    ngx_array_t                    ports;
+    ngx_stream_listen_t           *listen;
+    ngx_stream_module_t           *module;
+    ngx_stream_conf_ctx_t         *ctx;
+    ngx_stream_core_srv_conf_t   **cscfp;
+    ngx_stream_core_main_conf_t   *cmcf;
+
+    if (*(ngx_stream_conf_ctx_t **) conf) {
+        return "is duplicate";
+    }
+
+    /* the main stream context */
+
+    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_stream_conf_ctx_t));
+    if (ctx == NULL) {
+        return NGX_CONF_ERROR;
+    }
+
+    *(ngx_stream_conf_ctx_t **) conf = ctx;
+
+    /* count the number of the stream modules and set up their indices */
+
+    ngx_stream_max_module = 0;
+    for (m = 0; ngx_modules[m]; m++) {
+        if (ngx_modules[m]->type != NGX_STREAM_MODULE) {
+            continue;
+        }
+
+        ngx_modules[m]->ctx_index = ngx_stream_max_module++;
+    }
+
+
+    /* the stream main_conf context, it's the same in the all stream contexts */
+
+    ctx->main_conf = ngx_pcalloc(cf->pool,
+                                 sizeof(void *) * ngx_stream_max_module);
+    if (ctx->main_conf == NULL) {
+        return NGX_CONF_ERROR;
+    }
+
+
+    /*
+     * the stream null srv_conf context, it is used to merge
+     * the server{}s' srv_conf's
+     */
+
+    ctx->srv_conf = ngx_pcalloc(cf->pool,
+                                sizeof(void *) * ngx_stream_max_module);
+    if (ctx->srv_conf == NULL) {
+        return NGX_CONF_ERROR;
+    }
+
+
+    /*
+     * create the main_conf's and the null srv_conf's of the all stream modules
+     */
+
+    for (m = 0; ngx_modules[m]; m++) {
+        if (ngx_modules[m]->type != NGX_STREAM_MODULE) {
+            continue;
+        }
+
+        module = ngx_modules[m]->ctx;
+        mi = ngx_modules[m]->ctx_index;
+
+        if (module->create_main_conf) {
+            ctx->main_conf[mi] = module->create_main_conf(cf);
+            if (ctx->main_conf[mi] == NULL) {
+                return NGX_CONF_ERROR;
+            }
+        }
+
+        if (module->create_srv_conf) {
+            ctx->srv_conf[mi] = module->create_srv_conf(cf);
+            if (ctx->srv_conf[mi] == NULL) {
+                return NGX_CONF_ERROR;
+            }
+        }
+    }
+
+
+    /* parse inside the stream{} block */
+
+    pcf = *cf;
+    cf->ctx = ctx;
+
+    cf->module_type = NGX_STREAM_MODULE;
+    cf->cmd_type = NGX_STREAM_MAIN_CONF;
+    rv = ngx_conf_parse(cf, NULL);
+
+    if (rv != NGX_CONF_OK) {
+        *cf = pcf;
+        return rv;
+    }
+
+
+    /* init stream{} main_conf's, merge the server{}s' srv_conf's */
+
+    cmcf = ctx->main_conf[ngx_stream_core_module.ctx_index];
+    cscfp = cmcf->servers.elts;
+
+    for (m = 0; ngx_modules[m]; m++) {
+        if (ngx_modules[m]->type != NGX_STREAM_MODULE) {
+            continue;
+        }
+
+        module = ngx_modules[m]->ctx;
+        mi = ngx_modules[m]->ctx_index;
+
+        /* init stream{} main_conf's */
+
+        cf->ctx = ctx;
+
+        if (module->init_main_conf) {
+            rv = module->init_main_conf(cf, ctx->main_conf[mi]);
+            if (rv != NGX_CONF_OK) {
+                *cf = pcf;
+                return rv;
+            }
+        }
+
+        for (s = 0; s < cmcf->servers.nelts; s++) {
+
+            /* merge the server{}s' srv_conf's */
+
+            cf->ctx = cscfp[s]->ctx;
+
+            if (module->merge_srv_conf) {
+                rv = module->merge_srv_conf(cf,
+                                            ctx->srv_conf[mi],
+                                            cscfp[s]->ctx->srv_conf[mi]);
+                if (rv != NGX_CONF_OK) {
+                    *cf = pcf;
+                    return rv;
+                }
+            }
+        }
+    }
+
+    for (m = 0; ngx_modules[m]; m++) {
+        if (ngx_modules[m]->type != NGX_STREAM_MODULE) {
+            continue;
+        }
+
+        module = ngx_modules[m]->ctx;
+
+        if (module->postconfiguration) {
+            if (module->postconfiguration(cf) != NGX_OK) {
+                return NGX_CONF_ERROR;
+            }
+        }
+    }
+
+    *cf = pcf;
+
+
+    if (ngx_array_init(&ports, cf->temp_pool, 4, sizeof(ngx_stream_conf_port_t))
+        != NGX_OK)
+    {
+        return NGX_CONF_ERROR;
+    }
+
+    listen = cmcf->listen.elts;
+
+    for (i = 0; i < cmcf->listen.nelts; i++) {
+        if (ngx_stream_add_ports(cf, &ports, &listen[i]) != NGX_OK) {
+            return NGX_CONF_ERROR;
+        }
+    }
+
+    return ngx_stream_optimize_servers(cf, &ports);
+}
+
+
+static ngx_int_t
+ngx_stream_add_ports(ngx_conf_t *cf, ngx_array_t *ports,
+    ngx_stream_listen_t *listen)
+{
+    in_port_t                p;
+    ngx_uint_t               i;
+    struct sockaddr         *sa;
+    struct sockaddr_in      *sin;
+    ngx_stream_conf_port_t  *port;
+    ngx_stream_conf_addr_t  *addr;
+#if (NGX_HAVE_INET6)
+    struct sockaddr_in6     *sin6;
+#endif
+
+    sa = &listen->u.sockaddr;
+
+    switch (sa->sa_family) {
+
+#if (NGX_HAVE_INET6)
+    case AF_INET6:
+        sin6 = &listen->u.sockaddr_in6;
+        p = sin6->sin6_port;
+        break;
+#endif
+
+#if (NGX_HAVE_UNIX_DOMAIN)
+    case AF_UNIX:
+        p = 0;
+        break;
+#endif
+
+    default: /* AF_INET */
+        sin = &listen->u.sockaddr_in;
+        p = sin->sin_port;
+        break;
+    }
+
+    port = ports->elts;
+    for (i = 0; i < ports->nelts; i++) {
+        if (p == port[i].port && sa->sa_family == port[i].family) {
+
+            /* a port is already in the port list */
+
+            port = &port[i];
+            goto found;
+        }
+    }
+
+    /* add a port to the port list */
+
+    port = ngx_array_push(ports);
+    if (port == NULL) {
+        return NGX_ERROR;
+    }
+
+    port->family = sa->sa_family;
+    port->port = p;
+
+    if (ngx_array_init(&port->addrs, cf->temp_pool, 2,
+                       sizeof(ngx_stream_conf_addr_t))
+        != NGX_OK)
+    {
+        return NGX_ERROR;
+    }
+
+found:
+
+    addr = ngx_array_push(&port->addrs);
+    if (addr == NULL) {
+        return NGX_ERROR;
+    }
+
+    addr->opt = *listen;
+
+    return NGX_OK;
+}
+
+
+static char *
+ngx_stream_optimize_servers(ngx_conf_t *cf, ngx_array_t *ports)
+{
+    ngx_uint_t                   i, p, last, bind_wildcard;
+    ngx_listening_t             *ls;
+    ngx_stream_port_t           *stport;
+    ngx_stream_conf_port_t      *port;
+    ngx_stream_conf_addr_t      *addr;
+    ngx_stream_core_srv_conf_t  *cscf;
+
+    port = ports->elts;
+    for (p = 0; p < ports->nelts; p++) {
+
+        ngx_sort(port[p].addrs.elts, (size_t) port[p].addrs.nelts,
+                 sizeof(ngx_stream_conf_addr_t), ngx_stream_cmp_conf_addrs);
+
+        addr = port[p].addrs.elts;
+        last = port[p].addrs.nelts;
+
+        /*
+         * if there is the binding to the "*:port" then we need to bind()
+         * to the "*:port" only and ignore the other bindings
+         */
+
+        if (addr[last - 1].opt.wildcard) {
+            addr[last - 1].opt.bind = 1;
+            bind_wildcard = 1;
+
+        } else {
+            bind_wildcard = 0;
+        }
+
+        i = 0;
+
+        while (i < last) {
+
+            if (bind_wildcard && !addr[i].opt.bind) {
+                i++;
+                continue;
+            }
+
+            ls = ngx_create_listening(cf, &addr[i].opt.u.sockaddr,
+                                      addr[i].opt.socklen);
+            if (ls == NULL) {
+                return NGX_CONF_ERROR;
+            }
+
+            ls->addr_ntop = 1;
+            ls->handler = ngx_stream_init_connection;
+            ls->pool_size = 256;
+
+            cscf = addr->opt.ctx->srv_conf[ngx_stream_core_module.ctx_index];
+
+            ls->logp = cscf->error_log;
+            ls->log.data = &ls->addr_text;
+            ls->log.handler = ngx_accept_log_error;
+
+            ls->backlog = addr[i].opt.backlog;
+
+            ls->keepalive = addr[i].opt.so_keepalive;
+#if (NGX_HAVE_KEEPALIVE_TUNABLE)
+            ls->keepidle = addr[i].opt.tcp_keepidle;
+            ls->keepintvl = addr[i].opt.tcp_keepintvl;
+            ls->keepcnt = addr[i].opt.tcp_keepcnt;
+#endif
+
+#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
+            ls->ipv6only = addr[i].opt.ipv6only;
+#endif
+
+#if (NGX_HAVE_REUSEPORT)
+            ls->reuseport = addr[i].opt.reuseport;
+#endif
+
+            stport = ngx_palloc(cf->pool, sizeof(ngx_stream_port_t));
+            if (stport == NULL) {
+                return NGX_CONF_ERROR;
+            }
+
+            ls->servers = stport;
+
+            stport->naddrs = i + 1;
+
+            switch (ls->sockaddr->sa_family) {
+#if (NGX_HAVE_INET6)
+            case AF_INET6:
+                if (ngx_stream_add_addrs6(cf, stport, addr) != NGX_OK) {
+                    return NGX_CONF_ERROR;
+                }
+                break;
+#endif
+            default: /* AF_INET */
+                if (ngx_stream_add_addrs(cf, stport, addr) != NGX_OK) {
+                    return NGX_CONF_ERROR;
+                }
+                break;
+            }
+
+            if (ngx_clone_listening(cf, ls) != NGX_OK) {
+                return NGX_CONF_ERROR;
+            }
+
+            addr++;
+            last--;
+        }
+    }
+
+    return NGX_CONF_OK;
+}
+
+
+static ngx_int_t
+ngx_stream_add_addrs(ngx_conf_t *cf, ngx_stream_port_t *stport,
+    ngx_stream_conf_addr_t *addr)
+{
+    u_char                *p;
+    size_t                 len;
+    ngx_uint_t             i;
+    struct sockaddr_in    *sin;
+    ngx_stream_in_addr_t  *addrs;
+    u_char                 buf[NGX_SOCKADDR_STRLEN];
+
+    stport->addrs = ngx_pcalloc(cf->pool,
+                                stport->naddrs * sizeof(ngx_stream_in_addr_t));
+    if (stport->addrs == NULL) {
+        return NGX_ERROR;
+    }
+
+    addrs = stport->addrs;
+
+    for (i = 0; i < stport->naddrs; i++) {
+
+        sin = &addr[i].opt.u.sockaddr_in;
+        addrs[i].addr = sin->sin_addr.s_addr;
+
+        addrs[i].conf.ctx = addr[i].opt.ctx;
+#if (NGX_STREAM_SSL)
+        addrs[i].conf.ssl = addr[i].opt.ssl;
+#endif
+
+        len = ngx_sock_ntop(&addr[i].opt.u.sockaddr, addr[i].opt.socklen, buf,
+                            NGX_SOCKADDR_STRLEN, 1);
+
+        p = ngx_pnalloc(cf->pool, len);
+        if (p == NULL) {
+            return NGX_ERROR;
+        }
+
+        ngx_memcpy(p, buf, len);
+
+        addrs[i].conf.addr_text.len = len;
+        addrs[i].conf.addr_text.data = p;
+    }
+
+    return NGX_OK;
+}
+
+
+#if (NGX_HAVE_INET6)
+
+static ngx_int_t
+ngx_stream_add_addrs6(ngx_conf_t *cf, ngx_stream_port_t *stport,
+    ngx_stream_conf_addr_t *addr)
+{
+    u_char                 *p;
+    size_t                  len;
+    ngx_uint_t              i;
+    struct sockaddr_in6    *sin6;
+    ngx_stream_in6_addr_t  *addrs6;
+    u_char                  buf[NGX_SOCKADDR_STRLEN];
+
+    stport->addrs = ngx_pcalloc(cf->pool,
+                                stport->naddrs * sizeof(ngx_stream_in6_addr_t));
+    if (stport->addrs == NULL) {
+        return NGX_ERROR;
+    }
+
+    addrs6 = stport->addrs;
+
+    for (i = 0; i < stport->naddrs; i++) {
+
+        sin6 = &addr[i].opt.u.sockaddr_in6;
+        addrs6[i].addr6 = sin6->sin6_addr;
+
+        addrs6[i].conf.ctx = addr[i].opt.ctx;
+#if (NGX_STREAM_SSL)
+        addrs6[i].conf.ssl = addr[i].opt.ssl;
+#endif
+
+        len = ngx_sock_ntop(&addr[i].opt.u.sockaddr, addr[i].opt.socklen, buf,
+                            NGX_SOCKADDR_STRLEN, 1);
+
+        p = ngx_pnalloc(cf->pool, len);
+        if (p == NULL) {
+            return NGX_ERROR;
+        }
+
+        ngx_memcpy(p, buf, len);
+
+        addrs6[i].conf.addr_text.len = len;
+        addrs6[i].conf.addr_text.data = p;
+    }
+
+    return NGX_OK;
+}
+
+#endif
+
+
+static ngx_int_t
+ngx_stream_cmp_conf_addrs(const void *one, const void *two)
+{
+    ngx_stream_conf_addr_t  *first, *second;
+
+    first = (ngx_stream_conf_addr_t *) one;
+    second = (ngx_stream_conf_addr_t *) two;
+
+    if (first->opt.wildcard) {
+        /* a wildcard must be the last resort, shift it to the end */
+        return 1;
+    }
+
+    if (second->opt.wildcard) {
+        /* a wildcard must be the last resort, shift it to the end */
+        return -1;
+    }
+
+    if (first->opt.bind && !second->opt.bind) {
+        /* shift explicit bind()ed addresses to the start */
+        return -1;
+    }
+
+    if (!first->opt.bind && second->opt.bind) {
+        /* shift explicit bind()ed addresses to the start */
+        return 1;
+    }
+
+    /* do not sort by default */
+
+    return 0;
+}

  Added: vendor/nginx-1.9.5/src/stream/ngx_stream.h (+210 -0) 100644
===================================================================
--- /dev/null
+++ vendor/nginx-1.9.5/src/stream/ngx_stream.h    2015-09-27 22:10:53 +0900 (21953e9)
@@ -0,0 +1,210 @@
+
+/*
+ * Copyright (C) Roman Arutyunyan
+ * Copyright (C) Nginx, Inc.
+ */
+
+
+#ifndef _NGX_STREAM_H_INCLUDED_
+#define _NGX_STREAM_H_INCLUDED_
+
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+
+#if (NGX_STREAM_SSL)
+#include <ngx_stream_ssl_module.h>
+#endif
+
+
+typedef struct ngx_stream_session_s  ngx_stream_session_t;
+
+
+#include <ngx_stream_upstream.h>
+#include <ngx_stream_upstream_round_robin.h>
+
+
+typedef struct {
+    void                  **main_conf;
+    void                  **srv_conf;
+} ngx_stream_conf_ctx_t;
+
+
+typedef struct {
+    union {
+        struct sockaddr     sockaddr;
+        struct sockaddr_in  sockaddr_in;
+#if (NGX_HAVE_INET6)
+        struct sockaddr_in6 sockaddr_in6;
+#endif
+#if (NGX_HAVE_UNIX_DOMAIN)
+        struct sockaddr_un  sockaddr_un;
+#endif
+        u_char              sockaddr_data[NGX_SOCKADDRLEN];
+    } u;
+
+    socklen_t               socklen;
+
+    /* server ctx */
+    ngx_stream_conf_ctx_t  *ctx;
+
+    unsigned                bind:1;
+    unsigned                wildcard:1;
+#if (NGX_STREAM_SSL)
+    unsigned                ssl:1;
+#endif
+#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
+    unsigned                ipv6only:1;
+#endif
+#if (NGX_HAVE_REUSEPORT)
+    unsigned                reuseport:1;
+#endif
+    unsigned                so_keepalive:2;
+#if (NGX_HAVE_KEEPALIVE_TUNABLE)
+    int                     tcp_keepidle;
+    int                     tcp_keepintvl;
+    int                     tcp_keepcnt;
+#endif
+    int                     backlog;
+} ngx_stream_listen_t;
+
+
+typedef struct {
+    ngx_stream_conf_ctx_t  *ctx;
+    ngx_str_t               addr_text;
+#if (NGX_STREAM_SSL)
+    ngx_uint_t              ssl;    /* unsigned   ssl:1; */
+#endif
+} ngx_stream_addr_conf_t;
+
+typedef struct {
+    in_addr_t               addr;
+    ngx_stream_addr_conf_t  conf;
+} ngx_stream_in_addr_t;
+
+
+#if (NGX_HAVE_INET6)
+
+typedef struct {
+    struct in6_addr         addr6;
+    ngx_stream_addr_conf_t  conf;
+} ngx_stream_in6_addr_t;
+
+#endif
+
+
+typedef struct {
+    /* ngx_stream_in_addr_t or ngx_stream_in6_addr_t */
+    void                   *addrs;
+    ngx_uint_t              naddrs;
+} ngx_stream_port_t;
+
+
+typedef struct {
+    int                     family;
+    in_port_t               port;
+    ngx_array_t             addrs;       /* array of ngx_stream_conf_addr_t */
+} ngx_stream_conf_port_t;
+
+
+typedef struct {
+    ngx_stream_listen_t     opt;
+} ngx_stream_conf_addr_t;
+
+
+typedef ngx_int_t (*ngx_stream_access_pt)(ngx_stream_session_t *s);
+
+
+typedef struct {
+    ngx_array_t             servers;     /* ngx_stream_core_srv_conf_t */
+    ngx_array_t             listen;      /* ngx_stream_listen_t */
+    ngx_stream_access_pt    limit_conn_handler;
+    ngx_stream_access_pt    access_handler;
+} ngx_stream_core_main_conf_t;
+
+
+typedef void (*ngx_stream_handler_pt)(ngx_stream_session_t *s);
+
+
+typedef struct {
+    ngx_stream_handler_pt   handler;
+    ngx_stream_conf_ctx_t  *ctx;
+    u_char                 *file_name;
+    ngx_int_t               line;
+    ngx_log_t              *error_log;
+    ngx_flag_t              tcp_nodelay;
+} ngx_stream_core_srv_conf_t;
+
+
+struct ngx_stream_session_s {
+    uint32_t                signature;         /* "STRM" */
+
+    ngx_connection_t       *connection;
+
+    off_t                   received;
+
+    ngx_log_handler_pt      log_handler;
+
+    void                  **ctx;
+    void                  **main_conf;
+    void                  **srv_conf;
+
+    ngx_stream_upstream_t  *upstream;
+};
+
+
+typedef struct {
+    ngx_int_t             (*postconfiguration)(ngx_conf_t *cf);
+
+    void                 *(*create_main_conf)(ngx_conf_t *cf);
+    char                 *(*init_main_conf)(ngx_conf_t *cf, void *conf);
+
+    void                 *(*create_srv_conf)(ngx_conf_t *cf);
+    char                 *(*merge_srv_conf)(ngx_conf_t *cf, void *prev,
+                                            void *conf);
+} ngx_stream_module_t;
+
+
+#define NGX_STREAM_MODULE       0x4d525453     /* "STRM" */
+
+#define NGX_STREAM_MAIN_CONF    0x02000000
+#define NGX_STREAM_SRV_CONF     0x04000000
+#define NGX_STREAM_UPS_CONF     0x08000000
+
+
+#define NGX_STREAM_MAIN_CONF_OFFSET  offsetof(ngx_stream_conf_ctx_t, main_conf)
+#define NGX_STREAM_SRV_CONF_OFFSET   offsetof(ngx_stream_conf_ctx_t, srv_conf)
+
+
+#define ngx_stream_get_module_ctx(s, module)   (s)->ctx[module.ctx_index]
+#define ngx_stream_set_ctx(s, c, module)       s->ctx[module.ctx_index] = c;
+#define ngx_stream_delete_ctx(s, module)       s->ctx[module.ctx_index] = NULL;
+
+
+#define ngx_stream_get_module_main_conf(s, module)                             \
+    (s)->main_conf[module.ctx_index]
+#define ngx_stream_get_module_srv_conf(s, module)                              \
+    (s)->srv_conf[module.ctx_index]
+
+#define ngx_stream_conf_get_module_main_conf(cf, module)                       \
+    ((ngx_stream_conf_ctx_t *) cf->ctx)->main_conf[module.ctx_index]
+#define ngx_stream_conf_get_module_srv_conf(cf, module)                        \
+    ((ngx_stream_conf_ctx_t *) cf->ctx)->srv_conf[module.ctx_index]
+
+#define ngx_stream_cycle_get_module_main_conf(cycle, module)                   \
+    (cycle->conf_ctx[ngx_stream_module.index] ?                                \
+        ((ngx_stream_conf_ctx_t *) cycle->conf_ctx[ngx_stream_module.index])   \
+            ->main_conf[module.ctx_index]:                                     \
+        NULL)
+
+
+void ngx_stream_init_connection(ngx_connection_t *c);
+void ngx_stream_close_connection(ngx_connection_t *c);
+
+
+extern ngx_module_t  ngx_stream_module;
+extern ngx_uint_t    ngx_stream_max_module;
+extern ngx_module_t  ngx_stream_core_module;
+
+
+#endif /* _NGX_STREAM_H_INCLUDED_ */

  Added: vendor/nginx-1.9.5/src/stream/ngx_stream_access_module.c (+451 -0) 100644
===================================================================
--- /dev/null
+++ vendor/nginx-1.9.5/src/stream/ngx_stream_access_module.c    2015-09-27 22:10:53 +0900 (64869d2)
@@ -0,0 +1,451 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) Nginx, Inc.
+ */
+
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+#include <ngx_stream.h>
+
+
+typedef struct {
+    in_addr_t         mask;
+    in_addr_t         addr;
+    ngx_uint_t        deny;      /* unsigned  deny:1; */
+} ngx_stream_access_rule_t;
+
+#if (NGX_HAVE_INET6)
+
+typedef struct {
+    struct in6_addr   addr;
+    struct in6_addr   mask;
+    ngx_uint_t        deny;      /* unsigned  deny:1; */
+} ngx_stream_access_rule6_t;
+
+#endif
+
+#if (NGX_HAVE_UNIX_DOMAIN)
+
+typedef struct {
+    ngx_uint_t        deny;      /* unsigned  deny:1; */
+} ngx_stream_access_rule_un_t;
+
+#endif
+
+typedef struct {
+    ngx_array_t      *rules;     /* array of ngx_stream_access_rule_t */
+#if (NGX_HAVE_INET6)
+    ngx_array_t      *rules6;    /* array of ngx_stream_access_rule6_t */
+#endif
+#if (NGX_HAVE_UNIX_DOMAIN)
+    ngx_array_t      *rules_un;  /* array of ngx_stream_access_rule_un_t */
+#endif
+} ngx_stream_access_srv_conf_t;
+
+
+static ngx_int_t ngx_stream_access_handler(ngx_stream_session_t *s);
+static ngx_int_t ngx_stream_access_inet(ngx_stream_session_t *s,
+    ngx_stream_access_srv_conf_t *ascf, in_addr_t addr);
+#if (NGX_HAVE_INET6)
+static ngx_int_t ngx_stream_access_inet6(ngx_stream_session_t *s,
+    ngx_stream_access_srv_conf_t *ascf, u_char *p);
+#endif
+#if (NGX_HAVE_UNIX_DOMAIN)
+static ngx_int_t ngx_stream_access_unix(ngx_stream_session_t *s,
+    ngx_stream_access_srv_conf_t *ascf);
+#endif
+static ngx_int_t ngx_stream_access_found(ngx_stream_session_t *s,
+    ngx_uint_t deny);
+static char *ngx_stream_access_rule(ngx_conf_t *cf, ngx_command_t *cmd,
+    void *conf);
+static void *ngx_stream_access_create_srv_conf(ngx_conf_t *cf);
+static char *ngx_stream_access_merge_srv_conf(ngx_conf_t *cf,
+    void *parent, void *child);
+static ngx_int_t ngx_stream_access_init(ngx_conf_t *cf);
+
+
+static ngx_command_t  ngx_stream_access_commands[] = {
+
+    { ngx_string("allow"),
+      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
+      ngx_stream_access_rule,
+      NGX_STREAM_SRV_CONF_OFFSET,
+      0,
+      NULL },
+
+    { ngx_string("deny"),
+      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
+      ngx_stream_access_rule,
+      NGX_STREAM_SRV_CONF_OFFSET,
+      0,
+      NULL },
+
+      ngx_null_command
+};
+
+
+
+static ngx_stream_module_t  ngx_stream_access_module_ctx = {
+    ngx_stream_access_init,                /* postconfiguration */
+
+    NULL,                                  /* create main configuration */
+    NULL,                                  /* init main configuration */
+
+    ngx_stream_access_create_srv_conf,     /* create server configuration */
+    ngx_stream_access_merge_srv_conf       /* merge server configuration */
+};
+
+
+ngx_module_t  ngx_stream_access_module = {
+    NGX_MODULE_V1,
+    &ngx_stream_access_module_ctx,         /* module context */
+    ngx_stream_access_commands,            /* module directives */
+    NGX_STREAM_MODULE,                     /* module type */
+    NULL,                                  /* init master */
+    NULL,                                  /* init module */
+    NULL,                                  /* init process */
+    NULL,                                  /* init thread */
+    NULL,                                  /* exit thread */
+    NULL,                                  /* exit process */
+    NULL,                                  /* exit master */
+    NGX_MODULE_V1_PADDING
+};
+
+
+static ngx_int_t
+ngx_stream_access_handler(ngx_stream_session_t *s)
+{
+    struct sockaddr_in            *sin;
+    ngx_stream_access_srv_conf_t  *ascf;
+#if (NGX_HAVE_INET6)
+    u_char                        *p;
+    in_addr_t                      addr;
+    struct sockaddr_in6           *sin6;
+#endif
+
+    ascf = ngx_stream_get_module_srv_conf(s, ngx_stream_access_module);
+
+    switch (s->connection->sockaddr->sa_family) {
+
+    case AF_INET:
+        if (ascf->rules) {
+            sin = (struct sockaddr_in *) s->connection->sockaddr;
+            return ngx_stream_access_inet(s, ascf, sin->sin_addr.s_addr);
+        }
+        break;
+
+#if (NGX_HAVE_INET6)
+
+    case AF_INET6:
+        sin6 = (struct sockaddr_in6 *) s->connection->sockaddr;
+        p = sin6->sin6_addr.s6_addr;
+
+        if (ascf->rules && IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
+            addr = p[12] << 24;
+            addr += p[13] << 16;
+            addr += p[14] << 8;
+            addr += p[15];
+            return ngx_stream_access_inet(s, ascf, htonl(addr));
+        }
+
+        if (ascf->rules6) {
+            return ngx_stream_access_inet6(s, ascf, p);
+        }
+
+        break;
+
+#endif
+
+#if (NGX_HAVE_UNIX_DOMAIN)
+
+    case AF_UNIX:
+        if (ascf->rules_un) {
+            return ngx_stream_access_unix(s, ascf);
+        }
+
+        break;
+
+#endif
+    }
+
+    return NGX_DECLINED;
+}
+
+
+static ngx_int_t
+ngx_stream_access_inet(ngx_stream_session_t *s,
+    ngx_stream_access_srv_conf_t *ascf, in_addr_t addr)
+{
+    ngx_uint_t                 i;
+    ngx_stream_access_rule_t  *rule;
+
+    rule = ascf->rules->elts;
+    for (i = 0; i < ascf->rules->nelts; i++) {
+
+        ngx_log_debug3(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,
+                       "access: %08XD %08XD %08XD",
+                       addr, rule[i].mask, rule[i].addr);
+
+        if ((addr & rule[i].mask) == rule[i].addr) {
+            return ngx_stream_access_found(s, rule[i].deny);
+        }
+    }
+
+    return NGX_DECLINED;
+}
+
+
+#if (NGX_HAVE_INET6)
+
+static ngx_int_t
+ngx_stream_access_inet6(ngx_stream_session_t *s,
+    ngx_stream_access_srv_conf_t *ascf, u_char *p)
+{
+    ngx_uint_t                  n;
+    ngx_uint_t                  i;
+    ngx_stream_access_rule6_t  *rule6;
+
+    rule6 = ascf->rules6->elts;
+    for (i = 0; i < ascf->rules6->nelts; i++) {
+
+#if (NGX_DEBUG)
+        {
+        size_t  cl, ml, al;
+        u_char  ct[NGX_INET6_ADDRSTRLEN];
+        u_char  mt[NGX_INET6_ADDRSTRLEN];
+        u_char  at[NGX_INET6_ADDRSTRLEN];
+
+        cl = ngx_inet6_ntop(p, ct, NGX_INET6_ADDRSTRLEN);
+        ml = ngx_inet6_ntop(rule6[i].mask.s6_addr, mt, NGX_INET6_ADDRSTRLEN);
+        al = ngx_inet6_ntop(rule6[i].addr.s6_addr, at, NGX_INET6_ADDRSTRLEN);
+
+        ngx_log_debug6(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,
+                       "access: %*s %*s %*s", cl, ct, ml, mt, al, at);
+        }
+#endif
+
+        for (n = 0; n < 16; n++) {
+            if ((p[n] & rule6[i].mask.s6_addr[n]) != rule6[i].addr.s6_addr[n]) {
+                goto next;
+            }
+        }
+
+        return ngx_stream_access_found(s, rule6[i].deny);
+
+    next:
+        continue;
+    }
+
+    return NGX_DECLINED;
+}
+
+#endif
+
+
+#if (NGX_HAVE_UNIX_DOMAIN)
+
+static ngx_int_t
+ngx_stream_access_unix(ngx_stream_session_t *s,
+    ngx_stream_access_srv_conf_t *ascf)
+{
+    ngx_uint_t                    i;
+    ngx_stream_access_rule_un_t  *rule_un;
+
+    rule_un = ascf->rules_un->elts;
+    for (i = 0; i < ascf->rules_un->nelts; i++) {
+
+        /* TODO: check path */
+        if (1) {
+            return ngx_stream_access_found(s, rule_un[i].deny);
+        }
+    }
+
+    return NGX_DECLINED;
+}
+
+#endif
+
+
+static ngx_int_t
+ngx_stream_access_found(ngx_stream_session_t *s, ngx_uint_t deny)
+{
+    if (deny) {
+        ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
+                      "access forbidden by rule");
+        return NGX_ABORT;
+    }
+
+    return NGX_OK;
+}
+
+
+static char *
+ngx_stream_access_rule(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
+{
+    ngx_stream_access_srv_conf_t *ascf = conf;
+
+    ngx_int_t                     rc;
+    ngx_uint_t                    all;
+    ngx_str_t                    *value;
+    ngx_cidr_t                    cidr;
+    ngx_stream_access_rule_t     *rule;
+#if (NGX_HAVE_INET6)
+    ngx_stream_access_rule6_t    *rule6;
+#endif
+#if (NGX_HAVE_UNIX_DOMAIN)
+    ngx_stream_access_rule_un_t  *rule_un;
+#endif
+
+    ngx_memzero(&cidr, sizeof(ngx_cidr_t));
+
+    value = cf->args->elts;
+
+    all = (value[1].len == 3 && ngx_strcmp(value[1].data, "all") == 0);
+
+    if (!all) {
+
+#if (NGX_HAVE_UNIX_DOMAIN)
+
+        if (value[1].len == 5 && ngx_strcmp(value[1].data, "unix:") == 0) {
+            cidr.family = AF_UNIX;
+            rc = NGX_OK;
+
+        } else {
+            rc = ngx_ptocidr(&value[1], &cidr);
+        }
+
+#else
+        rc = ngx_ptocidr(&value[1], &cidr);
+#endif
+
+        if (rc == NGX_ERROR) {
+            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
+                         "invalid parameter \"%V\"", &value[1]);
+            return NGX_CONF_ERROR;
+        }
+
+        if (rc == NGX_DONE) {
+            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
+                         "low address bits of %V are meaningless", &value[1]);
+        }
+    }
+
+    if (cidr.family == AF_INET || all) {
+
+        if (ascf->rules == NULL) {
+            ascf->rules = ngx_array_create(cf->pool, 4,
+                                           sizeof(ngx_stream_access_rule_t));
+            if (ascf->rules == NULL) {
+                return NGX_CONF_ERROR;
+            }
+        }
+
+        rule = ngx_array_push(ascf->rules);
+        if (rule == NULL) {
+            return NGX_CONF_ERROR;
+        }
+
+        rule->mask = cidr.u.in.mask;
+        rule->addr = cidr.u.in.addr;
+        rule->deny = (value[0].data[0] == 'd') ? 1 : 0;
+    }
+
+#if (NGX_HAVE_INET6)
+    if (cidr.family == AF_INET6 || all) {
+
+        if (ascf->rules6 == NULL) {
+            ascf->rules6 = ngx_array_create(cf->pool, 4,
+                                            sizeof(ngx_stream_access_rule6_t));
+            if (ascf->rules6 == NULL) {
+                return NGX_CONF_ERROR;
+            }
+        }
+
+        rule6 = ngx_array_push(ascf->rules6);
+        if (rule6 == NULL) {
+            return NGX_CONF_ERROR;
+        }
+
+        rule6->mask = cidr.u.in6.mask;
+        rule6->addr = cidr.u.in6.addr;
+        rule6->deny = (value[0].data[0] == 'd') ? 1 : 0;
+    }
+#endif
+
+#if (NGX_HAVE_UNIX_DOMAIN)
+    if (cidr.family == AF_UNIX || all) {
+
+        if (ascf->rules_un == NULL) {
+            ascf->rules_un = ngx_array_create(cf->pool, 1,
+                                          sizeof(ngx_stream_access_rule_un_t));
+            if (ascf->rules_un == NULL) {
+                return NGX_CONF_ERROR;
+            }
+        }
+
+        rule_un = ngx_array_push(ascf->rules_un);
+        if (rule_un == NULL) {
+            return NGX_CONF_ERROR;
+        }
+
+        rule_un->deny = (value[0].data[0] == 'd') ? 1 : 0;
+    }
+#endif
+
+    return NGX_CONF_OK;
+}
+
+
+static void *
+ngx_stream_access_create_srv_conf(ngx_conf_t *cf)
+{
+    ngx_stream_access_srv_conf_t  *conf;
+
+    conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_access_srv_conf_t));
+    if (conf == NULL) {
+        return NULL;
+    }
+
+    return conf;
+}
+
+
+static char *
+ngx_stream_access_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)
+{
+    ngx_stream_access_srv_conf_t  *prev = parent;
+    ngx_stream_access_srv_conf_t  *conf = child;
+
+    if (conf->rules == NULL
+#if (NGX_HAVE_INET6)
+        && conf->rules6 == NULL
+#endif
+#if (NGX_HAVE_UNIX_DOMAIN)
+        && conf->rules_un == NULL
+#endif
+    ) {
+        conf->rules = prev->rules;
+#if (NGX_HAVE_INET6)
+        conf->rules6 = prev->rules6;
+#endif
+#if (NGX_HAVE_UNIX_DOMAIN)
+        conf->rules_un = prev->rules_un;
+#endif
+    }
+
+    return NGX_CONF_OK;
+}
+
+
+static ngx_int_t
+ngx_stream_access_init(ngx_conf_t *cf)
+{
+    ngx_stream_core_main_conf_t  *cmcf;
+
+    cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module);
+    cmcf->access_handler = ngx_stream_access_handler;
+
+    return NGX_OK;
+}

  Renamed: vendor/nginx-1.9.5/src/stream/ngx_stream_core_module.c (+135 -254) 52%
===================================================================
--- vendor/nginx-1.8.0/src/mail/ngx_mail_core_module.c    2015-09-27 18:09:01 +0900 (05a47f5)
+++ vendor/nginx-1.9.5/src/stream/ngx_stream_core_module.c    2015-09-27 22:10:53 +0900 (4fe6818)
@@ -1,114 +1,77 @@
 
 /*
- * Copyright (C) Igor Sysoev
+ * Copyright (C) Roman Arutyunyan
  * Copyright (C) Nginx, Inc.
  */
 
 
 #include <ngx_config.h>
 #include <ngx_core.h>
-#include <ngx_event.h>
-#include <ngx_mail.h>
+#include <ngx_stream.h>
 
 
-static void *ngx_mail_core_create_main_conf(ngx_conf_t *cf);
-static void *ngx_mail_core_create_srv_conf(ngx_conf_t *cf);
-static char *ngx_mail_core_merge_srv_conf(ngx_conf_t *cf, void *parent,
+static void *ngx_stream_core_create_main_conf(ngx_conf_t *cf);
+static void *ngx_stream_core_create_srv_conf(ngx_conf_t *cf);
+static char *ngx_stream_core_merge_srv_conf(ngx_conf_t *cf, void *parent,
     void *child);
-static char *ngx_mail_core_server(ngx_conf_t *cf, ngx_command_t *cmd,
+static char *ngx_stream_core_error_log(ngx_conf_t *cf, ngx_command_t *cmd,
     void *conf);
-static char *ngx_mail_core_listen(ngx_conf_t *cf, ngx_command_t *cmd,
+static char *ngx_stream_core_server(ngx_conf_t *cf, ngx_command_t *cmd,
     void *conf);
-static char *ngx_mail_core_protocol(ngx_conf_t *cf, ngx_command_t *cmd,
+static char *ngx_stream_core_listen(ngx_conf_t *cf, ngx_command_t *cmd,
     void *conf);
-static char *ngx_mail_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd,
-    void *conf);
-
-
-static ngx_conf_deprecated_t  ngx_conf_deprecated_so_keepalive = {
-    ngx_conf_deprecated, "so_keepalive",
-    "so_keepalive\" parameter of the \"listen"
-};
 
 
-static ngx_command_t  ngx_mail_core_commands[] = {
+static ngx_command_t  ngx_stream_core_commands[] = {
 
     { ngx_string("server"),
-      NGX_MAIL_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,
-      ngx_mail_core_server,
+      NGX_STREAM_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,
+      ngx_stream_core_server,
       0,
       0,
       NULL },
 
     { ngx_string("listen"),
-      NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,
-      ngx_mail_core_listen,
-      NGX_MAIL_SRV_CONF_OFFSET,
+      NGX_STREAM_SRV_CONF|NGX_CONF_1MORE,
+      ngx_stream_core_listen,
+      NGX_STREAM_SRV_CONF_OFFSET,
       0,
       NULL },
 
-    { ngx_string("protocol"),
-      NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,
-      ngx_mail_core_protocol,
-      NGX_MAIL_SRV_CONF_OFFSET,
+    { ngx_string("error_log"),
+      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_1MORE,
+      ngx_stream_core_error_log,
+      NGX_STREAM_SRV_CONF_OFFSET,
       0,
       NULL },
 
-    { ngx_string("so_keepalive"),
-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG,
+    { ngx_string("tcp_nodelay"),
+      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,
       ngx_conf_set_flag_slot,
-      NGX_MAIL_SRV_CONF_OFFSET,
-      offsetof(ngx_mail_core_srv_conf_t, so_keepalive),
-      &ngx_conf_deprecated_so_keepalive },
-
-    { ngx_string("timeout"),
-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,
-      ngx_conf_set_msec_slot,
-      NGX_MAIL_SRV_CONF_OFFSET,
-      offsetof(ngx_mail_core_srv_conf_t, timeout),
-      NULL },
-
-    { ngx_string("server_name"),
-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,
-      ngx_conf_set_str_slot,
-      NGX_MAIL_SRV_CONF_OFFSET,
-      offsetof(ngx_mail_core_srv_conf_t, server_name),
-      NULL },
-
-    { ngx_string("resolver"),
-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,
-      ngx_mail_core_resolver,
-      NGX_MAIL_SRV_CONF_OFFSET,
-      0,
-      NULL },
-
-    { ngx_string("resolver_timeout"),
-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,
-      ngx_conf_set_msec_slot,
-      NGX_MAIL_SRV_CONF_OFFSET,
-      offsetof(ngx_mail_core_srv_conf_t, resolver_timeout),
+      NGX_STREAM_SRV_CONF_OFFSET,
+      offsetof(ngx_stream_core_srv_conf_t, tcp_nodelay),
       NULL },
 
       ngx_null_command
 };
 
 
-static ngx_mail_module_t  ngx_mail_core_module_ctx = {
-    NULL,                                  /* protocol */
+static ngx_stream_module_t  ngx_stream_core_module_ctx = {
+    NULL,                                  /* postconfiguration */
 
-    ngx_mail_core_create_main_conf,        /* create main configuration */
+    ngx_stream_core_create_main_conf,      /* create main configuration */
     NULL,                                  /* init main configuration */
 
-    ngx_mail_core_create_srv_conf,         /* create server configuration */
-    ngx_mail_core_merge_srv_conf           /* merge server configuration */
+    ngx_stream_core_create_srv_conf,       /* create server configuration */
+    ngx_stream_core_merge_srv_conf         /* merge server configuration */
 };
 
 
-ngx_module_t  ngx_mail_core_module = {
+ngx_module_t  ngx_stream_core_module = {
     NGX_MODULE_V1,
-    &ngx_mail_core_module_ctx,             /* module context */
-    ngx_mail_core_commands,                /* module directives */
-    NGX_MAIL_MODULE,                       /* module type */
+    &ngx_stream_core_module_ctx,           /* module context */
+    ngx_stream_core_commands,              /* module directives */
+    NGX_STREAM_MODULE,                     /* module type */
     NULL,                                  /* init master */
     NULL,                                  /* init module */
     NULL,                                  /* init process */
@@ -121,23 +84,23 @@ ngx_module_t  ngx_mail_core_module = {
 
 
 static void *
-ngx_mail_core_create_main_conf(ngx_conf_t *cf)
+ngx_stream_core_create_main_conf(ngx_conf_t *cf)
 {
-    ngx_mail_core_main_conf_t  *cmcf;
+    ngx_stream_core_main_conf_t  *cmcf;
 
-    cmcf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_core_main_conf_t));
+    cmcf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_core_main_conf_t));
     if (cmcf == NULL) {
         return NULL;
     }
 
     if (ngx_array_init(&cmcf->servers, cf->pool, 4,
-                       sizeof(ngx_mail_core_srv_conf_t *))
+                       sizeof(ngx_stream_core_srv_conf_t *))
         != NGX_OK)
     {
         return NULL;
     }
 
-    if (ngx_array_init(&cmcf->listen, cf->pool, 4, sizeof(ngx_mail_listen_t))
+    if (ngx_array_init(&cmcf->listen, cf->pool, 4, sizeof(ngx_stream_listen_t))
         != NGX_OK)
     {
         return NULL;
@@ -148,11 +111,11 @@ ngx_mail_core_create_main_conf(ngx_conf_t *cf)
 
 
 static void *
-ngx_mail_core_create_srv_conf(ngx_conf_t *cf)
+ngx_stream_core_create_srv_conf(ngx_conf_t *cf)
 {
-    ngx_mail_core_srv_conf_t  *cscf;
+    ngx_stream_core_srv_conf_t  *cscf;
 
-    cscf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_core_srv_conf_t));
+    cscf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_core_srv_conf_t));
     if (cscf == NULL) {
         return NULL;
     }
@@ -160,83 +123,84 @@ ngx_mail_core_create_srv_conf(ngx_conf_t *cf)
     /*
      * set by ngx_pcalloc():
      *
-     *     cscf->protocol = NULL;
+     *     cscf->handler = NULL;
+     *     cscf->error_log = NULL;
      */
 
-    cscf->timeout = NGX_CONF_UNSET_MSEC;
-    cscf->resolver_timeout = NGX_CONF_UNSET_MSEC;
-    cscf->so_keepalive = NGX_CONF_UNSET;
-
-    cscf->resolver = NGX_CONF_UNSET_PTR;
-
     cscf->file_name = cf->conf_file->file.name.data;
     cscf->line = cf->conf_file->line;
+    cscf->tcp_nodelay = NGX_CONF_UNSET;
 
     return cscf;
 }
 
 
 static char *
-ngx_mail_core_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)
+ngx_stream_core_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)
 {
-    ngx_mail_core_srv_conf_t *prev = parent;
-    ngx_mail_core_srv_conf_t *conf = child;
-
-    ngx_conf_merge_msec_value(conf->timeout, prev->timeout, 60000);
-    ngx_conf_merge_msec_value(conf->resolver_timeout, prev->resolver_timeout,
-                              30000);
+    ngx_stream_core_srv_conf_t *prev = parent;
+    ngx_stream_core_srv_conf_t *conf = child;
 
-    ngx_conf_merge_value(conf->so_keepalive, prev->so_keepalive, 0);
-
-
-    ngx_conf_merge_str_value(conf->server_name, prev->server_name, "");
-
-    if (conf->server_name.len == 0) {
-        conf->server_name = cf->cycle->hostname;
-    }
-
-    if (conf->protocol == NULL) {
+    if (conf->handler == NULL) {
         ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
-                      "unknown mail protocol for server in %s:%ui",
+                      "no handler for server in %s:%ui",
                       conf->file_name, conf->line);
         return NGX_CONF_ERROR;
     }
 
-    ngx_conf_merge_ptr_value(conf->resolver, prev->resolver, NULL);
+    if (conf->error_log == NULL) {
+        if (prev->error_log) {
+            conf->error_log = prev->error_log;
+        } else {
+            conf->error_log = &cf->cycle->new_log;
+        }
+    }
+
+    ngx_conf_merge_value(conf->tcp_nodelay, prev->tcp_nodelay, 1);
 
     return NGX_CONF_OK;
 }
 
 
 static char *
-ngx_mail_core_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
+ngx_stream_core_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
 {
-    char                       *rv;
-    void                       *mconf;
-    ngx_uint_t                  m;
-    ngx_conf_t                  pcf;
-    ngx_mail_module_t          *module;
-    ngx_mail_conf_ctx_t        *ctx, *mail_ctx;
-    ngx_mail_core_srv_conf_t   *cscf, **cscfp;
-    ngx_mail_core_main_conf_t  *cmcf;
-
-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_mail_conf_ctx_t));
+    ngx_stream_core_srv_conf_t  *cscf = conf;
+
+    return ngx_log_set_log(cf, &cscf->error_log);
+}
+
+
+static char *
+ngx_stream_core_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
+{
+    char                         *rv;
+    void                         *mconf;
+    ngx_uint_t                    m;
+    ngx_conf_t                    pcf;
+    ngx_stream_module_t          *module;
+    ngx_stream_conf_ctx_t        *ctx, *stream_ctx;
+    ngx_stream_core_srv_conf_t   *cscf, **cscfp;
+    ngx_stream_core_main_conf_t  *cmcf;
+
+    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_stream_conf_ctx_t));
     if (ctx == NULL) {
         return NGX_CONF_ERROR;
     }
 
-    mail_ctx = cf->ctx;
-    ctx->main_conf = mail_ctx->main_conf;
+    stream_ctx = cf->ctx;
+    ctx->main_conf = stream_ctx->main_conf;
 
     /* the server{}'s srv_conf */
 
-    ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_mail_max_module);
+    ctx->srv_conf = ngx_pcalloc(cf->pool,
+                                sizeof(void *) * ngx_stream_max_module);
     if (ctx->srv_conf == NULL) {
         return NGX_CONF_ERROR;
     }
 
     for (m = 0; ngx_modules[m]; m++) {
-        if (ngx_modules[m]->type != NGX_MAIL_MODULE) {
+        if (ngx_modules[m]->type != NGX_STREAM_MODULE) {
             continue;
         }
 
@@ -254,10 +218,10 @@ ngx_mail_core_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
 
     /* the server configuration context */
 
-    cscf = ctx->srv_conf[ngx_mail_core_module.ctx_index];
+    cscf = ctx->srv_conf[ngx_stream_core_module.ctx_index];
     cscf->ctx = ctx;
 
-    cmcf = ctx->main_conf[ngx_mail_core_module.ctx_index];
+    cmcf = ctx->main_conf[ngx_stream_core_module.ctx_index];
 
     cscfp = ngx_array_push(&cmcf->servers);
     if (cscfp == NULL) {
@@ -271,7 +235,7 @@ ngx_mail_core_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
 
     pcf = *cf;
     cf->ctx = ctx;
-    cf->cmd_type = NGX_MAIL_SRV_CONF;
+    cf->cmd_type = NGX_STREAM_SRV_CONF;
 
     rv = ngx_conf_parse(cf, NULL);
 
@@ -282,22 +246,19 @@ ngx_mail_core_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
 
 
 static char *
-ngx_mail_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
+ngx_stream_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
 {
-    ngx_mail_core_srv_conf_t  *cscf = conf;
-
-    size_t                      len, off;
-    in_port_t                   port;
-    ngx_str_t                  *value;
-    ngx_url_t                   u;
-    ngx_uint_t                  i, m;
-    struct sockaddr            *sa;
-    ngx_mail_listen_t          *ls;
-    ngx_mail_module_t          *module;
-    struct sockaddr_in         *sin;
-    ngx_mail_core_main_conf_t  *cmcf;
+    size_t                        len, off;
+    in_port_t                     port;
+    ngx_str_t                    *value;
+    ngx_url_t                     u;
+    ngx_uint_t                    i;
+    struct sockaddr              *sa;
+    struct sockaddr_in           *sin;
+    ngx_stream_listen_t          *ls;
+    ngx_stream_core_main_conf_t  *cmcf;
 #if (NGX_HAVE_INET6)
-    struct sockaddr_in6        *sin6;
+    struct sockaddr_in6          *sin6;
 #endif
 
     value = cf->args->elts;
@@ -317,13 +278,13 @@ ngx_mail_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
         return NGX_CONF_ERROR;
     }
 
-    cmcf = ngx_mail_conf_get_module_main_conf(cf, ngx_mail_core_module);
+    cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module);
 
     ls = cmcf->listen.elts;
 
     for (i = 0; i < cmcf->listen.nelts; i++) {
 
-        sa = (struct sockaddr *) ls[i].sockaddr;
+        sa = &ls[i].u.sockaddr;
 
         if (sa->sa_family != u.family) {
             continue;
@@ -335,8 +296,8 @@ ngx_mail_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
         case AF_INET6:
             off = offsetof(struct sockaddr_in6, sin6_addr);
             len = 16;
-            sin6 = (struct sockaddr_in6 *) sa;
-            port = ntohs(sin6->sin6_port);
+            sin6 = &ls[i].u.sockaddr_in6;
+            port = sin6->sin6_port;
             break;
 #endif
 
@@ -351,12 +312,14 @@ ngx_mail_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
         default: /* AF_INET */
             off = offsetof(struct sockaddr_in, sin_addr);
             len = 4;
-            sin = (struct sockaddr_in *) sa;
-            port = ntohs(sin->sin_port);
+            sin = &ls[i].u.sockaddr_in;
+            port = sin->sin_port;
             break;
         }
 
-        if (ngx_memcmp(ls[i].sockaddr + off, u.sockaddr + off, len) != 0) {
+        if (ngx_memcmp(ls[i].u.sockaddr_data + off, u.sockaddr + off, len)
+            != 0)
+        {
             continue;
         }
 
@@ -374,11 +337,12 @@ ngx_mail_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
         return NGX_CONF_ERROR;
     }
 
-    ngx_memzero(ls, sizeof(ngx_mail_listen_t));
+    ngx_memzero(ls, sizeof(ngx_stream_listen_t));
 
-    ngx_memcpy(ls->sockaddr, u.sockaddr, u.socklen);
+    ngx_memcpy(&ls->u.sockaddr, u.sockaddr, u.socklen);
 
     ls->socklen = u.socklen;
+    ls->backlog = NGX_LISTEN_BACKLOG;
     ls->wildcard = u.wildcard;
     ls->ctx = cf->ctx;
 
@@ -386,40 +350,31 @@ ngx_mail_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
     ls->ipv6only = 1;
 #endif
 
-    if (cscf->protocol == NULL) {
-        for (m = 0; ngx_modules[m]; m++) {
-            if (ngx_modules[m]->type != NGX_MAIL_MODULE) {
-                continue;
-            }
+    for (i = 2; i < cf->args->nelts; i++) {
 
-            module = ngx_modules[m]->ctx;
+        if (ngx_strcmp(value[i].data, "bind") == 0) {
+            ls->bind = 1;
+            continue;
+        }
 
-            if (module->protocol == NULL) {
-                continue;
-            }
+        if (ngx_strncmp(value[i].data, "backlog=", 8) == 0) {
+            ls->backlog = ngx_atoi(value[i].data + 8, value[i].len - 8);
+            ls->bind = 1;
 
-            for (i = 0; module->protocol->port[i]; i++) {
-                if (module->protocol->port[i] == u.port) {
-                    cscf->protocol = module->protocol;
-                    break;
-                }
+            if (ls->backlog == NGX_ERROR || ls->backlog == 0) {
+                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
+                                   "invalid backlog \"%V\"", &value[i]);
+                return NGX_CONF_ERROR;
             }
-        }
-    }
-
-    for (i = 2; i < cf->args->nelts; i++) {
 
-        if (ngx_strcmp(value[i].data, "bind") == 0) {
-            ls->bind = 1;
             continue;
         }
 
         if (ngx_strncmp(value[i].data, "ipv6only=o", 10) == 0) {
 #if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
-            struct sockaddr  *sa;
-            u_char            buf[NGX_SOCKADDR_STRLEN];
+            u_char  buf[NGX_SOCKADDR_STRLEN];
 
-            sa = (struct sockaddr *) ls->sockaddr;
+            sa = &ls->u.sockaddr;
 
             if (sa->sa_family == AF_INET6) {
 
@@ -456,14 +411,26 @@ ngx_mail_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
 #endif
         }
 
+        if (ngx_strcmp(value[i].data, "reuseport") == 0) {
+#if (NGX_HAVE_REUSEPORT)
+            ls->reuseport = 1;
+            ls->bind = 1;
+#else
+            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
+                               "reuseport is not supported "
+                               "on this platform, ignored");
+#endif
+            continue;
+        }
+
         if (ngx_strcmp(value[i].data, "ssl") == 0) {
-#if (NGX_MAIL_SSL)
+#if (NGX_STREAM_SSL)
             ls->ssl = 1;
             continue;
 #else
             ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
                                "the \"ssl\" parameter requires "
-                               "ngx_mail_ssl_module");
+                               "ngx_stream_ssl_module");
             return NGX_CONF_ERROR;
 #endif
         }
@@ -565,89 +532,3 @@ ngx_mail_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
 
     return NGX_CONF_OK;
 }
-
-
-static char *
-ngx_mail_core_protocol(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
-{
-    ngx_mail_core_srv_conf_t  *cscf = conf;
-
-    ngx_str_t          *value;
-    ngx_uint_t          m;
-    ngx_mail_module_t  *module;
-
-    value = cf->args->elts;
-
-    for (m = 0; ngx_modules[m]; m++) {
-        if (ngx_modules[m]->type != NGX_MAIL_MODULE) {
-            continue;
-        }
-
-        module = ngx_modules[m]->ctx;
-
-        if (module->protocol
-            && ngx_strcmp(module->protocol->name.data, value[1].data) == 0)
-        {
-            cscf->protocol = module->protocol;
-
-            return NGX_CONF_OK;
-        }
-    }
-
-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
-                       "unknown protocol \"%V\"", &value[1]);
-    return NGX_CONF_ERROR;
-}
-
-
-static char *
-ngx_mail_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
-{
-    ngx_mail_core_srv_conf_t  *cscf = conf;
-
-    ngx_str_t  *value;
-
-    value = cf->args->elts;
-
-    if (cscf->resolver != NGX_CONF_UNSET_PTR) {
-        return "is duplicate";
-    }
-
-    if (ngx_strcmp(value[1].data, "off") == 0) {
-        cscf->resolver = NULL;
-        return NGX_CONF_OK;
-    }
-
-    cscf->resolver = ngx_resolver_create(cf, &value[1], cf->args->nelts - 1);
-    if (cscf->resolver == NULL) {
-        return NGX_CONF_ERROR;
-    }
-
-    return NGX_CONF_OK;
-}
-
-
-char *
-ngx_mail_capabilities(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
-{
-    char  *p = conf;
-
-    ngx_str_t    *c, *value;
-    ngx_uint_t    i;
-    ngx_array_t  *a;
-
-    a = (ngx_array_t *) (p + cmd->offset);
-
-    value = cf->args->elts;
-
-    for (i = 1; i < cf->args->nelts; i++) {
-        c = ngx_array_push(a);
-        if (c == NULL) {
-            return NGX_CONF_ERROR;
-        }
-
-        *c = value[i];
-    }
-
-    return NGX_CONF_OK;
-}

  Added: vendor/nginx-1.9.5/src/stream/ngx_stream_handler.c (+339 -0) 100644
===================================================================
--- /dev/null
+++ vendor/nginx-1.9.5/src/stream/ngx_stream_handler.c    2015-09-27 22:10:53 +0900 (b3edb68)
@@ -0,0 +1,339 @@
+
+/*
+ * Copyright (C) Roman Arutyunyan
+ * Copyright (C) Nginx, Inc.
+ */
+
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+#include <ngx_event.h>
+#include <ngx_stream.h>
+
+
+static u_char *ngx_stream_log_error(ngx_log_t *log, u_char *buf, size_t len);
+static void ngx_stream_init_session(ngx_connection_t *c);
+
+#if (NGX_STREAM_SSL)
+static void ngx_stream_ssl_init_connection(ngx_ssl_t *ssl, ngx_connection_t *c);
+static void ngx_stream_ssl_handshake_handler(ngx_connection_t *c);
+#endif
+
+
+void
+ngx_stream_init_connection(ngx_connection_t *c)
+{
+    int                           tcp_nodelay;
+    u_char                        text[NGX_SOCKADDR_STRLEN];
+    size_t                        len;
+    ngx_int_t                     rc;
+    ngx_uint_t                    i;
+    struct sockaddr              *sa;
+    ngx_stream_port_t            *port;
+    struct sockaddr_in           *sin;
+    ngx_stream_in_addr_t         *addr;
+    ngx_stream_session_t         *s;
+    ngx_stream_addr_conf_t       *addr_conf;
+#if (NGX_HAVE_INET6)
+    struct sockaddr_in6          *sin6;
+    ngx_stream_in6_addr_t        *addr6;
+#endif
+    ngx_stream_core_srv_conf_t   *cscf;
+    ngx_stream_core_main_conf_t  *cmcf;
+
+    /* find the server configuration for the address:port */
+
+    port = c->listening->servers;
+
+    if (port->naddrs > 1) {
+
+        /*
+         * There are several addresses on this port and one of them
+         * is the "*:port" wildcard so getsockname() is needed to determine
+         * the server address.
+         *
+         * AcceptEx() already gave this address.
+         */
+
+        if (ngx_connection_local_sockaddr(c, NULL, 0) != NGX_OK) {
+            ngx_stream_close_connection(c);
+            return;
+        }
+
+        sa = c->local_sockaddr;
+
+        switch (sa->sa_family) {
+
+#if (NGX_HAVE_INET6)
+        case AF_INET6:
+            sin6 = (struct sockaddr_in6 *) sa;
+
+            addr6 = port->addrs;
+
+            /* the last address is "*" */
+
+            for (i = 0; i < port->naddrs - 1; i++) {
+                if (ngx_memcmp(&addr6[i].addr6, &sin6->sin6_addr, 16) == 0) {
+                    break;
+                }
+            }
+
+            addr_conf = &addr6[i].conf;
+
+            break;
+#endif
+
+        default: /* AF_INET */
+            sin = (struct sockaddr_in *) sa;
+
+            addr = port->addrs;
+
+            /* the last address is "*" */
+
+            for (i = 0; i < port->naddrs - 1; i++) {
+                if (addr[i].addr == sin->sin_addr.s_addr) {
+                    break;
+                }
+            }
+
+            addr_conf = &addr[i].conf;
+
+            break;
+        }
+
+    } else {
+        switch (c->local_sockaddr->sa_family) {
+
+#if (NGX_HAVE_INET6)
+        case AF_INET6:
+            addr6 = port->addrs;
+            addr_conf = &addr6[0].conf;
+            break;
+#endif
+
+        default: /* AF_INET */
+            addr = port->addrs;
+            addr_conf = &addr[0].conf;
+            break;
+        }
+    }
+
+    s = ngx_pcalloc(c->pool, sizeof(ngx_stream_session_t));
+    if (s == NULL) {
+        ngx_stream_close_connection(c);
+        return;
+    }
+
+    s->signature = NGX_STREAM_MODULE;
+    s->main_conf = addr_conf->ctx->main_conf;
+    s->srv_conf = addr_conf->ctx->srv_conf;
+
+    s->connection = c;
+    c->data = s;
+
+    cscf = ngx_stream_get_module_srv_conf(s, ngx_stream_core_module);
+
+    ngx_set_connection_log(c, cscf->error_log);
+
+    len = ngx_sock_ntop(c->sockaddr, c->socklen, text, NGX_SOCKADDR_STRLEN, 1);
+
+    ngx_log_error(NGX_LOG_INFO, c->log, 0, "*%uA client %*s connected to %V",
+                  c->number, len, text, &addr_conf->addr_text);
+
+    c->log->connection = c->number;
+    c->log->handler = ngx_stream_log_error;
+    c->log->data = s;
+    c->log->action = "initializing connection";
+    c->log_error = NGX_ERROR_INFO;
+
+    cmcf = ngx_stream_get_module_main_conf(s, ngx_stream_core_module);
+
+    if (cmcf->limit_conn_handler) {
+        rc = cmcf->limit_conn_handler(s);
+
+        if (rc != NGX_DECLINED) {
+            ngx_stream_close_connection(c);
+            return;
+        }
+    }
+
+    if (cmcf->access_handler) {
+        rc = cmcf->access_handler(s);
+
+        if (rc != NGX_OK && rc != NGX_DECLINED) {
+            ngx_stream_close_connection(c);
+            return;
+        }
+    }
+
+    if (cscf->tcp_nodelay && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) {
+        ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0, "tcp_nodelay");
+
+        tcp_nodelay = 1;
+
+        if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,
+                       (const void *) &tcp_nodelay, sizeof(int)) == -1)
+        {
+            ngx_connection_error(c, ngx_socket_errno,
+                                 "setsockopt(TCP_NODELAY) failed");
+            ngx_stream_close_connection(c);
+            return;
+        }
+
+        c->tcp_nodelay = NGX_TCP_NODELAY_SET;
+    }
+
+
+#if (NGX_STREAM_SSL)
+    {
+    ngx_stream_ssl_conf_t  *sslcf;
+
+    sslcf = ngx_stream_get_module_srv_conf(s, ngx_stream_ssl_module);
+
+    if (addr_conf->ssl) {
+        c->log->action = "SSL handshaking";
+
+        if (sslcf->ssl.ctx == NULL) {
+            ngx_log_error(NGX_LOG_ERR, c->log, 0,
+                          "no \"ssl_certificate\" is defined "
+                          "in server listening on SSL port");
+            ngx_stream_close_connection(c);
+            return;
+        }
+
+        ngx_stream_ssl_init_connection(&sslcf->ssl, c);
+        return;
+    }
+    }
+#endif
+
+    ngx_stream_init_session(c);
+}
+
+
+static void
+ngx_stream_init_session(ngx_connection_t *c)
+{
+    ngx_stream_session_t        *s;
+    ngx_stream_core_srv_conf_t  *cscf;
+
+    s = c->data;
+    c->log->action = "handling client connection";
+
+    cscf = ngx_stream_get_module_srv_conf(s, ngx_stream_core_module);
+
+    s->ctx = ngx_pcalloc(c->pool, sizeof(void *) * ngx_stream_max_module);
+    if (s->ctx == NULL) {
+        ngx_stream_close_connection(c);
+        return;
+    }
+
+    cscf->handler(s);
+}
+
+
+#if (NGX_STREAM_SSL)
+
+static void
+ngx_stream_ssl_init_connection(ngx_ssl_t *ssl, ngx_connection_t *c)
+{
+    ngx_stream_session_t   *s;
+    ngx_stream_ssl_conf_t  *sslcf;
+
+    if (ngx_ssl_create_connection(ssl, c, 0) == NGX_ERROR) {
+        ngx_stream_close_connection(c);
+        return;
+    }
+
+    if (ngx_ssl_handshake(c) == NGX_AGAIN) {
+
+        s = c->data;
+
+        sslcf = ngx_stream_get_module_srv_conf(s, ngx_stream_ssl_module);
+
+        ngx_add_timer(c->read, sslcf->handshake_timeout);
+
+        c->ssl->handler = ngx_stream_ssl_handshake_handler;
+
+        return;
+    }
+
+    ngx_stream_ssl_handshake_handler(c);
+}
+
+
+static void
+ngx_stream_ssl_handshake_handler(ngx_connection_t *c)
+{
+    if (!c->ssl->handshaked) {
+        ngx_stream_close_connection(c);
+        return;
+    }
+
+    if (c->read->timer_set) {
+        ngx_del_timer(c->read);
+    }
+
+    ngx_stream_init_session(c);
+}
+
+#endif
+
+
+void
+ngx_stream_close_connection(ngx_connection_t *c)
+{
+    ngx_pool_t  *pool;
+
+    ngx_log_debug1(NGX_LOG_DEBUG_STREAM, c->log, 0,
+                   "close stream connection: %d", c->fd);
+
+#if (NGX_STREAM_SSL)
+
+    if (c->ssl) {
+        if (ngx_ssl_shutdown(c) == NGX_AGAIN) {
+            c->ssl->handler = ngx_stream_close_connection;
+            return;
+        }
+    }
+
+#endif
+
+#if (NGX_STAT_STUB)
+    (void) ngx_atomic_fetch_add(ngx_stat_active, -1);
+#endif
+
+    pool = c->pool;
+
+    ngx_close_connection(c);
+
+    ngx_destroy_pool(pool);
+}
+
+
+static u_char *
+ngx_stream_log_error(ngx_log_t *log, u_char *buf, size_t len)
+{
+    u_char                *p;
+    ngx_stream_session_t  *s;
+
+    if (log->action) {
+        p = ngx_snprintf(buf, len, " while %s", log->action);
+        len -= p - buf;
+        buf = p;
+    }
+
+    s = log->data;
+
+    p = ngx_snprintf(buf, len, ", client: %V, server: %V",
+                     &s->connection->addr_text,
+                     &s->connection->listening->addr_text);
+    len -= p - buf;
+    buf = p;
+
+    if (s->log_handler) {
+        p = s->log_handler(log, buf, len);
+    }
+
+    return p;
+}

  Renamed: vendor/nginx-1.9.5/src/stream/ngx_stream_limit_conn_module.c (+163 -201) 50%
===================================================================
--- vendor/nginx-1.8.0/src/http/modules/ngx_http_limit_conn_module.c    2015-09-27 18:09:01 +0900 (4379311)
+++ vendor/nginx-1.9.5/src/stream/ngx_stream_limit_conn_module.c    2015-09-27 22:10:53 +0900 (732b089)
@@ -7,7 +7,7 @@
 
 #include <ngx_config.h>
 #include <ngx_core.h>
-#include <ngx_http.h>
+#include <ngx_stream.h>
 
 
 typedef struct {
@@ -15,50 +15,48 @@ typedef struct {
     u_char                     len;
     u_short                    conn;
     u_char                     data[1];
-} ngx_http_limit_conn_node_t;
+} ngx_stream_limit_conn_node_t;
 
 
 typedef struct {
     ngx_shm_zone_t            *shm_zone;
     ngx_rbtree_node_t         *node;
-} ngx_http_limit_conn_cleanup_t;
+} ngx_stream_limit_conn_cleanup_t;
 
 
 typedef struct {
     ngx_rbtree_t              *rbtree;
-    ngx_http_complex_value_t   key;
-} ngx_http_limit_conn_ctx_t;
+} ngx_stream_limit_conn_ctx_t;
 
 
 typedef struct {
     ngx_shm_zone_t            *shm_zone;
     ngx_uint_t                 conn;
-} ngx_http_limit_conn_limit_t;
+} ngx_stream_limit_conn_limit_t;
 
 
 typedef struct {
     ngx_array_t                limits;
     ngx_uint_t                 log_level;
-    ngx_uint_t                 status_code;
-} ngx_http_limit_conn_conf_t;
+} ngx_stream_limit_conn_conf_t;
 
 
-static ngx_rbtree_node_t *ngx_http_limit_conn_lookup(ngx_rbtree_t *rbtree,
+static ngx_rbtree_node_t *ngx_stream_limit_conn_lookup(ngx_rbtree_t *rbtree,
     ngx_str_t *key, uint32_t hash);
-static void ngx_http_limit_conn_cleanup(void *data);
-static ngx_inline void ngx_http_limit_conn_cleanup_all(ngx_pool_t *pool);
+static void ngx_stream_limit_conn_cleanup(void *data);
+static ngx_inline void ngx_stream_limit_conn_cleanup_all(ngx_pool_t *pool);
 
-static void *ngx_http_limit_conn_create_conf(ngx_conf_t *cf);
-static char *ngx_http_limit_conn_merge_conf(ngx_conf_t *cf, void *parent,
+static void *ngx_stream_limit_conn_create_conf(ngx_conf_t *cf);
+static char *ngx_stream_limit_conn_merge_conf(ngx_conf_t *cf, void *parent,
     void *child);
-static char *ngx_http_limit_conn_zone(ngx_conf_t *cf, ngx_command_t *cmd,
+static char *ngx_stream_limit_conn_zone(ngx_conf_t *cf, ngx_command_t *cmd,
     void *conf);
-static char *ngx_http_limit_conn(ngx_conf_t *cf, ngx_command_t *cmd,
+static char *ngx_stream_limit_conn(ngx_conf_t *cf, ngx_command_t *cmd,
     void *conf);
-static ngx_int_t ngx_http_limit_conn_init(ngx_conf_t *cf);
+static ngx_int_t ngx_stream_limit_conn_init(ngx_conf_t *cf);
 
 
-static ngx_conf_enum_t  ngx_http_limit_conn_log_levels[] = {
+static ngx_conf_enum_t  ngx_stream_limit_conn_log_levels[] = {
     { ngx_string("info"), NGX_LOG_INFO },
     { ngx_string("notice"), NGX_LOG_NOTICE },
     { ngx_string("warn"), NGX_LOG_WARN },
@@ -67,143 +65,133 @@ static ngx_conf_enum_t  ngx_http_limit_conn_log_levels[] = {
 };
 
 
-static ngx_conf_num_bounds_t  ngx_http_limit_conn_status_bounds = {
-    ngx_conf_check_num_bounds, 400, 599
-};
-
-
-static ngx_command_t  ngx_http_limit_conn_commands[] = {
+static ngx_command_t  ngx_stream_limit_conn_commands[] = {
 
     { ngx_string("limit_conn_zone"),
-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE2,
-      ngx_http_limit_conn_zone,
+      NGX_STREAM_MAIN_CONF|NGX_CONF_TAKE2,
+      ngx_stream_limit_conn_zone,
       0,
       0,
       NULL },
 
     { ngx_string("limit_conn"),
-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,
-      ngx_http_limit_conn,
-      NGX_HTTP_LOC_CONF_OFFSET,
+      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE2,
+      ngx_stream_limit_conn,
+      NGX_STREAM_SRV_CONF_OFFSET,
       0,
       NULL },
 
     { ngx_string("limit_conn_log_level"),
-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
+      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
       ngx_conf_set_enum_slot,
-      NGX_HTTP_LOC_CONF_OFFSET,
-      offsetof(ngx_http_limit_conn_conf_t, log_level),
-      &ngx_http_limit_conn_log_levels },
-
-    { ngx_string("limit_conn_status"),
-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
-      ngx_conf_set_num_slot,
-      NGX_HTTP_LOC_CONF_OFFSET,
-      offsetof(ngx_http_limit_conn_conf_t, status_code),
-      &ngx_http_limit_conn_status_bounds },
+      NGX_STREAM_SRV_CONF_OFFSET,
+      offsetof(ngx_stream_limit_conn_conf_t, log_level),
+      &ngx_stream_limit_conn_log_levels },
 
       ngx_null_command
 };
 
 
-static ngx_http_module_t  ngx_http_limit_conn_module_ctx = {
-    NULL,                                  /* preconfiguration */
-    ngx_http_limit_conn_init,              /* postconfiguration */
+static ngx_stream_module_t  ngx_stream_limit_conn_module_ctx = {
+    ngx_stream_limit_conn_init,            /* postconfiguration */
 
     NULL,                                  /* create main configuration */
     NULL,                                  /* init main configuration */
 
-    NULL,                                  /* create server configuration */
-    NULL,                                  /* merge server configuration */
-
-    ngx_http_limit_conn_create_conf,       /* create location configuration */
-    ngx_http_limit_conn_merge_conf         /* merge location configuration */
+    ngx_stream_limit_conn_create_conf,     /* create server configuration */
+    ngx_stream_limit_conn_merge_conf,      /* merge server configuration */
 };
 
 
-ngx_module_t  ngx_http_limit_conn_module = {
+ngx_module_t  ngx_stream_limit_conn_module = {
     NGX_MODULE_V1,
-    &ngx_http_limit_conn_module_ctx,       /* module context */
-    ngx_http_limit_conn_commands,          /* module directives */
-    NGX_HTTP_MODULE,                       /* module type */
-    NULL,                                  /* init master */
-    NULL,                                  /* init module */
-    NULL,                                  /* init process */
-    NULL,                                  /* init thread */
-    NULL,                                  /* exit thread */
-    NULL,                                  /* exit process */
-    NULL,                                  /* exit master */
+    &ngx_stream_limit_conn_module_ctx,       /* module context */
+    ngx_stream_limit_conn_commands,          /* module directives */
+    NGX_STREAM_MODULE,                       /* module type */
+    NULL,                                    /* init master */
+    NULL,                                    /* init module */
+    NULL,                                    /* init process */
+    NULL,                                    /* init thread */
+    NULL,                                    /* exit thread */
+    NULL,                                    /* exit process */
+    NULL,                                    /* exit master */
     NGX_MODULE_V1_PADDING
 };
 
 
 static ngx_int_t
-ngx_http_limit_conn_handler(ngx_http_request_t *r)
+ngx_stream_limit_conn_handler(ngx_stream_session_t *s)
 {
-    size_t                          n;
-    uint32_t                        hash;
-    ngx_str_t                       key;
-    ngx_uint_t                      i;
-    ngx_slab_pool_t                *shpool;
-    ngx_rbtree_node_t              *node;
-    ngx_pool_cleanup_t             *cln;
-    ngx_http_limit_conn_ctx_t      *ctx;
-    ngx_http_limit_conn_node_t     *lc;
-    ngx_http_limit_conn_conf_t     *lccf;
-    ngx_http_limit_conn_limit_t    *limits;
-    ngx_http_limit_conn_cleanup_t  *lccln;
-
-    if (r->main->limit_conn_set) {
+    size_t                            n;
+    uint32_t                          hash;
+    ngx_str_t                         key;
+    ngx_uint_t                        i;
+    ngx_slab_pool_t                  *shpool;
+    ngx_rbtree_node_t                *node;
+    ngx_pool_cleanup_t               *cln;
+    struct sockaddr_in               *sin;
+#if (NGX_HAVE_INET6)
+    struct sockaddr_in6              *sin6;
+#endif
+    ngx_stream_limit_conn_ctx_t      *ctx;
+    ngx_stream_limit_conn_node_t     *lc;
+    ngx_stream_limit_conn_conf_t     *lccf;
+    ngx_stream_limit_conn_limit_t    *limits;
+    ngx_stream_limit_conn_cleanup_t  *lccln;
+
+    switch (s->connection->sockaddr->sa_family) {
+
+    case AF_INET:
+        sin = (struct sockaddr_in *) s->connection->sockaddr;
+
+        key.len = sizeof(in_addr_t);
+        key.data = (u_char *) &sin->sin_addr;
+
+        break;
+
+#if (NGX_HAVE_INET6)
+    case AF_INET6:
+        sin6 = (struct sockaddr_in6 *) s->connection->sockaddr;
+
+        key.len = sizeof(struct in6_addr);
+        key.data = sin6->sin6_addr.s6_addr;
+
+        break;
+#endif
+
+    default:
         return NGX_DECLINED;
     }
 
-    lccf = ngx_http_get_module_loc_conf(r, ngx_http_limit_conn_module);
+    hash = ngx_crc32_short(key.data, key.len);
+
+    lccf = ngx_stream_get_module_srv_conf(s, ngx_stream_limit_conn_module);
     limits = lccf->limits.elts;
 
     for (i = 0; i < lccf->limits.nelts; i++) {
         ctx = limits[i].shm_zone->data;
 
-        if (ngx_http_complex_value(r, &ctx->key, &key) != NGX_OK) {
-            return NGX_HTTP_INTERNAL_SERVER_ERROR;
-        }
-
-        if (key.len == 0) {
-            continue;
-        }
-
-        if (key.len > 255) {
-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
-                          "the value of the \"%V\" key "
-                          "is more than 255 bytes: \"%V\"",
-                          &ctx->key.value, &key);
-            continue;
-        }
-
-        r->main->limit_conn_set = 1;
-
-        hash = ngx_crc32_short(key.data, key.len);
-
         shpool = (ngx_slab_pool_t *) limits[i].shm_zone->shm.addr;
 
         ngx_shmtx_lock(&shpool->mutex);
 
-        node = ngx_http_limit_conn_lookup(ctx->rbtree, &key, hash);
+        node = ngx_stream_limit_conn_lookup(ctx->rbtree, &key, hash);
 
         if (node == NULL) {
 
             n = offsetof(ngx_rbtree_node_t, color)
-                + offsetof(ngx_http_limit_conn_node_t, data)
+                + offsetof(ngx_stream_limit_conn_node_t, data)
                 + key.len;
 
             node = ngx_slab_alloc_locked(shpool, n);
 
             if (node == NULL) {
                 ngx_shmtx_unlock(&shpool->mutex);
-                ngx_http_limit_conn_cleanup_all(r->pool);
-                return lccf->status_code;
+                ngx_stream_limit_conn_cleanup_all(s->connection->pool);
+                return NGX_ABORT;
             }
 
-            lc = (ngx_http_limit_conn_node_t *) &node->color;
+            lc = (ngx_stream_limit_conn_node_t *) &node->color;
 
             node->key = hash;
             lc->len = (u_char) key.len;
@@ -214,35 +202,35 @@ ngx_http_limit_conn_handler(ngx_http_request_t *r)
 
         } else {
 
-            lc = (ngx_http_limit_conn_node_t *) &node->color;
+            lc = (ngx_stream_limit_conn_node_t *) &node->color;
 
             if ((ngx_uint_t) lc->conn >= limits[i].conn) {
 
                 ngx_shmtx_unlock(&shpool->mutex);
 
-                ngx_log_error(lccf->log_level, r->connection->log, 0,
+                ngx_log_error(lccf->log_level, s->connection->log, 0,
                               "limiting connections by zone \"%V\"",
                               &limits[i].shm_zone->shm.name);
 
-                ngx_http_limit_conn_cleanup_all(r->pool);
-                return lccf->status_code;
+                ngx_stream_limit_conn_cleanup_all(s->connection->pool);
+                return NGX_ABORT;
             }
 
             lc->conn++;
         }
 
-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+        ngx_log_debug2(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,
                        "limit conn: %08XD %d", node->key, lc->conn);
 
         ngx_shmtx_unlock(&shpool->mutex);
 
-        cln = ngx_pool_cleanup_add(r->pool,
-                                   sizeof(ngx_http_limit_conn_cleanup_t));
+        cln = ngx_pool_cleanup_add(s->connection->pool,
+                                   sizeof(ngx_stream_limit_conn_cleanup_t));
         if (cln == NULL) {
-            return NGX_HTTP_INTERNAL_SERVER_ERROR;
+            return NGX_ERROR;
         }
 
-        cln->handler = ngx_http_limit_conn_cleanup;
+        cln->handler = ngx_stream_limit_conn_cleanup;
         lccln = cln->data;
 
         lccln->shm_zone = limits[i].shm_zone;
@@ -254,11 +242,11 @@ ngx_http_limit_conn_handler(ngx_http_request_t *r)
 
 
 static void
-ngx_http_limit_conn_rbtree_insert_value(ngx_rbtree_node_t *temp,
+ngx_stream_limit_conn_rbtree_insert_value(ngx_rbtree_node_t *temp,
     ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
 {
-    ngx_rbtree_node_t           **p;
-    ngx_http_limit_conn_node_t   *lcn, *lcnt;
+    ngx_rbtree_node_t             **p;
+    ngx_stream_limit_conn_node_t   *lcn, *lcnt;
 
     for ( ;; ) {
 
@@ -272,8 +260,8 @@ ngx_http_limit_conn_rbtree_insert_value(ngx_rbtree_node_t *temp,
 
         } else { /* node->key == temp->key */
 
-            lcn = (ngx_http_limit_conn_node_t *) &node->color;
-            lcnt = (ngx_http_limit_conn_node_t *) &temp->color;
+            lcn = (ngx_stream_limit_conn_node_t *) &node->color;
+            lcnt = (ngx_stream_limit_conn_node_t *) &temp->color;
 
             p = (ngx_memn2cmp(lcn->data, lcnt->data, lcn->len, lcnt->len) < 0)
                 ? &temp->left : &temp->right;
@@ -295,11 +283,12 @@ ngx_http_limit_conn_rbtree_insert_value(ngx_rbtree_node_t *temp,
 
 
 static ngx_rbtree_node_t *
-ngx_http_limit_conn_lookup(ngx_rbtree_t *rbtree, ngx_str_t *key, uint32_t hash)
+ngx_stream_limit_conn_lookup(ngx_rbtree_t *rbtree, ngx_str_t *key,
+    uint32_t hash)
 {
-    ngx_int_t                    rc;
-    ngx_rbtree_node_t           *node, *sentinel;
-    ngx_http_limit_conn_node_t  *lcn;
+    ngx_int_t                      rc;
+    ngx_rbtree_node_t             *node, *sentinel;
+    ngx_stream_limit_conn_node_t  *lcn;
 
     node = rbtree->root;
     sentinel = rbtree->sentinel;
@@ -318,7 +307,7 @@ ngx_http_limit_conn_lookup(ngx_rbtree_t *rbtree, ngx_str_t *key, uint32_t hash)
 
         /* hash == node->key */
 
-        lcn = (ngx_http_limit_conn_node_t *) &node->color;
+        lcn = (ngx_stream_limit_conn_node_t *) &node->color;
 
         rc = ngx_memn2cmp(key->data, lcn->data, key->len, (size_t) lcn->len);
 
@@ -334,23 +323,23 @@ ngx_http_limit_conn_lookup(ngx_rbtree_t *rbtree, ngx_str_t *key, uint32_t hash)
 
 
 static void
-ngx_http_limit_conn_cleanup(void *data)
+ngx_stream_limit_conn_cleanup(void *data)
 {
-    ngx_http_limit_conn_cleanup_t  *lccln = data;
+    ngx_stream_limit_conn_cleanup_t  *lccln = data;
 
-    ngx_slab_pool_t             *shpool;
-    ngx_rbtree_node_t           *node;
-    ngx_http_limit_conn_ctx_t   *ctx;
-    ngx_http_limit_conn_node_t  *lc;
+    ngx_slab_pool_t               *shpool;
+    ngx_rbtree_node_t             *node;
+    ngx_stream_limit_conn_ctx_t   *ctx;
+    ngx_stream_limit_conn_node_t  *lc;
 
     ctx = lccln->shm_zone->data;
     shpool = (ngx_slab_pool_t *) lccln->shm_zone->shm.addr;
     node = lccln->node;
-    lc = (ngx_http_limit_conn_node_t *) &node->color;
+    lc = (ngx_stream_limit_conn_node_t *) &node->color;
 
     ngx_shmtx_lock(&shpool->mutex);
 
-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, lccln->shm_zone->shm.log, 0,
+    ngx_log_debug2(NGX_LOG_DEBUG_STREAM, lccln->shm_zone->shm.log, 0,
                    "limit conn cleanup: %08XD %d", node->key, lc->conn);
 
     lc->conn--;
@@ -365,14 +354,14 @@ ngx_http_limit_conn_cleanup(void *data)
 
 
 static ngx_inline void
-ngx_http_limit_conn_cleanup_all(ngx_pool_t *pool)
+ngx_stream_limit_conn_cleanup_all(ngx_pool_t *pool)
 {
     ngx_pool_cleanup_t  *cln;
 
     cln = pool->cleanup;
 
-    while (cln && cln->handler == ngx_http_limit_conn_cleanup) {
-        ngx_http_limit_conn_cleanup(cln->data);
+    while (cln && cln->handler == ngx_stream_limit_conn_cleanup) {
+        ngx_stream_limit_conn_cleanup(cln->data);
         cln = cln->next;
     }
 
@@ -381,31 +370,18 @@ ngx_http_limit_conn_cleanup_all(ngx_pool_t *pool)
 
 
 static ngx_int_t
-ngx_http_limit_conn_init_zone(ngx_shm_zone_t *shm_zone, void *data)
+ngx_stream_limit_conn_init_zone(ngx_shm_zone_t *shm_zone, void *data)
 {
-    ngx_http_limit_conn_ctx_t  *octx = data;
+    ngx_stream_limit_conn_ctx_t  *octx = data;
 
-    size_t                      len;
-    ngx_slab_pool_t            *shpool;
-    ngx_rbtree_node_t          *sentinel;
-    ngx_http_limit_conn_ctx_t  *ctx;
+    size_t                        len;
+    ngx_slab_pool_t              *shpool;
+    ngx_rbtree_node_t            *sentinel;
+    ngx_stream_limit_conn_ctx_t  *ctx;
 
     ctx = shm_zone->data;
 
     if (octx) {
-        if (ctx->key.value.len != octx->key.value.len
-            || ngx_strncmp(ctx->key.value.data, octx->key.value.data,
-                           ctx->key.value.len)
-               != 0)
-        {
-            ngx_log_error(NGX_LOG_EMERG, shm_zone->shm.log, 0,
-                          "limit_conn_zone \"%V\" uses the \"%V\" key "
-                          "while previously it used the \"%V\" key",
-                          &shm_zone->shm.name, &ctx->key.value,
-                          &octx->key.value);
-            return NGX_ERROR;
-        }
-
         ctx->rbtree = octx->rbtree;
 
         return NGX_OK;
@@ -432,7 +408,7 @@ ngx_http_limit_conn_init_zone(ngx_shm_zone_t *shm_zone, void *data)
     }
 
     ngx_rbtree_init(ctx->rbtree, sentinel,
-                    ngx_http_limit_conn_rbtree_insert_value);
+                    ngx_stream_limit_conn_rbtree_insert_value);
 
     len = sizeof(" in limit_conn_zone \"\"") + shm_zone->shm.name.len;
 
@@ -449,11 +425,11 @@ ngx_http_limit_conn_init_zone(ngx_shm_zone_t *shm_zone, void *data)
 
 
 static void *
-ngx_http_limit_conn_create_conf(ngx_conf_t *cf)
+ngx_stream_limit_conn_create_conf(ngx_conf_t *cf)
 {
-    ngx_http_limit_conn_conf_t  *conf;
+    ngx_stream_limit_conn_conf_t  *conf;
 
-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_limit_conn_conf_t));
+    conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_limit_conn_conf_t));
     if (conf == NULL) {
         return NULL;
     }
@@ -465,58 +441,44 @@ ngx_http_limit_conn_create_conf(ngx_conf_t *cf)
      */
 
     conf->log_level = NGX_CONF_UNSET_UINT;
-    conf->status_code = NGX_CONF_UNSET_UINT;
 
     return conf;
 }
 
 
 static char *
-ngx_http_limit_conn_merge_conf(ngx_conf_t *cf, void *parent, void *child)
+ngx_stream_limit_conn_merge_conf(ngx_conf_t *cf, void *parent, void *child)
 {
-    ngx_http_limit_conn_conf_t *prev = parent;
-    ngx_http_limit_conn_conf_t *conf = child;
+    ngx_stream_limit_conn_conf_t *prev = parent;
+    ngx_stream_limit_conn_conf_t *conf = child;
 
     if (conf->limits.elts == NULL) {
         conf->limits = prev->limits;
     }
 
     ngx_conf_merge_uint_value(conf->log_level, prev->log_level, NGX_LOG_ERR);
-    ngx_conf_merge_uint_value(conf->status_code, prev->status_code,
-                              NGX_HTTP_SERVICE_UNAVAILABLE);
 
     return NGX_CONF_OK;
 }
 
 
 static char *
-ngx_http_limit_conn_zone(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
+ngx_stream_limit_conn_zone(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
 {
-    u_char                            *p;
-    ssize_t                            size;
-    ngx_str_t                         *value, name, s;
-    ngx_uint_t                         i;
-    ngx_shm_zone_t                    *shm_zone;
-    ngx_http_limit_conn_ctx_t         *ctx;
-    ngx_http_compile_complex_value_t   ccv;
+    u_char                       *p;
+    ssize_t                       size;
+    ngx_str_t                    *value, name, s;
+    ngx_uint_t                    i;
+    ngx_shm_zone_t               *shm_zone;
+    ngx_stream_limit_conn_ctx_t  *ctx;
 
     value = cf->args->elts;
 
-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_limit_conn_ctx_t));
+    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_stream_limit_conn_ctx_t));
     if (ctx == NULL) {
         return NGX_CONF_ERROR;
     }
 
-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
-
-    ccv.cf = cf;
-    ccv.value = &value[1];
-    ccv.complex_value = &ctx->key;
-
-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
-        return NGX_CONF_ERROR;
-    }
-
     size = 0;
     name.len = 0;
 
@@ -569,21 +531,27 @@ ngx_http_limit_conn_zone(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
     }
 
     shm_zone = ngx_shared_memory_add(cf, &name, size,
-                                     &ngx_http_limit_conn_module);
+                                     &ngx_stream_limit_conn_module);
     if (shm_zone == NULL) {
         return NGX_CONF_ERROR;
     }
 
     if (shm_zone->data) {
-        ctx = shm_zone->data;
+        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
+                           "%V \"%V\" is already bound to key "
+                           "\"$binary_remote_addr\"",
+                           &cmd->name, &name);
+        return NGX_CONF_ERROR;
+    }
 
+    if (ngx_strcmp(value[1].data, "$binary_remote_addr") != 0) {
         ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
-                           "%V \"%V\" is already bound to key \"%V\"",
-                           &cmd->name, &name, &ctx->key.value);
+                           "unsupported key \"%V\", use "
+                           "$binary_remote_addr", &value[1]);
         return NGX_CONF_ERROR;
     }
 
-    shm_zone->init = ngx_http_limit_conn_init_zone;
+    shm_zone->init = ngx_stream_limit_conn_init_zone;
     shm_zone->data = ctx;
 
     return NGX_CONF_OK;
@@ -591,20 +559,20 @@ ngx_http_limit_conn_zone(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
 
 
 static char *
-ngx_http_limit_conn(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
+ngx_stream_limit_conn(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
 {
-    ngx_shm_zone_t               *shm_zone;
-    ngx_http_limit_conn_conf_t   *lccf = conf;
-    ngx_http_limit_conn_limit_t  *limit, *limits;
+    ngx_shm_zone_t                 *shm_zone;
+    ngx_stream_limit_conn_conf_t   *lccf = conf;
+    ngx_stream_limit_conn_limit_t  *limit, *limits;
 
-    ngx_str_t  *value;
-    ngx_int_t   n;
-    ngx_uint_t  i;
+    ngx_str_t   *value;
+    ngx_int_t    n;
+    ngx_uint_t   i;
 
     value = cf->args->elts;
 
     shm_zone = ngx_shared_memory_add(cf, &value[1], 0,
-                                     &ngx_http_limit_conn_module);
+                                     &ngx_stream_limit_conn_module);
     if (shm_zone == NULL) {
         return NGX_CONF_ERROR;
     }
@@ -613,7 +581,7 @@ ngx_http_limit_conn(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
 
     if (limits == NULL) {
         if (ngx_array_init(&lccf->limits, cf->pool, 1,
-                           sizeof(ngx_http_limit_conn_limit_t))
+                           sizeof(ngx_stream_limit_conn_limit_t))
             != NGX_OK)
         {
             return NGX_CONF_ERROR;
@@ -652,19 +620,13 @@ ngx_http_limit_conn(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
 
 
 static ngx_int_t
-ngx_http_limit_conn_init(ngx_conf_t *cf)
+ngx_stream_limit_conn_init(ngx_conf_t *cf)
 {
-    ngx_http_handler_pt        *h;
-    ngx_http_core_main_conf_t  *cmcf;
-
-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
+    ngx_stream_core_main_conf_t  *cmcf;
 
-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_PREACCESS_PHASE].handlers);
-    if (h == NULL) {
-        return NGX_ERROR;
-    }
+    cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module);
 
-    *h = ngx_http_limit_conn_handler;
+    cmcf->limit_conn_handler = ngx_stream_limit_conn_handler;
 
     return NGX_OK;
 }

  Added: vendor/nginx-1.9.5/src/stream/ngx_stream_proxy_module.c (+1584 -0) 100644
===================================================================
--- /dev/null
+++ vendor/nginx-1.9.5/src/stream/ngx_stream_proxy_module.c    2015-09-27 22:10:53 +0900 (ea142e7)
@@ -0,0 +1,1584 @@
+
+/*
+ * Copyright (C) Roman Arutyunyan
+ * Copyright (C) Nginx, Inc.
+ */
+
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+#include <ngx_stream.h>
+
+
+typedef void (*ngx_stream_proxy_handler_pt)(ngx_stream_session_t *s);
+
+
+typedef struct {
+    ngx_msec_t                       connect_timeout;
+    ngx_msec_t                       timeout;
+    ngx_msec_t                       next_upstream_timeout;
+    size_t                           buffer_size;
+    size_t                           upload_rate;
+    size_t                           download_rate;
+    ngx_uint_t                       next_upstream_tries;
+    ngx_flag_t                       next_upstream;
+    ngx_flag_t                       proxy_protocol;
+    ngx_addr_t                      *local;
+
+#if (NGX_STREAM_SSL)
+    ngx_flag_t                       ssl_enable;
+    ngx_flag_t                       ssl_session_reuse;
+    ngx_uint_t                       ssl_protocols;
+    ngx_str_t                        ssl_ciphers;
+    ngx_str_t                        ssl_name;
+    ngx_flag_t                       ssl_server_name;
+
+    ngx_flag_t                       ssl_verify;
+    ngx_uint_t                       ssl_verify_depth;
+    ngx_str_t                        ssl_trusted_certificate;
+    ngx_str_t                        ssl_crl;
+    ngx_str_t                        ssl_certificate;
+    ngx_str_t                        ssl_certificate_key;
+    ngx_array_t                     *ssl_passwords;
+
+    ngx_ssl_t                       *ssl;
+#endif
+
+    ngx_stream_upstream_srv_conf_t  *upstream;
+} ngx_stream_proxy_srv_conf_t;
+
+
+static void ngx_stream_proxy_handler(ngx_stream_session_t *s);
+static void ngx_stream_proxy_connect(ngx_stream_session_t *s);
+static void ngx_stream_proxy_init_upstream(ngx_stream_session_t *s);
+static void ngx_stream_proxy_upstream_handler(ngx_event_t *ev);
+static void ngx_stream_proxy_downstream_handler(ngx_event_t *ev);
+static void ngx_stream_proxy_process_connection(ngx_event_t *ev,
+    ngx_uint_t from_upstream);
+static void ngx_stream_proxy_connect_handler(ngx_event_t *ev);
+static ngx_int_t ngx_stream_proxy_test_connect(ngx_connection_t *c);
+static ngx_int_t ngx_stream_proxy_process(ngx_stream_session_t *s,
+    ngx_uint_t from_upstream, ngx_uint_t do_write);
+static void ngx_stream_proxy_next_upstream(ngx_stream_session_t *s);
+static void ngx_stream_proxy_finalize(ngx_stream_session_t *s, ngx_int_t rc);
+static u_char *ngx_stream_proxy_log_error(ngx_log_t *log, u_char *buf,
+    size_t len);
+
+static void *ngx_stream_proxy_create_srv_conf(ngx_conf_t *cf);
+static char *ngx_stream_proxy_merge_srv_conf(ngx_conf_t *cf, void *parent,
+    void *child);
+static char *ngx_stream_proxy_pass(ngx_conf_t *cf, ngx_command_t *cmd,
+    void *conf);
+static char *ngx_stream_proxy_bind(ngx_conf_t *cf, ngx_command_t *cmd,
+    void *conf);
+static ngx_int_t ngx_stream_proxy_send_proxy_protocol(ngx_stream_session_t *s);
+
+#if (NGX_STREAM_SSL)
+
+static char *ngx_stream_proxy_ssl_password_file(ngx_conf_t *cf,
+    ngx_command_t *cmd, void *conf);
+static void ngx_stream_proxy_ssl_init_connection(ngx_stream_session_t *s);
+static void ngx_stream_proxy_ssl_handshake(ngx_connection_t *pc);
+static ngx_int_t ngx_stream_proxy_ssl_name(ngx_stream_session_t *s);
+static ngx_int_t ngx_stream_proxy_set_ssl(ngx_conf_t *cf,
+    ngx_stream_proxy_srv_conf_t *pscf);
+
+
+static ngx_conf_bitmask_t  ngx_stream_proxy_ssl_protocols[] = {
+    { ngx_string("SSLv2"), NGX_SSL_SSLv2 },
+    { ngx_string("SSLv3"), NGX_SSL_SSLv3 },
+    { ngx_string("TLSv1"), NGX_SSL_TLSv1 },
+    { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 },
+    { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 },
+    { ngx_null_string, 0 }
+};
+
+#endif
+
+
+static ngx_conf_deprecated_t  ngx_conf_deprecated_proxy_downstream_buffer = {
+    ngx_conf_deprecated, "proxy_downstream_buffer", "proxy_buffer_size"
+};
+
+static ngx_conf_deprecated_t  ngx_conf_deprecated_proxy_upstream_buffer = {
+    ngx_conf_deprecated, "proxy_upstream_buffer", "proxy_buffer_size"
+};
+
+
+static ngx_command_t  ngx_stream_proxy_commands[] = {
+
+    { ngx_string("proxy_pass"),
+      NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
... truncated to 1.0MB




More information about the Groonga-commit mailing list
Back to archive index