namespace __gnu_cxx { template struct basic_iterator { basic_iterator operator++(); basic_iterator operator++(int); basic_iterator operator--(); basic_iterator operator--(int); basic_iterator operator+(int); basic_iterator operator-(int); T& operator*() const; T* operator->() const; }; template bool operator==(basic_iterator, basic_iterator); template bool operator!=(basic_iterator, basic_iterator); template basic_iterator operator+(int, basic_iterator); template basic_iterator operator-(int, basic_iterator); } namespace std { template struct remove_reference { typedef T type; }; template struct remove_reference { typedef T type; }; template struct remove_reference { typedef T type; }; template< class InputIt, class T > InputIt find( InputIt first, InputIt last, const T& value ); template< class ForwardIt1, class ForwardIt2 > ForwardIt1 search( ForwardIt1 first, ForwardIt1 last, ForwardIt2 s_first, ForwardIt2 s_last ); template typename remove_reference::type &&move(T &&t) noexcept; template T &&forward(typename remove_reference::type &t) noexcept; template auto data(const C &c) -> decltype(c.data()); template auto begin(C &c) -> decltype(c.begin()); template auto end(C &c) -> decltype(c.end()); template T *begin(T (&array)[N]); using size_t = decltype(sizeof(0)); using nullptr_t = decltype(nullptr); template struct initializer_list { const T* ptr; size_t sz; }; template class allocator {}; template struct reverse_iterator { reverse_iterator operator++(); reverse_iterator operator++(int); reverse_iterator operator--(); reverse_iterator operator--(int); reverse_iterator operator+(int) const; reverse_iterator operator-(int) const; decltype(*Iterator()) operator*() const; }; template reverse_iterator operator+(int, reverse_iterator); template reverse_iterator operator-(int, reverse_iterator); template > struct vector { using iterator = __gnu_cxx::basic_iterator; using const_iterator = __gnu_cxx::basic_iterator; using reverse_iterator = std::reverse_iterator; using const_reverse_iterator = std::reverse_iterator; iterator begin(); iterator end(); const_iterator cbegin() const; const_iterator cend() const; reverse_iterator rbegin(); reverse_iterator rend(); const_reverse_iterator crbegin() const; const_reverse_iterator crend() const; const T *data() const; vector(); ~vector(); vector(initializer_list __l, const Alloc& alloc = Alloc()); template vector(InputIterator first, InputIterator __last); T& operator[](unsigned); T & at(int n) &; T && at(int n) &&; void push_back(const T&); void push_back(T&&); const T& back() const; void pop_back(); iterator insert(iterator, T&&); void resize(size_t); void erase(iterator); void clear(); }; template void swap( T& a, T& b ); template struct pair { A first; B second; }; template struct flat_map { using iterator = __gnu_cxx::basic_iterator>; T& operator[](const Key& key); iterator begin(); iterator end(); iterator find(const Key& key); iterator erase(iterator); }; template struct unordered_map { using iterator = __gnu_cxx::basic_iterator>; T& operator[](const Key& key); iterator begin(); iterator end(); iterator find(const Key& key); iterator erase(iterator); }; template struct set { using iterator = __gnu_cxx::basic_iterator; iterator begin(); iterator end(); void insert(const Key& key); iterator erase(iterator); void extract(iterator); void clear(); }; template struct multiset { using iterator = __gnu_cxx::basic_iterator; iterator begin(); iterator end(); void insert(const Key& key); void clear(); }; template struct map { using iterator = __gnu_cxx::basic_iterator>; T& operator[](const Key& key); iterator begin(); iterator end(); void insert(const std::pair& value); template void emplace(Args&&... args); iterator erase(iterator); void clear(); }; template struct multimap { using iterator = __gnu_cxx::basic_iterator>; iterator begin(); iterator end(); void insert(const std::pair& value); void clear(); }; template struct basic_string_view { basic_string_view(); basic_string_view(const T *); const T *begin() const; const T *data() const; int size() const; }; using string_view = basic_string_view; template basic_string_view::basic_string_view(const T *) {} template struct span { span(); span(const vector&); }; template struct iter { iter& operator-=(int); iter operator-(int _Off) const { iter _Tmp = *this; return _Tmp -= _Off; } }; template struct basic_string { basic_string(); basic_string(const basic_string &); basic_string(basic_string &&); basic_string(const T *); ~basic_string(); basic_string& operator=(const basic_string&); basic_string& operator+=(const basic_string&); basic_string& operator+=(const T*); void push_back(T); template basic_string& insert(size_t index, const StringViewLike&); void clear(); const T *c_str() const; operator basic_string_view () const; using const_iterator = iter; const T *data() const; }; using string = basic_string; template struct unique_ptr { unique_ptr(); explicit unique_ptr(T*); unique_ptr(unique_ptr&&); unique_ptr& operator=(unique_ptr&&); unique_ptr& operator=(std::nullptr_t); void reset(); ~unique_ptr(); T* release(); T &operator*(); T *operator->(); T *get() const; }; template unique_ptr make_unique(Args&&... args) { return unique_ptr(new T(args...)); } template void destroy_at(T *); template struct shared_ptr { shared_ptr(); explicit shared_ptr(T*); shared_ptr(const shared_ptr&); shared_ptr(shared_ptr&&); template shared_ptr(unique_ptr&& up) : ptr_(up.get()) { up.release(); } ~shared_ptr(); T &operator*(); T *operator->(); T *get() const; T* ptr_; }; template struct optional { optional(); optional(const T&); ~optional(); template optional(U&& t); template optional(optional&& __t); T *operator->(); T &operator*() &; T &&operator*() &&; T &value() &; T &&value() &&; }; template optional<__decay(T)> make_optional(T&&); template struct stack { T &top(); }; struct any { // FIXME: CFG based analysis should be able to catch bugs without need of ctor and dtor. any(); ~any(); }; template T any_cast(const any& operand); template struct reference_wrapper { template reference_wrapper(U &&); }; template reference_wrapper ref(T& t) noexcept; template struct [[gsl::Pointer]] iterator { T& operator*() const; }; struct false_type { static constexpr bool value = false; constexpr operator bool() const noexcept { return value; } }; struct true_type { static constexpr bool value = true; constexpr operator bool() const noexcept { return value; } }; template struct is_pointer : false_type {}; template struct is_pointer : true_type {}; template struct is_pointer : true_type {}; template class function; template class function { public: template function(F) {} function(const function&) {} function(function&&) {} template function& operator=(F) { return *this; } function& operator=(const function&) { return *this; } function& operator=(function&&) { return *this; } ~function(); }; } void *operator new(std::size_t, void *) noexcept; void *operator new[](std::size_t, void *) noexcept;